diff --git a/.github/workflows/action-format.yml b/.github/workflows/action-format.yml index 2cc9614972..9174365b30 100644 --- a/.github/workflows/action-format.yml +++ b/.github/workflows/action-format.yml @@ -12,11 +12,11 @@ jobs: steps: - name: 'Post acknowledgement that it will format code' continue-on-error: true # Never fail the build if this fails - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -34,7 +34,7 @@ jobs: id: fork_status run: | IS_FORK="$(jq '.head.repo.fork' "/tmp/pr.json")" - echo "::set-output name=fork::$IS_FORK" + echo "fork=$IS_FORK" >> "$GITHUB_OUTPUT" - name: 'Setup SSH deploy key' if: steps.fork_status.outputs.fork == 'false' @@ -60,10 +60,10 @@ jobs: git clone $HEAD_REPO . git checkout -b "$HEAD_REF" "origin/$HEAD_REF" - - name: Use Node.js LTS (16.x) - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + - name: Use Node.js LTS (18.x) + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: - node-version: '16' + node-version: '18' - name: Install project development dependencies run: npm install --no-save - name: 'Format code' @@ -88,11 +88,11 @@ jobs: - name: 'Post acknowledgement that it has formatted the code' continue-on-error: true # Never fail the build if this fails - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -102,11 +102,11 @@ jobs: - name: 'Post reminder to trigger build manually' continue-on-error: true # Never fail the build if this fails if: steps.fork_status.outputs.fork == 'true' - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, diff --git a/.github/workflows/action-sync.yml b/.github/workflows/action-sync.yml index 59d0fc587e..e49713e20e 100644 --- a/.github/workflows/action-sync.yml +++ b/.github/workflows/action-sync.yml @@ -12,11 +12,11 @@ jobs: steps: - name: 'Post acknowledgement that it will sync exercises' continue-on-error: true # Never fail the build if this fails - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -34,7 +34,7 @@ jobs: id: fork_status run: | IS_FORK="$(jq '.head.repo.fork' "/tmp/pr.json")" - echo "::set-output name=fork::$IS_FORK" + echo "fork=$IS_FORK" >> "$GITHUB_OUTPUT" - name: 'Setup SSH deploy key' if: steps.fork_status.outputs.fork == 'false' @@ -84,11 +84,11 @@ jobs: - name: 'Post acknowledgement that it has synced the code' continue-on-error: true # Never fail the build if this fails - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -98,11 +98,11 @@ jobs: - name: 'Post reminder to trigger build manually' continue-on-error: true # Never fail the build if this fails if: steps.fork_status.outputs.fork == 'true' - uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, diff --git a/.github/workflows/ci.js.yml b/.github/workflows/ci.js.yml index b7708be00a..1e8eaa8822 100644 --- a/.github/workflows/ci.js.yml +++ b/.github/workflows/ci.js.yml @@ -12,11 +12,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - - name: Use Node.js LTS (16.x) - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac + - name: Use Node.js LTS (18.x) + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: - node-version: '16' + node-version: '18' - name: Install project dependencies run: npm ci @@ -29,12 +29,12 @@ jobs: strategy: matrix: - node-version: ['16', '17', '18'] + node-version: ['18', '20'] steps: - - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 8651710cc6..db7d9459d5 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/pr.ci.js.yml b/.github/workflows/pr.ci.js.yml index ca103bc25a..23c57d576b 100644 --- a/.github/workflows/pr.ci.js.yml +++ b/.github/workflows/pr.ci.js.yml @@ -11,12 +11,12 @@ jobs: steps: - name: Checkout PR - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac - - name: Use Node.js LTS (16.x) - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + - name: Use Node.js LTS (18.x) + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: - node-version: '16' + node-version: '18' - name: Install project dependencies run: npm ci @@ -33,14 +33,14 @@ jobs: strategy: matrix: - node-version: ['16', '17', '18'] + node-version: ['18', '20'] steps: - name: Checkout PR - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/verify-code-formatting.yml b/.github/workflows/verify-code-formatting.yml index 4dbfac5877..073a8dafce 100644 --- a/.github/workflows/verify-code-formatting.yml +++ b/.github/workflows/verify-code-formatting.yml @@ -10,11 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout code' - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - - name: Use Node.js LTS (16.x) - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac + - name: Use Node.js LTS (18.x) + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d with: - node-version: '16' + node-version: '18' - name: Install project development dependencies run: npm i - name: 'Verify formatting of all files' diff --git a/.prettierignore b/.prettierignore index 8e55617028..977a70ecd0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,3 +9,4 @@ LICENSE # These are formatted via configlet and will not match prettier exercises/**/.meta/config.json +exercises/**/.approaches/config.json diff --git a/README.md b/README.md index 7a0b2a3a70..cc1c5457a1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ [![configlet](https://github.com/exercism/javascript/workflows/configlet/badge.svg)](https://github.com/exercism/javascript/actions?query=workflow%3Aconfiglet) [![javascript / main](https://github.com/exercism/javascript/workflows/javascript%20/%20main/badge.svg)](https://github.com/exercism/javascript/actions?query=workflow%3A%22javascript+%2F+main%22) +⚠️ We 💙 our community but **this repository does not accept community contributions at this time**. +There are no active maintainers to review PRs. +Please read this [community blog post][freeing-maintainers] for details. ⚠️ + **Exercism exercises in JavaScript** This is the JavaScript track, one of the many tracks on [Exercism][web-exercism]. @@ -93,3 +97,4 @@ A lot of the improvements made to this track and tooling are also made to the Ty [git-typescript-representer]: https://github.com/exercism/typescript-representer [git-typescript-test-runner]: https://github.com/exercism/typescript-test-runner [git-website-copy]: https://github.com/exercism/website-copy +[freeing-maintainers]: https://exercism.org/blog/freeing-our-maintainers diff --git a/concepts/array-transformations/about.md b/concepts/array-transformations/about.md index 814fb8d72b..f7d519bc9a 100644 --- a/concepts/array-transformations/about.md +++ b/concepts/array-transformations/about.md @@ -61,7 +61,7 @@ arr.reduce( return accumulator; }, - { even: [], odd: [] } + { even: [], odd: [] }, ); // => { even: [2, 4], odd: [1, 3] } ``` @@ -81,7 +81,7 @@ This method modifies the array it is called on. ### slice (pure) -Given a start and an end index, creates a sub-array from the array passed as a parameter. +Given a start and an end index, creates a sub-array from the array it is called on. The element at the end index will not be included. Also, all parameters are optional: diff --git a/concepts/array-transformations/introduction.md b/concepts/array-transformations/introduction.md index ad879d6443..ab64b7628d 100644 --- a/concepts/array-transformations/introduction.md +++ b/concepts/array-transformations/introduction.md @@ -61,7 +61,7 @@ arr.reduce( return accumulator; }, - { even: [], odd: [] } + { even: [], odd: [] }, ); // => { even: [2, 4], odd: [1, 3] } ``` @@ -81,7 +81,7 @@ This method modifies the array it is called on. ### slice (pure) -Given a start and an end index, creates a sub-array from the array passed as a parameter. +Given a start and an end index, creates a sub-array from the array it is called on. The element at the end index will not be included. Also, all parameters are optional: diff --git a/concepts/arrays/about.md b/concepts/arrays/about.md index 4f6809093e..8bbc8f3761 100644 --- a/concepts/arrays/about.md +++ b/concepts/arrays/about.md @@ -31,7 +31,7 @@ The array's object properties and list of array elements are separate, and the a ```javascript const names = ['Jack', 'Laura', 'Paul', 'Megan']; names.length; -// => 3 +// => 4 // Properties can be set on arrays using bracket ['property'] or // dot .property notation, and this will affect the length, as diff --git a/concepts/null-undefined/introduction.md b/concepts/null-undefined/introduction.md index 99d2025ba4..f1cb19446e 100644 --- a/concepts/null-undefined/introduction.md +++ b/concepts/null-undefined/introduction.md @@ -31,15 +31,38 @@ That means while `null` represents an empty value (but still a value), `undefine `undefined` appears in different contexts. - If a variable is declared without a value (initialization), it is `undefined`. + + ```js + let name; + console.log(name); // => undefined + ``` + - If you try to access a value for a non-existing key in an object, you get `undefined`. + + ```js + let obj = { + name: 'John', + }; + console.log(obj.age); // => undefined + ``` + - If a function does not return a value, the result is `undefined`. + + ```js + function printName(name) { + 'My name is ' + name; + } + console.log(printName('John')); // => undefined + ``` + - If an argument is not passed to a function, it is `undefined`, unless that argument has a default value. -```javascript -let name; -console.log(name); -// => undefined -``` + ```js + function printName(name) { + return name; + } + console.log(printName()); // => undefined + ``` You can check whether a variable is undefined using the strict equality operator `===`. diff --git a/concepts/objects/introduction.md b/concepts/objects/introduction.md index 824ab75a11..2efc612df4 100644 --- a/concepts/objects/introduction.md +++ b/concepts/objects/introduction.md @@ -76,6 +76,7 @@ obj[key]; Using the dot notation as a shorthand has the same restriction as omitting the quotation marks. It only works if the key follows the identifier naming rules. +In other words, if your key is not a single word using only letters, you must use square bracket notation. ## Adding or Changing a Value diff --git a/concepts/promises/about.md b/concepts/promises/about.md index 12378a528d..a56c2ee060 100644 --- a/concepts/promises/about.md +++ b/concepts/promises/about.md @@ -112,7 +112,7 @@ Promise.reject(new Error('failed')).then( }, function (error) { console.error(error); // error in the console - } + }, ); ``` @@ -127,7 +127,7 @@ Promise.resolve('resolved!').then( }, function (value) { // not called - } + }, ); ``` diff --git a/concepts/regular-expressions/about.md b/concepts/regular-expressions/about.md index 34cac00cbc..5bfa585f5d 100644 --- a/concepts/regular-expressions/about.md +++ b/concepts/regular-expressions/about.md @@ -73,7 +73,7 @@ _When to use one or the other?_ Use the `test()` when you want a fast way of che ### Test -The [test()][mdn-regex-test]] method executes a search for a match between a regular expression and a specified string. Returns true or false. +The [test()][mdn-regex-test] method executes a search for a match between a regular expression and a specified string. Returns true or false. ```javascript const str = 'It is difficult to test if you have a virus'; diff --git a/config.json b/config.json index 61b9a75537..4e55bb8e8d 100644 --- a/config.json +++ b/config.json @@ -16,7 +16,7 @@ "highlightjs_language": "javascript" }, "test_runner": { - "average_run_time": 5.0 + "average_run_time": 5 }, "files": { "solution": ["%{kebab_slug}.js"], @@ -169,7 +169,7 @@ "array-destructuring", "array-transformations" ], - "status": "wip" + "status": "beta" }, { "slug": "coordinate-transformation", @@ -901,7 +901,12 @@ "name": "Scale Generator", "uuid": "b9c586e8-998b-4f5d-ab98-a08be29a9f19", "practices": [], - "prerequisites": [], + "prerequisites": [ + "classes", + "arrays", + "strings", + "array-transformations" + ], "difficulty": 3, "topics": ["loops", "pattern_recognition", "strings", "arrays"] }, @@ -926,7 +931,13 @@ "name": "Largest Series Product", "uuid": "1f84305d-ea76-4fe2-9858-3b53576d683d", "practices": [], - "prerequisites": [], + "prerequisites": [ + "strings", + "numbers", + "errors", + "conditionals", + "array-transformations" + ], "difficulty": 7, "topics": [ "conditionals", @@ -943,8 +954,8 @@ "name": "Transpose", "uuid": "9c140fb7-cc8b-411b-b613-a0e0081a9c3f", "practices": [], - "prerequisites": [], - "difficulty": 1, + "prerequisites": ["arrays", "for-loops", "strings", "conditionals"], + "difficulty": 3, "topics": [ "arrays", "lists", @@ -1051,9 +1062,8 @@ "name": "House", "uuid": "a8b7187d-12eb-4efc-b966-87823654ccda", "practices": [], - "prerequisites": [], - "difficulty": 4, - "topics": ["arrays", "conditionals", "loops", "recursion", "strings"] + "prerequisites": ["for-loops", "arrays", "strings"], + "difficulty": 4 }, { "slug": "isbn-verifier", diff --git a/exercises/concept/amusement-park/.gitignore b/exercises/concept/amusement-park/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/amusement-park/.gitignore +++ b/exercises/concept/amusement-park/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/amusement-park/package.json b/exercises/concept/amusement-park/package.json index f76b6917ac..2507070a5c 100644 --- a/exercises/concept/amusement-park/package.json +++ b/exercises/concept/amusement-park/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/amusement-park" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/annalyns-infiltration/.gitignore b/exercises/concept/annalyns-infiltration/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/annalyns-infiltration/.gitignore +++ b/exercises/concept/annalyns-infiltration/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/annalyns-infiltration/.meta/exemplar.js b/exercises/concept/annalyns-infiltration/.meta/exemplar.js index a0cec712e3..1d096c536c 100644 --- a/exercises/concept/annalyns-infiltration/.meta/exemplar.js +++ b/exercises/concept/annalyns-infiltration/.meta/exemplar.js @@ -69,7 +69,7 @@ export function canFreePrisoner( knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent + petDogIsPresent, ) { return ( (!knightIsAwake && !archerIsAwake && prisonerIsAwake) || diff --git a/exercises/concept/annalyns-infiltration/annalyns-infiltration.js b/exercises/concept/annalyns-infiltration/annalyns-infiltration.js index e7255e5ea5..0c3e4adfc9 100644 --- a/exercises/concept/annalyns-infiltration/annalyns-infiltration.js +++ b/exercises/concept/annalyns-infiltration/annalyns-infiltration.js @@ -69,7 +69,7 @@ export function canFreePrisoner( knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent + petDogIsPresent, ) { throw new Error('Remove this line and implement the function'); } diff --git a/exercises/concept/annalyns-infiltration/annalyns-infiltration.spec.js b/exercises/concept/annalyns-infiltration/annalyns-infiltration.spec.js index 7fa874b1d1..3ad09917af 100644 --- a/exercises/concept/annalyns-infiltration/annalyns-infiltration.spec.js +++ b/exercises/concept/annalyns-infiltration/annalyns-infiltration.spec.js @@ -29,7 +29,7 @@ describe('can spy', () => { const expected = false; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -40,7 +40,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -51,7 +51,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -62,7 +62,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -73,7 +73,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -84,7 +84,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); @@ -95,7 +95,7 @@ describe('can spy', () => { const expected = true; expect(canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)).toBe( - expected + expected, ); }); }); @@ -147,8 +147,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -164,8 +164,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -181,8 +181,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -198,8 +198,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -215,8 +215,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -232,8 +232,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -249,8 +249,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -266,8 +266,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -283,8 +283,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -300,8 +300,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -317,8 +317,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -334,8 +334,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -351,8 +351,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -368,8 +368,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -385,8 +385,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); @@ -402,8 +402,8 @@ describe('can free prisoner', () => { knightIsAwake, archerIsAwake, prisonerIsAwake, - petDogIsPresent - ) + petDogIsPresent, + ), ).toBe(expected); }); }); diff --git a/exercises/concept/annalyns-infiltration/package.json b/exercises/concept/annalyns-infiltration/package.json index 99433d5e6c..71957cfacd 100644 --- a/exercises/concept/annalyns-infiltration/package.json +++ b/exercises/concept/annalyns-infiltration/package.json @@ -13,15 +13,15 @@ "directory": "exercises/concept/annalyns-infiltration" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/bird-watcher/.gitignore b/exercises/concept/bird-watcher/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/bird-watcher/.gitignore +++ b/exercises/concept/bird-watcher/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/bird-watcher/package.json b/exercises/concept/bird-watcher/package.json index 820b65aaad..e958c7139a 100644 --- a/exercises/concept/bird-watcher/package.json +++ b/exercises/concept/bird-watcher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/bird-watcher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/coordinate-transformation/.docs/instructions.md b/exercises/concept/coordinate-transformation/.docs/instructions.md index f01ddba7be..8dc5f31fbb 100644 --- a/exercises/concept/coordinate-transformation/.docs/instructions.md +++ b/exercises/concept/coordinate-transformation/.docs/instructions.md @@ -33,9 +33,9 @@ Combine two transformation functions to perform a repeatable transformation. Thi ```javascript const moveCoordinatesRight2Px = translate2d(2, 0); const doubleCoordinates = scale2d(2, 2); -const composedTransformations = composeTransformation( +const composedTransformations = composeTransform( moveCoordinatesRight2Px, - doubleCoordinates + doubleCoordinates, ); const result = composedTransformations(0, 1); // result => [4, 2] diff --git a/exercises/concept/coordinate-transformation/.gitignore b/exercises/concept/coordinate-transformation/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/coordinate-transformation/.gitignore +++ b/exercises/concept/coordinate-transformation/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/coordinate-transformation/coordinate-transformation.spec.js b/exercises/concept/coordinate-transformation/coordinate-transformation.spec.js index 623dc6ac6a..582fe25741 100644 --- a/exercises/concept/coordinate-transformation/coordinate-transformation.spec.js +++ b/exercises/concept/coordinate-transformation/coordinate-transformation.spec.js @@ -25,11 +25,11 @@ describe('translate2d', () => { const dx = 3; const dy = -5; - const translator = translate2d(dx, dy); const x1 = 0; const y1 = 0; const expected = [3, -5]; test('should be predictable', () => { + const translator = translate2d(dx, dy); expect(translator(x1, y1)).toEqual(expected); }); @@ -37,6 +37,8 @@ describe('translate2d', () => { const y2 = 5; const reusedExpected = [7, 0]; test('should be reusable', () => { + const translator = translate2d(dx, dy); + translator(x1, y1); expect(translator(x2, y2)).toEqual(reusedExpected); }); }); @@ -48,11 +50,11 @@ describe('scale2d', () => { const dx = 4; const dy = 2; - const scaler = scale2d(dx, dy); const x1 = 1; const y1 = 1; const expected = [4, 2]; test('should be predictable', () => { + const scaler = scale2d(dx, dy); expect(scaler(x1, y1)).toEqual(expected); }); @@ -60,6 +62,8 @@ describe('scale2d', () => { const y2 = 5; const reusedExpected = [-8, 10]; test('should be reusable', () => { + const scaler = scale2d(dx, dy); + scaler(x1, y1); expect(scaler(x2, y2)).toEqual(reusedExpected); }); }); @@ -67,31 +71,37 @@ describe('scale2d', () => { describe('composeTransform', () => { const dx = -6; const dy = 10; - const translator = translate2d(dx, dy); const sx = 3; const sy = 2; - const scaler = scale2d(sx, sy); test('should return a function', () => { + const translator = translate2d(dx, dy); + const scaler = scale2d(sx, sy); expect(typeof composeTransform(translator, scaler)).toBe('function'); }); test('should compose two translate functions', () => { + const translator = translate2d(dx, dy); const composeTranslate = composeTransform(translator, translator); expect(composeTranslate(0, 0)).toEqual([-12, 20]); }); test('should compose two scale functions', () => { + const scaler = scale2d(sx, sy); const composeScale = composeTransform(scaler, scaler); expect(composeScale(1, 1)).toEqual([9, 4]); }); test('should compose in the correct order: g(f(x))', () => { + const translator = translate2d(dx, dy); + const scaler = scale2d(sx, sy); const composed = composeTransform(scaler, translator); expect(composed(0, 0)).toEqual([-6, 10]); }); test('should compose in the opposite order: f(g(x))', () => { + const translator = translate2d(dx, dy); + const scaler = scale2d(sx, sy); const composed = composeTransform(translator, scaler); expect(composed(0, 0)).toEqual([-18, 20]); }); @@ -128,4 +138,14 @@ describe('memoizeTransform', () => { expect(memoizedTransform(1, 1)).toEqual([2, 2]); expect(mockFunction).toBeCalledTimes(3); }); + + test('should recalculate when a new function is passed in', () => { + const sumFunction = (x, y) => x + y; + const differenceFunction = (x, y) => x - y; + const memoizedSum = memoizeTransform(sumFunction); + const memoizedDifference = memoizeTransform(differenceFunction); + + expect(memoizedSum(1, 2)).toEqual(3); + expect(memoizedDifference(1, 2)).toEqual(-1); + }); }); diff --git a/exercises/concept/coordinate-transformation/package.json b/exercises/concept/coordinate-transformation/package.json index 85d5c28187..1bec86da15 100644 --- a/exercises/concept/coordinate-transformation/package.json +++ b/exercises/concept/coordinate-transformation/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/coordinate-transformation" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/custom-signs/.docs/instructions.md b/exercises/concept/custom-signs/.docs/instructions.md index 3635a2d8cb..12b8ddd326 100644 --- a/exercises/concept/custom-signs/.docs/instructions.md +++ b/exercises/concept/custom-signs/.docs/instructions.md @@ -13,9 +13,12 @@ buildSign('Birthday', 'Rob'); ## 2. Build a birthday sign -Implement the function `buildBirthdaySign(age)` that accepts an age and based on the age will determine part of the message on the sign. If the age is 50 or older, the sign will include the word _mature_, otherwise the sign will include the word _young_. +Implement the function `buildBirthdaySign(age)` that accepts an age and based on the age will determine part of the message on the sign. If the age is 50 or older, the sign will refer user as _mature_, else it will refer them as _young_. The exact expected output is shown below: ```javascript +buildBirthdaySign(50); +// => "Happy Birthday! What a mature fellow you are." + buildBirthdaySign(45); // => "Happy Birthday! What a young fellow you are." ``` diff --git a/exercises/concept/custom-signs/.gitignore b/exercises/concept/custom-signs/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/custom-signs/.gitignore +++ b/exercises/concept/custom-signs/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/custom-signs/custom-signs.js b/exercises/concept/custom-signs/custom-signs.js index 26d729bc9b..d9f5dad561 100644 --- a/exercises/concept/custom-signs/custom-signs.js +++ b/exercises/concept/custom-signs/custom-signs.js @@ -39,7 +39,7 @@ export function buildBirthdaySign(age) { */ export function graduationFor(name, year) { - throw new Error('Implement the graduationForm function'); + throw new Error('Implement the graduationFor function'); } /** diff --git a/exercises/concept/custom-signs/custom-signs.spec.js b/exercises/concept/custom-signs/custom-signs.spec.js index 36c838144a..a5e70ef0cb 100644 --- a/exercises/concept/custom-signs/custom-signs.spec.js +++ b/exercises/concept/custom-signs/custom-signs.spec.js @@ -20,19 +20,19 @@ describe('buildSign', () => { describe('buildBirthdaySign', () => { test('age is less than 50', () => { expect(buildBirthdaySign(49)).toBe( - 'Happy Birthday! What a young fellow you are.' + 'Happy Birthday! What a young fellow you are.', ); }); test('age is 50 or older', () => { expect(buildBirthdaySign(51)).toBe( - 'Happy Birthday! What a mature fellow you are.' + 'Happy Birthday! What a mature fellow you are.', ); }); test('age is 50', () => { expect(buildBirthdaySign(50)).toBe( - 'Happy Birthday! What a mature fellow you are.' + 'Happy Birthday! What a mature fellow you are.', ); }); }); diff --git a/exercises/concept/custom-signs/package.json b/exercises/concept/custom-signs/package.json index 091d1e89eb..c368b9c116 100644 --- a/exercises/concept/custom-signs/package.json +++ b/exercises/concept/custom-signs/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/custom-signs" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/elyses-analytic-enchantments/.gitignore b/exercises/concept/elyses-analytic-enchantments/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/elyses-analytic-enchantments/.gitignore +++ b/exercises/concept/elyses-analytic-enchantments/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/elyses-analytic-enchantments/package.json b/exercises/concept/elyses-analytic-enchantments/package.json index 08f8757f26..a56ff7335f 100644 --- a/exercises/concept/elyses-analytic-enchantments/package.json +++ b/exercises/concept/elyses-analytic-enchantments/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/elyses-analytic-enchantments" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/elyses-destructured-enchantments/.gitignore b/exercises/concept/elyses-destructured-enchantments/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/elyses-destructured-enchantments/.gitignore +++ b/exercises/concept/elyses-destructured-enchantments/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/elyses-destructured-enchantments/enchantments.js b/exercises/concept/elyses-destructured-enchantments/enchantments.js index e04735feb8..7483f0b4b8 100644 --- a/exercises/concept/elyses-destructured-enchantments/enchantments.js +++ b/exercises/concept/elyses-destructured-enchantments/enchantments.js @@ -46,7 +46,7 @@ export function discardTopCard(deck) { throw new Error('Implement the discardTopCard function'); } -/** @type Card[] **/ +/** @type {Card[]} **/ const FACE_CARDS = ['jack', 'queen', 'king']; /** diff --git a/exercises/concept/elyses-destructured-enchantments/package.json b/exercises/concept/elyses-destructured-enchantments/package.json index f4c5254f3d..f30453ba0b 100644 --- a/exercises/concept/elyses-destructured-enchantments/package.json +++ b/exercises/concept/elyses-destructured-enchantments/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/elyses-destructured-enchantments" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/elyses-enchantments/.docs/instructions.md b/exercises/concept/elyses-enchantments/.docs/instructions.md index f44e9fe7ab..615aafd475 100644 --- a/exercises/concept/elyses-enchantments/.docs/instructions.md +++ b/exercises/concept/elyses-enchantments/.docs/instructions.md @@ -9,6 +9,10 @@ of a certain card corresponds to the index in the array. That means position 0 refers to the first card, position 1 to the second card etc. +```exercism/note +All functions should update the array of cards and then return the modified array - a common way of working known as the Builder pattern, which allows you to nicely daisy-chain functions together. +``` + ## 1. Retrieve a card from a stack To pick a card, return the card at index `position` from diff --git a/exercises/concept/elyses-enchantments/.gitignore b/exercises/concept/elyses-enchantments/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/elyses-enchantments/.gitignore +++ b/exercises/concept/elyses-enchantments/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/elyses-enchantments/enchantments.spec.js b/exercises/concept/elyses-enchantments/enchantments.spec.js index 9bf6100d83..43c408d9a2 100644 --- a/exercises/concept/elyses-enchantments/enchantments.spec.js +++ b/exercises/concept/elyses-enchantments/enchantments.spec.js @@ -118,8 +118,8 @@ describe('make cards disappear', () => { // eslint-disable-next-line no-undef fail( new Error( - 'The card has disappeared, but the stack has not changed in size. This magic trick has turned into actual magic. Perhaps a different method of removing the card will result in a stack that Elyse can work with...' - ) + 'The card has disappeared, but the stack has not changed in size. This magic trick has turned into actual magic. Perhaps a different method of removing the card will result in a stack that Elyse can work with...', + ), ); } diff --git a/exercises/concept/elyses-enchantments/package.json b/exercises/concept/elyses-enchantments/package.json index 694e3fd5c2..736231e06e 100644 --- a/exercises/concept/elyses-enchantments/package.json +++ b/exercises/concept/elyses-enchantments/package.json @@ -13,15 +13,15 @@ "directory": "exercises/concept/elyses-enchantments" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/elyses-looping-enchantments/.gitignore b/exercises/concept/elyses-looping-enchantments/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/concept/elyses-looping-enchantments/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/elyses-looping-enchantments/package.json b/exercises/concept/elyses-looping-enchantments/package.json index 623ab8c71e..e614c51af5 100644 --- a/exercises/concept/elyses-looping-enchantments/package.json +++ b/exercises/concept/elyses-looping-enchantments/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/elyses-looping-enchantments" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/elyses-transformative-enchantments/.docs/introduction.md b/exercises/concept/elyses-transformative-enchantments/.docs/introduction.md index 9744d2d5e2..92ed35f233 100644 --- a/exercises/concept/elyses-transformative-enchantments/.docs/introduction.md +++ b/exercises/concept/elyses-transformative-enchantments/.docs/introduction.md @@ -61,7 +61,7 @@ arr.reduce( return accumulator; }, - { even: [], odd: [] } + { even: [], odd: [] }, ); // => { even: [2, 4], odd: [1, 3] } ``` diff --git a/exercises/concept/elyses-transformative-enchantments/.gitignore b/exercises/concept/elyses-transformative-enchantments/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/elyses-transformative-enchantments/.gitignore +++ b/exercises/concept/elyses-transformative-enchantments/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/elyses-transformative-enchantments/package.json b/exercises/concept/elyses-transformative-enchantments/package.json index 79af341dce..ee81b5857e 100644 --- a/exercises/concept/elyses-transformative-enchantments/package.json +++ b/exercises/concept/elyses-transformative-enchantments/package.json @@ -14,15 +14,15 @@ "directory": "exercises/concept/elyses-transformative-enchantments" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/factory-sensors/.gitignore b/exercises/concept/factory-sensors/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/factory-sensors/.gitignore +++ b/exercises/concept/factory-sensors/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/factory-sensors/factory-sensors.spec.js b/exercises/concept/factory-sensors/factory-sensors.spec.js index 3eda0876f5..01c185781b 100644 --- a/exercises/concept/factory-sensors/factory-sensors.spec.js +++ b/exercises/concept/factory-sensors/factory-sensors.spec.js @@ -77,7 +77,7 @@ describe('monitorTheMachine', () => { expect(actions.shutdown).not.toHaveBeenCalled(); }); - test('should call only the shutdown action if the check throws an OverheatingError with a temperature equals to 651°C', () => { + test('should call only the shutdown action if the check throws an OverheatingError with a temperature of 651°C', () => { actions.check = jest.fn(() => { throw new OverheatingError(651); }); diff --git a/exercises/concept/factory-sensors/package.json b/exercises/concept/factory-sensors/package.json index d8e1a748ea..aba4e1ee3f 100644 --- a/exercises/concept/factory-sensors/package.json +++ b/exercises/concept/factory-sensors/package.json @@ -9,15 +9,15 @@ "directory": "exercises/concept/factory-sensors" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/freelancer-rates/.gitignore b/exercises/concept/freelancer-rates/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/freelancer-rates/.gitignore +++ b/exercises/concept/freelancer-rates/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/freelancer-rates/.meta/exemplar.js b/exercises/concept/freelancer-rates/.meta/exemplar.js index 2f2959787e..7b2f91fad9 100644 --- a/exercises/concept/freelancer-rates/.meta/exemplar.js +++ b/exercises/concept/freelancer-rates/.meta/exemplar.js @@ -49,11 +49,12 @@ export function daysInBudget(budget, ratePerHour) { * @returns {number} the discounted rate, rounded up */ export function priceWithMonthlyDiscount(ratePerHour, numDays, discount) { - const numMonths = Math.floor(numDays / 22); - const monthlyRate = 22 * dayRate(ratePerHour); + const billableDaysPerMonth = 22; + const numMonths = Math.floor(numDays / billableDaysPerMonth); + const monthlyRate = billableDaysPerMonth * dayRate(ratePerHour); const monthlyDiscountedRate = (1 - discount) * monthlyRate; - const numExtraDays = numDays % 22; + const numExtraDays = numDays % billableDaysPerMonth; const priceExtraDays = numExtraDays * dayRate(ratePerHour); return Math.ceil(numMonths * monthlyDiscountedRate + priceExtraDays); diff --git a/exercises/concept/freelancer-rates/package.json b/exercises/concept/freelancer-rates/package.json index 2ffc8f2faa..633355cc91 100644 --- a/exercises/concept/freelancer-rates/package.json +++ b/exercises/concept/freelancer-rates/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/freelancer-rates" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/fruit-picker/.docs/hints.md b/exercises/concept/fruit-picker/.docs/hints.md index 60894553ac..bf33da9664 100644 --- a/exercises/concept/fruit-picker/.docs/hints.md +++ b/exercises/concept/fruit-picker/.docs/hints.md @@ -4,34 +4,28 @@ - Callback functions are functions passed as an argument to a calling function. - Callback functions must meet the specification of the calling function. -- These callbacks are all synchronous, meaning they all must return a value. -## 1. Check if the grocer's service is online +## 1. Notify with a successful message -- Use the imported API function `checkStatus` in your function. -- Pass a callback function to `checkStatus`. It should expect to receive a string argument. -- Return the result from the `checkStatus` API function. +- Use the imported API function `notify` in your function. +- Pass an object to `notify`. It should have a property of `message`. Think about what the message value should be. +- Pay attention to the JSDoc type hint -- the function should not return a value. -## 2. See if the grocer has some fruit +## 2. Notify with an error message -- Use the imported API function `checkInventory` in your function. -- Create the query _object_ to pass as an argument. - - Follow the template in the instructions. -- Pass along the callback function to the `checkInventory` API function. -- Return the result from the `checkInventory` API function. +- Use the imported API function `notify` in your function. +- Pass another object to `notify`. It should have a property of `message`. The message value should differ from the last part. +- Pay attention to the comments [JSDoc] above the function definition: + - The function should not return a value. -## 3. Create a callback to buy fruit if the inventory is available +## 3. Place an order to buy fruit -- If the `err` argument is not null, throw a new error using `err`'s message. - - See [Error()][mdn-error-constructor] -- if the `err` is null, ignore it and just respond to the value of `isAvailable` - - This pattern is sometimes called a [`Node.js`-style callback][node-js-callback]. -- Return the action determined by `isAvailable` +- Use the already imported `order` function. +- Pay attention to the JSDoc type hints -- the function should receive 3 arguments and not return a value. +- Reuse the previously created callbacks as arguments to the order function. -## 4. Put it all together +## 4. Refactor your work into a more concise function -- Reuse the functions you have already written, composing them together. -- Return the value of the callback function. - -[mdn-error-constructor]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error -[node-js-callback]: https://nodejs.org/en/knowledge/getting-started/control-flow/what-are-callbacks/ +- Reuse the functions from the previous tasks. +- Pay attention to the JSDoc type hints -- the function should receive 2 arguments and not return a value. +- Combine the arguments into an object representing the query to the grocer to place an order. diff --git a/exercises/concept/fruit-picker/.docs/instructions.md b/exercises/concept/fruit-picker/.docs/instructions.md index 9c41e710c7..a5f1db61dc 100644 --- a/exercises/concept/fruit-picker/.docs/instructions.md +++ b/exercises/concept/fruit-picker/.docs/instructions.md @@ -37,7 +37,7 @@ const query = { orderFromGrocer( { variety: 'pear', quantity: 12 }, exampleSuccessCallback, - exampleErrorCallback + exampleErrorCallback, ); // => `order` was called with the query and the callbacks ``` diff --git a/exercises/concept/fruit-picker/.gitignore b/exercises/concept/fruit-picker/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/fruit-picker/.gitignore +++ b/exercises/concept/fruit-picker/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/fruit-picker/fruit-picker.spec.js b/exercises/concept/fruit-picker/fruit-picker.spec.js index f920705511..4ef494ce10 100644 --- a/exercises/concept/fruit-picker/fruit-picker.spec.js +++ b/exercises/concept/fruit-picker/fruit-picker.spec.js @@ -51,7 +51,7 @@ describe('task 4', () => { expect(order).toHaveBeenCalledWith( { variety, quantity }, onSuccess, - onError + onError, ); }); }); diff --git a/exercises/concept/fruit-picker/global.d.ts b/exercises/concept/fruit-picker/global.d.ts index 19087979c6..0fbffe66e8 100644 --- a/exercises/concept/fruit-picker/global.d.ts +++ b/exercises/concept/fruit-picker/global.d.ts @@ -33,7 +33,7 @@ declare module 'grocer' { function order( query: GrocerQuery, onSuccess: GrocerOnSuccessCallback, - onError: GrocerOnErrorCallback + onError: GrocerOnErrorCallback, ): void; } diff --git a/exercises/concept/fruit-picker/package.json b/exercises/concept/fruit-picker/package.json index 50d5d83acd..b0cb861518 100644 --- a/exercises/concept/fruit-picker/package.json +++ b/exercises/concept/fruit-picker/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/fruit-picker" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/high-score-board/.docs/introduction.md b/exercises/concept/high-score-board/.docs/introduction.md index a4424c2b57..8f5cf6ea04 100644 --- a/exercises/concept/high-score-board/.docs/introduction.md +++ b/exercises/concept/high-score-board/.docs/introduction.md @@ -4,7 +4,7 @@ Besides primitive data types like `number` and `string`, there is another important data type in JavaScript called `object`. Objects are collections of key-value pairs. -As such, they can be used as what is often referred to as maps or dictionaries in other languages. +As such, they can be used in the same way as what are often referred to as maps or dictionaries in other languages. In other languages, all values in a map often need to have the same data type. In JavaScript, only the type of the key is restricted: it has to be a string. diff --git a/exercises/concept/high-score-board/.gitignore b/exercises/concept/high-score-board/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/high-score-board/.gitignore +++ b/exercises/concept/high-score-board/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/high-score-board/package.json b/exercises/concept/high-score-board/package.json index 755e6df2c2..a1d2a73f2c 100644 --- a/exercises/concept/high-score-board/package.json +++ b/exercises/concept/high-score-board/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/high-score-board" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/lasagna-master/.gitignore b/exercises/concept/lasagna-master/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/lasagna-master/.gitignore +++ b/exercises/concept/lasagna-master/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/lasagna-master/lasagna-master.spec.js b/exercises/concept/lasagna-master/lasagna-master.spec.js index fb7879fef9..3181b3f6f0 100644 --- a/exercises/concept/lasagna-master/lasagna-master.spec.js +++ b/exercises/concept/lasagna-master/lasagna-master.spec.js @@ -249,7 +249,7 @@ function expectObjectsToBeEqual(actualObj, expectedObj) { for (const key in expectedObj) { expect(actualObj[key]).toBeCloseTo( expectedObj[key], - DIFFERENCE_PRECISION_IN_DIGITS + DIFFERENCE_PRECISION_IN_DIGITS, ); } expect(Object.keys(actualObj).length).toBe(Object.keys(expectedObj).length); diff --git a/exercises/concept/lasagna-master/package.json b/exercises/concept/lasagna-master/package.json index 4e9095627b..0a59b51324 100644 --- a/exercises/concept/lasagna-master/package.json +++ b/exercises/concept/lasagna-master/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/lasagna-master" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/lasagna/.gitignore b/exercises/concept/lasagna/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/lasagna/.gitignore +++ b/exercises/concept/lasagna/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/lasagna/package.json b/exercises/concept/lasagna/package.json index 06c7a98dae..7e80bd5c33 100644 --- a/exercises/concept/lasagna/package.json +++ b/exercises/concept/lasagna/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/lasagna" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/lucky-numbers/.gitignore b/exercises/concept/lucky-numbers/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/lucky-numbers/.gitignore +++ b/exercises/concept/lucky-numbers/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/lucky-numbers/package.json b/exercises/concept/lucky-numbers/package.json index f4e1219092..7f0c01259c 100644 --- a/exercises/concept/lucky-numbers/package.json +++ b/exercises/concept/lucky-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/lucky-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/mixed-juices/.docs/instructions.md b/exercises/concept/mixed-juices/.docs/instructions.md index b0e4efbf80..56ea47e264 100644 --- a/exercises/concept/mixed-juices/.docs/instructions.md +++ b/exercises/concept/mixed-juices/.docs/instructions.md @@ -50,6 +50,7 @@ To make the hand-over easier, implement a function `remainingOrders` which takes The function should return the orders that Li Mei cannot start preparing before the end of her workday. The time left in the shift will always be greater than 0. +The array of juices to prepare will never be empty. Furthermore, the orders are prepared in the order in which they appear in the array. If Li Mei starts to mix a certain juice, she will always finish it even if she has to work a bit longer. If there are no remaining orders left that Dmitry needs to take care of, an empty array should be returned. diff --git a/exercises/concept/mixed-juices/.gitignore b/exercises/concept/mixed-juices/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/mixed-juices/.gitignore +++ b/exercises/concept/mixed-juices/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/mixed-juices/package.json b/exercises/concept/mixed-juices/package.json index 9d540eec0c..99d810eb2e 100644 --- a/exercises/concept/mixed-juices/package.json +++ b/exercises/concept/mixed-juices/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/mixed-juices" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/nullability/.gitignore b/exercises/concept/nullability/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/nullability/.gitignore +++ b/exercises/concept/nullability/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/nullability/package.json b/exercises/concept/nullability/package.json index ff2aa4dec4..ea80ca9588 100644 --- a/exercises/concept/nullability/package.json +++ b/exercises/concept/nullability/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/nullability" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/ozans-playlist/.gitignore b/exercises/concept/ozans-playlist/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/ozans-playlist/.gitignore +++ b/exercises/concept/ozans-playlist/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/ozans-playlist/package.json b/exercises/concept/ozans-playlist/package.json index 0dd346052c..196e47c1d5 100644 --- a/exercises/concept/ozans-playlist/package.json +++ b/exercises/concept/ozans-playlist/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/ozans-playlist" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/pizza-order/.docs/hints.md b/exercises/concept/pizza-order/.docs/hints.md index b5296c3664..f938b628ed 100644 --- a/exercises/concept/pizza-order/.docs/hints.md +++ b/exercises/concept/pizza-order/.docs/hints.md @@ -1 +1,13 @@ # Hints + +## 1. Calculate the price of a pizza + +- Set up a recursive function that returns the price of one extra option added to the price of the pizza without that extra topping. +- If `Maximum call stack size exceeded` error is raised, check if you've missed out on the base case. +- If you're getting a `Memory Allocation Error`, check if you're duplicating the input array of toppings instead of mutating it. + +## 2. Calculate the total price of an order + +- Using `pizzaPrice`, calculate the price of each pizza in the array, and add it to a sum. +- If `Maximum call stack size exceeded` error is raised, and more than one test is failing, check if you've missed out on the base case. If only one test is failing, try implementing this with a loop! +- If you're getting a `Memory Allocation Error`, check if you're duplicating the input array instead of mutating it. diff --git a/exercises/concept/pizza-order/.docs/instructions.md b/exercises/concept/pizza-order/.docs/instructions.md index 63fd98ab00..0ae66b16ca 100644 --- a/exercises/concept/pizza-order/.docs/instructions.md +++ b/exercises/concept/pizza-order/.docs/instructions.md @@ -1 +1,89 @@ # Instructions + +You run a pizza shop, and offer three types of pizzas: + +- Margherita: $7 +- Caprese: $9 +- Formaggio: $10 + +If customers want, they can add an unlimited number of extra options: either "ExtraSauce" for $1 or "ExtraToppings" for $2. + +Your task is to write code that assists the customer in figuring out the cost to them. + +## Calculate the price of a pizza + +Provided the pizza's name as the first argument, and an unlimited number of added options, calculate the price of the pizza in dollars. + +```js +pizzaPrice('Margherita'); +// => 7 + +pizzaPrice('Caprese', 'ExtraSauce', 'ExtraToppings'); +// => 12 + +pizzaPrice( + 'Caprese', + 'ExtraToppings', + 'ExtraToppings', + 'ExtraToppings', + 'ExtraToppings', +); +// => 17 +``` + +## Calculate the total price of an order + +Your function is called with a list of `PizzaOrder`s and should return the total price of the order in dollars. +Each `PizzaOrder` has a `pizza` property - the pizza's name, and an `extras` property - the list of extra options. + +```js +const margherita = new PizzaOrder('Margherita'); +const caprese = new PizzaOrder('Caprese', 'ExtraToppings'); +orderPrice([margherita, caprese]); +// => 18 +``` + +You'll realize that you can't write this using recursion, as one test with a tremendous amount of orders will raise a `Maximum call stack size exceeded`. +No worries, this is intentional - try implementing this function using an imperative loop! +You have many options, such as, but not limited to using `reduce` or a `for` loop. + + +~~~~exercism/advanced +When the JavaScript interpreter is running the JavaScript code, it will keep track of which functions it has entered (started to call) on a data structure called "a stack". +When the function returns (ends), it is removed from the stack. + +However, this stack has a limited size. +The most common mistake made is a recursive function that never ends. +Each call is placed on the stack, but before it returns, another call is placed on the stack. + +```javascript +function kaboom() { + kaboom() +} + +kaboom() +// => RangeError: Maximum call stack size exceeded +``` + +The stacktrace of this error shows the same line over and over, which makes sense, because the function calls itself. +Whilst it has no real practical application in most cases, you can find out how tall that stack can get. + +```javascript +let calls = 0; +function kaboom() { + calls +=1 ; + kaboom() +} + +kaboom() +// => RangeError: Maximum call stack size exceeded + +console.log(calls) +// => a number, generally higher than 10.000 +``` + +There are only two viable solutions to a call stack error caused by a synchronous recursive function: +- ensure the functions return before the stack limit is reached, usually by adding or fixing a base case. +- rewrite the recursive function to an imperative loop, which will execute the body of the loop, without having to enter a function, thus without increasing the stack. +~~~~ + diff --git a/exercises/concept/pizza-order/.docs/introduction.md b/exercises/concept/pizza-order/.docs/introduction.md index e10b99d013..28571cd59a 100644 --- a/exercises/concept/pizza-order/.docs/introduction.md +++ b/exercises/concept/pizza-order/.docs/introduction.md @@ -1 +1,73 @@ # Introduction + +The ability for something to be defined in terms of itself is called recursion. +Recursive functions are functions that call themselves. + +Suppose that you have a function called `recurse`. +This function is recursive if it calls itself inside its body, like this: + +```js +function recurse() { + // ... + recurse(); + // ... +} +``` + +A recursive function usually has a condition to stop calling itself and return a value, known as a _base case_. +If a base case is missing, in most cases, because it will call itself indefinitely, it would be able to run forever. +In reality, in most of those situations, you'll end up with a "StackSize error": an error raised by the runtime because the _stack_ of function calls has grown beyond a predefined limit because each recursive call adds to this _stack_ until it returns (and it doesn't). +The message of this error is `Maximum call stack size exceeded`. + +```js +function recurse() { + if (baseCondition) { + // stop calling itself + //... + } else { + recurse(); + } +} +``` + +Recursive functions often can be used instead of `for` loops for more succinct code. +For example, take a countdown. +Here's the more intuitive `for` loop approach: + +```js +function countDown(fromNumber) { + for (let i = fromNumber; i > 0; i--) { + console.log(i); + } +} + +countDown(3); // 3, 2, 1 in separate lines +``` + +We could solve this using recursion too: + +```js +function countDown(fromNumber) { + console.log(fromNumber); + if (fromNumber > 1) { + countDown(fromNumber - 1); + } +} + +countDown(3); // same result +``` + +Here, our base case is when `fromNumber` is 1, in which case we don't call `countDown` again. + +Apart from just displaying numbers, recursive functions can be used for more complicated procedures, such as keeping a sum or total. + +```js +function sum(n) { + if (n <= 1) { + return n; + } + return n + sum(n - 1); +} + +sum(3); // 6 +``` diff --git a/exercises/concept/pizza-order/.gitignore b/exercises/concept/pizza-order/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/pizza-order/.gitignore +++ b/exercises/concept/pizza-order/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/pizza-order/.meta/config.json b/exercises/concept/pizza-order/.meta/config.json index 38818be8cf..70c3534429 100644 --- a/exercises/concept/pizza-order/.meta/config.json +++ b/exercises/concept/pizza-order/.meta/config.json @@ -1,6 +1,7 @@ { "authors": [ - "SleeplessByte" + "SleeplessByte", + "safwansamsudeen" ], "files": { "solution": [ @@ -16,7 +17,7 @@ "forked_from": [ "fsharp/pizza-pricing" ], - "blurb": "TODO: add blurb for recursion exercise", + "blurb": "Allow customers to calculate the cost of their order", "custom": { "version.tests.compatibility": "jest-27", "flag.tests.task-per-describe": false, diff --git a/exercises/concept/pizza-order/.meta/exemplar.js b/exercises/concept/pizza-order/.meta/exemplar.js index 2eba3fed43..31ac0d6ba7 100644 --- a/exercises/concept/pizza-order/.meta/exemplar.js +++ b/exercises/concept/pizza-order/.meta/exemplar.js @@ -41,6 +41,6 @@ export function pizzaPrice(pizza, ...[extra, ...otherExtras]) { export function orderPrice(pizzaOrders) { return pizzaOrders.reduce( (result, order) => result + pizzaPrice(order.pizza, ...order.extras), - 0 + 0, ); } diff --git a/exercises/concept/pizza-order/package.json b/exercises/concept/pizza-order/package.json index 760603c369..e4b529da7c 100644 --- a/exercises/concept/pizza-order/package.json +++ b/exercises/concept/pizza-order/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/pizza-order" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/pizza-order/pizza-order.spec.js b/exercises/concept/pizza-order/pizza-order.spec.js index 98c8adf86f..7af2e206fd 100644 --- a/exercises/concept/pizza-order/pizza-order.spec.js +++ b/exercises/concept/pizza-order/pizza-order.spec.js @@ -64,8 +64,8 @@ describe('Price for pizza caprese with a lot of extra toppings', () => { 'ExtraToppings', 'ExtraToppings', 'ExtraToppings', - 'ExtraToppings' - ) + 'ExtraToppings', + ), ).toBe(17); }); }); @@ -108,14 +108,14 @@ describe('Order price for one pizza margherita with a LOT of sauce and one pizza 'Margherita', 'ExtraSauce', 'ExtraSauce', - 'ExtraSauce' + 'ExtraSauce', ); const toppedCaprese = new PizzaOrder( 'Caprese', 'ExtraToppings', 'ExtraToppings', 'ExtraToppings', - 'ExtraToppings' + 'ExtraToppings', ); expect(orderPrice([saucyMargherita, toppedCaprese])).toBe(27); @@ -136,14 +136,14 @@ describe('Order price for very large order', () => { const formaggio3 = new PizzaOrder( 'Formaggio', 'ExtraSauce', - 'ExtraToppings' + 'ExtraToppings', ); const formaggio4 = new PizzaOrder( 'Formaggio', 'ExtraToppings', 'ExtraSauce', 'ExtraToppings', - 'ExtraSauce' + 'ExtraSauce', ); const actual = orderPrice([ @@ -163,7 +163,7 @@ describe('Order price for very large order', () => { describe('Order price for a gigantic order', () => { it('orderPrice([/* lots of */])', () => { const allTheMargheritas = Array(100 * 1000).fill( - new PizzaOrder('Margherita') + new PizzaOrder('Margherita'), ); const actual = orderPrice(allTheMargheritas); expect(actual).toBe(700 * 1000); diff --git a/exercises/concept/poetry-club-door-policy/.gitignore b/exercises/concept/poetry-club-door-policy/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/poetry-club-door-policy/.gitignore +++ b/exercises/concept/poetry-club-door-policy/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/poetry-club-door-policy/.meta/exemplar.js b/exercises/concept/poetry-club-door-policy/.meta/exemplar.js index 0dc048defb..65d2d57941 100644 --- a/exercises/concept/poetry-club-door-policy/.meta/exemplar.js +++ b/exercises/concept/poetry-club-door-policy/.meta/exemplar.js @@ -42,5 +42,5 @@ export function backDoorResponse(line) { * @returns {string} the back door password */ export function backDoorPassword(word) { - return frontDoorPassword(word) + `, please`; + return frontDoorPassword(word) + ', please'; } diff --git a/exercises/concept/poetry-club-door-policy/door-policy.spec.js b/exercises/concept/poetry-club-door-policy/door-policy.spec.js index db1079ee5d..201054bafc 100644 --- a/exercises/concept/poetry-club-door-policy/door-policy.spec.js +++ b/exercises/concept/poetry-club-door-policy/door-policy.spec.js @@ -61,12 +61,12 @@ describe('front door password', () => { expect(frontDoorPassword('SUMMER')).toBe('Summer'); }); - test('should capitalize SOPHIA', () => { - expect(frontDoorPassword('SOPHIA')).toBe('Sophia'); + test('should capitalize sophia', () => { + expect(frontDoorPassword('sophia')).toBe('Sophia'); }); - test('should capitalize CODE', () => { - expect(frontDoorPassword('CODE')).toBe('Code'); + test('should capitalize Code', () => { + expect(frontDoorPassword('Code')).toBe('Code'); }); }); diff --git a/exercises/concept/poetry-club-door-policy/package.json b/exercises/concept/poetry-club-door-policy/package.json index be96eee3c3..87de96d761 100644 --- a/exercises/concept/poetry-club-door-policy/package.json +++ b/exercises/concept/poetry-club-door-policy/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/poetry-club-door-policy" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/regular-chatbot/.docs/instructions.md b/exercises/concept/regular-chatbot/.docs/instructions.md index c3683597b1..01196b361f 100644 --- a/exercises/concept/regular-chatbot/.docs/instructions.md +++ b/exercises/concept/regular-chatbot/.docs/instructions.md @@ -53,10 +53,10 @@ If the number is valid (matches the character sequence specified by the **regula The expected format is: (+##) ###-###-### ```javascript -isValidNumber('(+34) 659-771-594'); +checkPhoneNumber('(+34) 659-771-594'); // => "Thanks! You can now download me to your phone." -isValidNumber('659-771-594'); -// => "Oops, it seems like I can't reach out to 6s59-771-594" +checkPhoneNumber('659-771-594'); +// => "Oops, it seems like I can't reach out to 659-771-594" ``` ## Get website link @@ -81,13 +81,13 @@ For storing data from all the persons who have had a conversation with, the chat In this way, we want our chatbot to be really polite and make a good impression. -Write the function `NiceToMeetYou()` that takes a string with the full name of the user, and returns the string **“Nice to meet you, John Smith”** +Write the function `niceToMeetYou()` that takes a string with the full name of the user, and returns the string **“Nice to meet you, John Smith”** For learning purposes, implement the function using a **replacement method** from Regular Expressions. ```javascript -let str = 'smith, john'; +let str = 'Smith, John'; -NiceToMeetYou(str); -// => "Nice to meet you John Smith" +niceToMeetYou(str); +// => "Nice to meet you, John Smith" ``` diff --git a/exercises/concept/regular-chatbot/.docs/introduction.md b/exercises/concept/regular-chatbot/.docs/introduction.md index 97f66508a7..9d4b09ac22 100644 --- a/exercises/concept/regular-chatbot/.docs/introduction.md +++ b/exercises/concept/regular-chatbot/.docs/introduction.md @@ -73,7 +73,7 @@ These are some of the most common functions used alongside regex. ### Test -The [test()][mdn-regex-test]] method executes a search for a match between a regular expression and a specified string. Returns true or false. +The [test()][mdn-regex-test] method executes a search for a match between a regular expression and a specified string. Returns true or false. ```javascript const str = 'It is difficult to test if you have a virus'; @@ -97,7 +97,7 @@ const regex1 = /someone/; const regex2 = /happy/; funnyQuote.match(regex1); -// => ["someone", index: 3, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined] +// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined] funnyQuote.match(regex2); // => null diff --git a/exercises/concept/regular-chatbot/.gitignore b/exercises/concept/regular-chatbot/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/regular-chatbot/.gitignore +++ b/exercises/concept/regular-chatbot/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/regular-chatbot/package.json b/exercises/concept/regular-chatbot/package.json index b017d236e8..3d7fba064a 100644 --- a/exercises/concept/regular-chatbot/package.json +++ b/exercises/concept/regular-chatbot/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/regular-chatbot" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/regular-chatbot/regular-chatbot.js b/exercises/concept/regular-chatbot/regular-chatbot.js index a4363095c7..fd141786b1 100644 --- a/exercises/concept/regular-chatbot/regular-chatbot.js +++ b/exercises/concept/regular-chatbot/regular-chatbot.js @@ -12,7 +12,7 @@ export function isValidCommand(command) { } /** - * Given a certain message, help the chatbot get rid of all the emoji's encryption throught the message. + * Given a certain message, help the chatbot get rid of all the emoji's encryption through the message. * * @param {string} message * @returns {string} The message without the emojis encryption @@ -32,7 +32,7 @@ export function checkPhoneNumber(number) { } /** - * Given a certain response from the user, help the chatbot get only the URL + * Given a certain response from the user, help the chatbot get only the URL. * * @param {string} userInput * @returns {string[] | null} all the possible URL's that the user may have answered @@ -42,7 +42,7 @@ export function getURL(userInput) { } /** - * Greet the user using its full name data from the profile + * Greet the user using the full name data from the profile. * * @param {string} fullName * @returns {string} Greeting from the chatbot diff --git a/exercises/concept/regular-chatbot/regular-chatbot.spec.js b/exercises/concept/regular-chatbot/regular-chatbot.spec.js index 63f8a58645..0399dae4ba 100644 --- a/exercises/concept/regular-chatbot/regular-chatbot.spec.js +++ b/exercises/concept/regular-chatbot/regular-chatbot.spec.js @@ -9,19 +9,19 @@ import { describe('isValidCommand', () => { test('recognizes wheter the command is at the first position', () => { expect(isValidCommand('Chatbot, Do you understand this command?')).toBe( - true + true, ); expect( isValidCommand( - 'Hey Chatbot, please tell me what is the weather for tomorrow.' - ) + 'Hey Chatbot, please tell me what is the weather for tomorrow.', + ), ).toBe(false); }); test('does not care about UPPERCASE or lowercase', () => { expect(isValidCommand('CHATBOT, Is it okey if I shout at you?')).toBe(true); expect( - isValidCommand('chatbot, please tell me what is happening here.') + isValidCommand('chatbot, please tell me what is happening here.'), ).toBe(true); }); }); @@ -30,14 +30,14 @@ describe('removeEmoji', () => { test('removes properly one single emoji encryption', () => { const expected = 'What was your name? Sorry I forgot about it.'; expect( - removeEmoji('What was your name? emoji2134 Sorry I forgot about it.') + removeEmoji('What was your name? emoji2134 Sorry I forgot about it.'), ).toBe(expected); }); test('removes all the emoji encryption', () => { const expected = ' How about ordering ?'; expect(removeEmoji('emoji5321 How about ordering emoji8921 ?')).toBe( - expected + expected, ); }); }); @@ -51,10 +51,10 @@ describe('checkPhoneNumber', () => { test('informs the user that it is a wrong phone number format', () => { expect(checkPhoneNumber('322-787-654')).toBe( - "Oops, it seems like I can't reach out to 322-787-654" + "Oops, it seems like I can't reach out to 322-787-654", ); expect(checkPhoneNumber('4355-67-274')).toBe( - "Oops, it seems like I can't reach out to 4355-67-274" + "Oops, it seems like I can't reach out to 4355-67-274", ); }); }); @@ -65,7 +65,7 @@ describe('getURL', () => { 'youtube.com', ]); expect( - getURL('There is a cool website called theodinproject.com to learn from') + getURL('There is a cool website called theodinproject.com to learn from'), ).toStrictEqual(['theodinproject.com']); }); @@ -81,7 +81,7 @@ describe('niceToMeetYou', () => { test('greets the user by its proper name', () => { expect(niceToMeetYou('Sanz, Pablo')).toBe('Nice to meet you, Pablo Sanz'); expect(niceToMeetYou('Stephan, Sandro')).toBe( - 'Nice to meet you, Sandro Stephan' + 'Nice to meet you, Sandro Stephan', ); }); }); diff --git a/exercises/concept/translation-service/.gitignore b/exercises/concept/translation-service/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/translation-service/.gitignore +++ b/exercises/concept/translation-service/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/translation-service/.meta/exemplar.alternative.js b/exercises/concept/translation-service/.meta/exemplar.alternative.js index 37816be861..fc64e8345f 100644 --- a/exercises/concept/translation-service/.meta/exemplar.alternative.js +++ b/exercises/concept/translation-service/.meta/exemplar.alternative.js @@ -100,7 +100,7 @@ export class QualityThresholdNotMet extends Error { super( ` The translation of ${text} does not meet the requested quality threshold. - `.trim() + `.trim(), ); } } @@ -110,7 +110,7 @@ export class BatchIsEmpty extends Error { super( ` Requested a batch translation, but there are no texts in the batch. - `.trim() + `.trim(), ); } } diff --git a/exercises/concept/translation-service/.meta/exemplar.js b/exercises/concept/translation-service/.meta/exemplar.js index b8a372b28a..6219de5e24 100644 --- a/exercises/concept/translation-service/.meta/exemplar.js +++ b/exercises/concept/translation-service/.meta/exemplar.js @@ -96,7 +96,7 @@ export class QualityThresholdNotMet extends Error { */ constructor(text) { super( - `The translation of ${text} does not meet the requested quality threshold.` + `The translation of ${text} does not meet the requested quality threshold.`, ); this.text = text; @@ -110,7 +110,7 @@ export class QualityThresholdNotMet extends Error { export class BatchIsEmpty extends Error { constructor() { super( - `Requested a batch translation, but there are no texts in the batch.` + `Requested a batch translation, but there are no texts in the batch.`, ); } } diff --git a/exercises/concept/translation-service/api.js b/exercises/concept/translation-service/api.js index 26f642f3b9..e0284a6ec2 100644 --- a/exercises/concept/translation-service/api.js +++ b/exercises/concept/translation-service/api.js @@ -41,7 +41,7 @@ export class ExternalApi { fetch(text) { if (typeof text !== 'string') { throw new BadRequest( - `Expected text when calling fetch(text), actual ${typeof text}.` + `Expected text when calling fetch(text), actual ${typeof text}.`, ); } @@ -68,13 +68,13 @@ export class ExternalApi { request(text, callback) { if (typeof text !== 'string') { throw new BadRequest( - `Expected string text when calling request(text, callback), actual ${typeof text}.` + `Expected string text when calling request(text, callback), actual ${typeof text}.`, ); } if (typeof callback !== 'function') { throw new BadRequest( - `Expected callback function when calling fetch(text, callback), actual ${typeof callback}.` + `Expected callback function when calling fetch(text, callback), actual ${typeof callback}.`, ); } @@ -90,7 +90,7 @@ export class ExternalApi { // If it's now available, yay, otherwise, nay setTimeout( () => callback(this.values[text][0] ? undefined : makeRandomError()), - 1 + 1, ); return; } diff --git a/exercises/concept/translation-service/errors.js b/exercises/concept/translation-service/errors.js index 7c98b921a4..5f25ae705b 100644 --- a/exercises/concept/translation-service/errors.js +++ b/exercises/concept/translation-service/errors.js @@ -3,7 +3,7 @@ export class NotAvailable extends Error { super( ` The requested text "${text}" has not been translated yet. - `.trim() + `.trim(), ); } } @@ -15,7 +15,7 @@ export class AbusiveClientError extends Error { Your client has been rejected because of abusive behaviour. naDevvo’ yIghoS! - `.trim() + `.trim(), ); } } diff --git a/exercises/concept/translation-service/global.d.ts b/exercises/concept/translation-service/global.d.ts index 5276467907..a3dfdeef46 100644 --- a/exercises/concept/translation-service/global.d.ts +++ b/exercises/concept/translation-service/global.d.ts @@ -17,5 +17,5 @@ interface Translation { type fetchTranslation = (text: string) => Promise; type requestTranslation = ( text: string, - callback: (err?: Error) => void + callback: (err?: Error) => void, ) => void; diff --git a/exercises/concept/translation-service/package.json b/exercises/concept/translation-service/package.json index 2b1a7fdcc3..cbc6ed404b 100644 --- a/exercises/concept/translation-service/package.json +++ b/exercises/concept/translation-service/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/translation-service" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/translation-service/service.js b/exercises/concept/translation-service/service.js index d1ee3b1c79..3320abef61 100644 --- a/exercises/concept/translation-service/service.js +++ b/exercises/concept/translation-service/service.js @@ -84,7 +84,7 @@ export class QualityThresholdNotMet extends Error { super( ` The translation of ${text} does not meet the requested quality threshold. - `.trim() + `.trim(), ); this.text = text; @@ -100,7 +100,7 @@ export class BatchIsEmpty extends Error { super( ` Requested a batch translation, but there are no texts in the batch. - `.trim() + `.trim(), ); } } diff --git a/exercises/concept/vehicle-purchase/.docs/hints.md b/exercises/concept/vehicle-purchase/.docs/hints.md index 7aad9c2126..a57dd002bd 100644 --- a/exercises/concept/vehicle-purchase/.docs/hints.md +++ b/exercises/concept/vehicle-purchase/.docs/hints.md @@ -1,6 +1,6 @@ # Hints -## 1. Determine if you will need a drivers licence +## 1. Determine if you will need a drivers license - Use the [strict equals operator][mdn-equality-operators] to check whether your input equals a certain string. - Use one of the two [logical operators][mdn-logical-operators] you learned about in the boolean concept to combine the two requirements. diff --git a/exercises/concept/vehicle-purchase/.docs/instructions.md b/exercises/concept/vehicle-purchase/.docs/instructions.md index 769dd2d957..b0dd514a3e 100644 --- a/exercises/concept/vehicle-purchase/.docs/instructions.md +++ b/exercises/concept/vehicle-purchase/.docs/instructions.md @@ -2,9 +2,9 @@ In this exercise, you will write some code to help you prepare to buy a vehicle. -You have three tasks, one to determine if you will need to get a licence, one to help you choose between two vehicles and one to estimate the acceptable price for a used vehicle. +You have three tasks, one to determine if you will need to get a license, one to help you choose between two vehicles and one to estimate the acceptable price for a used vehicle. -## 1. Determine if you will need a drivers licence +## 1. Determine if you will need a drivers license Some kinds of vehicles require a drivers license to operate them. Assume only the kinds `'car'` and `'truck'` require a license, everything else can be operated without a license. @@ -41,7 +41,7 @@ For a rough estimate, assume if the vehicle is less than 3 years old, it costs 8 If it is more than 10 years old, it costs 50%. If the vehicle is at least 3 years old but not older than 10 years, it costs 70% of the original price. -Implement the `calculateResellPrice(originalPrice, age)` function that applies this logic using `if`, `else if` and `else` (there are other ways but you want to practice). +Implement the `calculateResellPrice(originalPrice, age)` function that applies this logic using `if`, `else if` and `else` (there are other ways if you want to practice). It takes the original price and the age of the vehicle as arguments and returns the estimated price in the dealership. ```javascript diff --git a/exercises/concept/vehicle-purchase/.gitignore b/exercises/concept/vehicle-purchase/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/vehicle-purchase/.gitignore +++ b/exercises/concept/vehicle-purchase/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/vehicle-purchase/.meta/exemplar.js b/exercises/concept/vehicle-purchase/.meta/exemplar.js index e603c18d30..69b3abf8c2 100644 --- a/exercises/concept/vehicle-purchase/.meta/exemplar.js +++ b/exercises/concept/vehicle-purchase/.meta/exemplar.js @@ -5,7 +5,7 @@ // implementing this exercise. /** - * Determines whether or not you need a licence to operate a certain kind of vehicle. + * Determines whether or not you need a license to operate a certain kind of vehicle. * * @param {string} kind * @returns {boolean} whether a license is required diff --git a/exercises/concept/vehicle-purchase/package.json b/exercises/concept/vehicle-purchase/package.json index 5af75623f2..7a834ea3bd 100644 --- a/exercises/concept/vehicle-purchase/package.json +++ b/exercises/concept/vehicle-purchase/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/vehicle-purchase" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/concept/vehicle-purchase/vehicle-purchase.js b/exercises/concept/vehicle-purchase/vehicle-purchase.js index fc97fa7f91..d635d2c7ce 100644 --- a/exercises/concept/vehicle-purchase/vehicle-purchase.js +++ b/exercises/concept/vehicle-purchase/vehicle-purchase.js @@ -5,7 +5,7 @@ // implementing this exercise. /** - * Determines whether or not you need a licence to operate a certain kind of vehicle. + * Determines whether or not you need a license to operate a certain kind of vehicle. * * @param {string} kind * @returns {boolean} whether a license is required diff --git a/exercises/concept/vehicle-purchase/vehicle-purchase.spec.js b/exercises/concept/vehicle-purchase/vehicle-purchase.spec.js index 12c5cc1a59..8686736d9a 100644 --- a/exercises/concept/vehicle-purchase/vehicle-purchase.spec.js +++ b/exercises/concept/vehicle-purchase/vehicle-purchase.spec.js @@ -31,19 +31,19 @@ describe('chooseVehicle', () => { test('correctly recommends the first option', () => { expect(chooseVehicle('Bugatti Veyron', 'Ford Pinto')).toBe( - 'Bugatti Veyron' + rest + 'Bugatti Veyron' + rest, ); expect(chooseVehicle('Chery EQ', 'Kia Niro Elektro')).toBe( - 'Chery EQ' + rest + 'Chery EQ' + rest, ); }); test('correctly recommends the second option', () => { expect(chooseVehicle('Ford Pinto', 'Bugatti Veyron')).toBe( - 'Bugatti Veyron' + rest + 'Bugatti Veyron' + rest, ); expect(chooseVehicle('2020 Gazelle Medeo', '2018 Bergamont City')).toBe( - '2018 Bergamont City' + rest + '2018 Bergamont City' + rest, ); }); }); diff --git a/exercises/concept/windowing-system/.gitignore b/exercises/concept/windowing-system/.gitignore index bdb912f98a..31c57dd53a 100644 --- a/exercises/concept/windowing-system/.gitignore +++ b/exercises/concept/windowing-system/.gitignore @@ -1,3 +1,5 @@ -node_modules -yarn-error.log - +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/concept/windowing-system/package.json b/exercises/concept/windowing-system/package.json index e8a2a231ca..7ea522c072 100644 --- a/exercises/concept/windowing-system/package.json +++ b/exercises/concept/windowing-system/package.json @@ -10,15 +10,15 @@ "directory": "exercises/concept/windowing-system" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/accumulate/.gitignore b/exercises/practice/accumulate/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/accumulate/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/accumulate/accumulate.spec.js b/exercises/practice/accumulate/accumulate.spec.js index dc5e9f0da8..efaffe7679 100644 --- a/exercises/practice/accumulate/accumulate.spec.js +++ b/exercises/practice/accumulate/accumulate.spec.js @@ -22,14 +22,14 @@ describe('accumulate()', () => { const accumulator = (word) => word.split('').reverse().join(''); const result = accumulate( 'the quick brown fox etc'.split(/\s/), - accumulator + accumulator, ); expect(result).toEqual(['eht', 'kciuq', 'nworb', 'xof', 'cte']); }); xtest('accumulate recursively', () => { const result = accumulate('a b c'.split(/\s/), (char) => - accumulate('1 2 3'.split(/\s/), (digit) => char + digit) + accumulate('1 2 3'.split(/\s/), (digit) => char + digit), ); expect(result).toEqual([ diff --git a/exercises/practice/accumulate/package.json b/exercises/practice/accumulate/package.json index 531eca8090..49c699dc62 100644 --- a/exercises/practice/accumulate/package.json +++ b/exercises/practice/accumulate/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/accumulate" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/acronym/.gitignore b/exercises/practice/acronym/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/acronym/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/acronym/acronym.spec.js b/exercises/practice/acronym/acronym.spec.js index a8cc6f9f45..574bfb804a 100644 --- a/exercises/practice/acronym/acronym.spec.js +++ b/exercises/practice/acronym/acronym.spec.js @@ -30,8 +30,8 @@ describe('Acronyms are produced from', () => { xtest('long phrases', () => { expect( parse( - 'Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me' - ) + 'Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me', + ), ).toEqual('ROTFLSHTMDCOALM'); }); diff --git a/exercises/practice/acronym/package.json b/exercises/practice/acronym/package.json index 7140d27b46..17108f2ec8 100644 --- a/exercises/practice/acronym/package.json +++ b/exercises/practice/acronym/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/acronym" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/affine-cipher/.gitignore b/exercises/practice/affine-cipher/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/affine-cipher/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/affine-cipher/affine-cipher.spec.js b/exercises/practice/affine-cipher/affine-cipher.spec.js index 9156312c5d..8431242ab4 100644 --- a/exercises/practice/affine-cipher/affine-cipher.spec.js +++ b/exercises/practice/affine-cipher/affine-cipher.spec.js @@ -24,19 +24,22 @@ describe('Affine cipher', () => { xtest('encode numbers', () => { expect(encode('Testing,1 2 3, testing.', { a: 3, b: 4 })).toBe( - 'jqgjc rw123 jqgjc rw' + 'jqgjc rw123 jqgjc rw', ); }); xtest('encode deep thought', () => { expect(encode('Truth is fiction.', { a: 5, b: 17 })).toBe( - 'iynia fdqfb ifje' + 'iynia fdqfb ifje', ); }); xtest('encode all the letters', () => { expect( - encode('The quick brown fox jumps over the lazy dog.', { a: 17, b: 33 }) + encode('The quick brown fox jumps over the lazy dog.', { + a: 17, + b: 33, + }), ).toBe('swxtj npvyk lruol iejdc blaxk swxmh qzglf'); }); @@ -53,31 +56,31 @@ describe('Affine cipher', () => { xtest('decode a sentence', () => { expect( - decode('qdwju nqcro muwhn odqun oppmd aunwd o', { a: 19, b: 16 }) + decode('qdwju nqcro muwhn odqun oppmd aunwd o', { a: 19, b: 16 }), ).toBe('anobstacleisoftenasteppingstone'); }); xtest('decode numbers', () => { expect(decode('odpoz ub123 odpoz ub', { a: 25, b: 7 })).toBe( - 'testing123testing' + 'testing123testing', ); }); xtest('decode all the letters', () => { expect( - decode('swxtj npvyk lruol iejdc blaxk swxmh qzglf', { a: 17, b: 33 }) + decode('swxtj npvyk lruol iejdc blaxk swxmh qzglf', { a: 17, b: 33 }), ).toBe('thequickbrownfoxjumpsoverthelazydog'); }); xtest('decode with no spaces in input', () => { expect( - decode('swxtjnpvyklruoliejdcblaxkswxmhqzglf', { a: 17, b: 33 }) + decode('swxtjnpvyklruoliejdcblaxkswxmhqzglf', { a: 17, b: 33 }), ).toBe('thequickbrownfoxjumpsoverthelazydog'); }); xtest('decode with too many spaces', () => { expect(decode('vszzm cly yd cg qdp', { a: 15, b: 16 })).toBe( - 'jollygreengiant' + 'jollygreengiant', ); }); diff --git a/exercises/practice/affine-cipher/package.json b/exercises/practice/affine-cipher/package.json index ad91f971f1..d23ffe9687 100644 --- a/exercises/practice/affine-cipher/package.json +++ b/exercises/practice/affine-cipher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/affine-cipher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/all-your-base/.gitignore b/exercises/practice/all-your-base/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/all-your-base/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/all-your-base/.meta/proof.ci.js b/exercises/practice/all-your-base/.meta/proof.ci.js index 57eb0a2873..f7bd2176e2 100644 --- a/exercises/practice/all-your-base/.meta/proof.ci.js +++ b/exercises/practice/all-your-base/.meta/proof.ci.js @@ -44,7 +44,7 @@ export const convert = (array, inputBase, outputBase) => { } const decimalValue = array.reduce( (accumulator, value) => accumulator * inputBase + value, - 0 + 0, ); return convertFromDecimalToBase(decimalValue, outputBase); }; diff --git a/exercises/practice/all-your-base/package.json b/exercises/practice/all-your-base/package.json index a2f2828dd1..73ba5713d2 100644 --- a/exercises/practice/all-your-base/package.json +++ b/exercises/practice/all-your-base/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/all-your-base" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/allergies/.gitignore b/exercises/practice/allergies/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/allergies/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/allergies/.meta/proof.ci.js b/exercises/practice/allergies/.meta/proof.ci.js index 9b997105a8..1bc999f006 100644 --- a/exercises/practice/allergies/.meta/proof.ci.js +++ b/exercises/practice/allergies/.meta/proof.ci.js @@ -17,7 +17,7 @@ export class Allergies { list() { // eslint-disable-next-line no-bitwise, no-restricted-properties return possibleAllergies.filter( - (allergy, i) => this.allergenIndex & Math.pow(2, i) + (allergy, i) => this.allergenIndex & Math.pow(2, i), ); } diff --git a/exercises/practice/allergies/package.json b/exercises/practice/allergies/package.json index e632f52d6e..1a054457d1 100644 --- a/exercises/practice/allergies/package.json +++ b/exercises/practice/allergies/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/allergies" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/alphametics/.gitignore b/exercises/practice/alphametics/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/alphametics/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/alphametics/.meta/proof.ci.js b/exercises/practice/alphametics/.meta/proof.ci.js index f982eb4543..fe9b11f9d9 100644 --- a/exercises/practice/alphametics/.meta/proof.ci.js +++ b/exercises/practice/alphametics/.meta/proof.ci.js @@ -38,7 +38,7 @@ function testPermutation(letterCounts, numbers) { return counts.reduce((sum, count, i) => sum + count * numbers[i], 0) === 0 ? letters.reduce( (solution, letter, i) => ({ ...solution, [letter]: numbers[i] }), - {} + {}, ) : null; } diff --git a/exercises/practice/alphametics/package.json b/exercises/practice/alphametics/package.json index b729bcc6ed..6452568cbc 100644 --- a/exercises/practice/alphametics/package.json +++ b/exercises/practice/alphametics/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/alphametics" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/anagram/.gitignore b/exercises/practice/anagram/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/anagram/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/anagram/.meta/proof.ci.js b/exercises/practice/anagram/.meta/proof.ci.js index 0147356fdc..ac53a2c23c 100644 --- a/exercises/practice/anagram/.meta/proof.ci.js +++ b/exercises/practice/anagram/.meta/proof.ci.js @@ -7,6 +7,6 @@ export const findAnagrams = (subject, candidates) => { const wordsCopy = Array.isArray(candidates) ? candidates : [...candidates]; return wordsCopy.filter( (candidate) => - !sameWord(subject, candidate) && isAnagram(subject, candidate) + !sameWord(subject, candidate) && isAnagram(subject, candidate), ); }; diff --git a/exercises/practice/anagram/anagram.spec.js b/exercises/practice/anagram/anagram.spec.js index bea592ea5b..3d999c30fd 100644 --- a/exercises/practice/anagram/anagram.spec.js +++ b/exercises/practice/anagram/anagram.spec.js @@ -3,7 +3,7 @@ import { findAnagrams } from './anagram'; describe('Anagram', () => { test('no matches', () => { expect( - findAnagrams('diaper', ['hello', 'world', 'zombies', 'pants']) + findAnagrams('diaper', ['hello', 'world', 'zombies', 'pants']), ).toEqual([]); }); @@ -20,7 +20,7 @@ describe('Anagram', () => { xtest('detects anagram', () => { expect( - findAnagrams('listen', ['enlists', 'google', 'inlets', 'banana']) + findAnagrams('listen', ['enlists', 'google', 'inlets', 'banana']), ).toEqual(['inlets']); }); @@ -33,7 +33,7 @@ describe('Anagram', () => { 'clergy', 'largely', 'leading', - ]) + ]), ).toEqual(['gallery', 'regally', 'largely']); }); @@ -47,19 +47,19 @@ describe('Anagram', () => { xtest('detects anagrams case-insensitively', () => { expect( - findAnagrams('Orchestra', ['cashregister', 'Carthorse', 'radishes']) + findAnagrams('Orchestra', ['cashregister', 'Carthorse', 'radishes']), ).toEqual(['Carthorse']); }); xtest('detects anagrams using case-insensitive subject', () => { expect( - findAnagrams('Orchestra', ['cashregister', 'carthorse', 'radishes']) + findAnagrams('Orchestra', ['cashregister', 'carthorse', 'radishes']), ).toEqual(['carthorse']); }); xtest('detects anagrams using case-insensitive possible matches', () => { expect( - findAnagrams('orchestra', ['cashregister', 'Carthorse', 'radishes']) + findAnagrams('orchestra', ['cashregister', 'Carthorse', 'radishes']), ).toEqual(['Carthorse']); }); diff --git a/exercises/practice/anagram/package.json b/exercises/practice/anagram/package.json index b3b5b5220f..db8fda82bb 100644 --- a/exercises/practice/anagram/package.json +++ b/exercises/practice/anagram/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/anagram" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/armstrong-numbers/.gitignore b/exercises/practice/armstrong-numbers/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/armstrong-numbers/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/armstrong-numbers/.meta/proof.ci.js b/exercises/practice/armstrong-numbers/.meta/proof.ci.js index 0fe35c82e6..374d60c090 100644 --- a/exercises/practice/armstrong-numbers/.meta/proof.ci.js +++ b/exercises/practice/armstrong-numbers/.meta/proof.ci.js @@ -2,7 +2,7 @@ export const isArmstrongNumber = (input) => { const digits = [...String(input)]; const sum = digits.reduce( (total, current) => total + current ** digits.length, - 0 + 0, ); return sum === input; }; diff --git a/exercises/practice/armstrong-numbers/package.json b/exercises/practice/armstrong-numbers/package.json index 796265cfba..1667e56ae7 100644 --- a/exercises/practice/armstrong-numbers/package.json +++ b/exercises/practice/armstrong-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/armstrong-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/atbash-cipher/.gitignore b/exercises/practice/atbash-cipher/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/atbash-cipher/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/atbash-cipher/package.json b/exercises/practice/atbash-cipher/package.json index 61fa5f5492..2177bba776 100644 --- a/exercises/practice/atbash-cipher/package.json +++ b/exercises/practice/atbash-cipher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/atbash-cipher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/bank-account/.gitignore b/exercises/practice/bank-account/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/bank-account/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/bank-account/package.json b/exercises/practice/bank-account/package.json index 2ed3be3986..24a0e4c034 100644 --- a/exercises/practice/bank-account/package.json +++ b/exercises/practice/bank-account/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/bank-account" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/beer-song/.gitignore b/exercises/practice/beer-song/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/beer-song/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/beer-song/.meta/proof.ci.js b/exercises/practice/beer-song/.meta/proof.ci.js index 1f38385c64..92db51db27 100644 --- a/exercises/practice/beer-song/.meta/proof.ci.js +++ b/exercises/practice/beer-song/.meta/proof.ci.js @@ -25,13 +25,13 @@ function nextVerse(currentVerse) { function nextBottle(currentVerse) { return `${bottles( - nextVerse(currentVerse) + nextVerse(currentVerse), ).toLowerCase()} of beer on the wall.`; } function verse(number) { const line1 = `${bottles(number)} of beer on the wall, ${bottles( - number + number, ).toLowerCase()} of beer.`; const line2 = action(number) + nextBottle(number); diff --git a/exercises/practice/beer-song/package.json b/exercises/practice/beer-song/package.json index 25186dc526..809c6ef1e5 100644 --- a/exercises/practice/beer-song/package.json +++ b/exercises/practice/beer-song/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/beer-song" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/binary-search-tree/.gitignore b/exercises/practice/binary-search-tree/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/binary-search-tree/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/binary-search-tree/package.json b/exercises/practice/binary-search-tree/package.json index 1747eb3e83..f626498a30 100644 --- a/exercises/practice/binary-search-tree/package.json +++ b/exercises/practice/binary-search-tree/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/binary-search-tree" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/binary-search/.docs/instructions.md b/exercises/practice/binary-search/.docs/instructions.md index 4dcaba726a..115036c050 100644 --- a/exercises/practice/binary-search/.docs/instructions.md +++ b/exercises/practice/binary-search/.docs/instructions.md @@ -1,35 +1,30 @@ # Instructions -Implement a binary search algorithm. +Your task is to implement a binary search algorithm. -Searching a sorted collection is a common task. A dictionary is a sorted -list of word definitions. Given a word, one can find its definition. A -telephone book is a sorted list of people's names, addresses, and -telephone numbers. Knowing someone's name allows one to quickly find -their telephone number and address. +A binary search algorithm finds an item in a list by repeatedly splitting it in half, only keeping the half which contains the item we're looking for. +It allows us to quickly narrow down the possible locations of our item until we find it, or until we've eliminated all possible locations. -If the list to be searched contains more than a few items (a dozen, say) -a binary search will require far fewer comparisons than a linear search, -but it imposes the requirement that the list be sorted. + +~~~~exercism/caution +Binary search only works when a list has been sorted. +~~~~ -In computer science, a binary search or half-interval search algorithm -finds the position of a specified input value (the search "key") within -an array sorted by key value. +The algorithm looks like this: -In each step, the algorithm compares the search key value with the key -value of the middle element of the array. +- Find the middle element of a sorted list and compare it with the item we're looking for. +- If the middle element is our item, then we're done! +- If the middle element is greater than our item, we can eliminate that element and all the elements **after** it. +- If the middle element is less than our item, we can eliminate that element and all the elements **before** it. +- If every element of the list has been eliminated then the item is not in the list. +- Otherwise, repeat the process on the part of the list that has not been eliminated. -If the keys match, then a matching element has been found and its index, -or position, is returned. +Here's an example: -Otherwise, if the search key is less than the middle element's key, then -the algorithm repeats its action on the sub-array to the left of the -middle element or, if the search key is greater, on the sub-array to the -right. +Let's say we're looking for the number 23 in the following sorted list: `[4, 8, 12, 16, 23, 28, 32]`. -If the remaining array to be searched is empty, then the key cannot be -found in the array and a special "not found" indication is returned. - -A binary search halves the number of items to check with each iteration, -so locating an item (or determining its absence) takes logarithmic time. -A binary search is a dichotomic divide and conquer search algorithm. +- We start by comparing 23 with the middle element, 16. +- Since 23 is greater than 16, we can eliminate the left half of the list, leaving us with `[23, 28, 32]`. +- We then compare 23 with the new middle element, 28. +- Since 23 is less than 28, we can eliminate the right half of the list: `[23]`. +- We've found our item. diff --git a/exercises/practice/binary-search/.docs/introduction.md b/exercises/practice/binary-search/.docs/introduction.md new file mode 100644 index 0000000000..03496599e7 --- /dev/null +++ b/exercises/practice/binary-search/.docs/introduction.md @@ -0,0 +1,13 @@ +# Introduction + +You have stumbled upon a group of mathematicians who are also singer-songwriters. +They have written a song for each of their favorite numbers, and, as you can imagine, they have a lot of favorite numbers (like [0][zero] or [73][seventy-three] or [6174][kaprekars-constant]). + +You are curious to hear the song for your favorite number, but with so many songs to wade through, finding the right song could take a while. +Fortunately, they have organized their songs in a playlist sorted by the title — which is simply the number that the song is about. + +You realize that you can use a binary search algorithm to quickly find a song given the title. + +[zero]: https://en.wikipedia.org/wiki/0 +[seventy-three]: https://en.wikipedia.org/wiki/73_(number) +[kaprekars-constant]: https://en.wikipedia.org/wiki/6174_(number) diff --git a/exercises/practice/binary-search/.gitignore b/exercises/practice/binary-search/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/binary-search/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/binary-search/package.json b/exercises/practice/binary-search/package.json index b2657868f8..d1d27709f1 100644 --- a/exercises/practice/binary-search/package.json +++ b/exercises/practice/binary-search/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/binary-search" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/binary/.gitignore b/exercises/practice/binary/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/binary/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/binary/package.json b/exercises/practice/binary/package.json index cf720e3950..15d7ac2ab3 100644 --- a/exercises/practice/binary/package.json +++ b/exercises/practice/binary/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/binary" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/bob/.approaches/config.json b/exercises/practice/bob/.approaches/config.json index 904e3da778..6bb7d60e90 100644 --- a/exercises/practice/bob/.approaches/config.json +++ b/exercises/practice/bob/.approaches/config.json @@ -1,7 +1,8 @@ { "introduction": { - "authors": ["bobahop"], - "contributors": [] + "authors": [ + "bobahop" + ] }, "approaches": [ { @@ -9,21 +10,27 @@ "slug": "if-statements", "title": "If statements", "blurb": "Use if statements to return the answer.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "a439f836-57c3-4b99-995f-d76a0321e4b8", "slug": "switch-statement", "title": "Switch statement", "blurb": "Use a switch to return the answer.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "ad78cacc-d3e1-4b3d-a2e1-5488495f590c", "slug": "answer-array", "title": "Answer array", "blurb": "Index into an array to return the answer.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] } ] } diff --git a/exercises/practice/bob/.gitignore b/exercises/practice/bob/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/bob/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/bob/package.json b/exercises/practice/bob/package.json index 124dc45bea..843002f99c 100644 --- a/exercises/practice/bob/package.json +++ b/exercises/practice/bob/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/bob" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/book-store/.docs/instructions.append.md b/exercises/practice/book-store/.docs/instructions.append.md index 0f51b54f7e..251c2ed8ca 100644 --- a/exercises/practice/book-store/.docs/instructions.append.md +++ b/exercises/practice/book-store/.docs/instructions.append.md @@ -1,7 +1,7 @@ # Implementation -Define a function - `Cost` - that calculates the cost for a given list of books based on defined discounts. +Define a function - `cost` - that calculates the cost for a given list of books based on defined discounts. -Cost will return the total cost (after discounts) in cents. +`cost` will return the total cost (after discounts) in cents. For example, for a single book, the cost is 800 cents, which equals $8.00. Only integer calculations are necessary for this exercise. diff --git a/exercises/practice/book-store/.docs/instructions.md b/exercises/practice/book-store/.docs/instructions.md index 5d767b0360..4f5418bc07 100644 --- a/exercises/practice/book-store/.docs/instructions.md +++ b/exercises/practice/book-store/.docs/instructions.md @@ -1,12 +1,10 @@ -# Description +# Instructions -To try and encourage more sales of different books from a popular 5 book -series, a bookshop has decided to offer discounts on multiple book purchases. +To try and encourage more sales of different books from a popular 5 book series, a bookshop has decided to offer discounts on multiple book purchases. One copy of any of the five books costs $8. -If, however, you buy two different books, you get a 5% -discount on those two books. +If, however, you buy two different books, you get a 5% discount on those two books. If you buy 3 different books, you get a 10% discount. @@ -14,14 +12,9 @@ If you buy 4 different books, you get a 20% discount. If you buy all 5, you get a 25% discount. -Note: that if you buy four books, of which 3 are -different titles, you get a 10% discount on the 3 that -form part of a set, but the fourth book still costs $8. +Note that if you buy four books, of which 3 are different titles, you get a 10% discount on the 3 that form part of a set, but the fourth book still costs $8. -Your mission is to write a piece of code to calculate the -price of any conceivable shopping basket (containing only -books of the same series), giving as big a discount as -possible. +Your mission is to write code to calculate the price of any conceivable shopping basket (containing only books of the same series), giving as big a discount as possible. For example, how much does this basket of books cost? @@ -33,36 +26,36 @@ For example, how much does this basket of books cost? One way of grouping these 8 books is: -- 1 group of 5 --> 25% discount (1st,2nd,3rd,4th,5th) -- +1 group of 3 --> 10% discount (1st,2nd,3rd) +- 1 group of 5 (1st, 2nd,3rd, 4th, 5th) +- 1 group of 3 (1st, 2nd, 3rd) This would give a total of: - 5 books at a 25% discount -- +3 books at a 10% discount +- 3 books at a 10% discount Resulting in: -- 5 _ (8 - 2.00) == 5 _ 6.00 == $30.00 -- +3 _ (8 - 0.80) == 3 _ 7.20 == $21.60 +- 5 × (100% - 25%) x $8 = 5 × $6.00 = $30.00, plus +- 3 × (100% - 10%) x $8 = 3 × $7.20 = $21.60 -For a total of $51.60 +Which equals $51.60. However, a different way to group these 8 books is: -- 1 group of 4 books --> 20% discount (1st,2nd,3rd,4th) -- +1 group of 4 books --> 20% discount (1st,2nd,3rd,5th) +- 1 group of 4 books (1st, 2nd, 3rd, 4th) +- 1 group of 4 books (1st, 2nd, 3rd, 5th) This would give a total of: - 4 books at a 20% discount -- +4 books at a 20% discount +- 4 books at a 20% discount Resulting in: -- 4 _ (8 - 1.60) == 4 _ 6.40 == $25.60 -- +4 _ (8 - 1.60) == 4 _ 6.40 == $25.60 +- 4 × (100% - 20%) x $8 = 4 × $6.40 = $25.60, plus +- 4 × (100% - 20%) x $8 = 4 × $6.40 = $25.60 -For a total of $51.20 +Which equals $51.20. And $51.20 is the price with the biggest discount. diff --git a/exercises/practice/book-store/.gitignore b/exercises/practice/book-store/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/book-store/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/book-store/.meta/tests.toml b/exercises/practice/book-store/.meta/tests.toml index 70d3f906a5..8241ee55f2 100644 --- a/exercises/practice/book-store/.meta/tests.toml +++ b/exercises/practice/book-store/.meta/tests.toml @@ -1,6 +1,13 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. [17146bd5-2e80-4557-ab4c-05632b6b0d01] description = "Only a single book" @@ -33,19 +40,27 @@ description = "Two groups of four is cheaper than groups of five and three" description = "Group of four plus group of two is cheaper than two groups of three" [68ea9b78-10ad-420e-a766-836a501d3633] -description = "Two each of first 4 books and 1 copy each of rest" +description = "Two each of first four books and one copy each of rest" [c0a779d5-a40c-47ae-9828-a340e936b866] description = "Two copies of each book" [18fd86fe-08f1-4b68-969b-392b8af20513] -description = "Three copies of first book and 2 each of remaining" +description = "Three copies of first book and two each of remaining" [0b19a24d-e4cf-4ec8-9db2-8899a41af0da] -description = "Three each of first 2 books and 2 each of remaining books" +description = "Three each of first two books and two each of remaining books" [bb376344-4fb2-49ab-ab85-e38d8354a58d] description = "Four groups of four are cheaper than two groups each of five and three" [5260ddde-2703-4915-b45a-e54dbbac4303] description = "Check that groups of four are created properly even when there are more groups of three than groups of five" + +[b0478278-c551-4747-b0fc-7e0be3158b1f] +description = "One group of one and four is cheaper than one group of two and three" +include = false + +[cf868453-6484-4ae1-9dfc-f8ee85bbde01] +description = "One group of one and two plus three groups of four is cheaper than one group of each size" +include = false diff --git a/exercises/practice/book-store/package.json b/exercises/practice/book-store/package.json index eb113a990e..467d2dd554 100644 --- a/exercises/practice/book-store/package.json +++ b/exercises/practice/book-store/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/book-store" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/bowling/.gitignore b/exercises/practice/bowling/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/bowling/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/bowling/package.json b/exercises/practice/bowling/package.json index ea3957c629..f0f79b3481 100644 --- a/exercises/practice/bowling/package.json +++ b/exercises/practice/bowling/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/bowling" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/change/.gitignore b/exercises/practice/change/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/change/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/change/.meta/proof.ci.js b/exercises/practice/change/.meta/proof.ci.js index b0cc9bf9e8..a3a0c93efd 100644 --- a/exercises/practice/change/.meta/proof.ci.js +++ b/exercises/practice/change/.meta/proof.ci.js @@ -74,13 +74,13 @@ export class Change { // is everything searched? const isDone = () => candidates.every( - (candidate) => isNumber(candidate) || candidate.isSearched() + (candidate) => isNumber(candidate) || candidate.isSearched(), ); // get the next unsearched member of the candidate array const getNext = () => candidates.find( - (candidate) => !isNumber(candidate) && !candidate.isSearched() + (candidate) => !isNumber(candidate) && !candidate.isSearched(), ); // for the candidate, generate another candidate for each of the possible coins @@ -106,7 +106,7 @@ export class Change { if (target < Math.min.apply(null, coinArray)) { throw new Error( - `The total ${target} cannot be represented in the given currency.` + `The total ${target} cannot be represented in the given currency.`, ); } @@ -122,7 +122,7 @@ export class Change { // print the result if (!isNumber(candidates[target])) return candidates[target].getCoins(); throw new Error( - `The total ${target} cannot be represented in the given currency.` + `The total ${target} cannot be represented in the given currency.`, ); } } diff --git a/exercises/practice/change/package.json b/exercises/practice/change/package.json index 0d42004420..0ee8406989 100644 --- a/exercises/practice/change/package.json +++ b/exercises/practice/change/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/change" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/circular-buffer/.gitignore b/exercises/practice/circular-buffer/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/circular-buffer/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/circular-buffer/package.json b/exercises/practice/circular-buffer/package.json index c5e1c77f90..b52f7194d4 100644 --- a/exercises/practice/circular-buffer/package.json +++ b/exercises/practice/circular-buffer/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/circular-buffer" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/clock/.gitignore b/exercises/practice/clock/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/clock/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/clock/package.json b/exercises/practice/clock/package.json index fbe55a36d5..16424ad969 100644 --- a/exercises/practice/clock/package.json +++ b/exercises/practice/clock/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/clock" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/collatz-conjecture/.gitignore b/exercises/practice/collatz-conjecture/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/collatz-conjecture/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/collatz-conjecture/package.json b/exercises/practice/collatz-conjecture/package.json index b613a2be5f..8199738f33 100644 --- a/exercises/practice/collatz-conjecture/package.json +++ b/exercises/practice/collatz-conjecture/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/collatz-conjecture" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/complex-numbers/.gitignore b/exercises/practice/complex-numbers/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/complex-numbers/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/complex-numbers/.meta/proof.ci.js b/exercises/practice/complex-numbers/.meta/proof.ci.js index ff3bba9ce7..ee89763e19 100644 --- a/exercises/practice/complex-numbers/.meta/proof.ci.js +++ b/exercises/practice/complex-numbers/.meta/proof.ci.js @@ -15,7 +15,7 @@ export class ComplexNumber { mul(other) { return new ComplexNumber( this.real * other.real - this.imag * other.imag, - this.imag * other.real + this.real * other.imag + this.imag * other.real + this.real * other.imag, ); } @@ -24,7 +24,7 @@ export class ComplexNumber { (this.real * other.real + this.imag * other.imag) / (other.real * other.real + other.imag * other.imag), (this.imag * other.real - this.real * other.imag) / - (other.real * other.real + other.imag * other.imag) + (other.real * other.real + other.imag * other.imag), ); } @@ -39,7 +39,7 @@ export class ComplexNumber { get exp() { return new ComplexNumber( Math.exp(this.real) * Math.cos(this.imag), - Math.exp(this.real) * Math.sin(this.imag) + Math.exp(this.real) * Math.sin(this.imag), ); } } diff --git a/exercises/practice/complex-numbers/package.json b/exercises/practice/complex-numbers/package.json index 19dbc228c3..1fac4fab12 100644 --- a/exercises/practice/complex-numbers/package.json +++ b/exercises/practice/complex-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/complex-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/connect/.gitignore b/exercises/practice/connect/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/connect/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/connect/.meta/proof.ci.js b/exercises/practice/connect/.meta/proof.ci.js index 9159886d03..b40653e079 100644 --- a/exercises/practice/connect/.meta/proof.ci.js +++ b/exercises/practice/connect/.meta/proof.ci.js @@ -36,7 +36,7 @@ export class Board { const matches = this.neighbors(pos).filter( ({ x, y }) => this.matches({ x, y }, XorO) && - checked.filter((spot) => spot.x === x && spot.y === y).length === 0 + checked.filter((spot) => spot.x === x && spot.y === y).length === 0, ); if (matches.length === 0) { return false; diff --git a/exercises/practice/connect/package.json b/exercises/practice/connect/package.json index 50bd70e28f..5ceebfcfd0 100644 --- a/exercises/practice/connect/package.json +++ b/exercises/practice/connect/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/connect" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/crypto-square/.gitignore b/exercises/practice/crypto-square/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/crypto-square/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/crypto-square/crypto-square.spec.js b/exercises/practice/crypto-square/crypto-square.spec.js index c3066f6a65..0532a5a0e6 100644 --- a/exercises/practice/crypto-square/crypto-square.spec.js +++ b/exercises/practice/crypto-square/crypto-square.spec.js @@ -37,12 +37,12 @@ describe('Crypto', () => { '54 character plaintext results in 7 chunks, the last two with trailing spaces', () => { const crypto = new Crypto( - 'If man was meant to stay on the ground, god would have given us roots.' + 'If man was meant to stay on the ground, god would have given us roots.', ); expect(crypto.ciphertext).toEqual( - 'imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau ' + 'imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau ', ); }, - 20 * 1000 + 20 * 1000, ); }); diff --git a/exercises/practice/crypto-square/package.json b/exercises/practice/crypto-square/package.json index 30f8374b18..0c51e99b35 100644 --- a/exercises/practice/crypto-square/package.json +++ b/exercises/practice/crypto-square/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/crypto-square" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/custom-set/.gitignore b/exercises/practice/custom-set/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/custom-set/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/custom-set/.meta/proof.ci.js b/exercises/practice/custom-set/.meta/proof.ci.js index b56c67315f..aeabdbce32 100644 --- a/exercises/practice/custom-set/.meta/proof.ci.js +++ b/exercises/practice/custom-set/.meta/proof.ci.js @@ -34,7 +34,7 @@ export class CustomSet { difference(other) { return new CustomSet( - Object.keys(this.data).filter((el) => other.data[el] === undefined) + Object.keys(this.data).filter((el) => other.data[el] === undefined), ); } diff --git a/exercises/practice/custom-set/custom-set.spec.js b/exercises/practice/custom-set/custom-set.spec.js index aec7416b08..cd7e33dea9 100644 --- a/exercises/practice/custom-set/custom-set.spec.js +++ b/exercises/practice/custom-set/custom-set.spec.js @@ -53,7 +53,7 @@ describe('CustomSet', () => { xtest('set is a subset of larger set with same elements', () => { const actual = new CustomSet([1, 2, 3]).subset( - new CustomSet([4, 1, 2, 3]) + new CustomSet([4, 1, 2, 3]), ); expect(actual).toBe(true); }); @@ -157,7 +157,7 @@ describe('CustomSet', () => { xtest('intersection of a non-empty set and an empty set is an empty set', () => { const actual = new CustomSet([1, 2, 3, 4]).intersection( - new CustomSet([]) + new CustomSet([]), ); const expected = new CustomSet([]); expect(actual.eql(expected)).toBe(true); @@ -165,7 +165,7 @@ describe('CustomSet', () => { xtest('intersection of two sets with no shared elements is an empty set', () => { const actual = new CustomSet([1, 2, 3]).intersection( - new CustomSet([4, 5, 6]) + new CustomSet([4, 5, 6]), ); const expected = new CustomSet([]); expect(actual.eql(expected)).toBe(true); @@ -173,7 +173,7 @@ describe('CustomSet', () => { xtest('intersection of two sets with shared elements is a set of the shared elements', () => { const actual = new CustomSet([1, 2, 3, 4]).intersection( - new CustomSet([3, 2, 5]) + new CustomSet([3, 2, 5]), ); const expected = new CustomSet([2, 3]); expect(actual.eql(expected)).toBe(true); diff --git a/exercises/practice/custom-set/package.json b/exercises/practice/custom-set/package.json index 89ae7ea5e5..1a13154805 100644 --- a/exercises/practice/custom-set/package.json +++ b/exercises/practice/custom-set/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/custom-set" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/darts/.gitignore b/exercises/practice/darts/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/darts/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/darts/package.json b/exercises/practice/darts/package.json index 557bf8a535..62a288ed72 100644 --- a/exercises/practice/darts/package.json +++ b/exercises/practice/darts/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/darts" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/diamond/.gitignore b/exercises/practice/diamond/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/diamond/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/diamond/package.json b/exercises/practice/diamond/package.json index 31fb43de69..119faf381b 100644 --- a/exercises/practice/diamond/package.json +++ b/exercises/practice/diamond/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/diamond" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/difference-of-squares/.gitignore b/exercises/practice/difference-of-squares/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/difference-of-squares/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/difference-of-squares/package.json b/exercises/practice/difference-of-squares/package.json index 9374caa079..8fe6cd5a7e 100644 --- a/exercises/practice/difference-of-squares/package.json +++ b/exercises/practice/difference-of-squares/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/difference-of-squares" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/diffie-hellman/.gitignore b/exercises/practice/diffie-hellman/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/diffie-hellman/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/diffie-hellman/.meta/proof.ci.js b/exercises/practice/diffie-hellman/.meta/proof.ci.js index c10c46a2e9..a526e27604 100644 --- a/exercises/practice/diffie-hellman/.meta/proof.ci.js +++ b/exercises/practice/diffie-hellman/.meta/proof.ci.js @@ -91,7 +91,7 @@ export class DiffieHellman { getPublicKey(privateKey) { if (privateKey <= 1 || privateKey > this.p - 1) { throw Error( - 'Private key a must be greater than one but less than modulus parameter p!' + 'Private key a must be greater than one but less than modulus parameter p!', ); } return this.g ** privateKey % this.p; diff --git a/exercises/practice/diffie-hellman/diffie-hellman.spec.js b/exercises/practice/diffie-hellman/diffie-hellman.spec.js index 14129c23a7..3d7951e68a 100644 --- a/exercises/practice/diffie-hellman/diffie-hellman.spec.js +++ b/exercises/practice/diffie-hellman/diffie-hellman.spec.js @@ -61,7 +61,7 @@ describe('diffie-hellman', () => { xtest('can calculate public key using private key', () => { expect(diffieHellman.getPublicKey(alicePrivateKey)).toEqual( - alicePublicKey + alicePublicKey, ); }); diff --git a/exercises/practice/diffie-hellman/package.json b/exercises/practice/diffie-hellman/package.json index b515349f8c..d2fe1d2330 100644 --- a/exercises/practice/diffie-hellman/package.json +++ b/exercises/practice/diffie-hellman/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/diffie-hellman" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/dnd-character/.gitignore b/exercises/practice/dnd-character/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/dnd-character/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/dnd-character/dnd-character.spec.js b/exercises/practice/dnd-character/dnd-character.spec.js index 210a7b09f3..43d560a161 100644 --- a/exercises/practice/dnd-character/dnd-character.spec.js +++ b/exercises/practice/dnd-character/dnd-character.spec.js @@ -68,13 +68,13 @@ describe('D&D Character', () => { xtest('ability score less than 3 throws error', () => { expect(() => abilityModifier(2)).toThrow( - new Error('Ability scores must be at least 3') + new Error('Ability scores must be at least 3'), ); }); xtest('ability score greater than 18 throws error', () => { expect(() => abilityModifier(19)).toThrow( - new Error('Ability scores can be at most 18') + new Error('Ability scores can be at most 18'), ); }); }); diff --git a/exercises/practice/dnd-character/package.json b/exercises/practice/dnd-character/package.json index c6903b5c16..729ce80dd6 100644 --- a/exercises/practice/dnd-character/package.json +++ b/exercises/practice/dnd-character/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/dnd-character" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/dominoes/.gitignore b/exercises/practice/dominoes/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/dominoes/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/dominoes/dominoes.spec.js b/exercises/practice/dominoes/dominoes.spec.js index fdc64f2c76..6218cf97bc 100644 --- a/exercises/practice/dominoes/dominoes.spec.js +++ b/exercises/practice/dominoes/dominoes.spec.js @@ -34,7 +34,7 @@ function runTestsExpectingChain(dominoes) { if (i === result.length - 1) return true; return v[1] === result[i + 1][0]; }) - .every(Boolean) + .every(Boolean), ).toBe(true); }); @@ -49,7 +49,7 @@ function runTestsExpectingChain(dominoes) { xit('Should have the same dominoes', () => { const sortDomino = (domino) => [...domino].sort(); expect([...dominoes].map(sortDomino).sort()).toEqual( - [...result].map(sortDomino).sort() + [...result].map(sortDomino).sort(), ); }); } @@ -74,7 +74,7 @@ describe('Dominoes', () => { [3, 1], [2, 3], ], - true + true, ); }); @@ -85,7 +85,7 @@ describe('Dominoes', () => { [1, 3], [2, 3], ], - true + true, ); }); @@ -96,7 +96,7 @@ describe('Dominoes', () => { [4, 1], [2, 3], ], - false + false, ); }); @@ -106,7 +106,7 @@ describe('Dominoes', () => { [1, 1], [2, 2], ], - false + false, ); }); @@ -118,7 +118,7 @@ describe('Dominoes', () => { [3, 4], [4, 3], ], - false + false, ); }); @@ -130,7 +130,7 @@ describe('Dominoes', () => { [3, 1], [4, 4], ], - false + false, ); }); @@ -143,7 +143,7 @@ describe('Dominoes', () => { [2, 4], [2, 4], ], - true + true, ); }); @@ -157,7 +157,7 @@ describe('Dominoes', () => { [2, 2], [3, 3], ], - true + true, ); }); @@ -174,7 +174,7 @@ describe('Dominoes', () => { [3, 4], [5, 6], ], - true + true, ); }); }); diff --git a/exercises/practice/dominoes/package.json b/exercises/practice/dominoes/package.json index ce075f712f..2086672353 100644 --- a/exercises/practice/dominoes/package.json +++ b/exercises/practice/dominoes/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/dominoes" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/etl/.docs/instructions.md b/exercises/practice/etl/.docs/instructions.md index ff96906c6b..7bb161f8b7 100644 --- a/exercises/practice/etl/.docs/instructions.md +++ b/exercises/practice/etl/.docs/instructions.md @@ -1,21 +1,8 @@ # Instructions -We are going to do the `Transform` step of an Extract-Transform-Load. +Your task is to change the data format of letters and their point values in the game. -## ETL - -Extract-Transform-Load (ETL) is a fancy way of saying, "We have some crufty, legacy data over in this system, and now we need it in this shiny new system over here, so -we're going to migrate this." - -(Typically, this is followed by, "We're only going to need to run this -once." That's then typically followed by much forehead slapping and -moaning about how stupid we could possibly be.) - -## The goal - -We're going to extract some Scrabble scores from a legacy system. - -The old system stored a list of letters per score: +Currently, letters are stored in groups based on their score, in a one-to-many mapping. - 1 point: "A", "E", "I", "O", "U", "L", "N", "R", "S", "T", - 2 points: "D", "G", @@ -25,23 +12,16 @@ The old system stored a list of letters per score: - 8 points: "J", "X", - 10 points: "Q", "Z", -The shiny new Scrabble system instead stores the score per letter, which -makes it much faster and easier to calculate the score for a word. It -also stores the letters in lower-case regardless of the case of the -input letters: +This needs to be changed to store each individual letter with its score in a one-to-one mapping. - "a" is worth 1 point. - "b" is worth 3 points. - "c" is worth 3 points. - "d" is worth 2 points. -- Etc. - -Your mission, should you choose to accept it, is to transform the legacy data -format to the shiny new format. +- etc. -## Notes +As part of this change, the team has also decided to change the letters to be lower-case rather than upper-case. -A final note about scoring, Scrabble is played around the world in a -variety of languages, each with its own unique scoring table. For -example, an "E" is scored at 2 in the Māori-language version of the -game while being scored at 4 in the Hawaiian-language version. +```exercism/note +If you want to look at how the data was previously structured and how it needs to change, take a look at the examples in the test suite. +``` diff --git a/exercises/practice/etl/.docs/introduction.md b/exercises/practice/etl/.docs/introduction.md new file mode 100644 index 0000000000..5be65147d7 --- /dev/null +++ b/exercises/practice/etl/.docs/introduction.md @@ -0,0 +1,16 @@ +# Introduction + +You work for a company that makes an online multiplayer game called Lexiconia. + +To play the game, each player is given 13 letters, which they must rearrange to create words. +Different letters have different point values, since it's easier to create words with some letters than others. + +The game was originally launched in English, but it is very popular, and now the company wants to expand to other languages as well. + +Different languages need to support different point values for letters. +The point values are determined by how often letters are used, compared to other letters in that language. + +For example, the letter 'C' is quite common in English, and is only worth 3 points. +But in Norwegian it's a very rare letter, and is worth 10 points. + +To make it easier to add new languages, your team needs to change the way letters and their point values are stored in the game. diff --git a/exercises/practice/etl/.gitignore b/exercises/practice/etl/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/etl/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/etl/package.json b/exercises/practice/etl/package.json index 92cda0a18a..d63f432808 100644 --- a/exercises/practice/etl/package.json +++ b/exercises/practice/etl/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/etl" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/flatten-array/.gitignore b/exercises/practice/flatten-array/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/flatten-array/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/flatten-array/.meta/proof.ci.js b/exercises/practice/flatten-array/.meta/proof.ci.js index d0412cd8ff..6b14e5b7ad 100644 --- a/exercises/practice/flatten-array/.meta/proof.ci.js +++ b/exercises/practice/flatten-array/.meta/proof.ci.js @@ -3,7 +3,7 @@ export const flatten = (arr) => { .reduce( (acc, el) => Array.isArray(el) ? acc.concat(flatten(el)) : acc.concat(el), - [] + [], ) .filter((el) => el !== null && el !== undefined); }; diff --git a/exercises/practice/flatten-array/flatten-array.spec.js b/exercises/practice/flatten-array/flatten-array.spec.js index 648a313410..71044c48bf 100644 --- a/exercises/practice/flatten-array/flatten-array.spec.js +++ b/exercises/practice/flatten-array/flatten-array.spec.js @@ -47,7 +47,7 @@ describe('FlattenArray', () => { xtest('all values in nested list are null', () => { expect( - flatten([null, [[[null]]], null, null, [[null, null], null], null]) + flatten([null, [[[null]]], null, null, [[null, null], null], null]), ).toEqual([]); }); }); diff --git a/exercises/practice/flatten-array/package.json b/exercises/practice/flatten-array/package.json index ed79329992..fe279b6237 100644 --- a/exercises/practice/flatten-array/package.json +++ b/exercises/practice/flatten-array/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/flatten-array" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/food-chain/.gitignore b/exercises/practice/food-chain/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/food-chain/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/food-chain/package.json b/exercises/practice/food-chain/package.json index f468d78530..0b2958883a 100644 --- a/exercises/practice/food-chain/package.json +++ b/exercises/practice/food-chain/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/food-chain" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/forth/.gitignore b/exercises/practice/forth/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/forth/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/forth/.meta/proof.ci.js b/exercises/practice/forth/.meta/proof.ci.js index 7557f2acbb..b85f1ec7b9 100644 --- a/exercises/practice/forth/.meta/proof.ci.js +++ b/exercises/practice/forth/.meta/proof.ci.js @@ -24,7 +24,7 @@ export class Forth { this.defineCommand( words[t + 1], - words.slice(t + 2, semicolon).join(' ') + words.slice(t + 2, semicolon).join(' '), ); t = semicolon; diff --git a/exercises/practice/forth/package.json b/exercises/practice/forth/package.json index c0f1994c59..f6c2e49d13 100644 --- a/exercises/practice/forth/package.json +++ b/exercises/practice/forth/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/forth" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/gigasecond/.docs/instructions.md b/exercises/practice/gigasecond/.docs/instructions.md index 680870f3a8..1e20f0022e 100644 --- a/exercises/practice/gigasecond/.docs/instructions.md +++ b/exercises/practice/gigasecond/.docs/instructions.md @@ -1,6 +1,8 @@ # Instructions -Given a moment, determine the moment that would be after a gigasecond -has passed. +Your task is to determine the date and time one gigasecond after a certain date. -A gigasecond is 10^9 (1,000,000,000) seconds. +A gigasecond is one thousand million seconds. +That is a one with nine zeros after it. + +If you were born on _January 24th, 2015 at 22:00 (10:00:00pm)_, then you would be a gigasecond old on _October 2nd, 2046 at 23:46:40 (11:46:40pm)_. diff --git a/exercises/practice/gigasecond/.docs/introduction.md b/exercises/practice/gigasecond/.docs/introduction.md new file mode 100644 index 0000000000..74afaa994f --- /dev/null +++ b/exercises/practice/gigasecond/.docs/introduction.md @@ -0,0 +1,24 @@ +# Introduction + +The way we measure time is kind of messy. +We have 60 seconds in a minute, and 60 minutes in an hour. +This comes from ancient Babylon, where they used 60 as the basis for their number system. +We have 24 hours in a day, 7 days in a week, and how many days in a month? +Well, for days in a month it depends not only on which month it is, but also on what type of calendar is used in the country you live in. + +What if, instead, we only use seconds to express time intervals? +Then we can use metric system prefixes for writing large numbers of seconds in more easily comprehensible quantities. + +- A food recipe might explain that you need to let the brownies cook in the oven for two kiloseconds (that's two thousand seconds). +- Perhaps you and your family would travel to somewhere exotic for two megaseconds (that's two million seconds). +- And if you and your spouse were married for _a thousand million_ seconds, you would celebrate your one gigasecond anniversary. + +```exercism/note +If we ever colonize Mars or some other planet, measuring time is going to get even messier. +If someone says "year" do they mean a year on Earth or a year on Mars? + +The idea for this exercise came from the science fiction novel ["A Deepness in the Sky"][vinge-novel] by author Vernor Vinge. +In it the author uses the metric system as the basis for time measurements. + +[vinge-novel]: https://www.tor.com/2017/08/03/science-fiction-with-something-for-everyone-a-deepness-in-the-sky-by-vernor-vinge/ +``` diff --git a/exercises/practice/gigasecond/.gitignore b/exercises/practice/gigasecond/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/gigasecond/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/gigasecond/package.json b/exercises/practice/gigasecond/package.json index 667bb2afcb..e2a33ea57c 100644 --- a/exercises/practice/gigasecond/package.json +++ b/exercises/practice/gigasecond/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/gigasecond" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/go-counting/.gitignore b/exercises/practice/go-counting/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/go-counting/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/go-counting/.meta/proof.ci.js b/exercises/practice/go-counting/.meta/proof.ci.js index 1bc01766bc..d2da017051 100644 --- a/exercises/practice/go-counting/.meta/proof.ci.js +++ b/exercises/practice/go-counting/.meta/proof.ci.js @@ -84,7 +84,7 @@ export class GoCounting { case this.OPEN: if ( !territory.some( - (value) => value[0] === cell.x && value[1] === cell.y + (value) => value[0] === cell.x && value[1] === cell.y, ) ) { territory.push([cell.x, cell.y]); diff --git a/exercises/practice/go-counting/package.json b/exercises/practice/go-counting/package.json index 723eefe9cd..a149edfafb 100644 --- a/exercises/practice/go-counting/package.json +++ b/exercises/practice/go-counting/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/go-counting" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/grade-school/.gitignore b/exercises/practice/grade-school/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/grade-school/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/grade-school/package.json b/exercises/practice/grade-school/package.json index bfcc206d90..3bedd99d20 100644 --- a/exercises/practice/grade-school/package.json +++ b/exercises/practice/grade-school/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/grade-school" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/grains/.approaches/config.json b/exercises/practice/grains/.approaches/config.json index 30595c16a1..1b09065282 100644 --- a/exercises/practice/grains/.approaches/config.json +++ b/exercises/practice/grains/.approaches/config.json @@ -1,6 +1,8 @@ { "introduction": { - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, "approaches": [ { @@ -8,14 +10,18 @@ "slug": "exponentiation", "title": "exponentiation", "blurb": "Use exponentiation to raise 2 by a specified power.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "019b01f3-1955-45b1-96e9-06a233627f3e", "slug": "bit-shifting", "title": "Bit-shifting", "blurb": "Use bit-shifting to set the correct value.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] } ] } diff --git a/exercises/practice/grains/.approaches/introduction.md b/exercises/practice/grains/.approaches/introduction.md index 659b1c2271..84312036af 100644 --- a/exercises/practice/grains/.approaches/introduction.md +++ b/exercises/practice/grains/.approaches/introduction.md @@ -18,7 +18,7 @@ You can see that the exponent, or power, that `2` is raised by is always one les | 1 | 0 | 2 to the power of 0 = 1 | | 2 | 1 | 2 to the power of 1 = 2 | | 3 | 2 | 2 to the power of 2 = 4 | -| 4 | 3 | 2 to the power of 4 = 8 | +| 4 | 3 | 2 to the power of 3 = 8 | You can use the `bigint` type and [BigInt][bigint] global object to support numbers above [`NUMBER.MAX_SAFE_INTEGER`][max-safe-integer]. diff --git a/exercises/practice/grains/.gitignore b/exercises/practice/grains/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/grains/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/grains/grains.spec.js b/exercises/practice/grains/grains.spec.js index 3f10a2ab57..f69a98c54a 100644 --- a/exercises/practice/grains/grains.spec.js +++ b/exercises/practice/grains/grains.spec.js @@ -61,19 +61,19 @@ describe('Grains', () => { xtest('square 0 raises an exception', () => { expect(() => square(0)).toThrow( - new Error('square must be between 1 and 64') + new Error('square must be between 1 and 64'), ); }); xtest('negative square raises an exception', () => { expect(() => square(-1)).toThrow( - new Error('square must be between 1 and 64') + new Error('square must be between 1 and 64'), ); }); xtest('square greater than 64 raises an exception', () => { expect(() => square(65)).toThrow( - new Error('square must be between 1 and 64') + new Error('square must be between 1 and 64'), ); }); }); diff --git a/exercises/practice/grains/package.json b/exercises/practice/grains/package.json index fa5899adc5..4cb82eb310 100644 --- a/exercises/practice/grains/package.json +++ b/exercises/practice/grains/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/grains" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/grep/.gitignore b/exercises/practice/grep/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/grep/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/grep/grep.spec.js b/exercises/practice/grep/grep.spec.js index 98ef1dafe0..31ea2cb417 100644 --- a/exercises/practice/grep/grep.spec.js +++ b/exercises/practice/grep/grep.spec.js @@ -18,7 +18,7 @@ function spawnGrep(config) { ...config.flags, config.pattern, ...config.files.map((file) => - relative(BASE_DIR, resolvePath(BASE_DIR, 'data', file)) + relative(BASE_DIR, resolvePath(BASE_DIR, 'data', file)), ), ]; @@ -67,7 +67,7 @@ describe('grep exercise', () => { pattern: 'Agamemnon', flags: [], files: ['iliad.txt'], - }) + }), ).resolves.toBe('Of Atreus, Agamemnon, King of men.'); }); @@ -77,7 +77,7 @@ describe('grep exercise', () => { pattern: 'Forbidden', flags: ['-n'], files: ['paradise-lost.txt'], - }) + }), ).resolves.toBe('2:Of that Forbidden Tree, whose mortal tast'); }); @@ -87,7 +87,7 @@ describe('grep exercise', () => { pattern: 'FORBIDDEN', flags: ['-i'], files: ['paradise-lost.txt'], - }) + }), ).resolves.toBe('Of that Forbidden Tree, whose mortal tast'); }); @@ -97,7 +97,7 @@ describe('grep exercise', () => { pattern: 'Forbidden', flags: ['-l'], files: ['paradise-lost.txt'], - }) + }), ).resolves.toBe(resolveDataFile('paradise-lost.txt')); }); @@ -107,7 +107,7 @@ describe('grep exercise', () => { pattern: 'With loss of Eden, till one greater Man', flags: ['-x'], files: ['paradise-lost.txt'], - }) + }), ).resolves.toBe('With loss of Eden, till one greater Man'); }); @@ -117,7 +117,7 @@ describe('grep exercise', () => { pattern: 'OF ATREUS, Agamemnon, KIng of MEN.', flags: ['-n', '-i', '-x'], files: ['iliad.txt'], - }) + }), ).resolves.toBe('9:Of Atreus, Agamemnon, King of men.'); }); @@ -127,11 +127,11 @@ describe('grep exercise', () => { pattern: 'may', flags: [], files: ['midsummer-night.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`Nor how it may concern my modesty, But I beseech your grace that I may know - The worst that may befall me in this case,`) + The worst that may befall me in this case,`), ); }); @@ -141,11 +141,11 @@ describe('grep exercise', () => { pattern: 'may', flags: ['-n'], files: ['midsummer-night.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`3:Nor how it may concern my modesty, 5:But I beseech your grace that I may know - 6:The worst that may befall me in this case,`) + 6:The worst that may befall me in this case,`), ); }); @@ -155,7 +155,7 @@ describe('grep exercise', () => { pattern: 'may', flags: ['-x'], files: ['midsummer-night.txt'], - }) + }), ).resolves.toBe(''); }); @@ -165,10 +165,10 @@ describe('grep exercise', () => { pattern: 'ACHILLES', flags: ['-i'], files: ['iliad.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`Achilles sing, O Goddess! Peleus' son; - The noble Chief Achilles from the son`) + The noble Chief Achilles from the son`), ); }); @@ -178,13 +178,13 @@ describe('grep exercise', () => { pattern: 'Of', flags: ['-v'], files: ['paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`Brought Death into the World, and all our woe, With loss of Eden, till one greater Man Restore us, and regain the blissful Seat, Sing Heav'nly Muse, that on the secret top - That Shepherd, who first taught the chosen Seed`) + That Shepherd, who first taught the chosen Seed`), ); }); @@ -194,7 +194,7 @@ describe('grep exercise', () => { pattern: 'Gandalf', flags: ['-n', '-l', '-x', '-i'], files: ['iliad.txt'], - }) + }), ).resolves.toBe(''); }); @@ -204,7 +204,7 @@ describe('grep exercise', () => { pattern: 'ten', flags: ['-n', '-l'], files: ['iliad.txt'], - }) + }), ).resolves.toBe(resolveDataFile('iliad.txt')); }); @@ -214,7 +214,7 @@ describe('grep exercise', () => { pattern: 'Illustrious into Ades premature,', flags: ['-x', '-v'], files: ['iliad.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`Achilles sing, O Goddess! Peleus' son; His wrath pernicious, who ten thousand woes @@ -223,7 +223,7 @@ describe('grep exercise', () => { To dogs and to all ravening fowls a prey, When fierce dispute had separated once The noble Chief Achilles from the son - Of Atreus, Agamemnon, King of men.`) + Of Atreus, Agamemnon, King of men.`), ); }); }); @@ -235,9 +235,9 @@ describe('grep exercise', () => { pattern: 'Agamemnon', flags: [], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( - `${resolveDataFile('iliad.txt')}:Of Atreus, Agamemnon, King of men.` + `${resolveDataFile('iliad.txt')}:Of Atreus, Agamemnon, King of men.`, ); }); @@ -247,17 +247,17 @@ describe('grep exercise', () => { pattern: 'may', flags: [], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:Nor how it may concern my modesty, ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:But I beseech your grace that I may know ${resolveDataFile( - 'midsummer-night.txt' - )}:The worst that may befall me in this case,`) + 'midsummer-night.txt', + )}:The worst that may befall me in this case,`), ); }); @@ -267,20 +267,20 @@ describe('grep exercise', () => { pattern: 'that', flags: ['-n'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:5:But I beseech your grace that I may know ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:6:The worst that may befall me in this case, ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:2:Of that Forbidden Tree, whose mortal tast ${resolveDataFile( - 'paradise-lost.txt' - )}:6:Sing Heav'nly Muse, that on the secret top`) + 'paradise-lost.txt', + )}:6:Sing Heav'nly Muse, that on the secret top`), ); }); @@ -290,10 +290,10 @@ describe('grep exercise', () => { pattern: 'who', flags: ['-l'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile('iliad.txt')} - ${resolveDataFile('paradise-lost.txt')}`) + ${resolveDataFile('paradise-lost.txt')}`), ); }); @@ -303,34 +303,34 @@ describe('grep exercise', () => { pattern: 'TO', flags: ['-i'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:Caused to Achaia's host, sent many a soul ${resolveDataFile('iliad.txt')}:Illustrious into Ades premature, ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:And Heroes gave (so stood the will of Jove) ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:To dogs and to all ravening fowls a prey, ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:I do entreat your grace to pardon me. ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:In such a presence here to plead my thoughts; ${resolveDataFile('midsummer-night.txt')}:If I refuse to wed Demetrius. ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Brought Death into the World, and all our woe, ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Restore us, and regain the blissful Seat, ${resolveDataFile( - 'paradise-lost.txt' - )}:Sing Heav'nly Muse, that on the secret top`) + 'paradise-lost.txt', + )}:Sing Heav'nly Muse, that on the secret top`), ); }); @@ -340,15 +340,15 @@ describe('grep exercise', () => { pattern: 'a', flags: ['-v'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:Achilles sing, O Goddess! Peleus' son; ${resolveDataFile('iliad.txt')}:The noble Chief Achilles from the son ${resolveDataFile( - 'midsummer-night.txt' - )}:If I refuse to wed Demetrius.`) + 'midsummer-night.txt', + )}:If I refuse to wed Demetrius.`), ); }); @@ -358,11 +358,11 @@ describe('grep exercise', () => { pattern: 'But I beseech your grace that I may know', flags: ['-x'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( `${resolveDataFile( - 'midsummer-night.txt:But I beseech your grace that I may know' - )}` + 'midsummer-night.txt:But I beseech your grace that I may know', + )}`, ); }); @@ -372,11 +372,11 @@ describe('grep exercise', () => { pattern: 'WITH LOSS OF EDEN, TILL ONE GREATER MAN', flags: ['-n', '-i', '-x'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( `${resolveDataFile( - 'paradise-lost.txt' - )}:4:With loss of Eden, till one greater Man` + 'paradise-lost.txt', + )}:4:With loss of Eden, till one greater Man`, ); }); @@ -386,7 +386,7 @@ describe('grep exercise', () => { pattern: 'Frodo', flags: ['-n', '-l', '-x', '-i'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe(''); }); @@ -396,10 +396,10 @@ describe('grep exercise', () => { pattern: 'who', flags: ['-n', '-l'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile('iliad.txt')} - ${resolveDataFile('paradise-lost.txt')}`) + ${resolveDataFile('paradise-lost.txt')}`), ); }); @@ -409,69 +409,69 @@ describe('grep exercise', () => { pattern: 'Illustrious into Ades premature,', flags: ['-x', '-v'], files: ['iliad.txt', 'midsummer-night.txt', 'paradise-lost.txt'], - }) + }), ).resolves.toBe( formatStringTemplate(`${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:Achilles sing, O Goddess! Peleus' son; ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:His wrath pernicious, who ten thousand woes ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:Caused to Achaia's host, sent many a soul ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:And Heroes gave (so stood the will of Jove) ${resolveDataFile( - 'iliad.txt' + 'iliad.txt', )}:To dogs and to all ravening fowls a prey, ${resolveDataFile('iliad.txt')}:When fierce dispute had separated once ${resolveDataFile('iliad.txt')}:The noble Chief Achilles from the son ${resolveDataFile('iliad.txt')}:Of Atreus, Agamemnon, King of men. ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:I do entreat your grace to pardon me. ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:I know not by what power I am made bold, ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:Nor how it may concern my modesty, ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:In such a presence here to plead my thoughts; ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:But I beseech your grace that I may know ${resolveDataFile( - 'midsummer-night.txt' + 'midsummer-night.txt', )}:The worst that may befall me in this case, ${resolveDataFile('midsummer-night.txt')}:If I refuse to wed Demetrius. ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Of Mans First Disobedience, and the Fruit ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Of that Forbidden Tree, whose mortal tast ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Brought Death into the World, and all our woe, ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:With loss of Eden, till one greater Man ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Restore us, and regain the blissful Seat, ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Sing Heav'nly Muse, that on the secret top ${resolveDataFile( - 'paradise-lost.txt' + 'paradise-lost.txt', )}:Of Oreb, or of Sinai, didst inspire ${resolveDataFile( - 'paradise-lost.txt' - )}:That Shepherd, who first taught the chosen Seed`) + 'paradise-lost.txt', + )}:That Shepherd, who first taught the chosen Seed`), ); }); }); diff --git a/exercises/practice/grep/package.json b/exercises/practice/grep/package.json index 2fbdc3fd5c..167f140f91 100644 --- a/exercises/practice/grep/package.json +++ b/exercises/practice/grep/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/grep" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/hamming/.gitignore b/exercises/practice/hamming/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/hamming/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/hamming/hamming.spec.js b/exercises/practice/hamming/hamming.spec.js index b6218cfaf4..d4ff7a63aa 100644 --- a/exercises/practice/hamming/hamming.spec.js +++ b/exercises/practice/hamming/hamming.spec.js @@ -23,25 +23,25 @@ describe('Hamming', () => { xtest('disallow first strand longer', () => { expect(() => compute('AATG', 'AAA')).toThrow( - new Error('strands must be of equal length') + new Error('strands must be of equal length'), ); }); xtest('disallow second strand longer', () => { expect(() => compute('ATA', 'AGTG')).toThrow( - new Error('strands must be of equal length') + new Error('strands must be of equal length'), ); }); xtest('disallow empty first strand', () => { expect(() => compute('', 'G')).toThrow( - new Error('strands must be of equal length') + new Error('strands must be of equal length'), ); }); xtest('disallow empty second strand', () => { expect(() => compute('G', '')).toThrow( - new Error('strands must be of equal length') + new Error('strands must be of equal length'), ); }); }); diff --git a/exercises/practice/hamming/package.json b/exercises/practice/hamming/package.json index dd52c55968..c21c553896 100644 --- a/exercises/practice/hamming/package.json +++ b/exercises/practice/hamming/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/hamming" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/hello-world/.gitignore b/exercises/practice/hello-world/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/hello-world/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/hello-world/package.json b/exercises/practice/hello-world/package.json index 77fee03b86..606f2af424 100644 --- a/exercises/practice/hello-world/package.json +++ b/exercises/practice/hello-world/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/hello-world" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/hexadecimal/.gitignore b/exercises/practice/hexadecimal/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/hexadecimal/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/hexadecimal/package.json b/exercises/practice/hexadecimal/package.json index ecba7ac82a..916f63158f 100644 --- a/exercises/practice/hexadecimal/package.json +++ b/exercises/practice/hexadecimal/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/hexadecimal" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/high-scores/.gitignore b/exercises/practice/high-scores/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/high-scores/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/high-scores/package.json b/exercises/practice/high-scores/package.json index 50c92bd5eb..a8d2325d19 100644 --- a/exercises/practice/high-scores/package.json +++ b/exercises/practice/high-scores/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/high-scores" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/house/.gitignore b/exercises/practice/house/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/house/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/house/package.json b/exercises/practice/house/package.json index c558c6b4b5..3d49044ba8 100644 --- a/exercises/practice/house/package.json +++ b/exercises/practice/house/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/house" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/isbn-verifier/.gitignore b/exercises/practice/isbn-verifier/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/isbn-verifier/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/isbn-verifier/package.json b/exercises/practice/isbn-verifier/package.json index 81836564e6..2e2608f89b 100644 --- a/exercises/practice/isbn-verifier/package.json +++ b/exercises/practice/isbn-verifier/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/isbn-verifier" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/isogram/.approaches/config.json b/exercises/practice/isogram/.approaches/config.json index 479a94bac8..79a3e31493 100644 --- a/exercises/practice/isogram/.approaches/config.json +++ b/exercises/practice/isogram/.approaches/config.json @@ -1,6 +1,8 @@ { "introduction": { - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, "approaches": [ { @@ -8,21 +10,27 @@ "slug": "regex-match-dupe", "title": "regex match dupe", "blurb": "Use regex to match a duplicated letter.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "fbdf0f92-77d0-4b8b-be96-372ac7a4911b", "slug": "filter-set", "title": "filter with Set", "blurb": "Use filter to populate a Set.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "1748fd8c-d72e-4cf5-a92d-dd63d64a83ec", "slug": "bitfield", "title": "Bit field", "blurb": "Use a bit field to keep track of used letters.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] } ] } diff --git a/exercises/practice/isogram/.approaches/filter-set/content.md b/exercises/practice/isogram/.approaches/filter-set/content.md index 3884ef3a44..70d5fe1e94 100644 --- a/exercises/practice/isogram/.approaches/filter-set/content.md +++ b/exercises/practice/isogram/.approaches/filter-set/content.md @@ -3,7 +3,7 @@ ```javascript export function isIsogram(string) { let word = [...string.toLowerCase()].filter( - (letter) => letter >= 'a' && letter <= 'z' + (letter) => letter >= 'a' && letter <= 'z', ); return new Set(word).size == word.length; } diff --git a/exercises/practice/isogram/.approaches/introduction.md b/exercises/practice/isogram/.approaches/introduction.md index 0655acd6f7..a5aff7c1cc 100644 --- a/exercises/practice/isogram/.approaches/introduction.md +++ b/exercises/practice/isogram/.approaches/introduction.md @@ -25,7 +25,7 @@ For more information, check the [regex approach][approach-regex]. ```javascript export function isIsogram(string) { let word = [...string.toLowerCase()].filter( - (letter) => letter >= 'a' && letter <= 'z' + (letter) => letter >= 'a' && letter <= 'z', ); return new Set(word).size == word.length; } diff --git a/exercises/practice/isogram/.gitignore b/exercises/practice/isogram/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/isogram/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/isogram/package.json b/exercises/practice/isogram/package.json index 44013a0e1e..930a6cd5f1 100644 --- a/exercises/practice/isogram/package.json +++ b/exercises/practice/isogram/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/isogram" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/kindergarten-garden/.gitignore b/exercises/practice/kindergarten-garden/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/kindergarten-garden/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/kindergarten-garden/package.json b/exercises/practice/kindergarten-garden/package.json index ffcc03c51a..3221e61546 100644 --- a/exercises/practice/kindergarten-garden/package.json +++ b/exercises/practice/kindergarten-garden/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/kindergarten-garden" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/knapsack/.gitignore b/exercises/practice/knapsack/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/knapsack/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/knapsack/.meta/proof.ci.js b/exercises/practice/knapsack/.meta/proof.ci.js index e73c1866f7..c0dbf83a41 100644 --- a/exercises/practice/knapsack/.meta/proof.ci.js +++ b/exercises/practice/knapsack/.meta/proof.ci.js @@ -11,7 +11,7 @@ export const knapsack = (maximumWeight, items) => { } else { table[i + 1][capacity] = Math.max( table[i][capacity], - value + table[i][capacity - weight] + value + table[i][capacity - weight], ); } } diff --git a/exercises/practice/knapsack/package.json b/exercises/practice/knapsack/package.json index c077e5e085..4101bc65f5 100644 --- a/exercises/practice/knapsack/package.json +++ b/exercises/practice/knapsack/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/knapsack" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/largest-series-product/.docs/instructions.md b/exercises/practice/largest-series-product/.docs/instructions.md index 0d5956454b..f297b57f7c 100644 --- a/exercises/practice/largest-series-product/.docs/instructions.md +++ b/exercises/practice/largest-series-product/.docs/instructions.md @@ -1,14 +1,26 @@ # Instructions -Given a string of digits, calculate the largest product for a contiguous -substring of digits of length n. +Your task is to look for patterns in the long sequence of digits in the encrypted signal. -For example, for the input `'1027839564'`, the largest product for a -series of 3 digits is 270 (9 _ 5 _ 6), and the largest product for a -series of 5 digits is 7560 (7 _ 8 _ 3 _ 9 _ 5). +The technique you're going to use here is called the largest series product. -Note that these series are only required to occupy _adjacent positions_ -in the input; the digits need not be _numerically consecutive_. +Let's define a few terms, first. -For the input `'73167176531330624919225119674426574742355349194934'`, -the largest product for a series of 6 digits is 23520. +- **input**: the sequence of digits that you need to analyze +- **series**: a sequence of adjacent digits (those that are next to each other) that is contained within the input +- **span**: how many digits long each series is +- **product**: what you get when you multiply numbers together + +Let's work through an example, with the input `"63915"`. + +- To form a series, take adjacent digits in the original input. +- If you are working with a span of `3`, there will be three possible series: + - `"639"` + - `"391"` + - `"915"` +- Then we need to calculate the product of each series: + - The product of the series `"639"` is 162 (`6 × 3 × 9 = 162`) + - The product of the series `"391"` is 27 (`3 × 9 × 1 = 27`) + - The product of the series `"915"` is 45 (`9 × 1 × 5 = 45`) +- 162 is bigger than both 27 and 45, so the largest series product of `"63915"` is from the series `"639"`. + So the answer is **162**. diff --git a/exercises/practice/largest-series-product/.docs/introduction.md b/exercises/practice/largest-series-product/.docs/introduction.md new file mode 100644 index 0000000000..597bb5fa15 --- /dev/null +++ b/exercises/practice/largest-series-product/.docs/introduction.md @@ -0,0 +1,5 @@ +# Introduction + +You work for a government agency that has intercepted a series of encrypted communication signals from a group of bank robbers. +The signals contain a long sequence of digits. +Your team needs to use various digital signal processing techniques to analyze the signals and identify any patterns that may indicate the planning of a heist. diff --git a/exercises/practice/largest-series-product/.gitignore b/exercises/practice/largest-series-product/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/largest-series-product/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/largest-series-product/.meta/tests.toml b/exercises/practice/largest-series-product/.meta/tests.toml index 931c941180..00956d8d41 100644 --- a/exercises/practice/largest-series-product/.meta/tests.toml +++ b/exercises/practice/largest-series-product/.meta/tests.toml @@ -34,9 +34,11 @@ description = "rejects span longer than string length" [06bc8b90-0c51-4c54-ac22-3ec3893a079e] description = "reports 1 for empty string and empty product (0 span)" +include = false [3ec0d92e-f2e2-4090-a380-70afee02f4c0] description = "reports 1 for nonempty string and empty product (0 span)" +include = false [6d96c691-4374-4404-80ee-2ea8f3613dd4] description = "rejects empty string and nonzero span" diff --git a/exercises/practice/largest-series-product/largest-series-product.spec.js b/exercises/practice/largest-series-product/largest-series-product.spec.js index 213625d003..a0c38936cf 100644 --- a/exercises/practice/largest-series-product/largest-series-product.spec.js +++ b/exercises/practice/largest-series-product/largest-series-product.spec.js @@ -27,7 +27,7 @@ describe('Largest Series Product', () => { xtest('can get the largest product of a big number', () => { expect( - largestProduct('73167176531330624919225119674426574742355349194934', 6) + largestProduct('73167176531330624919225119674426574742355349194934', 6), ).toEqual(23520); }); @@ -41,33 +41,25 @@ describe('Largest Series Product', () => { xtest('rejects span longer than string length', () => { expect(() => largestProduct('123', 4)).toThrow( - new Error('Span must be smaller than string length') + new Error('Span must be smaller than string length'), ); }); - xtest('reports 1 for empty string and empty product (0 span)', () => { - expect(largestProduct('', 0)).toEqual(1); - }); - - xtest('reports 1 for nonempty string and empty product (0 span)', () => { - expect(largestProduct('123', 0)).toEqual(1); - }); - xtest('rejects empty string and nonzero span', () => { expect(() => largestProduct('', 1)).toThrow( - new Error('Span must be smaller than string length') + new Error('Span must be smaller than string length'), ); }); xtest('rejects invalid character in digits', () => { expect(() => largestProduct('1234a5', 2)).toThrow( - new Error('Digits input must only contain digits') + new Error('Digits input must only contain digits'), ); }); xtest('rejects negative span', () => { expect(() => largestProduct('12345', -1)).toThrow( - new Error('Span must be greater than zero') + new Error('Span must be greater than zero'), ); }); }); diff --git a/exercises/practice/largest-series-product/package.json b/exercises/practice/largest-series-product/package.json index dc43f55068..cbc8cfcc44 100644 --- a/exercises/practice/largest-series-product/package.json +++ b/exercises/practice/largest-series-product/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/largest-series-product" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/leap/.approaches/config.json b/exercises/practice/leap/.approaches/config.json index f1c94ad08b..7bba7b7e9d 100644 --- a/exercises/practice/leap/.approaches/config.json +++ b/exercises/practice/leap/.approaches/config.json @@ -1,7 +1,8 @@ { "introduction": { - "authors": ["bobahop"], - "contributors": [] + "authors": [ + "bobahop" + ] }, "approaches": [ { @@ -9,28 +10,36 @@ "slug": "boolean-chain", "title": "Boolean chain", "blurb": "Use a chain of boolean expressions.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "05a2ccf2-0878-48ed-b0dc-72c214813a8e", "slug": "ternary-operator", "title": "Ternary operator", "blurb": "Use a ternary operator of boolean expressions.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "a891670c-ea07-4171-bb91-06321663b6b1", "slug": "switch-statement", "title": "switch statement", "blurb": "Use a switch statement.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "eec0b9f3-331b-4df9-b33d-75d19f78c03e", "slug": "new-date-getmonth", "title": "new Date getMonth", "blurb": "Get the month for a new Date.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] } ] } diff --git a/exercises/practice/leap/.approaches/switch-statement/content.md b/exercises/practice/leap/.approaches/switch-statement/content.md index 0268449e32..91a39ad1d5 100644 --- a/exercises/practice/leap/.approaches/switch-statement/content.md +++ b/exercises/practice/leap/.approaches/switch-statement/content.md @@ -16,12 +16,12 @@ export function isLeap(year) { The [switch][switch] statement tests the value `true`, which leaves the actual testing up to the `case` arms. The `default` arm of the `switch` returns whether the year is evenly divisable by `4` when none of the previous arms match. -| year | year % 4 | year % 100 | year % 400 == 0 | is leap year | -| ---- | -------- | ---------- | --------------- | ------------ | -| 2020 | 0 | 20 | 20 | true | -| 2019 | 3 | 19 | 19 | false | -| 2020 | 0 | 0 | 0 | true | -| 1900 | 0 | 0 | 300 | false | +| year | year % 4 | year % 100 | year % 400 | is leap year | +| ---- | -------- | ---------- | ---------- | ------------ | +| 2020 | 0 | 20 | 20 | true | +| 2019 | 3 | 19 | 19 | false | +| 2000 | 0 | 0 | 0 | true | +| 1900 | 0 | 0 | 300 | false | The `switch` statement is somewhat more verbose than other approaches, and may also be considered less readable. diff --git a/exercises/practice/leap/.gitignore b/exercises/practice/leap/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/leap/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/leap/package.json b/exercises/practice/leap/package.json index c37e13f6e6..d6f961bdf0 100644 --- a/exercises/practice/leap/package.json +++ b/exercises/practice/leap/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/leap" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/linked-list/.docs/instructions.md b/exercises/practice/linked-list/.docs/instructions.md index 5cb6a9b4e9..a47942d73d 100644 --- a/exercises/practice/linked-list/.docs/instructions.md +++ b/exercises/practice/linked-list/.docs/instructions.md @@ -1,28 +1,26 @@ # Instructions -Implement a doubly linked list. +Your team has decided to use a doubly linked list to represent each train route in the schedule. +Each station along the train's route will be represented by a node in the linked list. -Like an array, a linked list is a simple linear data structure. Several -common data types can be implemented using linked lists, like queues, -stacks, and associative arrays. +You don't need to worry about arrival and departure times at the stations. +Each station will simply be represented by a number. -A linked list is a collection of data elements called _nodes_. In a -_singly linked list_ each node holds a value and a link to the next node. -In a _doubly linked list_ each node also holds a link to the previous -node. +Routes can be extended, adding stations to the beginning or end of a route. +They can also be shortened by removing stations from the beginning or the end of a route. -You will write an implementation of a doubly linked list. Implement a -Node to hold a value and pointers to the next and previous nodes. Then -implement a List which holds references to the first and last node and -offers an array-like interface for adding and removing items: +Sometimes a station gets closed down, and in that case the station needs to be removed from the route, even if it is not at the beginning or end of the route. -- `push` (_insert value at back_); -- `pop` (_remove value at back_); -- `shift` (_remove value at front_). -- `unshift` (_insert value at front_); +The size of a route is measured not by how far the train travels, but by how many stations it stops at. -To keep your implementation simple, the tests will not cover error -conditions. Specifically: `pop` or `shift` will never be called on an -empty list. +```exercism/note +The linked list is a fundamental data structure in computer science, often used in the implementation of other data structures. +As the name suggests, it is a list of nodes that are linked together. +It is a list of "nodes", where each node links to its neighbor or neighbors. +In a **singly linked list** each node links only to the node that follows it. +In a **doubly linked list** each node links to both the node that comes before, as well as the node that comes after. -If you want to know more about linked lists, check [Wikipedia](https://en.wikipedia.org/wiki/Linked_list). +If you want to dig deeper into linked lists, check out [this article][intro-linked-list] that explains it using nice drawings. + +[intro-linked-list]: https://medium.com/basecs/whats-a-linked-list-anyway-part-1-d8b7e6508b9d +``` diff --git a/exercises/practice/linked-list/.docs/introduction.md b/exercises/practice/linked-list/.docs/introduction.md new file mode 100644 index 0000000000..6e83ae7b6e --- /dev/null +++ b/exercises/practice/linked-list/.docs/introduction.md @@ -0,0 +1,6 @@ +# Introduction + +You are working on a project to develop a train scheduling system for a busy railway network. + +You've been asked to develop a prototype for the train routes in the scheduling system. +Each route consists of a sequence of train stations that a given train stops at. diff --git a/exercises/practice/linked-list/.gitignore b/exercises/practice/linked-list/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/linked-list/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/linked-list/package.json b/exercises/practice/linked-list/package.json index 3fc3c5af86..10290d80a7 100644 --- a/exercises/practice/linked-list/package.json +++ b/exercises/practice/linked-list/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/linked-list" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/list-ops/.gitignore b/exercises/practice/list-ops/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/list-ops/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/list-ops/.meta/proof.ci.js b/exercises/practice/list-ops/.meta/proof.ci.js index ba18271555..1804f163ef 100644 --- a/exercises/practice/list-ops/.meta/proof.ci.js +++ b/exercises/practice/list-ops/.meta/proof.ci.js @@ -98,7 +98,7 @@ class Cons { filter(predicate) { return this.foldl( (result, item) => (predicate(item) && result.push(item)) || result, - Null + Null, ); } diff --git a/exercises/practice/list-ops/package.json b/exercises/practice/list-ops/package.json index eeae1a55a8..e060782b01 100644 --- a/exercises/practice/list-ops/package.json +++ b/exercises/practice/list-ops/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/list-ops" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/luhn/.gitignore b/exercises/practice/luhn/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/luhn/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/luhn/package.json b/exercises/practice/luhn/package.json index e3ba76add5..1d4bb6c1c6 100644 --- a/exercises/practice/luhn/package.json +++ b/exercises/practice/luhn/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/luhn" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/matching-brackets/.gitignore b/exercises/practice/matching-brackets/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/matching-brackets/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/matching-brackets/matching-brackets.spec.js b/exercises/practice/matching-brackets/matching-brackets.spec.js index 74c89ea63c..de9ea3d224 100644 --- a/exercises/practice/matching-brackets/matching-brackets.spec.js +++ b/exercises/practice/matching-brackets/matching-brackets.spec.js @@ -68,8 +68,8 @@ describe('Matching Brackets', () => { xtest('complex latex expression', () => { expect( isPaired( - '\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)' - ) + '\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)', + ), ).toEqual(true); }); }); diff --git a/exercises/practice/matching-brackets/package.json b/exercises/practice/matching-brackets/package.json index 5f51f5b0d4..3777e1c040 100644 --- a/exercises/practice/matching-brackets/package.json +++ b/exercises/practice/matching-brackets/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/matching-brackets" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/matrix/.gitignore b/exercises/practice/matrix/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/matrix/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/matrix/package.json b/exercises/practice/matrix/package.json index c1cffb96f4..1e8a241890 100644 --- a/exercises/practice/matrix/package.json +++ b/exercises/practice/matrix/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/matrix" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/meetup/.gitignore b/exercises/practice/meetup/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/meetup/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/meetup/meetup.spec.js b/exercises/practice/meetup/meetup.spec.js index 6f0d16d8e0..14dd53d0e2 100644 --- a/exercises/practice/meetup/meetup.spec.js +++ b/exercises/practice/meetup/meetup.spec.js @@ -27,37 +27,37 @@ describe('Meetup', () => { xtest('wednesteenth of January 2013', () => { expect(meetup(2013, 1, 'teenth', 'Wednesday')).toEqual( - new Date(2013, 0, 16) + new Date(2013, 0, 16), ); }); xtest('wednesteenth of February 2013', () => { expect(meetup(2013, 2, 'teenth', 'Wednesday')).toEqual( - new Date(2013, 1, 13) + new Date(2013, 1, 13), ); }); xtest('wednesteenth of June 2013', () => { expect(meetup(2013, 6, 'teenth', 'Wednesday')).toEqual( - new Date(2013, 5, 19) + new Date(2013, 5, 19), ); }); xtest('thursteenth of May 2013', () => { expect(meetup(2013, 5, 'teenth', 'Thursday')).toEqual( - new Date(2013, 4, 16) + new Date(2013, 4, 16), ); }); xtest('thursteenth of June 2013', () => { expect(meetup(2013, 6, 'teenth', 'Thursday')).toEqual( - new Date(2013, 5, 13) + new Date(2013, 5, 13), ); }); xtest('thursteenth of September 2013', () => { expect(meetup(2013, 9, 'teenth', 'Thursday')).toEqual( - new Date(2013, 8, 19) + new Date(2013, 8, 19), ); }); @@ -75,19 +75,19 @@ describe('Meetup', () => { xtest('saturteenth of February 2013', () => { expect(meetup(2013, 2, 'teenth', 'Saturday')).toEqual( - new Date(2013, 1, 16) + new Date(2013, 1, 16), ); }); xtest('saturteenth of April 2013', () => { expect(meetup(2013, 4, 'teenth', 'Saturday')).toEqual( - new Date(2013, 3, 13) + new Date(2013, 3, 13), ); }); xtest('saturteenth of October 2013', () => { expect(meetup(2013, 10, 'teenth', 'Saturday')).toEqual( - new Date(2013, 9, 19) + new Date(2013, 9, 19), ); }); @@ -177,25 +177,25 @@ describe('Meetup', () => { xtest('second Wednesday of July 2013', () => { expect(meetup(2013, 7, 'second', 'Wednesday')).toEqual( - new Date(2013, 6, 10) + new Date(2013, 6, 10), ); }); xtest('second Wednesday of August 2013', () => { expect(meetup(2013, 8, 'second', 'Wednesday')).toEqual( - new Date(2013, 7, 14) + new Date(2013, 7, 14), ); }); xtest('second Thursday of September 2013', () => { expect(meetup(2013, 9, 'second', 'Thursday')).toEqual( - new Date(2013, 8, 12) + new Date(2013, 8, 12), ); }); xtest('second Thursday of October 2013', () => { expect(meetup(2013, 10, 'second', 'Thursday')).toEqual( - new Date(2013, 9, 10) + new Date(2013, 9, 10), ); }); @@ -205,13 +205,13 @@ describe('Meetup', () => { xtest('second Friday of December 2013', () => { expect(meetup(2013, 12, 'second', 'Friday')).toEqual( - new Date(2013, 11, 13) + new Date(2013, 11, 13), ); }); xtest('second Saturday of January 2013', () => { expect(meetup(2013, 1, 'second', 'Saturday')).toEqual( - new Date(2013, 0, 12) + new Date(2013, 0, 12), ); }); @@ -245,13 +245,13 @@ describe('Meetup', () => { xtest('third Wednesday of July 2013', () => { expect(meetup(2013, 7, 'third', 'Wednesday')).toEqual( - new Date(2013, 6, 17) + new Date(2013, 6, 17), ); }); xtest('third Wednesday of August 2013', () => { expect(meetup(2013, 8, 'third', 'Wednesday')).toEqual( - new Date(2013, 7, 21) + new Date(2013, 7, 21), ); }); @@ -261,7 +261,7 @@ describe('Meetup', () => { xtest('third Thursday of October 2013', () => { expect(meetup(2013, 10, 'third', 'Thursday')).toEqual( - new Date(2013, 9, 17) + new Date(2013, 9, 17), ); }); @@ -307,49 +307,49 @@ describe('Meetup', () => { xtest('fourth Wednesday of July 2013', () => { expect(meetup(2013, 7, 'fourth', 'Wednesday')).toEqual( - new Date(2013, 6, 24) + new Date(2013, 6, 24), ); }); xtest('fourth Wednesday of August 2013', () => { expect(meetup(2013, 8, 'fourth', 'Wednesday')).toEqual( - new Date(2013, 7, 28) + new Date(2013, 7, 28), ); }); xtest('fourth Thursday of September 2013', () => { expect(meetup(2013, 9, 'fourth', 'Thursday')).toEqual( - new Date(2013, 8, 26) + new Date(2013, 8, 26), ); }); xtest('fourth Thursday of October 2013', () => { expect(meetup(2013, 10, 'fourth', 'Thursday')).toEqual( - new Date(2013, 9, 24) + new Date(2013, 9, 24), ); }); xtest('fourth Friday of November 2013', () => { expect(meetup(2013, 11, 'fourth', 'Friday')).toEqual( - new Date(2013, 10, 22) + new Date(2013, 10, 22), ); }); xtest('fourth Friday of December 2013', () => { expect(meetup(2013, 12, 'fourth', 'Friday')).toEqual( - new Date(2013, 11, 27) + new Date(2013, 11, 27), ); }); xtest('fourth Saturday of January 2013', () => { expect(meetup(2013, 1, 'fourth', 'Saturday')).toEqual( - new Date(2013, 0, 26) + new Date(2013, 0, 26), ); }); xtest('fourth Saturday of February 2013', () => { expect(meetup(2013, 2, 'fourth', 'Saturday')).toEqual( - new Date(2013, 1, 23) + new Date(2013, 1, 23), ); }); @@ -423,7 +423,7 @@ describe('Meetup', () => { xtest('last Wednesday of December 2014', () => { expect(meetup(2014, 12, 'last', 'Wednesday')).toEqual( - new Date(2014, 11, 31) + new Date(2014, 11, 31), ); }); diff --git a/exercises/practice/meetup/package.json b/exercises/practice/meetup/package.json index 23c9240b0e..a6c220de89 100644 --- a/exercises/practice/meetup/package.json +++ b/exercises/practice/meetup/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/meetup" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/minesweeper/.gitignore b/exercises/practice/minesweeper/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/minesweeper/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/minesweeper/.meta/proof.ci.js b/exercises/practice/minesweeper/.meta/proof.ci.js index 3a760ea2c7..8509f91a24 100644 --- a/exercises/practice/minesweeper/.meta/proof.ci.js +++ b/exercises/practice/minesweeper/.meta/proof.ci.js @@ -21,7 +21,7 @@ function adjacentSquareHasMine(board, x, y, d) { function countAdjacentMines(board, x, y) { return DELTAS.filter((d) => adjacentSquareIsOnBoard(board, x, d)).filter( - (d) => adjacentSquareHasMine(board, x, y, d) + (d) => adjacentSquareHasMine(board, x, y, d), ).length; } @@ -50,7 +50,7 @@ export function annotate(rows) { return stringify( inputBoard.map((row, x) => - [...row].map((cell, y) => cellToMineOrCount(cell, inputBoard, x, y)) - ) + [...row].map((cell, y) => cellToMineOrCount(cell, inputBoard, x, y)), + ), ); } diff --git a/exercises/practice/minesweeper/package.json b/exercises/practice/minesweeper/package.json index 3785fcda11..810322a789 100644 --- a/exercises/practice/minesweeper/package.json +++ b/exercises/practice/minesweeper/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/minesweeper" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/nth-prime/.gitignore b/exercises/practice/nth-prime/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/nth-prime/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/nth-prime/package.json b/exercises/practice/nth-prime/package.json index a1fd947bf2..bb760429cb 100644 --- a/exercises/practice/nth-prime/package.json +++ b/exercises/practice/nth-prime/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/nth-prime" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/nucleotide-count/.gitignore b/exercises/practice/nucleotide-count/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/nucleotide-count/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/nucleotide-count/.meta/proof.ci.js b/exercises/practice/nucleotide-count/.meta/proof.ci.js index ceceff145a..5245c52de7 100644 --- a/exercises/practice/nucleotide-count/.meta/proof.ci.js +++ b/exercises/practice/nucleotide-count/.meta/proof.ci.js @@ -8,6 +8,6 @@ export function countNucleotides(strand) { return `${count(strand, 'A')} ${count(strand, 'C')} ${count( strand, - 'G' + 'G', )} ${count(strand, 'T')}`; } diff --git a/exercises/practice/nucleotide-count/nucleotide-count.spec.js b/exercises/practice/nucleotide-count/nucleotide-count.spec.js index fa297837f0..5f0674f77c 100644 --- a/exercises/practice/nucleotide-count/nucleotide-count.spec.js +++ b/exercises/practice/nucleotide-count/nucleotide-count.spec.js @@ -16,14 +16,14 @@ describe('count all nucleotides in a strand', () => { xtest('strand with multiple nucleotides', () => { expect( countNucleotides( - 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC' - ) + 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC', + ), ).toEqual('20 12 17 21'); }); xtest('strand with invalid nucleotides', () => { expect(() => countNucleotides('AGXXACT')).toThrow( - new Error('Invalid nucleotide in strand') + new Error('Invalid nucleotide in strand'), ); }); }); diff --git a/exercises/practice/nucleotide-count/package.json b/exercises/practice/nucleotide-count/package.json index 5cdfc35da9..01bbdbde31 100644 --- a/exercises/practice/nucleotide-count/package.json +++ b/exercises/practice/nucleotide-count/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/nucleotide-count" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/ocr-numbers/.gitignore b/exercises/practice/ocr-numbers/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/ocr-numbers/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/ocr-numbers/ocr-numbers.spec.js b/exercises/practice/ocr-numbers/ocr-numbers.spec.js index b9a18cf1e4..84b798b1d5 100644 --- a/exercises/practice/ocr-numbers/ocr-numbers.spec.js +++ b/exercises/practice/ocr-numbers/ocr-numbers.spec.js @@ -9,7 +9,7 @@ describe('ocr', () => { '| |\n' + '|_|\n' + ' ' - ) + ), ).toBe('0'); }); @@ -21,7 +21,7 @@ describe('ocr', () => { ' |\n' + ' |\n' + ' ' - ) + ), ).toBe('1'); }); @@ -33,7 +33,7 @@ describe('ocr', () => { ' _|\n' + '|_ \n' + ' ' - ) + ), ).toBe('2'); }); @@ -45,7 +45,7 @@ describe('ocr', () => { ' _|\n' + ' _|\n' + ' ' - ) + ), ).toBe('3'); }); @@ -57,7 +57,7 @@ describe('ocr', () => { '|_|\n' + ' |\n' + ' ' - ) + ), ).toBe('4'); }); @@ -69,7 +69,7 @@ describe('ocr', () => { '|_ \n' + ' _|\n' + ' ' - ) + ), ).toBe('5'); }); @@ -81,7 +81,7 @@ describe('ocr', () => { '|_ \n' + '|_|\n' + ' ' - ) + ), ).toBe('6'); }); @@ -93,7 +93,7 @@ describe('ocr', () => { ' |\n' + ' |\n' + ' ' - ) + ), ).toBe('7'); }); @@ -105,7 +105,7 @@ describe('ocr', () => { '|_|\n' + '|_|\n' + ' ' - ) + ), ).toBe('8'); }); @@ -117,7 +117,7 @@ describe('ocr', () => { '|_|\n' + ' _|\n' + ' ' - ) + ), ).toBe('9'); }); @@ -129,7 +129,7 @@ describe('ocr', () => { ' || |\n' + ' ||_|\n' + ' ' - ) + ), ).toBe('10'); }); @@ -141,7 +141,7 @@ describe('ocr', () => { '| |\n' + '| |\n' + ' ' - ) + ), ).toBe('?'); }); @@ -153,7 +153,7 @@ describe('ocr', () => { ' | || | || | | || || |\n' + ' | ||_| ||_| | ||_||_|\n' + ' ' - ) + ), ).toBe('110101100'); }); @@ -165,7 +165,7 @@ describe('ocr', () => { ' | || | || | || || |\n' + ' | | _| ||_| | ||_||_|\n' + ' ' - ) + ), ).toBe('11?10?1?0'); }); @@ -177,7 +177,7 @@ describe('ocr', () => { ' | _| _||_||_ |_ ||_||_|| |\n' + ' ||_ _| | _||_| ||_| _||_|\n' + ' ' - ) + ), ).toBe('1234567890'); }); @@ -197,7 +197,7 @@ describe('ocr', () => { ' ||_||_|\n' + ' ||_| _|\n' + ' ' - ) + ), ).toBe('123,456,789'); }); }); diff --git a/exercises/practice/ocr-numbers/package.json b/exercises/practice/ocr-numbers/package.json index 84dc161b82..42f9d94285 100644 --- a/exercises/practice/ocr-numbers/package.json +++ b/exercises/practice/ocr-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/ocr-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/octal/.gitignore b/exercises/practice/octal/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/octal/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/octal/package.json b/exercises/practice/octal/package.json index 94aa8cbac6..e68ff154ad 100644 --- a/exercises/practice/octal/package.json +++ b/exercises/practice/octal/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/octal" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/palindrome-products/.gitignore b/exercises/practice/palindrome-products/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/palindrome-products/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/palindrome-products/package.json b/exercises/practice/palindrome-products/package.json index 1d7d95ac26..a0ef66b98e 100644 --- a/exercises/practice/palindrome-products/package.json +++ b/exercises/practice/palindrome-products/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/palindrome-products" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/palindrome-products/palindrome-products.spec.js b/exercises/practice/palindrome-products/palindrome-products.spec.js index 8f7632a7d8..66c883bc60 100644 --- a/exercises/practice/palindrome-products/palindrome-products.spec.js +++ b/exercises/practice/palindrome-products/palindrome-products.spec.js @@ -94,7 +94,7 @@ describe('Palindromes', () => { expect(largest.value).toEqual(expected.value); expect(sortFactors(largest.factors)).toEqual(expected.factors); }, - 20 * 1000 + 20 * 1000, ); xtest('empty result for smallest if no palindrome in range', () => { diff --git a/exercises/practice/pangram/.approaches/config.json b/exercises/practice/pangram/.approaches/config.json index 6bb77f7334..167677512a 100644 --- a/exercises/practice/pangram/.approaches/config.json +++ b/exercises/practice/pangram/.approaches/config.json @@ -1,6 +1,8 @@ { "introduction": { - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, "approaches": [ { @@ -8,21 +10,27 @@ "slug": "every-includes", "title": "every with includes", "blurb": "Use every with includes.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "5d19ca5a-9eb2-42fc-bf23-ebf66b7e4959", "slug": "set-size", "title": "Set with size", "blurb": "Use Set with size.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] }, { "uuid": "44eff693-c28f-4928-9f45-7a9c7e79b843", "slug": "bitfield", "title": "Bit field", "blurb": "Use a bit field to keep track of used letters.", - "authors": ["bobahop"] + "authors": [ + "bobahop" + ] } ] } diff --git a/exercises/practice/pangram/.approaches/every-includes/content.md b/exercises/practice/pangram/.approaches/every-includes/content.md index e36283df6b..d0b8443105 100644 --- a/exercises/practice/pangram/.approaches/every-includes/content.md +++ b/exercises/practice/pangram/.approaches/every-includes/content.md @@ -4,7 +4,7 @@ export function isPangram(input) { const inputLowered = input.toLowerCase(); return [...'abcdefghijklmnopqrstuvwxyz'].every((c) => - inputLowered.includes(c) + inputLowered.includes(c), ); } ``` diff --git a/exercises/practice/pangram/.approaches/introduction.md b/exercises/practice/pangram/.approaches/introduction.md index 4342b6248b..f47bc73631 100644 --- a/exercises/practice/pangram/.approaches/introduction.md +++ b/exercises/practice/pangram/.approaches/introduction.md @@ -15,7 +15,7 @@ The occurrence of either the letter `a` or the letter `A` would count as the sam export function isPangram(input) { const inputLowered = input.toLowerCase(); return [...'abcdefghijklmnopqrstuvwxyz'].every((c) => - inputLowered.includes(c) + inputLowered.includes(c), ); } ``` diff --git a/exercises/practice/pangram/.docs/instructions.md b/exercises/practice/pangram/.docs/instructions.md index a4a152dcb9..d5698bc2a2 100644 --- a/exercises/practice/pangram/.docs/instructions.md +++ b/exercises/practice/pangram/.docs/instructions.md @@ -1,10 +1,8 @@ # Instructions -Determine if a sentence is a pangram. A pangram (Greek: παν γράμμα, pan gramma, -"every letter") is a sentence using every letter of the alphabet at least once. -The best known English pangram is: +Your task is to figure out if a sentence is a pangram. -> The quick brown fox jumps over the lazy dog. +A pangram is a sentence using every letter of the alphabet at least once. +It is case insensitive, so it doesn't matter if a letter is lower-case (e.g. `k`) or upper-case (e.g. `K`). -The alphabet used consists of ASCII letters `a` to `z`, inclusive, and is case -insensitive. Input will not contain non-ASCII symbols. +For this exercise we only use the basic letters used in the English alphabet: `a` to `z`. diff --git a/exercises/practice/pangram/.docs/introduction.md b/exercises/practice/pangram/.docs/introduction.md new file mode 100644 index 0000000000..d38fa341df --- /dev/null +++ b/exercises/practice/pangram/.docs/introduction.md @@ -0,0 +1,16 @@ +# Introduction + +You work for a company that sells fonts through their website. +They'd like to show a different sentence each time someone views a font on their website. +To give a comprehensive sense of the font, the random sentences should use **all** the letters in the English alphabet. + +They're running a competition to get suggestions for sentences that they can use. +You're in charge of checking the submissions to see if they are valid. + +```exercism/note +Pangram comes from Greek, παν γράμμα, pan gramma, which means "every letter". + +The best known English pangram is: + +> The quick brown fox jumps over the lazy dog. +``` diff --git a/exercises/practice/pangram/.gitignore b/exercises/practice/pangram/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/pangram/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/pangram/package.json b/exercises/practice/pangram/package.json index db3d991a04..bb699191a5 100644 --- a/exercises/practice/pangram/package.json +++ b/exercises/practice/pangram/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/pangram" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/pangram/pangram.spec.js b/exercises/practice/pangram/pangram.spec.js index 302c8875ad..c4671382fc 100644 --- a/exercises/practice/pangram/pangram.spec.js +++ b/exercises/practice/pangram/pangram.spec.js @@ -15,7 +15,7 @@ describe('Pangram()', () => { xtest("missing the letter 'x'", () => { expect( - isPangram('a quick movement of the enemy will jeopardize five gunboats') + isPangram('a quick movement of the enemy will jeopardize five gunboats'), ).toBe(false); }); @@ -29,13 +29,13 @@ describe('Pangram()', () => { xtest('with numbers', () => { expect(isPangram('the 1 quick brown fox jumps over the 2 lazy dogs')).toBe( - true + true, ); }); xtest('missing letters replaced by numbers', () => { expect(isPangram('7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog')).toBe( - false + false, ); }); @@ -45,7 +45,7 @@ describe('Pangram()', () => { xtest('case insensitive', () => { expect(isPangram('the quick brown fox jumps over with lazy FX')).toBe( - false + false, ); }); }); diff --git a/exercises/practice/pascals-triangle/.gitignore b/exercises/practice/pascals-triangle/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/pascals-triangle/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/pascals-triangle/package.json b/exercises/practice/pascals-triangle/package.json index 7bcaaa6ce2..217e394a92 100644 --- a/exercises/practice/pascals-triangle/package.json +++ b/exercises/practice/pascals-triangle/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/pascals-triangle" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/perfect-numbers/.gitignore b/exercises/practice/perfect-numbers/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/perfect-numbers/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/perfect-numbers/package.json b/exercises/practice/perfect-numbers/package.json index 86718609b1..3f1d14f0a2 100644 --- a/exercises/practice/perfect-numbers/package.json +++ b/exercises/practice/perfect-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/perfect-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/perfect-numbers/perfect-numbers.spec.js b/exercises/practice/perfect-numbers/perfect-numbers.spec.js index ffe4638928..70170853b8 100644 --- a/exercises/practice/perfect-numbers/perfect-numbers.spec.js +++ b/exercises/practice/perfect-numbers/perfect-numbers.spec.js @@ -4,13 +4,13 @@ describe('Exercise - Perfect Numbers', () => { describe('Invalid Inputs', () => { test('Zero is rejected (not a natural number)', () => { expect(() => classify(0)).toThrow( - new Error('Classification is only possible for natural numbers.') + new Error('Classification is only possible for natural numbers.'), ); }); xtest('Negative integer is rejected (not a natural number)', () => { expect(() => classify(-1)).toThrow( - new Error('Classification is only possible for natural numbers.') + new Error('Classification is only possible for natural numbers.'), ); }); }); diff --git a/exercises/practice/phone-number/.gitignore b/exercises/practice/phone-number/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/phone-number/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/phone-number/package.json b/exercises/practice/phone-number/package.json index 2fd56a650d..5224c1a141 100644 --- a/exercises/practice/phone-number/package.json +++ b/exercises/practice/phone-number/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/phone-number" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/phone-number/phone-number.spec.js b/exercises/practice/phone-number/phone-number.spec.js index 323f956022..adcd1f9bf5 100644 --- a/exercises/practice/phone-number/phone-number.spec.js +++ b/exercises/practice/phone-number/phone-number.spec.js @@ -16,13 +16,13 @@ describe('Phone Number', () => { xtest('invalid when 9 digits', () => { expect(() => clean('123456789')).toThrow( - new Error('Incorrect number of digits') + new Error('Incorrect number of digits'), ); }); xtest('invalid when 11 digits does not start with a 1', () => { expect(() => clean('22234567890')).toThrow( - new Error('11 digits must start with 1') + new Error('11 digits must start with 1'), ); }); @@ -36,67 +36,67 @@ describe('Phone Number', () => { xtest('invalid when more than 11 digits', () => { expect(() => clean('321234567890')).toThrow( - new Error('More than 11 digits') + new Error('More than 11 digits'), ); }); xtest('invalid with letters', () => { expect(() => clean('123-abc-7890')).toThrow( - new Error('Letters not permitted') + new Error('Letters not permitted'), ); }); xtest('invalid with punctuations', () => { expect(() => clean('123-@:!-7890')).toThrow( - new Error('Punctuations not permitted') + new Error('Punctuations not permitted'), ); }); xtest('invalid if area code starts with 0', () => { expect(() => clean('(023) 456-7890')).toThrow( - new Error('Area code cannot start with zero') + new Error('Area code cannot start with zero'), ); }); xtest('invalid if area code starts with 1', () => { expect(() => clean('(123) 456-7890')).toThrow( - new Error('Area code cannot start with one') + new Error('Area code cannot start with one'), ); }); xtest('invalid if exchange code starts with 0', () => { expect(() => clean('(223) 056-7890')).toThrow( - new Error('Exchange code cannot start with zero') + new Error('Exchange code cannot start with zero'), ); }); xtest('invalid if exchange code starts with 1', () => { expect(() => clean('(223) 156-7890')).toThrow( - new Error('Exchange code cannot start with one') + new Error('Exchange code cannot start with one'), ); }); xtest('invalid if area code starts with 0 on valid 11-digit number', () => { expect(() => clean('1 (023) 456-7890')).toThrow( - new Error('Area code cannot start with zero') + new Error('Area code cannot start with zero'), ); }); xtest('invalid if area code starts with 1 on valid 11-digit number', () => { expect(() => clean('1 (123) 456-7890')).toThrow( - new Error('Area code cannot start with one') + new Error('Area code cannot start with one'), ); }); xtest('invalid if exchange code starts with 0 on valid 11-digit number', () => { expect(() => clean('1 (223) 056-7890')).toThrow( - new Error('Exchange code cannot start with zero') + new Error('Exchange code cannot start with zero'), ); }); xtest('invalid if exchange code starts with 1 on valid 11-digit number', () => { expect(() => clean('1 (223) 156-7890')).toThrow( - new Error('Exchange code cannot start with one') + new Error('Exchange code cannot start with one'), ); }); }); diff --git a/exercises/practice/pig-latin/.gitignore b/exercises/practice/pig-latin/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/pig-latin/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/pig-latin/package.json b/exercises/practice/pig-latin/package.json index 562d5ab25a..5d515d0d12 100644 --- a/exercises/practice/pig-latin/package.json +++ b/exercises/practice/pig-latin/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/pig-latin" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/point-mutations/.gitignore b/exercises/practice/point-mutations/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/point-mutations/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/point-mutations/.meta/proof.ci.js b/exercises/practice/point-mutations/.meta/proof.ci.js index 03f2a5ab73..90b64a005c 100644 --- a/exercises/practice/point-mutations/.meta/proof.ci.js +++ b/exercises/practice/point-mutations/.meta/proof.ci.js @@ -7,7 +7,7 @@ export class DNA { let distance = 0; const calculationDistance = Math.min( this.nucleotides.length, - comparison.length + comparison.length, ); for (let i = 0; i < calculationDistance; i += 1) { diff --git a/exercises/practice/point-mutations/package.json b/exercises/practice/point-mutations/package.json index e5a6f20508..7e2655ffc1 100644 --- a/exercises/practice/point-mutations/package.json +++ b/exercises/practice/point-mutations/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/point-mutations" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/poker/.gitignore b/exercises/practice/poker/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/poker/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/poker/.meta/proof.ci.js b/exercises/practice/poker/.meta/proof.ci.js index 45df5279da..ec7134e440 100644 --- a/exercises/practice/poker/.meta/proof.ci.js +++ b/exercises/practice/poker/.meta/proof.ci.js @@ -22,7 +22,7 @@ export const bestHands = (hands) => { const handValueComparison = compareHandValues( maxRank, maxValue, - handValue + handValue, ); if (handValueComparison === 2) { maxValue = handValue; diff --git a/exercises/practice/poker/package.json b/exercises/practice/poker/package.json index b124849fb5..21b3521b7f 100644 --- a/exercises/practice/poker/package.json +++ b/exercises/practice/poker/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/poker" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/prime-factors/.gitignore b/exercises/practice/prime-factors/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/prime-factors/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/prime-factors/package.json b/exercises/practice/prime-factors/package.json index 9210cfb68b..2124d393f2 100644 --- a/exercises/practice/prime-factors/package.json +++ b/exercises/practice/prime-factors/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/prime-factors" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/promises/.gitignore b/exercises/practice/promises/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/promises/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/promises/.meta/proof.ci.js b/exercises/practice/promises/.meta/proof.ci.js index a0b36fe722..9ea7f2d9d2 100644 --- a/exercises/practice/promises/.meta/proof.ci.js +++ b/exercises/practice/promises/.meta/proof.ci.js @@ -10,7 +10,7 @@ export const all = (promises) => { if (promises.length === 0) return Promise.resolve([]); return promises.reduce( async (acc, promise) => (await acc).concat(await promise), - Promise.resolve([]) + Promise.resolve([]), ); }; @@ -20,7 +20,7 @@ export const allSettled = (promises) => { return promises.reduce( async (acc, promise) => (await acc).concat(await promise.catch((err) => err)), - Promise.resolve([]) + Promise.resolve([]), ); }; diff --git a/exercises/practice/promises/package.json b/exercises/practice/promises/package.json index 2d5e209c5b..8c51921f54 100644 --- a/exercises/practice/promises/package.json +++ b/exercises/practice/promises/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/promises" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/promises/promises.spec.js b/exercises/practice/promises/promises.spec.js index 0d16a92886..39c5bb2197 100644 --- a/exercises/practice/promises/promises.spec.js +++ b/exercises/practice/promises/promises.spec.js @@ -139,20 +139,20 @@ describe('promises', () => { slowestPromise('SLOWEST'), slowerPromise('SLOWER'), fastPromise(FAST), - ]) + ]), ).resolves.toEqual(FAST); }); xtest('resolves with value of the fastest promise even if other slower promises fail', () => { const FAST = 'FAST'; return expect( - race([failedPromise(null), fastPromise(FAST)]) + race([failedPromise(null), fastPromise(FAST)]), ).resolves.toEqual(FAST); }); xtest('rejects if the fastest promise fails even if other slower promises succeed', () => { return expect( - race([slowestPromise('SLOWEST'), failedPromise(null)]) + race([slowestPromise('SLOWEST'), failedPromise(null)]), ).rejects.toEqual(failedCallback); }); }); @@ -184,27 +184,27 @@ describe('promises', () => { slowestPromise('SLOWEST'), slowerPromise('SLOWER'), fastPromise(FAST), - ]) + ]), ).resolves.toEqual(FAST); }); xtest('resolves with value of the fastest successful promise even if slower promises fail', () => { const FAST = 'FAST'; return expect( - any([failedPromise(null), fastPromise(FAST)]) + any([failedPromise(null), fastPromise(FAST)]), ).resolves.toEqual(FAST); }); xtest('resolves with value of fastest successful promise even if faster promises fail', () => { const SLOWEST = 'SLOWEST'; return expect( - any([failedPromise(null), slowestPromise(SLOWEST)]) + any([failedPromise(null), slowestPromise(SLOWEST)]), ).resolves.toEqual(SLOWEST); }); xtest('rejects with array of errors if all promises fail', () => { return expect( - any([failedPromise(null), failedPromise(null)]) + any([failedPromise(null), failedPromise(null)]), ).rejects.toEqual([failedCallback, failedCallback]); }); }); diff --git a/exercises/practice/protein-translation/.gitignore b/exercises/practice/protein-translation/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/protein-translation/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/protein-translation/package.json b/exercises/practice/protein-translation/package.json index 28e9364a55..25f2912faf 100644 --- a/exercises/practice/protein-translation/package.json +++ b/exercises/practice/protein-translation/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/protein-translation" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/proverb/.gitignore b/exercises/practice/proverb/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/proverb/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/proverb/.meta/proof.ci.js b/exercises/practice/proverb/.meta/proof.ci.js index 4c04a3c32e..7e9da596f5 100644 --- a/exercises/practice/proverb/.meta/proof.ci.js +++ b/exercises/practice/proverb/.meta/proof.ci.js @@ -18,7 +18,7 @@ export const proverb = (...args) => { const allExceptLastArg = args.slice(0, -1); const chainOfEvents = allExceptLastArg.map( - (arg, index) => `For want of a ${arg} the ${args[index + 1]} was lost.` + (arg, index) => `For want of a ${arg} the ${args[index + 1]} was lost.`, ); const qualifier = options.qualifier diff --git a/exercises/practice/proverb/package.json b/exercises/practice/proverb/package.json index 1e9bf65a3d..a7adbf270c 100644 --- a/exercises/practice/proverb/package.json +++ b/exercises/practice/proverb/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/proverb" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/proverb/proverb.spec.js b/exercises/practice/proverb/proverb.spec.js index 82367e5f92..b893560de0 100644 --- a/exercises/practice/proverb/proverb.spec.js +++ b/exercises/practice/proverb/proverb.spec.js @@ -18,7 +18,7 @@ describe('Proverb', () => { expect(result).toEqual( `For want of a nail the shoe was lost. -And all for the want of a nail.` +And all for the want of a nail.`, ); }); @@ -28,7 +28,7 @@ And all for the want of a nail.` expect(result).toEqual( `For want of a nail the shoe was lost. For want of a shoe the horse was lost. -And all for the want of a nail.` +And all for the want of a nail.`, ); }); @@ -40,7 +40,7 @@ And all for the want of a nail.` 'rider', 'message', 'battle', - 'kingdom' + 'kingdom', ); expect(result).toEqual( @@ -50,7 +50,7 @@ For want of a horse the rider was lost. For want of a rider the message was lost. For want of a message the battle was lost. For want of a battle the kingdom was lost. -And all for the want of a nail.` +And all for the want of a nail.`, ); }); @@ -65,7 +65,7 @@ And all for the want of a nail.` `For want of a pin the gun was lost. For want of a gun the soldier was lost. For want of a soldier the battle was lost. -And all for the want of a pin.` +And all for the want of a pin.`, ); }); @@ -78,7 +78,7 @@ And all for the want of a pin.` 'message', 'battle', 'kingdom', - { qualifier: 'horseshoe' } + { qualifier: 'horseshoe' }, ); expect(result).toEqual( @@ -88,7 +88,7 @@ For want of a horse the rider was lost. For want of a rider the message was lost. For want of a message the battle was lost. For want of a battle the kingdom was lost. -And all for the want of a horseshoe nail.` +And all for the want of a horseshoe nail.`, ); }); }); diff --git a/exercises/practice/pythagorean-triplet/.gitignore b/exercises/practice/pythagorean-triplet/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/pythagorean-triplet/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/pythagorean-triplet/package.json b/exercises/practice/pythagorean-triplet/package.json index 6433f28ba5..8683c4c4cd 100644 --- a/exercises/practice/pythagorean-triplet/package.json +++ b/exercises/practice/pythagorean-triplet/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/pythagorean-triplet" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/pythagorean-triplet/pythagorean-triplet.spec.js b/exercises/practice/pythagorean-triplet/pythagorean-triplet.spec.js index a744aa1af9..9094d78a37 100644 --- a/exercises/practice/pythagorean-triplet/pythagorean-triplet.spec.js +++ b/exercises/practice/pythagorean-triplet/pythagorean-triplet.spec.js @@ -2,7 +2,7 @@ import { triplets } from './pythagorean-triplet'; function tripletsWithSum(sum, options = {}) { return triplets({ ...options, sum }).map((triplet) => - triplet.toArray().sort((a, b) => a - b) + triplet.toArray().sort((a, b) => a - b), ); } @@ -71,6 +71,6 @@ describe('Triplet', () => { [7500, 10000, 12500], ]); }, - 20 * 1000 + 20 * 1000, ); }); diff --git a/exercises/practice/queen-attack/.gitignore b/exercises/practice/queen-attack/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/queen-attack/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/queen-attack/.meta/proof.ci.js b/exercises/practice/queen-attack/.meta/proof.ci.js index 2ffa5aeff2..ac7bb0ae85 100644 --- a/exercises/practice/queen-attack/.meta/proof.ci.js +++ b/exercises/practice/queen-attack/.meta/proof.ci.js @@ -66,7 +66,7 @@ export class QueenAttack { toString() { return Array.from({ length: H }, (_, row) => - this.board.slice(row * H, row * H + W).join(' ') + this.board.slice(row * H, row * H + W).join(' '), ).join('\n'); } } diff --git a/exercises/practice/queen-attack/package.json b/exercises/practice/queen-attack/package.json index 50fa115cb1..908fd04dfc 100644 --- a/exercises/practice/queen-attack/package.json +++ b/exercises/practice/queen-attack/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/queen-attack" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/rail-fence-cipher/.gitignore b/exercises/practice/rail-fence-cipher/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rail-fence-cipher/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rail-fence-cipher/.meta/proof.ci.js b/exercises/practice/rail-fence-cipher/.meta/proof.ci.js index 7ace51c83c..e57bb0e53b 100644 --- a/exercises/practice/rail-fence-cipher/.meta/proof.ci.js +++ b/exercises/practice/rail-fence-cipher/.meta/proof.ci.js @@ -29,7 +29,7 @@ export const decode = (msg, rails) => { }); return cycles.reduce( (str, cycle, index) => str + stringRails[cycle][index], - '' + '', ); }; diff --git a/exercises/practice/rail-fence-cipher/package.json b/exercises/practice/rail-fence-cipher/package.json index c98b7a4f24..d448ac92b0 100644 --- a/exercises/practice/rail-fence-cipher/package.json +++ b/exercises/practice/rail-fence-cipher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rail-fence-cipher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/raindrops/.gitignore b/exercises/practice/raindrops/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/raindrops/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/raindrops/package.json b/exercises/practice/raindrops/package.json index e27803bd9f..730605d1fb 100644 --- a/exercises/practice/raindrops/package.json +++ b/exercises/practice/raindrops/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/raindrops" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/rational-numbers/.gitignore b/exercises/practice/rational-numbers/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rational-numbers/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rational-numbers/.meta/proof.ci.js b/exercises/practice/rational-numbers/.meta/proof.ci.js index eceb27e5da..66f11409cd 100644 --- a/exercises/practice/rational-numbers/.meta/proof.ci.js +++ b/exercises/practice/rational-numbers/.meta/proof.ci.js @@ -14,26 +14,26 @@ class Rational { const commonDenominator = this.denominator * that.denominator; return new Rational( this.numerator * that.denominator + that.numerator * this.denominator, - commonDenominator + commonDenominator, ); } sub(that) { const commonDenominator = this.denominator * that.denominator; return new Rational( this.numerator * that.denominator - that.numerator * this.denominator, - commonDenominator + commonDenominator, ); } mul(that) { return new Rational( this.numerator * that.numerator, - this.denominator * that.denominator + this.denominator * that.denominator, ); } div(that) { return new Rational( this.numerator * that.denominator, - this.denominator * that.numerator + this.denominator * that.numerator, ); } abs() { @@ -42,13 +42,13 @@ class Rational { exprational(n) { return new Rational( Math.pow(this.numerator, n), - Math.pow(this.denominator, n) + Math.pow(this.denominator, n), ); } expreal(base) { return Math.pow( 10.0, - Math.log10(Math.pow(base, this.numerator)) / this.denominator + Math.log10(Math.pow(base, this.numerator)) / this.denominator, ); } reduce() { diff --git a/exercises/practice/rational-numbers/package.json b/exercises/practice/rational-numbers/package.json index 2b90db0b38..a0b1e6297b 100644 --- a/exercises/practice/rational-numbers/package.json +++ b/exercises/practice/rational-numbers/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rational-numbers" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/react/.gitignore b/exercises/practice/react/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/react/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/react/package.json b/exercises/practice/react/package.json index 51642a90d2..3e418c738e 100644 --- a/exercises/practice/react/package.json +++ b/exercises/practice/react/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/react" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/react/react.spec.js b/exercises/practice/react/react.spec.js index d59110e84b..660e40b1ae 100644 --- a/exercises/practice/react/react.spec.js +++ b/exercises/practice/react/react.spec.js @@ -24,7 +24,7 @@ describe('React module', () => { const computeCell = new ComputeCell( inputCells, - (inputs) => inputs[0].value + inputs[1].value * 10 + (inputs) => inputs[0].value + inputs[1].value * 10, ); expect(computeCell.value).toEqual(21); @@ -34,7 +34,7 @@ describe('React module', () => { const inputCell = new InputCell(1); const computeCell = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); inputCell.setValue(3); expect(computeCell.value).toEqual(4); @@ -44,17 +44,17 @@ describe('React module', () => { const inputCell = new InputCell(1); const timesTwo = new ComputeCell( [inputCell], - (inputs) => inputs[0].value * 2 + (inputs) => inputs[0].value * 2, ); const timesThirty = new ComputeCell( [inputCell], - (inputs) => inputs[0].value * 30 + (inputs) => inputs[0].value * 30, ); const sum = new ComputeCell( [timesTwo, timesThirty], - (inputs) => inputs[0].value + inputs[1].value + (inputs) => inputs[0].value + inputs[1].value, ); expect(sum.value).toEqual(32); @@ -67,7 +67,7 @@ describe('React module', () => { const inputCell = new InputCell(1); const output = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); const callback = new CallbackCell((cell) => cell.value); @@ -80,7 +80,7 @@ describe('React module', () => { xtest('callbacks fire only when output values change', () => { const inputCell = new InputCell(1); const output = new ComputeCell([inputCell], (inputs) => - inputs[0].value < 3 ? 111 : 222 + inputs[0].value < 3 ? 111 : 222, ); const callback = new CallbackCell((cell) => cell.value); @@ -96,7 +96,7 @@ describe('React module', () => { xtest('static callbacks fire even if their own value has not changed', () => { const inputCell = new InputCell(1); const output = new ComputeCell([inputCell], (inputs) => - inputs[0].value < 3 ? 111 : 222 + inputs[0].value < 3 ? 111 : 222, ); const callback = new CallbackCell(() => 'cell changed'); @@ -119,7 +119,7 @@ describe('React module', () => { const inputCell = new InputCell(1); const output = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); const callback1 = new CallbackCell((cell) => cell.value); @@ -146,7 +146,7 @@ describe('React module', () => { const inputCell = new InputCell(1); const output = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); const callback1 = new CallbackCell((cell) => cell.value); @@ -169,22 +169,22 @@ describe('React module', () => { const inputCell = new InputCell(1); const plusOne = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); const minusOne1 = new ComputeCell( [inputCell], - (inputs) => inputs[0].value - 1 + (inputs) => inputs[0].value - 1, ); const minusOne2 = new ComputeCell( [minusOne1], - (inputs) => inputs[0].value - 1 + (inputs) => inputs[0].value - 1, ); const output = new ComputeCell( [plusOne, minusOne2], - (inputs) => inputs[0].value * inputs[1].value + (inputs) => inputs[0].value * inputs[1].value, ); const callback1 = new CallbackCell((cell) => cell.value); @@ -199,17 +199,17 @@ describe('React module', () => { const inputCell = new InputCell(1); const plusOne = new ComputeCell( [inputCell], - (inputs) => inputs[0].value + 1 + (inputs) => inputs[0].value + 1, ); const minusOne = new ComputeCell( [inputCell], - (inputs) => inputs[0].value - 1 + (inputs) => inputs[0].value - 1, ); const alwaysTwo = new ComputeCell( [plusOne, minusOne], - (inputs) => inputs[0].value - inputs[1].value + (inputs) => inputs[0].value - inputs[1].value, ); const callback = new CallbackCell((cell) => cell.value); diff --git a/exercises/practice/rectangles/.gitignore b/exercises/practice/rectangles/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rectangles/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rectangles/package.json b/exercises/practice/rectangles/package.json index 2447a99586..3c379c593c 100644 --- a/exercises/practice/rectangles/package.json +++ b/exercises/practice/rectangles/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rectangles" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/resistor-color-duo/.gitignore b/exercises/practice/resistor-color-duo/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/resistor-color-duo/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/resistor-color-duo/package.json b/exercises/practice/resistor-color-duo/package.json index 4dd69f9f55..ebd3b888ce 100644 --- a/exercises/practice/resistor-color-duo/package.json +++ b/exercises/practice/resistor-color-duo/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/resistor-color-duo" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/resistor-color-trio/.gitignore b/exercises/practice/resistor-color-trio/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/resistor-color-trio/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/resistor-color-trio/package.json b/exercises/practice/resistor-color-trio/package.json index 24f9e873c2..10ef577560 100644 --- a/exercises/practice/resistor-color-trio/package.json +++ b/exercises/practice/resistor-color-trio/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/resistor-color-trio" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/resistor-color-trio/resistor-color-trio.spec.js b/exercises/practice/resistor-color-trio/resistor-color-trio.spec.js index be86abf55c..135dd9c287 100644 --- a/exercises/practice/resistor-color-trio/resistor-color-trio.spec.js +++ b/exercises/practice/resistor-color-trio/resistor-color-trio.spec.js @@ -7,38 +7,38 @@ function makeLabel({ value, unit }) { describe('Resistor Color Trio', () => { test('Orange and orange and black', () => { expect(new ResistorColorTrio(['orange', 'orange', 'black']).label).toEqual( - makeLabel({ value: 33, unit: 'ohms' }) + makeLabel({ value: 33, unit: 'ohms' }), ); }); xtest('Blue and grey and brown', () => { expect(new ResistorColorTrio(['blue', 'grey', 'brown']).label).toEqual( - makeLabel({ value: 680, unit: 'ohms' }) + makeLabel({ value: 680, unit: 'ohms' }), ); }); xtest('Red and black and red', () => { expect(new ResistorColorTrio(['red', 'black', 'red']).label).toEqual( - makeLabel({ value: 2, unit: 'kiloohms' }) + makeLabel({ value: 2, unit: 'kiloohms' }), ); }); xtest('Green and brown and orange', () => { expect(new ResistorColorTrio(['green', 'brown', 'orange']).label).toEqual( - makeLabel({ value: 51, unit: 'kiloohms' }) + makeLabel({ value: 51, unit: 'kiloohms' }), ); }); xtest('Yellow and violet and yellow', () => { expect(new ResistorColorTrio(['yellow', 'violet', 'yellow']).label).toEqual( - makeLabel({ value: 470, unit: 'kiloohms' }) + makeLabel({ value: 470, unit: 'kiloohms' }), ); }); // optional: error xtest('Invalid color', () => { expect( - () => new ResistorColorTrio(['yellow', 'purple', 'black']).label + () => new ResistorColorTrio(['yellow', 'purple', 'black']).label, ).toThrowError(/invalid color/); }); }); diff --git a/exercises/practice/resistor-color/.gitignore b/exercises/practice/resistor-color/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/resistor-color/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/resistor-color/package.json b/exercises/practice/resistor-color/package.json index ed56a56cce..db08cec654 100644 --- a/exercises/practice/resistor-color/package.json +++ b/exercises/practice/resistor-color/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/resistor-color" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/rest-api/.gitignore b/exercises/practice/rest-api/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rest-api/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rest-api/.meta/proof.ci.js b/exercises/practice/rest-api/.meta/proof.ci.js index 036a0883da..90a071508a 100644 --- a/exercises/practice/rest-api/.meta/proof.ci.js +++ b/exercises/practice/rest-api/.meta/proof.ci.js @@ -17,7 +17,7 @@ export class RestAPI { if (pName === 'users') { return { users: this.database.users.filter((user) => - pData.includes(user.name) + pData.includes(user.name), ), }; } @@ -36,7 +36,7 @@ export class RestAPI { switch (url) { case '/add': { const existingUser = this.database.users.find( - (user) => user.name === payload.user + (user) => user.name === payload.user, ); if (existingUser) return existingUser; const newUser = { diff --git a/exercises/practice/rest-api/package.json b/exercises/practice/rest-api/package.json index 664992a1d3..150b567c88 100644 --- a/exercises/practice/rest-api/package.json +++ b/exercises/practice/rest-api/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rest-api" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/reverse-string/.gitignore b/exercises/practice/reverse-string/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/reverse-string/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/reverse-string/package.json b/exercises/practice/reverse-string/package.json index ec57a0fe5c..2388a7d0b2 100644 --- a/exercises/practice/reverse-string/package.json +++ b/exercises/practice/reverse-string/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/reverse-string" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/rna-transcription/.docs/instructions.md b/exercises/practice/rna-transcription/.docs/instructions.md index d1613b3573..de2783a14c 100644 --- a/exercises/practice/rna-transcription/.docs/instructions.md +++ b/exercises/practice/rna-transcription/.docs/instructions.md @@ -1,19 +1,21 @@ # Instructions -Given a DNA strand, return its RNA complement (per RNA transcription). +Your task is determine the RNA complement of a given DNA sequence. Both DNA and RNA strands are a sequence of nucleotides. -The four nucleotides found in DNA are adenine (**A**), cytosine (**C**), -guanine (**G**) and thymine (**T**). +The four nucleotides found in DNA are adenine (**A**), cytosine (**C**), guanine (**G**) and thymine (**T**). -The four nucleotides found in RNA are adenine (**A**), cytosine (**C**), -guanine (**G**) and uracil (**U**). +The four nucleotides found in RNA are adenine (**A**), cytosine (**C**), guanine (**G**) and uracil (**U**). -Given a DNA strand, its transcribed RNA strand is formed by replacing -each nucleotide with its complement: +Given a DNA strand, its transcribed RNA strand is formed by replacing each nucleotide with its complement: - `G` -> `C` - `C` -> `G` - `T` -> `A` - `A` -> `U` + + +~~~~exercism/note +If you want to look at how the inputs and outputs are structured, take a look at the examples in the test suite. +~~~~ diff --git a/exercises/practice/rna-transcription/.docs/introduction.md b/exercises/practice/rna-transcription/.docs/introduction.md new file mode 100644 index 0000000000..8706b23126 --- /dev/null +++ b/exercises/practice/rna-transcription/.docs/introduction.md @@ -0,0 +1,17 @@ +# Introduction + +You work for a bioengineering company that specializes in developing therapeutic solutions. + +Your team has just been given a new project to develop a targeted therapy for a rare type of cancer. + + +~~~~exercism/note +It's all very complicated, but the basic idea is that sometimes people's bodies produce too much of a given protein. +That can cause all sorts of havoc. + +But if you can create a very specific molecule (called a micro-RNA), it can prevent the protein from being produced. + +This technique is called [RNA Interference][rnai]. + +[rnai]: https://admin.acceleratingscience.com/ask-a-scientist/what-is-rnai/ +~~~~ diff --git a/exercises/practice/rna-transcription/.gitignore b/exercises/practice/rna-transcription/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rna-transcription/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rna-transcription/package.json b/exercises/practice/rna-transcription/package.json index 18ca15e171..3373ac3c5a 100644 --- a/exercises/practice/rna-transcription/package.json +++ b/exercises/practice/rna-transcription/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rna-transcription" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/robot-name/.gitignore b/exercises/practice/robot-name/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/robot-name/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/robot-name/.meta/proof.ci.js b/exercises/practice/robot-name/.meta/proof.ci.js index 22cd5e0d52..5264abb4c0 100644 --- a/exercises/practice/robot-name/.meta/proof.ci.js +++ b/exercises/practice/robot-name/.meta/proof.ci.js @@ -41,7 +41,7 @@ function generateName() { shuffledPointer += 1; if (shuffledPointer > shuffled.length) { throw new Error( - 'Can not generate another name because all the names have been used.' + 'Can not generate another name because all the names have been used.', ); } return shuffled[shuffledPointer]; diff --git a/exercises/practice/robot-name/package.json b/exercises/practice/robot-name/package.json index 7bf43d0d79..fded2ea631 100644 --- a/exercises/practice/robot-name/package.json +++ b/exercises/practice/robot-name/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/robot-name" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/robot-name/robot-name.spec.js b/exercises/practice/robot-name/robot-name.spec.js index ada4dc9ac5..f88435b8c1 100644 --- a/exercises/practice/robot-name/robot-name.spec.js +++ b/exercises/practice/robot-name/robot-name.spec.js @@ -113,6 +113,6 @@ describe('Robot', () => { expect(usedNames.size).toEqual(TOTAL_NUMBER_OF_NAMES); }, - 8 * 1000 + 8 * 1000, ); }); diff --git a/exercises/practice/robot-simulator/.gitignore b/exercises/practice/robot-simulator/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/robot-simulator/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/robot-simulator/.meta/proof.ci.js b/exercises/practice/robot-simulator/.meta/proof.ci.js index fe2db5094f..cc7f4ce9b2 100644 --- a/exercises/practice/robot-simulator/.meta/proof.ci.js +++ b/exercises/practice/robot-simulator/.meta/proof.ci.js @@ -17,7 +17,7 @@ export class Robot { return 'advance'; default: throw new InvalidInputError( - `${character} is not a valid instruction character.` + `${character} is not a valid instruction character.`, ); } }); diff --git a/exercises/practice/robot-simulator/package.json b/exercises/practice/robot-simulator/package.json index df2be641f7..c4fc4e1cee 100644 --- a/exercises/practice/robot-simulator/package.json +++ b/exercises/practice/robot-simulator/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/robot-simulator" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/robot-simulator/robot-simulator.spec.js b/exercises/practice/robot-simulator/robot-simulator.spec.js index 9cc568489d..446e91c911 100644 --- a/exercises/practice/robot-simulator/robot-simulator.spec.js +++ b/exercises/practice/robot-simulator/robot-simulator.spec.js @@ -47,7 +47,7 @@ describe('Robot', () => { expect(InvalidInputError.prototype).toBeInstanceOf(Error); expect(() => robot.place({ direction: 'crood', x: 0, y: 0 })).toThrow( - InvalidInputError + InvalidInputError, ); }); }); diff --git a/exercises/practice/roman-numerals/.gitignore b/exercises/practice/roman-numerals/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/roman-numerals/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/roman-numerals/.meta/config.json b/exercises/practice/roman-numerals/.meta/config.json index 6842f56516..3ac9cde836 100644 --- a/exercises/practice/roman-numerals/.meta/config.json +++ b/exercises/practice/roman-numerals/.meta/config.json @@ -8,7 +8,8 @@ "matthewmorgan", "ryanplusplus", "serixscorpio", - "SleeplessByte" + "SleeplessByte", + "tejasbubane" ], "files": { "solution": [ diff --git a/exercises/practice/roman-numerals/package.json b/exercises/practice/roman-numerals/package.json index ec2e61f5fd..4904cb5de2 100644 --- a/exercises/practice/roman-numerals/package.json +++ b/exercises/practice/roman-numerals/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/roman-numerals" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/roman-numerals/roman-numerals.spec.js b/exercises/practice/roman-numerals/roman-numerals.spec.js index 74c6e684e4..cb1fe2d38b 100644 --- a/exercises/practice/roman-numerals/roman-numerals.spec.js +++ b/exercises/practice/roman-numerals/roman-numerals.spec.js @@ -8,16 +8,23 @@ describe('toRoman()', () => { xtest('converts 5', () => expect(toRoman(5)).toEqual('V')); xtest('converts 6', () => expect(toRoman(6)).toEqual('VI')); xtest('converts 9', () => expect(toRoman(9)).toEqual('IX')); + xtest('converts 16', () => expect(toRoman(16)).toEqual('XVI')); xtest('converts 27', () => expect(toRoman(27)).toEqual('XXVII')); xtest('converts 48', () => expect(toRoman(48)).toEqual('XLVIII')); xtest('converts 49', () => expect(toRoman(49)).toEqual('XLIX')); xtest('converts 59', () => expect(toRoman(59)).toEqual('LIX')); + xtest('converts 66', () => expect(toRoman(66)).toEqual('LXVI')); xtest('converts 93', () => expect(toRoman(93)).toEqual('XCIII')); xtest('converts 141', () => expect(toRoman(141)).toEqual('CXLI')); xtest('converts 163', () => expect(toRoman(163)).toEqual('CLXIII')); + xtest('converts 166', () => expect(toRoman(166)).toEqual('CLXVI')); xtest('converts 402', () => expect(toRoman(402)).toEqual('CDII')); xtest('converts 575', () => expect(toRoman(575)).toEqual('DLXXV')); + xtest('converts 666', () => expect(toRoman(666)).toEqual('DCLXVI')); xtest('converts 911', () => expect(toRoman(911)).toEqual('CMXI')); xtest('converts 1024', () => expect(toRoman(1024)).toEqual('MXXIV')); + xtest('converts 1666', () => expect(toRoman(1666)).toEqual('MDCLXVI')); xtest('converts 3000', () => expect(toRoman(3000)).toEqual('MMM')); + xtest('converts 3001', () => expect(toRoman(3001)).toEqual('MMMI')); + xtest('converts 3999', () => expect(toRoman(3999)).toEqual('MMMCMXCIX')); }); diff --git a/exercises/practice/rotational-cipher/.gitignore b/exercises/practice/rotational-cipher/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/rotational-cipher/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/rotational-cipher/.meta/proof.ci.js b/exercises/practice/rotational-cipher/.meta/proof.ci.js index a9be173c11..aef62ae6b9 100644 --- a/exercises/practice/rotational-cipher/.meta/proof.ci.js +++ b/exercises/practice/rotational-cipher/.meta/proof.ci.js @@ -7,7 +7,7 @@ export function rotate(text, shift) { return isAlpha ? String.fromCharCode( - ((c.charCodeAt(0) - charShift + shift) % 26) + charShift + ((c.charCodeAt(0) - charShift + shift) % 26) + charShift, ) : c; }) diff --git a/exercises/practice/rotational-cipher/package.json b/exercises/practice/rotational-cipher/package.json index 2f47cc642c..c8d811dbdc 100644 --- a/exercises/practice/rotational-cipher/package.json +++ b/exercises/practice/rotational-cipher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/rotational-cipher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/run-length-encoding/.gitignore b/exercises/practice/run-length-encoding/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/run-length-encoding/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/run-length-encoding/.meta/proof.ci.js b/exercises/practice/run-length-encoding/.meta/proof.ci.js index 133e3d2bb5..0a090ebf67 100644 --- a/exercises/practice/run-length-encoding/.meta/proof.ci.js +++ b/exercises/practice/run-length-encoding/.meta/proof.ci.js @@ -1,13 +1,13 @@ export const encode = (plainText) => { const consecutiveChars = /([\w\s])\1*/g; return plainText.replace(consecutiveChars, (match) => - match.length > 1 ? match.length + match[0] : match[0] + match.length > 1 ? match.length + match[0] : match[0], ); }; export const decode = (encodedText) => { const countAndChar = /(\d+)(\w|\s)/g; return encodedText.replace(countAndChar, (match, repeats, char) => - new Array(Number(repeats) + 1).join(char) + new Array(Number(repeats) + 1).join(char), ); }; diff --git a/exercises/practice/run-length-encoding/package.json b/exercises/practice/run-length-encoding/package.json index 726b0e343d..2cf7758b14 100644 --- a/exercises/practice/run-length-encoding/package.json +++ b/exercises/practice/run-length-encoding/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/run-length-encoding" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/run-length-encoding/run-length-encoding.spec.js b/exercises/practice/run-length-encoding/run-length-encoding.spec.js index 6d7fdf692b..03243c75c2 100644 --- a/exercises/practice/run-length-encoding/run-length-encoding.spec.js +++ b/exercises/practice/run-length-encoding/run-length-encoding.spec.js @@ -15,7 +15,7 @@ describe('run-length encode a string', () => { xtest('encode string with single characters mixed with repeated characters', () => { expect( - encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB') + encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB'), ).toEqual('12WB12W3B24WB'); }); @@ -43,7 +43,7 @@ describe('run-length decode a string', () => { xtest('decode string with single characters mixed with repeated characters', () => { expect(decode('12WB12W3B24WB')).toEqual( - 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB' + 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB', ); }); diff --git a/exercises/practice/saddle-points/.docs/instructions.md b/exercises/practice/saddle-points/.docs/instructions.md index aa11e05713..749173f91a 100644 --- a/exercises/practice/saddle-points/.docs/instructions.md +++ b/exercises/practice/saddle-points/.docs/instructions.md @@ -1,29 +1,26 @@ # Instructions -Detect saddle points in a matrix. +Your task is to find the potential trees where you could build your tree house. -So say you have a matrix like so: +The data company provides the data as grids that show the heights of the trees. +The rows of the grid represent the east-west direction, and the columns represent the north-south direction. -```text - 1 2 3 - |--------- -1 | 9 8 7 -2 | 5 3 2 <--- saddle point at column 1, row 2, with value 5 -3 | 6 6 7 -``` - -It has a saddle point at column 1, row 2. +An acceptable tree will be the the largest in its row, while being the smallest in its column. -It's called a "saddle point" because it is greater than or equal to -every element in its row and less than or equal to every element in -its column. +A grid might not have any good trees at all. +Or it might have one, or even several. -A matrix may have zero or more saddle points. +Here is a grid that has exactly one candidate tree. -Your code should be able to provide the (possibly empty) list of all the -saddle points for any given matrix. +```text + 1 2 3 4 + |----------- +1 | 9 8 7 8 +2 | 5 3 2 4 <--- potential tree house at row 2, column 1, for tree with height 5 +3 | 6 6 7 1 +``` -The matrix can have a different number of rows and columns (Non square). +- Row 2 has values 5, 3, 2, and 4. The largest value is 5. +- Column 1 has values 9, 5, and 6. The smallest value is 5. -Note that you may find other definitions of matrix saddle points online, -but the tests for this exercise follow the above unambiguous definition. +So the point at `[2, 1]` (row: 2, column: 1) is a great spot for a tree house. diff --git a/exercises/practice/saddle-points/.docs/introduction.md b/exercises/practice/saddle-points/.docs/introduction.md new file mode 100644 index 0000000000..b582efbd21 --- /dev/null +++ b/exercises/practice/saddle-points/.docs/introduction.md @@ -0,0 +1,9 @@ +# Introduction + +You are planning on building a tree house in the woods near your house so that you can watch the sun rise and set. + +You've obtained data from a local survey company that shows the heights of all the trees in each rectangular section of the map. +You need to analyze each grid on the map to find the perfect tree for your tree house. + +The best tree will be the tallest tree compared to all the other trees to the east and west, so that you have the best possible view of the sunrises and sunsets. +You don't like climbing too much, so the perfect tree will also be the shortest among all the trees to the north and to the south. diff --git a/exercises/practice/saddle-points/.gitignore b/exercises/practice/saddle-points/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/saddle-points/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/saddle-points/.meta/config.json b/exercises/practice/saddle-points/.meta/config.json index 05b1e10393..de01afd353 100644 --- a/exercises/practice/saddle-points/.meta/config.json +++ b/exercises/practice/saddle-points/.meta/config.json @@ -23,7 +23,7 @@ }, "blurb": "Detect saddle points in a matrix.", "source": "J Dalbey's Programming Practice problems", - "source_url": "http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html", + "source_url": "https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html", "custom": { "version.tests.compatibility": "jest-27", "flag.tests.task-per-describe": false, diff --git a/exercises/practice/saddle-points/package.json b/exercises/practice/saddle-points/package.json index 8c272d98a2..2c60f8b6b8 100644 --- a/exercises/practice/saddle-points/package.json +++ b/exercises/practice/saddle-points/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/saddle-points" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/saddle-points/saddle-points.spec.js b/exercises/practice/saddle-points/saddle-points.spec.js index 546147f890..0682c4ab3a 100644 --- a/exercises/practice/saddle-points/saddle-points.spec.js +++ b/exercises/practice/saddle-points/saddle-points.spec.js @@ -8,7 +8,7 @@ describe('Saddle Points', () => { [9, 8, 7], [5, 3, 2], [6, 6, 7], - ]) + ]), ).toEqual(expected); }); @@ -22,7 +22,7 @@ describe('Saddle Points', () => { [1, 2, 3], [3, 1, 2], [2, 3, 1], - ]) + ]), ).toEqual([]); }); @@ -37,7 +37,7 @@ describe('Saddle Points', () => { [4, 5, 4], [3, 5, 5], [1, 5, 4], - ]) + ]), ).toEqual(expected); }); @@ -52,7 +52,7 @@ describe('Saddle Points', () => { [6, 7, 8], [5, 5, 5], [7, 5, 6], - ]) + ]), ).toEqual(expected); }); @@ -63,7 +63,7 @@ describe('Saddle Points', () => { [8, 7, 9], [6, 7, 6], [3, 2, 5], - ]) + ]), ).toEqual(expected); }); @@ -76,7 +76,7 @@ describe('Saddle Points', () => { saddlePoints([ [3, 1, 3], [3, 2, 4], - ]) + ]), ).toEqual(expected); }); diff --git a/exercises/practice/satellite/.gitignore b/exercises/practice/satellite/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/satellite/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/satellite/package.json b/exercises/practice/satellite/package.json index 42dc9e3e9a..c49e7ba7e3 100644 --- a/exercises/practice/satellite/package.json +++ b/exercises/practice/satellite/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/satellite" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/say/.gitignore b/exercises/practice/say/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/say/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/say/package.json b/exercises/practice/say/package.json index d6da26fdaf..57a28c1e7d 100644 --- a/exercises/practice/say/package.json +++ b/exercises/practice/say/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/say" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/say/say.spec.js b/exercises/practice/say/say.spec.js index 385f160dcc..ef232c78ac 100644 --- a/exercises/practice/say/say.spec.js +++ b/exercises/practice/say/say.spec.js @@ -47,7 +47,7 @@ describe('say', () => { xtest('one million two thousand three hundred forty-five', () => { expect(say(1002345)).toBe( - 'one million two thousand three hundred forty-five' + 'one million two thousand three hundred forty-five', ); }); diff --git a/exercises/practice/scale-generator/.docs/instructions.md b/exercises/practice/scale-generator/.docs/instructions.md index 1d155daa66..f6a36373c5 100644 --- a/exercises/practice/scale-generator/.docs/instructions.md +++ b/exercises/practice/scale-generator/.docs/instructions.md @@ -1,36 +1,47 @@ -# Instructions +# Description -Given a tonic, or starting note, and a set of intervals, generate -the musical scale starting with the tonic and following the -specified interval pattern. +## Chromatic Scales Scales in Western music are based on the chromatic (12-note) scale. This scale can be expressed as the following group of pitches: -A, A#, B, C, C#, D, D#, E, F, F#, G, G# +> A, A♯, B, C, C♯, D, D♯, E, F, F♯, G, G♯ -A given sharp note (indicated by a #) can also be expressed as the flat -of the note above it (indicated by a b) so the chromatic scale can also be +A given sharp note (indicated by a ♯) can also be expressed as the flat +of the note above it (indicated by a ♭) so the chromatic scale can also be written like this: -A, Bb, B, C, Db, D, Eb, E, F, Gb, G, Ab +> A, B♭, B, C, D♭, D, E♭, E, F, G♭, G, A♭ The major and minor scale and modes are subsets of this twelve-pitch collection. They have seven pitches, and are called diatonic scales. The collection of notes in these scales is written with either sharps or -flats, depending on the tonic. Here is a list of which are which: +flats, depending on the tonic (starting note). Here is a table indicating +whether the flat expression or sharp expression of the scale would be used for +a given tonic: -No Sharps or Flats: -C major, -a minor +| Key Signature | Major | Minor | +| ------------- | --------------------- | -------------------- | +| Natural | C | a | +| Sharp | G, D, A, E, B, F♯ | e, b, f♯, c♯, g♯, d♯ | +| Flat | F, B♭, E♭, A♭, D♭, G♭ | d, g, c, f, b♭, e♭ | -Use Sharps: -G, D, A, E, B, F# major, -e, b, f#, c#, g#, d# minor +Note that by common music theory convention the natural notes "C" and "a" +follow the sharps scale when ascending and the flats scale when descending. +For the scope of this exercise the scale is only ascending. -Use Flats: -F, Bb, Eb, Ab, Db, Gb major, -d, g, c, f, bb, eb minor +### Task + +Given a tonic, generate the 12 note chromatic scale starting with the tonic. + +- Shift the base scale appropriately so that all 12 notes are returned + starting with the given tonic. +- For the given tonic, determine if the scale is to be returned with flats + or sharps. +- Return all notes in uppercase letters (except for the `b` for flats) + irrespective of the casing of the given tonic. + +## Diatonic Scales The diatonic scales, and all other scales that derive from the chromatic scale, are built upon intervals. An interval is the space @@ -44,6 +55,29 @@ diatonic scales are built using only these two intervals between adjacent notes. Non-diatonic scales can contain other intervals. An "augmented second" -interval, written "A", has two interceding notes (e.g., from A to C or Db to E) +interval, written "A", has two interceding notes (e.g., from A to C or D♭ to E) or a "whole step" plus a "half step". There are also smaller and larger intervals, but they will not figure into this exercise. + +### Task + +Given a tonic and a set of intervals, generate the musical scale starting with +the tonic and following the specified interval pattern. + +This is similar to generating chromatic scales except that instead of returning +12 notes, you will return N+1 notes for N intervals. +The first note is always the given tonic. +Then, for each interval in the pattern, the next note is determined by starting from the previous note and skipping the number of notes indicated by the interval. + +For example, starting with G and using the seven intervals MMmMMMm, there would be the following eight notes: + +| Note | Reason | +| ---- | ------------------------------------------------- | +| G | Tonic | +| A | M indicates a whole step from G, skipping G♯ | +| B | M indicates a whole step from A, skipping A♯ | +| C | m indicates a half step from B, skipping nothing | +| D | M indicates a whole step from C, skipping C♯ | +| E | M indicates a whole step from D, skipping D♯ | +| F♯ | M indicates a whole step from E, skipping F | +| G | m indicates a half step from F♯, skipping nothing | diff --git a/exercises/practice/scale-generator/.gitignore b/exercises/practice/scale-generator/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/scale-generator/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/scale-generator/.meta/proof.ci.js b/exercises/practice/scale-generator/.meta/proof.ci.js index ec7fe6c052..f22f6b552b 100644 --- a/exercises/practice/scale-generator/.meta/proof.ci.js +++ b/exercises/practice/scale-generator/.meta/proof.ci.js @@ -1,76 +1,49 @@ export class Scale { constructor(tonic) { - this.INTERVAL_STEPS = ['m', 'M', 'A']; - this.SHARPS_SCALE = [ - 'A', - 'A#', - 'B', - 'C', - 'C#', - 'D', - 'D#', - 'E', - 'F', - 'F#', + this.tonic = tonic; + this.notes = { + sharp: ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'], + flat: ['A', 'Bb', 'B', 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab'], + }; + this.sharpStart = [ 'G', - 'G#', - ]; - this.FLATS_SCALE = [ + 'D', 'A', - 'Bb', + 'E', 'B', + 'F#', + 'e', + 'b', + 'f#', + 'c#', + 'g#', + 'd#', 'C', - 'Db', - 'D', - 'Eb', - 'E', - 'F', - 'Gb', - 'G', - 'Ab', + 'a', ]; - this.USE_FLATS = [ - 'F', - 'Bb', - 'Eb', - 'Ab', - 'Db', - 'Gb', - 'd', - 'g', - 'c', - 'f', - 'bb', - 'eb', - ]; - - this.tonic = tonic.slice(0, 1).toUpperCase() + tonic.slice(1); - // note use of original tonic argument - this.chromaticScale = this.USE_FLATS.includes(tonic) - ? this.FLATS_SCALE - : this.SHARPS_SCALE; + this.accidental = + this.notes[this.sharpStart.includes(this.tonic) ? 'sharp' : 'flat']; + this.index = this.accidental.indexOf(this.toTitleCase(this.tonic)); + this.steps = { m: 1, M: 2, A: 3 }; } - chromatic() { - return this.reorderChromaticScale(); + toTitleCase(str) { + return str.charAt(0).toUpperCase() + str.substring(1); } - interval(intervals) { - const scale = this.reorderChromaticScale(); - const result = []; - let currentIndex = 0; + generateScale(intervals) { + return [this.accidental[this.index]].concat( + intervals + .split('') + .map((i) => this.accidental[(this.index += this.steps[i]) % 12]), + ); + } - for (const step of intervals) { - result.push(scale[currentIndex]); - currentIndex = currentIndex + (this.INTERVAL_STEPS.indexOf(step) + 1); - } - return result; + chromatic() { + return this.generateScale('mmmmmmmmmmm'); } - reorderChromaticScale() { - const tonicIndex = this.chromaticScale.indexOf(this.tonic); - return this.chromaticScale - .slice(tonicIndex) - .concat(this.chromaticScale.slice(0, tonicIndex)); + interval(intervals) { + return this.generateScale(intervals); } } diff --git a/exercises/practice/scale-generator/package.json b/exercises/practice/scale-generator/package.json index ea9519db07..f0e52ed776 100644 --- a/exercises/practice/scale-generator/package.json +++ b/exercises/practice/scale-generator/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/scale-generator" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/scale-generator/scale-generator.spec.js b/exercises/practice/scale-generator/scale-generator.spec.js index cdf0f0cfe1..2a9f37b7ed 100644 --- a/exercises/practice/scale-generator/scale-generator.spec.js +++ b/exercises/practice/scale-generator/scale-generator.spec.js @@ -37,81 +37,117 @@ describe('ScaleGenerator', () => { ]; expect(new Scale('F').chromatic()).toEqual(expected); }); + + xtest('Chromatic scale with sharps from D', () => { + const expected = [ + 'D', + 'D#', + 'E', + 'F', + 'F#', + 'G', + 'G#', + 'A', + 'A#', + 'B', + 'C', + 'C#', + ]; + expect(new Scale('D').chromatic()).toEqual(expected); + }); + + xtest('Chromatic scale with flats from D', () => { + const expected = [ + 'D', + 'Eb', + 'E', + 'F', + 'Gb', + 'G', + 'Ab', + 'A', + 'Bb', + 'B', + 'C', + 'Db', + ]; + expect(new Scale('d').chromatic()).toEqual(expected); + }); }); describe('Scales with specified intervals', () => { xtest('Simple major scale', () => { - const expected = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; + const expected = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'C']; expect(new Scale('C').interval('MMmMMMm')).toEqual(expected); }); xtest('Major scale with sharps', () => { - const expected = ['G', 'A', 'B', 'C', 'D', 'E', 'F#']; + const expected = ['G', 'A', 'B', 'C', 'D', 'E', 'F#', 'G']; expect(new Scale('G').interval('MMmMMMm')).toEqual(expected); }); xtest('Major scale with flats', () => { - const expected = ['F', 'G', 'A', 'Bb', 'C', 'D', 'E']; + const expected = ['F', 'G', 'A', 'Bb', 'C', 'D', 'E', 'F']; expect(new Scale('F').interval('MMmMMMm')).toEqual(expected); }); xtest('Minor scale with sharps', () => { - const expected = ['F#', 'G#', 'A', 'B', 'C#', 'D', 'E']; + const expected = ['F#', 'G#', 'A', 'B', 'C#', 'D', 'E', 'F#']; expect(new Scale('f#').interval('MmMMmMM')).toEqual(expected); }); xtest('Minor scale with flats', () => { - const expected = ['Bb', 'C', 'Db', 'Eb', 'F', 'Gb', 'Ab']; + const expected = ['Bb', 'C', 'Db', 'Eb', 'F', 'Gb', 'Ab', 'Bb']; expect(new Scale('bb').interval('MmMMmMM')).toEqual(expected); }); xtest('Dorian mode', () => { - const expected = ['D', 'E', 'F', 'G', 'A', 'B', 'C']; + const expected = ['D', 'E', 'F', 'G', 'A', 'B', 'C', 'D']; expect(new Scale('d').interval('MmMMMmM')).toEqual(expected); }); - xtest('Mixolydian mode', () => { - const expected = ['Eb', 'F', 'G', 'Ab', 'Bb', 'C', 'Db']; - expect(new Scale('Eb').interval('MMmMMmM')).toEqual(expected); + xtest('Phrygian mode', () => { + const expected = ['E', 'F', 'G', 'A', 'B', 'C', 'D', 'E']; + expect(new Scale('e').interval('mMMMmMM')).toEqual(expected); }); xtest('Lydian mode', () => { - const expected = ['A', 'B', 'C#', 'D#', 'E', 'F#', 'G#']; + const expected = ['A', 'B', 'C#', 'D#', 'E', 'F#', 'G#', 'A']; expect(new Scale('a').interval('MMMmMMm')).toEqual(expected); }); - xtest('Phrygian mode', () => { - const expected = ['E', 'F', 'G', 'A', 'B', 'C', 'D']; - expect(new Scale('e').interval('mMMMmMM')).toEqual(expected); + xtest('Mixolydian mode', () => { + const expected = ['Eb', 'F', 'G', 'Ab', 'Bb', 'C', 'Db', 'Eb']; + expect(new Scale('Eb').interval('MMmMMmM')).toEqual(expected); }); xtest('Locrian mode', () => { - const expected = ['G', 'Ab', 'Bb', 'C', 'Db', 'Eb', 'F']; + const expected = ['G', 'Ab', 'Bb', 'C', 'Db', 'Eb', 'F', 'G']; expect(new Scale('g').interval('mMMmMMM')).toEqual(expected); }); xtest('Harmonic minor', () => { - const expected = ['D', 'E', 'F', 'G', 'A', 'Bb', 'Db']; + const expected = ['D', 'E', 'F', 'G', 'A', 'Bb', 'Db', 'D']; expect(new Scale('d').interval('MmMMmAm')).toEqual(expected); }); xtest('Octatonic', () => { - const expected = ['C', 'D', 'D#', 'F', 'F#', 'G#', 'A', 'B']; + const expected = ['C', 'D', 'D#', 'F', 'F#', 'G#', 'A', 'B', 'C']; expect(new Scale('C').interval('MmMmMmMm')).toEqual(expected); }); xtest('Hexatonic', () => { - const expected = ['Db', 'Eb', 'F', 'G', 'A', 'B']; + const expected = ['Db', 'Eb', 'F', 'G', 'A', 'B', 'Db']; expect(new Scale('Db').interval('MMMMMM')).toEqual(expected); }); xtest('Pentatonic', () => { - const expected = ['A', 'B', 'C#', 'E', 'F#']; + const expected = ['A', 'B', 'C#', 'E', 'F#', 'A']; expect(new Scale('A').interval('MMAMA')).toEqual(expected); }); xtest('Enigmatic', () => { - const expected = ['G', 'G#', 'B', 'C#', 'D#', 'F', 'F#']; + const expected = ['G', 'G#', 'B', 'C#', 'D#', 'F', 'F#', 'G']; expect(new Scale('G').interval('mAMMMmm')).toEqual(expected); }); }); diff --git a/exercises/practice/scrabble-score/.gitignore b/exercises/practice/scrabble-score/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/scrabble-score/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/scrabble-score/.meta/proof.ci.js b/exercises/practice/scrabble-score/.meta/proof.ci.js index e578d5304b..523771d930 100644 --- a/exercises/practice/scrabble-score/.meta/proof.ci.js +++ b/exercises/practice/scrabble-score/.meta/proof.ci.js @@ -32,5 +32,5 @@ const letterScore = (letter) => letterScores[letter] || 0; export const score = (word) => [...word.toLowerCase()].reduce( (sum, currChar) => sum + letterScore(currChar), - 0 + 0, ); diff --git a/exercises/practice/scrabble-score/package.json b/exercises/practice/scrabble-score/package.json index 364c261361..19c542400c 100644 --- a/exercises/practice/scrabble-score/package.json +++ b/exercises/practice/scrabble-score/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/scrabble-score" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/secret-handshake/.docs/instructions.md b/exercises/practice/secret-handshake/.docs/instructions.md index 92cef20165..d0fcb66e70 100644 --- a/exercises/practice/secret-handshake/.docs/instructions.md +++ b/exercises/practice/secret-handshake/.docs/instructions.md @@ -1,29 +1,48 @@ # Instructions -> There are 10 types of people in the world: Those who understand -> binary, and those who don't. +Your task is to convert a number between 1 and 31 to a sequence of actions in the secret handshake. -You and your fellow cohort of those in the "know" when it comes to -binary decide to come up with a secret "handshake". - -```text -1 = wink -10 = double blink -100 = close your eyes -1000 = jump +The sequence of actions is chosen by looking at the rightmost five digits of the number once it's been converted to binary. +Start at the right-most digit and move left. +The actions for each number place are: +```plaintext +00001 = wink +00010 = double blink +00100 = close your eyes +01000 = jump 10000 = Reverse the order of the operations in the secret handshake. ``` -Given a decimal number, convert it to the appropriate sequence of events for a secret handshake. +Let's use the number `9` as an example: + +- 9 in binary is `1001`. +- The digit that is farthest to the right is 1, so the first action is `wink`. +- Going left, the next digit is 0, so there is no double-blink. +- Going left again, the next digit is 0, so you leave your eyes open. +- Going left again, the next digit is 1, so you jump. + +That was the last digit, so the final code is: + +```plaintext +wink, jump +``` + +Given the number 26, which is `11010` in binary, we get the following actions: -Here's a couple of examples: +- double blink +- jump +- reverse actions -Given the input 3, the function would return the array -["wink", "double blink"] because 3 is 11 in binary. +The secret handshake for 26 is therefore: + +```plaintext +jump, double blink +``` -Given the input 19, the function would return the array -["double blink", "wink"] because 19 is 10011 in binary. -Notice that the addition of 16 (10000 in binary) -has caused the array to be reversed. + +~~~~exercism/note +If you aren't sure what binary is or how it works, check out [this binary tutorial][intro-to-binary]. +[intro-to-binary]: https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa +~~~~ diff --git a/exercises/practice/secret-handshake/.docs/introduction.md b/exercises/practice/secret-handshake/.docs/introduction.md new file mode 100644 index 0000000000..176b92e8cf --- /dev/null +++ b/exercises/practice/secret-handshake/.docs/introduction.md @@ -0,0 +1,7 @@ +# Introduction + +You are starting a secret coding club with some friends and friends-of-friends. +Not everyone knows each other, so you and your friends have decided to create a secret handshake that you can use to recognize that someone is a member. +You don't want anyone who isn't in the know to be able to crack the code. + +You've designed the code so that one person says a number between 1 and 31, and the other person turns it into a series of actions. diff --git a/exercises/practice/secret-handshake/.gitignore b/exercises/practice/secret-handshake/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/secret-handshake/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/secret-handshake/.meta/proof.ci.js b/exercises/practice/secret-handshake/.meta/proof.ci.js index 5065ebdde5..645882db2c 100644 --- a/exercises/practice/secret-handshake/.meta/proof.ci.js +++ b/exercises/practice/secret-handshake/.meta/proof.ci.js @@ -6,7 +6,7 @@ export const commands = (handshake) => { } const shakeWith = handshakeCommands.filter( - (_, i) => handshake & Math.pow(2, i) + (_, i) => handshake & Math.pow(2, i), ); if (handshake & Math.pow(2, 4)) shakeWith.reverse(); diff --git a/exercises/practice/secret-handshake/package.json b/exercises/practice/secret-handshake/package.json index 743a8afbc3..f732ef024f 100644 --- a/exercises/practice/secret-handshake/package.json +++ b/exercises/practice/secret-handshake/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/secret-handshake" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/series/.gitignore b/exercises/practice/series/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/series/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/series/package.json b/exercises/practice/series/package.json index 7d3b7e5cac..c91bf3af25 100644 --- a/exercises/practice/series/package.json +++ b/exercises/practice/series/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/series" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/sieve/.gitignore b/exercises/practice/sieve/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/sieve/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/sieve/package.json b/exercises/practice/sieve/package.json index 233a378884..47e58b460b 100644 --- a/exercises/practice/sieve/package.json +++ b/exercises/practice/sieve/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/sieve" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/simple-cipher/.docs/instructions.md b/exercises/practice/simple-cipher/.docs/instructions.md index 22a7e4d4bd..467207c654 100644 --- a/exercises/practice/simple-cipher/.docs/instructions.md +++ b/exercises/practice/simple-cipher/.docs/instructions.md @@ -13,8 +13,8 @@ for A, and so with the others." Ciphers are very straight-forward algorithms that allow us to render text less readable while still allowing easy deciphering. They are -vulnerable to many forms of cryptanalysis, but we are lucky that -generally our little sisters are not cryptanalysts. +vulnerable to many forms of cryptanalysis, but Caesar was lucky that +his enemies were not cryptanalysts. The Caesar Cipher was used for some messages from Julius Caesar that were sent afield. Now Caesar knew that the cipher wasn't very good, but @@ -37,9 +37,9 @@ message. ## Step 2 -Shift ciphers are no fun though when your kid sister figures it out. Try -amending the code to allow us to specify a key and use that for the -shift distance. This is called a substitution cipher. +Shift ciphers quickly cease to be useful when the opposition commander figures them out. +So instead, let's try using a substitution cipher. +Try amending the code to allow us to specify a key and use that for the shift distance. Here's an example: diff --git a/exercises/practice/simple-cipher/.gitignore b/exercises/practice/simple-cipher/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/simple-cipher/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/simple-cipher/package.json b/exercises/practice/simple-cipher/package.json index 7bff1b8a10..977769d97c 100644 --- a/exercises/practice/simple-cipher/package.json +++ b/exercises/practice/simple-cipher/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/simple-cipher" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/simple-cipher/simple-cipher.spec.js b/exercises/practice/simple-cipher/simple-cipher.spec.js index 081c7e8949..a20f3e914f 100644 --- a/exercises/practice/simple-cipher/simple-cipher.spec.js +++ b/exercises/practice/simple-cipher/simple-cipher.spec.js @@ -47,7 +47,7 @@ describe('Substitution cipher', () => { xtest('can double shift encode', () => { expect(new Cipher('iamapandabear').encode('iamapandabear')).toEqual( - 'qayaeaagaciai' + 'qayaeaagaciai', ); }); diff --git a/exercises/practice/simple-linked-list/.docs/instructions.md b/exercises/practice/simple-linked-list/.docs/instructions.md index 1c9d0b3de9..c3ff4cf311 100644 --- a/exercises/practice/simple-linked-list/.docs/instructions.md +++ b/exercises/practice/simple-linked-list/.docs/instructions.md @@ -1,22 +1,19 @@ # Instructions -Write a simple linked list implementation that uses Elements and a List. +Write a prototype of the music player application. -The linked list is a fundamental data structure in computer science, -often used in the implementation of other data structures. They're -pervasive in functional programming languages, such as Clojure, Erlang, -or Haskell, but far less common in imperative languages such as Ruby or -Python. +For the prototype, each song will simply be represented by a number. +Given a range of numbers (the song IDs), create a singly linked list. -The simplest kind of linked list is a singly linked list. Each element in the -list contains data and a "next" field pointing to the next element in the list -of elements. +Given a singly linked list, you should be able to reverse the list to play the songs in the opposite order. -This variant of linked lists is often used to represent sequences or -push-down stacks (also called a LIFO stack; Last In, First Out). +```exercism/note +The linked list is a fundamental data structure in computer science, often used in the implementation of other data structures. -As a first take, lets create a singly linked list to contain the range (1..10), -and provide functions to reverse a linked list and convert to and from arrays. +The simplest kind of linked list is a **singly** linked list. +That means that each element (or "node") contains data, along with something that points to the next node in the list. -When implementing this in a language with built-in linked lists, -implement your own abstract data type. +If you want to dig deeper into linked lists, check out [this article][intro-linked-list] that explains it using nice drawings. + +[intro-linked-list]: https://medium.com/basecs/whats-a-linked-list-anyway-part-1-d8b7e6508b9d +``` diff --git a/exercises/practice/simple-linked-list/.docs/introduction.md b/exercises/practice/simple-linked-list/.docs/introduction.md new file mode 100644 index 0000000000..0e1df72f9b --- /dev/null +++ b/exercises/practice/simple-linked-list/.docs/introduction.md @@ -0,0 +1,5 @@ +# Introduction + +You work for a music streaming company. + +You've been tasked with creating a playlist feature for your music player application. diff --git a/exercises/practice/simple-linked-list/.gitignore b/exercises/practice/simple-linked-list/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/simple-linked-list/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/simple-linked-list/package.json b/exercises/practice/simple-linked-list/package.json index babd1541a4..89185dc033 100644 --- a/exercises/practice/simple-linked-list/package.json +++ b/exercises/practice/simple-linked-list/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/simple-linked-list" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/space-age/.gitignore b/exercises/practice/space-age/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/space-age/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/space-age/package.json b/exercises/practice/space-age/package.json index 9eb85c0265..6d4f56071b 100644 --- a/exercises/practice/space-age/package.json +++ b/exercises/practice/space-age/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/space-age" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/spiral-matrix/.gitignore b/exercises/practice/spiral-matrix/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/spiral-matrix/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/spiral-matrix/package.json b/exercises/practice/spiral-matrix/package.json index 9debba0d2e..7e1455ff40 100644 --- a/exercises/practice/spiral-matrix/package.json +++ b/exercises/practice/spiral-matrix/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/spiral-matrix" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/square-root/.gitignore b/exercises/practice/square-root/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/square-root/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/square-root/package.json b/exercises/practice/square-root/package.json index 3be87b6dca..7aebdb0f0f 100644 --- a/exercises/practice/square-root/package.json +++ b/exercises/practice/square-root/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/square-root" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/strain/.gitignore b/exercises/practice/strain/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/strain/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/strain/package.json b/exercises/practice/strain/package.json index 70badb7bd5..5b4460d6de 100644 --- a/exercises/practice/strain/package.json +++ b/exercises/practice/strain/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/strain" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/sublist/.gitignore b/exercises/practice/sublist/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/sublist/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/sublist/package.json b/exercises/practice/sublist/package.json index 957e781be9..24869cfa0e 100644 --- a/exercises/practice/sublist/package.json +++ b/exercises/practice/sublist/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/sublist" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/sum-of-multiples/.docs/instructions.md b/exercises/practice/sum-of-multiples/.docs/instructions.md index bb512396aa..d69f890e9d 100644 --- a/exercises/practice/sum-of-multiples/.docs/instructions.md +++ b/exercises/practice/sum-of-multiples/.docs/instructions.md @@ -1,9 +1,27 @@ # Instructions -Given a number, find the sum of all the unique multiples of particular numbers up to -but not including that number. +Your task is to write the code that calculates the energy points that get awarded to players when they complete a level. -If we list all the natural numbers below 20 that are multiples of 3 or 5, -we get 3, 5, 6, 9, 10, 12, 15, and 18. +The points awarded depend on two things: -The sum of these multiples is 78. +- The level (a number) that the player completed. +- The base value of each magical item collected by the player during that level. + +The energy points are awarded according to the following rules: + +1. For each magical item, take the base value and find all the multiples of that value that are less than the level number. +2. Combine the sets of numbers. +3. Remove any duplicates. +4. Calculate the sum of all the numbers that are left. + +Let's look at an example: + +**The player completed level 20 and found two magical items with base values of 3 and 5.** + +To calculate the energy points earned by the player, we need to find all the unique multiples of these base values that are less than level 20. + +- Multiples of 3 less than 20: `{3, 6, 9, 12, 15, 18}` +- Multiples of 5 less than 20: `{5, 10, 15}` +- Combine the sets and remove duplicates: `{3, 5, 6, 9, 10, 12, 15, 18}` +- Sum the unique multiples: `3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78` +- Therefore, the player earns **78** energy points for completing level 20 and finding the two magical items with base values of 3 and 5. diff --git a/exercises/practice/sum-of-multiples/.docs/introduction.md b/exercises/practice/sum-of-multiples/.docs/introduction.md new file mode 100644 index 0000000000..69cabeed5a --- /dev/null +++ b/exercises/practice/sum-of-multiples/.docs/introduction.md @@ -0,0 +1,6 @@ +# Introduction + +You work for a company that makes an online, fantasy-survival game. + +When a player finishes a level, they are awarded energy points. +The amount of energy awarded depends on which magical items the player found while exploring that level. diff --git a/exercises/practice/sum-of-multiples/.gitignore b/exercises/practice/sum-of-multiples/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/sum-of-multiples/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/sum-of-multiples/package.json b/exercises/practice/sum-of-multiples/package.json index ebab777617..c6d3943d8e 100644 --- a/exercises/practice/sum-of-multiples/package.json +++ b/exercises/practice/sum-of-multiples/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/sum-of-multiples" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/tournament/.gitignore b/exercises/practice/tournament/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/tournament/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/tournament/package.json b/exercises/practice/tournament/package.json index 86ca97b40a..9ca747884a 100644 --- a/exercises/practice/tournament/package.json +++ b/exercises/practice/tournament/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/tournament" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/transpose/.gitignore b/exercises/practice/transpose/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/transpose/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/transpose/.meta/proof.ci.js b/exercises/practice/transpose/.meta/proof.ci.js index 00b84f7ed3..c8bd606ea6 100644 --- a/exercises/practice/transpose/.meta/proof.ci.js +++ b/exercises/practice/transpose/.meta/proof.ci.js @@ -10,6 +10,6 @@ export function transpose(input) { return [...Array(maxCol).keys()].map((col) => trimTrailingUndefined(input.map((_v, row) => input[row][col])) .map((charOrUndefined) => charOrUndefined || ' ') - .join('') + .join(''), ); } diff --git a/exercises/practice/transpose/.meta/tests.toml b/exercises/practice/transpose/.meta/tests.toml index 7faa8aea3e..23ac5eecd7 100644 --- a/exercises/practice/transpose/.meta/tests.toml +++ b/exercises/practice/transpose/.meta/tests.toml @@ -34,3 +34,6 @@ description = "rectangle" [b80badc9-057e-4543-bd07-ce1296a1ea2c] description = "triangle" + +[76acfd50-5596-4d05-89f1-5116328a7dd9] +description = "jagged triangle" diff --git a/exercises/practice/transpose/package.json b/exercises/practice/transpose/package.json index adc0f226b7..94c99eccb5 100644 --- a/exercises/practice/transpose/package.json +++ b/exercises/practice/transpose/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/transpose" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/transpose/transpose.spec.js b/exercises/practice/transpose/transpose.spec.js index 8613c04b5a..e40d4e17b6 100644 --- a/exercises/practice/transpose/transpose.spec.js +++ b/exercises/practice/transpose/transpose.spec.js @@ -88,6 +88,35 @@ describe('Transpose', () => { expect(transpose(input)).toEqual(expected); }); + xtest('mixed line length', () => { + const input = [ + 'The longest line.', + 'A long line.', + 'A longer line.', + 'A line.', + ]; + const expected = [ + 'TAAA', + 'h ', + 'elll', + ' ooi', + 'lnnn', + 'ogge', + 'n e.', + 'glr', + 'ei ', + 'snl', + 'tei', + ' .n', + 'l e', + 'i .', + 'n', + 'e', + '.', + ]; + expect(transpose(input)).toEqual(expected); + }); + xtest('square', () => { const input = ['HEART', 'EMBER', 'ABUSE', 'RESIN', 'TREND']; const expected = ['HEART', 'EMBER', 'ABUSE', 'RESIN', 'TREND']; @@ -122,6 +151,19 @@ describe('Transpose', () => { expect(transpose(input)).toEqual(expected); }); + xtest('jagged triangle', () => { + const input = ['11', '2', '3333', '444', '555555', '66666']; + const expected = [ + '123456', + '1 3456', + ' 3456', + ' 3 56', + ' 56', + ' 5', + ]; + expect(transpose(input)).toEqual(expected); + }); + xtest('many lines', () => { const input = [ 'Chor. Two households, both alike in dignity,', diff --git a/exercises/practice/triangle/.gitignore b/exercises/practice/triangle/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/triangle/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/triangle/package.json b/exercises/practice/triangle/package.json index 72df80056e..17f3ecdb28 100644 --- a/exercises/practice/triangle/package.json +++ b/exercises/practice/triangle/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/triangle" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/trinary/.gitignore b/exercises/practice/trinary/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/trinary/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/trinary/.meta/proof.ci.js b/exercises/practice/trinary/.meta/proof.ci.js index cdde2fbc40..3147b2908f 100644 --- a/exercises/practice/trinary/.meta/proof.ci.js +++ b/exercises/practice/trinary/.meta/proof.ci.js @@ -12,7 +12,7 @@ export class Trinary { return this.digits.reduce( (decimal, digit, index) => decimal + digit * BASE ** index, - 0 + 0, ); } diff --git a/exercises/practice/trinary/package.json b/exercises/practice/trinary/package.json index 2cf8f98f22..d99091ccf9 100644 --- a/exercises/practice/trinary/package.json +++ b/exercises/practice/trinary/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/trinary" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/twelve-days/.gitignore b/exercises/practice/twelve-days/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/twelve-days/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/twelve-days/package.json b/exercises/practice/twelve-days/package.json index 747f84a505..03df4b4948 100644 --- a/exercises/practice/twelve-days/package.json +++ b/exercises/practice/twelve-days/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/twelve-days" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/two-bucket/.gitignore b/exercises/practice/two-bucket/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/two-bucket/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/two-bucket/.meta/proof.ci.js b/exercises/practice/two-bucket/.meta/proof.ci.js index 15f6960da2..c6d554172e 100644 --- a/exercises/practice/two-bucket/.meta/proof.ci.js +++ b/exercises/practice/two-bucket/.meta/proof.ci.js @@ -24,7 +24,7 @@ export class TwoBucket { if (this.goal % gcd(this.first.size, this.second.size) !== 0) { throw new Error( - 'Goal must be a multiple of the GCD of the sizes of the two buckets.' + 'Goal must be a multiple of the GCD of the sizes of the two buckets.', ); } } diff --git a/exercises/practice/two-bucket/package.json b/exercises/practice/two-bucket/package.json index 1ea556d206..98b0a17951 100644 --- a/exercises/practice/two-bucket/package.json +++ b/exercises/practice/two-bucket/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/two-bucket" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/two-fer/.docs/instructions.md b/exercises/practice/two-fer/.docs/instructions.md index 11f14f2c42..37aa75297e 100644 --- a/exercises/practice/two-fer/.docs/instructions.md +++ b/exercises/practice/two-fer/.docs/instructions.md @@ -1,16 +1,15 @@ # Instructions -`Two-fer` or `2-fer` is short for two for one. One for you and one for me. +Your task is to determine what you will say as you give away the extra cookie. -Given a name, return a string with the message: +If your friend likes cookies, and is named Do-yun, then you will say: ```text -One for name, one for me. +One for Do-yun, one for me. ``` -Where "name" is the given name. - -However, if the name is missing, return the string: +If your friend doesn't like cookies, you give the cookie to the next person in line at the bakery. +Since you don't know their name, you will say _you_ instead. ```text One for you, one for me. @@ -18,9 +17,9 @@ One for you, one for me. Here are some examples: -| Name | String to return | +| Name | Dialogue | | :----- | :-------------------------- | | Alice | One for Alice, one for me. | -| Bob | One for Bob, one for me. | +| Bohdan | One for Bohdan, one for me. | | | One for you, one for me. | | Zaphod | One for Zaphod, one for me. | diff --git a/exercises/practice/two-fer/.docs/introduction.md b/exercises/practice/two-fer/.docs/introduction.md new file mode 100644 index 0000000000..8c124394aa --- /dev/null +++ b/exercises/practice/two-fer/.docs/introduction.md @@ -0,0 +1,8 @@ +# Introduction + +In some English accents, when you say "two for" quickly, it sounds like "two fer". +Two-for-one is a way of saying that if you buy one, you also get one for free. +So the phrase "two-fer" often implies a two-for-one offer. + +Imagine a bakery that has a holiday offer where you can buy two cookies for the price of one ("two-fer one!"). +You go for the offer and (very generously) decide to give the extra cookie to a friend. diff --git a/exercises/practice/two-fer/.gitignore b/exercises/practice/two-fer/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/two-fer/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/two-fer/package.json b/exercises/practice/two-fer/package.json index 76b61d47b6..0cd8abd3b0 100644 --- a/exercises/practice/two-fer/package.json +++ b/exercises/practice/two-fer/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/two-fer" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/variable-length-quantity/.gitignore b/exercises/practice/variable-length-quantity/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/variable-length-quantity/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/variable-length-quantity/package.json b/exercises/practice/variable-length-quantity/package.json index f02daf7600..fed649b860 100644 --- a/exercises/practice/variable-length-quantity/package.json +++ b/exercises/practice/variable-length-quantity/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/variable-length-quantity" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/word-count/.docs/instructions.md b/exercises/practice/word-count/.docs/instructions.md index d3548e5d88..064393c8a0 100644 --- a/exercises/practice/word-count/.docs/instructions.md +++ b/exercises/practice/word-count/.docs/instructions.md @@ -1,31 +1,47 @@ # Instructions -Given a phrase, count the occurrences of each _word_ in that phrase. +Your task is to count how many times each word occurs in a subtitle of a drama. -For the purposes of this exercise you can expect that a _word_ will always be one of: +The subtitles from these dramas use only ASCII characters. -1. A _number_ composed of one or more ASCII digits (ie "0" or "1234") OR -2. A _simple word_ composed of one or more ASCII letters (ie "a" or "they") OR -3. A _contraction_ of two _simple words_ joined by a single apostrophe (ie "it's" or "they're") +The characters often speak in casual English, using contractions like _they're_ or _it's_. +Though these contractions come from two words (e.g. _we are_), the contraction (_we're_) is considered a single word. -When counting words you can assume the following rules: +Words can be separated by any form of punctuation (e.g. ":", "!", or "?") or whitespace (e.g. "\t", "\n", or " "). +The only punctuation that does not separate words is the apostrophe in contractions. -1. The count is _case insensitive_ (ie "You", "you", and "YOU" are 3 uses of the same word) -2. The count is _unordered_; the tests will ignore how words and counts are ordered -3. Other than the apostrophe in a _contraction_ all forms of _punctuation_ are ignored -4. The words can be separated by _any_ form of whitespace (ie "\t", "\n", " ") +Numbers are considered words. +If the subtitles say _It costs 100 dollars._ then _100_ will be its own word. -For example, for the phrase `"That's the password: 'PASSWORD 123'!", cried the Special Agent.\nSo I fled.` the count would be: +Words are case insensitive. +For example, the word _you_ occurs three times in the following sentence: + +> You come back, you hear me? DO YOU HEAR ME? + +The ordering of the word counts in the results doesn't matter. + +Here's an example that incorporates several of the elements discussed above: + +- simple words +- contractions +- numbers +- case insensitive words +- punctuation (including apostrophes) to separate words +- different forms of whitespace to separate words + +`"That's the password: 'PASSWORD 123'!", cried the Special Agent.\nSo I fled.` + +The mapping for this subtitle would be: ```text -that's: 1 -the: 2 -password: 2 123: 1 -cried: 1 -special: 1 agent: 1 -so: 1 -i: 1 +cried: 1 fled: 1 +i: 1 +password: 2 +so: 1 +special: 1 +that's: 1 +the: 2 ``` diff --git a/exercises/practice/word-count/.docs/introduction.md b/exercises/practice/word-count/.docs/introduction.md new file mode 100644 index 0000000000..1654508e79 --- /dev/null +++ b/exercises/practice/word-count/.docs/introduction.md @@ -0,0 +1,8 @@ +# Introduction + +You teach English as a foreign language to high school students. + +You've decided to base your entire curriculum on TV shows. +You need to analyze which words are used, and how often they're repeated. + +This will let you choose the simplest shows to start with, and to gradually increase the difficulty as time passes. diff --git a/exercises/practice/word-count/.gitignore b/exercises/practice/word-count/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/word-count/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/word-count/package.json b/exercises/practice/word-count/package.json index e5cf85e240..1cc49accd9 100644 --- a/exercises/practice/word-count/package.json +++ b/exercises/practice/word-count/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/word-count" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/word-count/word-count.spec.js b/exercises/practice/word-count/word-count.spec.js index 091683ba7d..e0e7cc1f0f 100644 --- a/exercises/practice/word-count/word-count.spec.js +++ b/exercises/practice/word-count/word-count.spec.js @@ -20,7 +20,7 @@ describe('countWords', () => { blue: 1, }; expect(countWords('one fish two fish red fish blue fish')).toEqual( - expectedCounts + expectedCounts, ); }); @@ -51,7 +51,7 @@ describe('countWords', () => { javascript: 1, }; expect(countWords('car: carpet as java: javascript!!&@$%^&')).toEqual( - expectedCounts + expectedCounts, ); }); @@ -81,7 +81,7 @@ describe('countWords', () => { cry: 1, }; expect(countWords("First: don't laugh. Then: don't cry.")).toEqual( - expectedCounts + expectedCounts, ); }); @@ -95,7 +95,7 @@ describe('countWords', () => { and: 1, }; expect(countWords("Joe can't tell between 'large' and large.")).toEqual( - expectedCounts + expectedCounts, ); }); @@ -111,7 +111,7 @@ describe('countWords', () => { a: 1, }; expect(countWords("Joe can't tell between app, apple and a.")).toEqual( - expectedCounts + expectedCounts, ); }); diff --git a/exercises/practice/word-search/.gitignore b/exercises/practice/word-search/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/word-search/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/word-search/.meta/proof.ci.js b/exercises/practice/word-search/.meta/proof.ci.js index 727f68fa98..c6e5d5540a 100644 --- a/exercises/practice/word-search/.meta/proof.ci.js +++ b/exercises/practice/word-search/.meta/proof.ci.js @@ -59,7 +59,7 @@ function diagonalFind(r, c, word, grid, rIncrement, outOfRange, buildCoords) { currentColumn, word.length, grid[currentRow].length, - foundLetters.length + foundLetters.length, ) ) { const currLetterInGrid = grid[currentRow].charAt(currentColumn); diff --git a/exercises/practice/word-search/package.json b/exercises/practice/word-search/package.json index 3630310eb0..fac5376b31 100644 --- a/exercises/practice/word-search/package.json +++ b/exercises/practice/word-search/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/word-search" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/word-search/word-search.spec.js b/exercises/practice/word-search/word-search.spec.js index 26c0f23817..52121ae0af 100644 --- a/exercises/practice/word-search/word-search.spec.js +++ b/exercises/practice/word-search/word-search.spec.js @@ -285,7 +285,7 @@ describe('vertical directions', () => { const wordSearch = new WordSearch(grid); expect(wordSearch.find(['elixir', 'clojure', 'ecmascript'])).toEqual( - expectedResults + expectedResults, ); }); xtest('should locate words written bottom to top', () => { @@ -322,7 +322,7 @@ describe('vertical directions', () => { const wordSearch = new WordSearch(grid); expect( - wordSearch.find(['elixir', 'clojure', 'ecmascript', 'rust']) + wordSearch.find(['elixir', 'clojure', 'ecmascript', 'rust']), ).toEqual(expectedResults); }); xtest('should locate words written top left to bottom right', () => { @@ -363,7 +363,7 @@ describe('vertical directions', () => { const wordSearch = new WordSearch(grid); expect( - wordSearch.find(['clojure', 'elixir', 'ecmascript', 'rust', 'java']) + wordSearch.find(['clojure', 'elixir', 'ecmascript', 'rust', 'java']), ).toEqual(expectedResults); }); xtest('should locate words written bottom right to top left', () => { @@ -416,7 +416,7 @@ describe('vertical directions', () => { 'rust', 'java', 'lua', - ]) + ]), ).toEqual(expectedResults); }); xtest('should locate words written bottom left to top right', () => { @@ -474,7 +474,7 @@ describe('vertical directions', () => { 'java', 'lua', 'lisp', - ]) + ]), ).toEqual(expectedResults); }); xtest('should locate words written top right to bottom left', () => { @@ -537,7 +537,7 @@ describe('vertical directions', () => { 'lua', 'lisp', 'ruby', - ]) + ]), ).toEqual(expectedResults); }); diff --git a/exercises/practice/wordy/.gitignore b/exercises/practice/wordy/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/wordy/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/wordy/package.json b/exercises/practice/wordy/package.json index 94f6a46210..8155391321 100644 --- a/exercises/practice/wordy/package.json +++ b/exercises/practice/wordy/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/wordy" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/wordy/wordy.spec.js b/exercises/practice/wordy/wordy.spec.js index d6653af692..2f03b8bcc1 100644 --- a/exercises/practice/wordy/wordy.spec.js +++ b/exercises/practice/wordy/wordy.spec.js @@ -63,13 +63,13 @@ describe('Wordy', () => { xtest('unknown operation', () => { expect(() => answer('What is 52 cubed?')).toThrow( - new Error('Unknown operation') + new Error('Unknown operation'), ); }); xtest('Non math question', () => { expect(() => answer('Who is the President of the United States?')).toThrow( - new Error('Unknown operation') + new Error('Unknown operation'), ); }); @@ -83,25 +83,25 @@ describe('Wordy', () => { xtest('reject two operations in a row', () => { expect(() => answer('What is 1 plus plus 2?')).toThrow( - new Error('Syntax error') + new Error('Syntax error'), ); }); xtest('reject two numbers in a row', () => { expect(() => answer('What is 1 plus 2 1?')).toThrow( - new Error('Syntax error') + new Error('Syntax error'), ); }); xtest('reject postfix notation', () => { expect(() => answer('What is 1 2 plus?')).toThrow( - new Error('Syntax error') + new Error('Syntax error'), ); }); xtest('reject prefix notation', () => { expect(() => answer('What is plus 1 2?')).toThrow( - new Error('Syntax error') + new Error('Syntax error'), ); }); }); diff --git a/exercises/practice/yacht/.gitignore b/exercises/practice/yacht/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/yacht/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/yacht/.meta/proof.ci.js b/exercises/practice/yacht/.meta/proof.ci.js index 9ba5a965ea..fea2bd080a 100644 --- a/exercises/practice/yacht/.meta/proof.ci.js +++ b/exercises/practice/yacht/.meta/proof.ci.js @@ -35,7 +35,7 @@ const getScoreForTheLittleStraightCategory = (dices) => { counterArray, 0, counterArray.length - 1, - 1 + 1, ); return isLittleStraight ? 30 : 0; }; @@ -46,7 +46,7 @@ const getScoreForTheBigStraightCategory = (dices) => { counterArray, 1, counterArray.length, - 1 + 1, ); return isBigStraight ? 30 : 0; }; diff --git a/exercises/practice/yacht/package.json b/exercises/practice/yacht/package.json index 7949945759..cbe62a728c 100644 --- a/exercises/practice/yacht/package.json +++ b/exercises/practice/yacht/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/yacht" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/zebra-puzzle/.gitignore b/exercises/practice/zebra-puzzle/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/zebra-puzzle/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/zebra-puzzle/.meta/proof.ci.js b/exercises/practice/zebra-puzzle/.meta/proof.ci.js index 415c9f0189..8916a1964f 100644 --- a/exercises/practice/zebra-puzzle/.meta/proof.ci.js +++ b/exercises/practice/zebra-puzzle/.meta/proof.ci.js @@ -56,7 +56,7 @@ export class ZebraPuzzle { for (let i = 0; i < arr.length; i++) { const rest = this.permutateValues( - arr.slice(0, i).concat(arr.slice(i + 1)) + arr.slice(0, i).concat(arr.slice(i + 1)), ); if (!rest.length) { diff --git a/exercises/practice/zebra-puzzle/package.json b/exercises/practice/zebra-puzzle/package.json index 0725df666c..cb9c762cd7 100644 --- a/exercises/practice/zebra-puzzle/package.json +++ b/exercises/practice/zebra-puzzle/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/zebra-puzzle" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/exercises/practice/zipper/.gitignore b/exercises/practice/zipper/.gitignore new file mode 100644 index 0000000000..31c57dd53a --- /dev/null +++ b/exercises/practice/zipper/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/bin/configlet +/bin/configlet.exe +/pnpm-lock.yaml +/yarn.lock diff --git a/exercises/practice/zipper/.meta/proof.ci.js b/exercises/practice/zipper/.meta/proof.ci.js index 9aff85b7fd..e020141c5e 100644 --- a/exercises/practice/zipper/.meta/proof.ci.js +++ b/exercises/practice/zipper/.meta/proof.ci.js @@ -43,7 +43,7 @@ export class Zipper { return new Zipper( this.tree.left, - [['left', this.tree.value, this.tree.right]].concat(this.trail) + [['left', this.tree.value, this.tree.right]].concat(this.trail), ); } @@ -52,7 +52,7 @@ export class Zipper { return new Zipper( this.tree.right, - [['right', this.tree.value, this.tree.left]].concat(this.trail) + [['right', this.tree.value, this.tree.left]].concat(this.trail), ); } @@ -66,21 +66,21 @@ export class Zipper { setValue(value) { return new Zipper( { value, left: this.tree.left, right: this.tree.right }, - this.trail + this.trail, ); } setLeft(left) { return new Zipper( { value: this.tree.value, left, right: this.tree.right }, - this.trail + this.trail, ); } setRight(right) { return new Zipper( { value: this.tree.value, left: this.tree.left, right }, - this.trail + this.trail, ); } } diff --git a/exercises/practice/zipper/package.json b/exercises/practice/zipper/package.json index 49a69f8792..6f15071c3a 100644 --- a/exercises/practice/zipper/package.json +++ b/exercises/practice/zipper/package.json @@ -10,15 +10,15 @@ "directory": "exercises/practice/zipper" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", - "core-js": "~3.26.1", - "eslint": "^8.30.0", - "jest": "^29.3.1" + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", + "core-js": "~3.32.1", + "eslint": "^8.49.0", + "jest": "^29.6.3" }, "dependencies": {}, "scripts": { diff --git a/package-lock.json b/package-lock.json index d4847f4a19..265b3ae6a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,75 +7,155 @@ "name": "@exercism/javascript", "license": "MIT", "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", "chalk": "^4.1.2", - "core-js": "~3.26.1", + "core-js": "~3.32.1", "diff": "^5.1.0", - "eslint": "^8.30.0", - "jest": "^29.3.1", - "prettier": "^2.8.1", + "eslint": "^8.49.0", + "jest": "^29.6.3", + "prettier": "^3.0.2", "shelljs": "^0.8.5" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "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/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -120,13 +200,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -159,22 +240,19 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { @@ -247,9 +325,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" @@ -268,25 +346,25 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -305,34 +383,34 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -348,9 +426,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -391,12 +469,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -415,39 +493,39 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -469,27 +547,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -576,9 +654,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -983,12 +1061,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1100,12 +1178,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1760,33 +1838,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1795,13 +1873,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1814,15 +1892,48 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1844,9 +1955,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1882,6 +1993,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@exercism/babel-preset-javascript": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@exercism/babel-preset-javascript/-/babel-preset-javascript-0.2.1.tgz", @@ -1922,9 +2042,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1980,16 +2100,16 @@ } }, "node_modules/@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz", + "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1997,37 +2117,37 @@ } }, "node_modules/@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz", + "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/reporters": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-resolve-dependencies": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.3", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2044,89 +2164,89 @@ } }, "node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz", + "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.3.1" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==", "dev": true, "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" + "expect": "^29.6.3", + "jest-snapshot": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", + "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", "dev": true, "dependencies": { - "jest-get-type": "^29.2.0" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz", + "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz", + "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz", + "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -2134,13 +2254,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2158,25 +2278,56 @@ } } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -2185,13 +2336,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz", + "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2200,14 +2351,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz", + "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.3.1", + "@jest/test-result": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -2215,26 +2366,26 @@ } }, "node_modules/@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.6.4", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2247,12 +2398,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -2278,9 +2429,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2296,19 +2447,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -2347,37 +2498,37 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.31", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.31.tgz", - "integrity": "sha512-uWZaAsh9WFhcY1rWLLcMU/omiIIAQ/PmgqplaF6UWY6ULPH0ZO8hupJRAydzlTQZJIK3Voz8o8dYlEx+Cm6BAA==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -2403,18 +2554,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" @@ -2445,9 +2596,9 @@ } }, "node_modules/@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2461,15 +2612,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "20.5.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", + "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -2494,9 +2639,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2567,9 +2712,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -2644,15 +2789,15 @@ } }, "node_modules/babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.3.1", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -2690,9 +2835,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -2767,12 +2912,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.2.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2811,9 +2956,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -2823,13 +2968,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -2885,9 +3034,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", "dev": true, "funding": [ { @@ -2897,6 +3046,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -2965,9 +3118,9 @@ "dev": true }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/cliui": { @@ -3009,9 +3162,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -3060,9 +3213,9 @@ } }, "node_modules/core-js": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", - "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", + "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -3115,10 +3268,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-is": { "version": "0.1.4", @@ -3127,9 +3288,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3170,9 +3331,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3191,9 +3352,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, "node_modules/emittery": { @@ -3306,49 +3467,47 @@ } }, "node_modules/eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -3557,24 +3716,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -3591,9 +3732,9 @@ "dev": true }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -3601,15 +3742,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -3722,14 +3869,14 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3739,12 +3886,15 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -3761,9 +3911,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3853,16 +4003,16 @@ } }, "node_modules/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" + "@jest/expect-utils": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3883,7 +4033,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { @@ -3981,9 +4131,9 @@ "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==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4143,10 +4293,10 @@ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has": { @@ -4650,34 +4800,49 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -4693,9 +4858,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4706,15 +4871,15 @@ } }, "node_modules/jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz", + "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==", "dev": true, "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.6.3", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.3.1" + "jest-cli": "^29.6.3" }, "bin": { "jest": "bin/jest.js" @@ -4732,12 +4897,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -4760,28 +4926,29 @@ } }, "node_modules/jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz", + "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4805,21 +4972,21 @@ } }, "node_modules/jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz", + "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==", "dev": true, "dependencies": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-config": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -4839,31 +5006,31 @@ } }, "node_modules/jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz", + "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", + "@jest/test-sequencer": "^29.6.3", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.3", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-circus": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4884,24 +5051,24 @@ } }, "node_modules/jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", + "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4911,62 +5078,62 @@ } }, "node_modules/jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz", + "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4978,46 +5145,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", + "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5026,23 +5193,23 @@ } }, "node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.3.1" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" @@ -5057,28 +5224,28 @@ } }, "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz", + "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.6.3", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { @@ -5086,43 +5253,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz", + "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==", "dev": true, "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz", + "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/environment": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.3", + "jest-worker": "^29.6.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5156,31 +5323,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz", + "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/globals": "^29.6.3", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5189,44 +5356,40 @@ } }, "node_modules/jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz", + "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.3.1", + "expect": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" + "pretty-format": "^29.6.3", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5239,12 +5402,12 @@ } }, "node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -5256,17 +5419,17 @@ } }, "node_modules/jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.3.1" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5285,18 +5448,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz", + "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.3.1", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -5304,13 +5467,13 @@ } }, "node_modules/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.3.1", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -5333,12 +5496,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5389,9 +5546,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5597,9 +5754,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -5719,17 +5876,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -5947,27 +6104,27 @@ } }, "node_modules/prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5989,14 +6146,30 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6085,18 +6258,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -6189,9 +6350,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -6266,9 +6427,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6586,9 +6747,9 @@ } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -6695,9 +6856,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -6707,6 +6868,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -6714,7 +6879,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -6730,9 +6895,9 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -6795,15 +6960,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6889,9 +7045,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -6929,51 +7085,114 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" } }, "@babel/eslint-parser": { @@ -6997,13 +7216,14 @@ } }, "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, @@ -7027,16 +7247,16 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "lru-cache": { @@ -7096,9 +7316,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -7111,22 +7331,22 @@ } }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -7139,28 +7359,25 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-optimise-call-expression": { @@ -7173,9 +7390,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -7204,12 +7421,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -7222,30 +7439,30 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helper-wrap-function": { @@ -7261,24 +7478,24 @@ } }, "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -7340,9 +7557,9 @@ } }, "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -7606,12 +7823,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -7687,12 +7904,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-arrow-functions": { @@ -8131,42 +8348,42 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -8176,15 +8393,38 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -8200,9 +8440,9 @@ "dev": true }, "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8225,6 +8465,12 @@ } } }, + "@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true + }, "@exercism/babel-preset-javascript": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@exercism/babel-preset-javascript/-/babel-preset-javascript-0.2.1.tgz", @@ -8258,9 +8504,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -8300,124 +8546,124 @@ "dev": true }, "@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz", + "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz", + "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/reporters": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-resolve-dependencies": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.3", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz", + "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==", "dev": true, "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.3.1" + "jest-mock": "^29.6.3" } }, "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==", "dev": true, "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" + "expect": "^29.6.3", + "jest-snapshot": "^29.6.3" } }, "@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", + "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", "dev": true, "requires": { - "jest-get-type": "^29.2.0" + "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz", + "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==", "dev": true, "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" } }, "@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz", + "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" } }, "@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz", + "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -8425,84 +8671,108 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz", + "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz", + "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==", "dev": true, "requires": { - "@jest/test-result": "^29.3.1", + "@jest/test-result": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.6.3", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.6.4", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "dependencies": { "convert-source-map": { @@ -8514,12 +8784,12 @@ } }, "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -8539,9 +8809,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { @@ -8551,19 +8821,19 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@nodelib/fs.scandir": { @@ -8593,37 +8863,37 @@ } }, "@sinclair/typebox": { - "version": "0.24.31", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.31.tgz", - "integrity": "sha512-uWZaAsh9WFhcY1rWLLcMU/omiIIAQ/PmgqplaF6UWY6ULPH0ZO8hupJRAydzlTQZJIK3Voz8o8dYlEx+Cm6BAA==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -8649,18 +8919,18 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" @@ -8691,9 +8961,9 @@ } }, "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "requires": { "expect": "^29.0.0", @@ -8707,15 +8977,9 @@ "dev": true }, "@types/node": { - "version": "18.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "20.5.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", + "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==", "dev": true }, "@types/stack-utils": { @@ -8740,9 +9004,9 @@ "dev": true }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-jsx": { @@ -8786,9 +9050,9 @@ "dev": true }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -8842,15 +9106,15 @@ } }, "babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "requires": { - "@jest/transform": "^29.3.1", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -8879,9 +9143,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -8941,12 +9205,12 @@ } }, "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^29.2.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -8976,15 +9240,15 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bser": { @@ -9025,9 +9289,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", "dev": true }, "chalk": { @@ -9079,9 +9343,9 @@ "dev": true }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "cliui": { @@ -9113,9 +9377,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color-convert": { @@ -9161,9 +9425,9 @@ } }, "core-js": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", - "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", + "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", "dev": true }, "core-js-compat": { @@ -9196,10 +9460,11 @@ } }, "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "requires": {} }, "deep-is": { "version": "0.1.4", @@ -9208,9 +9473,9 @@ "dev": true }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "define-properties": { @@ -9236,9 +9501,9 @@ "dev": true }, "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "doctrine": { @@ -9251,9 +9516,9 @@ } }, "electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, "emittery": { @@ -9339,49 +9604,47 @@ "dev": true }, "eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -9392,9 +9655,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -9402,9 +9665,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "estraverse": { @@ -9637,15 +9900,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -9653,20 +9907,20 @@ "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } @@ -9678,9 +9932,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -9747,16 +10001,16 @@ "dev": true }, "expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", "dev": true, "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" + "@jest/expect-utils": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" } }, "fast-deep-equal": { @@ -9774,7 +10028,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { @@ -9857,9 +10111,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -9967,10 +10221,10 @@ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "has": { @@ -10319,23 +10573,32 @@ } }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "dependencies": { "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { - "semver": "^6.0.0" + "lru-cache": "^6.0.0" } } } @@ -10352,9 +10615,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -10362,24 +10625,25 @@ } }, "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz", + "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==", "dev": true, "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.6.3", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.3.1" + "jest-cli": "^29.6.3" } }, "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "requires": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "dependencies": { @@ -10395,28 +10659,29 @@ } }, "jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz", + "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -10433,244 +10698,244 @@ } }, "jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz", + "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==", "dev": true, "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-config": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz", + "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", + "@jest/test-sequencer": "^29.6.3", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.3", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-circus": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", + "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz", + "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" } }, "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", + "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.3.1" + "jest-util": "^29.6.3" } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz", + "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.6.3", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz", + "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==", "dev": true, "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.3" } }, "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz", + "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.6.3", + "@jest/environment": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.3", + "jest-worker": "^29.6.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -10697,71 +10962,67 @@ } }, "jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz", + "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/globals": "^29.6.3", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz", + "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.3.1", + "expect": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" + "pretty-format": "^29.6.3", + "semver": "^7.5.3" }, "dependencies": { "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10770,12 +11031,12 @@ } }, "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -10784,17 +11045,17 @@ } }, "jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.3.1" + "pretty-format": "^29.6.3" }, "dependencies": { "camelcase": { @@ -10806,29 +11067,29 @@ } }, "jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz", + "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==", "dev": true, "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.3.1", + "jest-util": "^29.6.3", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.3.1", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10844,12 +11105,6 @@ } } }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10891,9 +11146,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "kind-of": { @@ -11061,9 +11316,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -11147,17 +11402,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -11311,18 +11566,18 @@ "dev": true }, "prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true }, "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -11338,9 +11593,15 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true }, "queue-microtask": { @@ -11405,12 +11666,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -11481,9 +11736,9 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "reusify": { @@ -11528,9 +11783,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "shallow-clone": { @@ -11772,9 +12027,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -11850,9 +12105,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -11869,9 +12124,9 @@ } }, "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", @@ -11919,12 +12174,6 @@ "is-symbol": "^1.0.3" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11991,9 +12240,9 @@ "dev": true }, "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", diff --git a/package.json b/package.json index 42c701daeb..3388240214 100644 --- a/package.json +++ b/package.json @@ -13,18 +13,18 @@ "url": "https://github.com/exercism/javascript" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.22.10", "@exercism/babel-preset-javascript": "^0.2.1", "@exercism/eslint-config-javascript": "^0.6.0", - "@types/jest": "^29.2.4", - "@types/node": "^18.11.17", - "babel-jest": "^29.2.2", + "@types/jest": "^29.5.4", + "@types/node": "^20.5.6", + "babel-jest": "^29.6.4", "chalk": "^4.1.2", - "core-js": "~3.26.1", + "core-js": "~3.32.1", "diff": "^5.1.0", - "eslint": "^8.30.0", - "jest": "^29.3.1", - "prettier": "^2.8.1", + "eslint": "^8.49.0", + "jest": "^29.6.3", + "prettier": "^3.0.2", "shelljs": "^0.8.5" }, "dependencies": {}, diff --git a/scripts/checksum b/scripts/checksum index 7e12607477..7c1a281d23 100755 --- a/scripts/checksum +++ b/scripts/checksum @@ -125,8 +125,9 @@ helpers.createExercisePackageJson(true); checksumAll('package.json', 'exercise-package.json'); -['.eslintrc', '.npmrc', 'babel.config.js', 'LICENSE'].forEach((fileToCheck) => { - checksumAll(fileToCheck); -}); +['.eslintrc', '.npmrc', 'babel.config.js', 'LICENSE', '.gitignore'].forEach((fileToCheck) => { + checksumAll(fileToCheck); + } +); shell.echo('All files passed the checksum test'); diff --git a/scripts/helpers.js b/scripts/helpers.js index eebe3850fc..42f54ac3d6 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -8,7 +8,7 @@ const crypto = require('crypto'); const exerciseDirs = shell.ls( '-d', - path.join('exercises', '{practice,concept}', '*') + path.join('exercises', '{practice,concept}', '*'), ); export const packageFiles = exerciseDirs.map((dir) => `${dir}/package.json`); @@ -19,7 +19,7 @@ export const assignments = shell.env['ASSIGNMENT'] function knownAssignments() { return exerciseDirs.map((directory) => - path.join(path.basename(path.dirname(directory)), path.basename(directory)) + path.join(path.basename(path.dirname(directory)), path.basename(directory)), ); } @@ -49,13 +49,13 @@ Expected ${chalk.cyan(`{type}${path.sep}{slug}`)}, actual: ${chalk.yellow(assign } const suggestions = knownAssignments().filter((known) => - known.includes(assignment) + known.includes(assignment), ); if (suggestions.length > 0 && suggestions.length < 5) { shell.echo( '\nDid you mean:\n' + - suggestions.map((suggestion) => `- ${suggestion}`).join('\n') + suggestions.map((suggestion) => `- ${suggestion}`).join('\n'), ); } @@ -77,7 +77,7 @@ export function findExerciseDirectory(input) { return path.join( path.basename(path.dirname(directory)), - path.basename(directory) + path.basename(directory), ); } @@ -86,7 +86,7 @@ export function fileConfiguration(assignment) { 'exercises', assignment, '.meta', - 'config.json' + 'config.json', ); let files = undefined; @@ -104,7 +104,7 @@ export function fileConfiguration(assignment) { files[key] = files[key].map((value) => value .replace('%{kebab_slug}', path.basename(assignment)) - .replace(/[/\\]/g, path.sep) + .replace(/[/\\]/g, path.sep), ); }); @@ -115,7 +115,7 @@ export function hasStub(assignment) { const stubFiles = fileConfiguration(assignment).solution; return stubFiles.every((stubFile) => - shell.test('-f', path.join('exercises', assignment, stubFile)) + shell.test('-f', path.join('exercises', assignment, stubFile)), ); } @@ -194,11 +194,11 @@ export function createExercisePackageJson(writeSha = false) { // Filter out some unwanted packages and create package.json for exercises SKIP_PACKAGES_FOR_CHECKSUM.forEach( - (pkg) => delete packageJson['devDependencies'][pkg] + (pkg) => delete packageJson['devDependencies'][pkg], ); const shellStr = new shell.ShellString( - JSON.stringify(packageJson, undefined, 2) + '\n' + JSON.stringify(packageJson, undefined, 2) + '\n', ); shellStr.to('exercise-package.json'); @@ -224,7 +224,7 @@ export function mergePackageJsons(basePackageJson, packageJson, assignment) { }); const extraRepositoryKeys = Object.keys(packageJson.repository || {}).filter( - (key) => !basePackageJson.repository[key] + (key) => !basePackageJson.repository[key], ); extraRepositoryKeys.forEach((key) => { @@ -233,7 +233,7 @@ export function mergePackageJsons(basePackageJson, packageJson, assignment) { mergedPackageJson.repository.directory = `exercises/${assignment.replace( '\\', - '/' + '/', )}`; return mergedPackageJson; @@ -287,7 +287,7 @@ export function prepare(assignment) { if (!shell.test('-f', specFile)) { if (specFileName !== 'custom.spec.js') { console.warn( - `Skipped copying test file for ${assignment}: ${specFileName} because it doesn't exist` + `Skipped copying test file for ${assignment}: ${specFileName} because it doesn't exist`, ); } @@ -297,7 +297,7 @@ export function prepare(assignment) { const specFileDestination = path.join( 'tmp_exercises', assignment, - specFileName + specFileName, ); shell.mkdir('-p', path.dirname(specFileDestination)); @@ -325,7 +325,7 @@ export function prepare(assignment) { const exampleFileDestination = path.join( 'tmp_exercises', assignment, - files.solution[i] + files.solution[i], ); shell.sed("from '../", "from './", exampleFile).to(exampleFileDestination); @@ -340,7 +340,7 @@ export function prepare(assignment) { const solutionFileDestination = path.join( 'tmp_exercises', assignment, - extraLibFileName + extraLibFileName, ); shell.cp(solutionFile, solutionFileDestination); @@ -354,7 +354,7 @@ export function prepare(assignment) { const readonlyFileDestination = path.join( 'tmp_exercises', assignment, - readonlyFileName + readonlyFileName, ); shell.cp(readonlyFile, readonlyFileDestination); @@ -366,7 +366,7 @@ export function prepare(assignment) { if (shell.test('-d', libDir)) { shell.cp( path.join(libDir, '*.js'), - path.join('tmp_exercises', assignment, 'lib') + path.join('tmp_exercises', assignment, 'lib'), ); } @@ -377,7 +377,7 @@ export function prepare(assignment) { if (shell.test('-d', dataDir)) { shell.cp( path.join(dataDir, '*'), - path.join('tmp_exercises', assignment, 'data') + path.join('tmp_exercises', assignment, 'data'), ); } } @@ -414,6 +414,6 @@ export function registerExitHandler() { //catches uncaught exceptions process.on('uncaughtException', (error) => - exitHandler({ exit: true, error }) + exitHandler({ exit: true, error }), ); } diff --git a/scripts/sync b/scripts/sync index abf8ede609..67321e2567 100755 --- a/scripts/sync +++ b/scripts/sync @@ -38,9 +38,11 @@ function copyConfigForAssignment(assignment) { .ShellString(JSON.stringify(mergedPackageJson, undefined, 2) + '\n') .to(assignmentPackageFilename); - ['.eslintrc', '.npmrc', 'babel.config.js', 'LICENSE'].forEach((file) => { - shell.cp(file, destination); - }); + ['.eslintrc', '.npmrc', 'babel.config.js', 'LICENSE', '.gitignore'].forEach( + (file) => { + shell.cp(file, destination); + } + ); } function getCurrentPackageJson(assignmentPackageFilename) {