From b71beae66e5d2d46e828e1211e7517d5f11a4ad7 Mon Sep 17 00:00:00 2001 From: Matt Pocock Date: Tue, 15 Aug 2023 10:03:07 +0100 Subject: [PATCH] Initial --- .github/workflows/main.yml | 21 + .gitignore | 3 + README.md | 57 + og-image.png | Bin 0 -> 166463 bytes package.json | 213 ++ pnpm-lock.yaml | 2343 +++++++++++++++++ scripts/setup.ts | 3 + scripts/tests/__snapshots__/all.test.ts.snap | 1287 +++++++++ scripts/tests/all.test.ts | 51 + scripts/tests/cleanVitestOutput.ts | 61 + scripts/tests/vite.config.ts | 3 + .../example.ts | 5 + .../index.html | 11 + .../example.js | 5 + .../index.html | 11 + .../example.ts | 5 + .../index.html | 11 + .../.gitignore | 1 + .../example.ts | 5 + .../index.html | 11 + .../tsconfig.json | 103 + .../012-tsc-watch-mode.problem/.gitignore | 1 + .../012-tsc-watch-mode.problem/example.ts | 5 + .../012-tsc-watch-mode.problem/index.html | 11 + .../012-tsc-watch-mode.problem/tsconfig.json | 95 + .../012-tsc-watch-mode.solution/.gitignore | 1 + .../012-tsc-watch-mode.solution/example.ts | 5 + .../012-tsc-watch-mode.solution/index.html | 11 + .../012-tsc-watch-mode.solution/tsconfig.json | 95 + .../.gitignore | 1 + .../example.ts | 5 + .../index.html | 11 + .../tsconfig.json | 95 + .../.gitignore | 1 + .../example.ts | 5 + .../index.html | 11 + .../tsconfig.json | 95 + .../.gitignore | 1 + .../example.ts | 5 + .../index.html | 5 + .../tsconfig.json | 95 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 15 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 15 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 15 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.github/workflows/ci.yml | 38 + .../016-typescript-on-ci.explainer/.gitignore | 24 + .../016-typescript-on-ci.explainer/index.html | 13 + .../package.json | 16 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 16 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 17 + .../pnpm-lock.yaml | 803 ++++++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 26 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../vite.config.js | 9 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 19 + .../pnpm-lock.yaml | 1039 ++++++++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 26 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../explainer.ts | 0 .../.gitignore | 24 + .../index.html | 13 + .../package.json | 16 + .../pnpm-lock.yaml | 320 +++ .../public/vite.svg | 1 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../.gitignore | 24 + .../index.html | 13 + .../package.json | 18 + .../pnpm-lock.yaml | 608 +++++ .../public/vite.svg | 1 + .../scripts/doSomething.ts | 5 + .../src/counter.ts | 9 + .../src/main.ts | 24 + .../src/style.css | 97 + .../src/typescript.svg | 1 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + ...-types-with-function-parameters.problem.ts | 11 + ...types-with-function-parameters.solution.ts | 11 + ...022-annotating-empty-parameters.problem.ts | 11 + ...22-annotating-empty-parameters.solution.ts | 11 + .../023-all-types.problem.ts | 5 + .../023-all-types.solution.1.ts | 5 + .../023-all-types.solution.2.ts | 5 + ...24-optional-function-parameters.problem.ts | 15 + ...4-optional-function-parameters.solution.ts | 15 + .../025-default-parameters.problem.ts | 25 + .../025-default-parameters.solution.ts | 25 + .../026-object-literal-types.problem.ts | 16 + .../026-object-literal-types.solution.ts | 16 + .../027-optional-property-types.problem.ts | 29 + .../027-optional-property-types.solution.ts | 29 + .../028-type-keyword.problem.ts | 34 + .../028-type-keyword.solution.1.ts | 36 + .../028-type-keyword.solution.2.ts | 32 + .../028-type-keyword.solution.3.ts | 4 + .../029-arrays.problem.ts | 13 + .../029-arrays.solution.1.ts | 14 + .../029-arrays.solution.2.ts | 14 + .../030-arrays-of-objects.problem.ts | 17 + .../030-arrays-of-objects.solution.1.ts | 23 + .../030-arrays-of-objects.solution.2.ts | 23 + .../030-arrays-of-objects.solution.3.ts | 21 + .../030-arrays-of-objects.solution.4.ts | 21 + ...31-rest-parameters-of-functions.problem.ts | 12 + ...rest-parameters-of-functions.solution.1.ts | 12 + ...rest-parameters-of-functions.solution.2.ts | 12 + .../032-tuples.problem.ts | 23 + .../032-tuples.solution.1.ts | 22 + .../032-tuples.solution.2.ts | 22 + .../033-optional-members-of-tuples.problem.ts | 1 + ...033-optional-members-of-tuples.solution.ts | 0 .../034-pass-types-to-set.problem.ts | 10 + .../034-pass-types-to-set.solution.1.ts | 10 + .../034-pass-types-to-set.solution.2.ts | 10 + .../035-pass-types-to-map.problem.ts | 10 + .../035-pass-types-to-map.solution.1.ts | 15 + .../035-pass-types-to-map.solution.2.ts | 10 + .../035-pass-types-to-map.solution.3.ts | 10 + .../035-pass-types-to-map.solution.4.ts | 15 + ...rse-cant-receive-type-arguments.problem.ts | 23 + ...se-cant-receive-type-arguments.solution.ts | 23 + .../037-type-async-functions.problem.ts | 11 + .../037-type-async-functions.solution.ts | 11 + src/helpers/type-utils.ts | 47 + tsconfig.json | 18 + vite.config.ts | 13 + 194 files changed, 11895 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 og-image.png create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 scripts/setup.ts create mode 100644 scripts/tests/__snapshots__/all.test.ts.snap create mode 100644 scripts/tests/all.test.ts create mode 100644 scripts/tests/cleanVitestOutput.ts create mode 100644 scripts/tests/vite.config.ts create mode 100644 src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/example.ts create mode 100644 src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/example.js create mode 100644 src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/example.ts create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/example.ts create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/example.ts create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/example.ts create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/example.ts create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/example.ts create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/example.ts create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/package.json create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/style.css create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/package.json create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/style.css create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/package.json create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/style.css create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.github/workflows/ci.yml create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.gitignore create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/index.html create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/package.json create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/style.css create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/package.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/style.css create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/.gitignore create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/index.html create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/package.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/style.css create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/vite.config.js create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/.gitignore create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/index.html create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/package.json create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/style.css create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/018-typescript-in-different-frameworks.explainer/explainer.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/.gitignore create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/index.html create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/package.json create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/style.css create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/tsconfig.json create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/.gitignore create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/index.html create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/package.json create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/pnpm-lock.yaml create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/public/vite.svg create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/scripts/doSomething.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/counter.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/main.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/style.css create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/typescript.svg create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/vite-env.d.ts create mode 100644 src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/tsconfig.json create mode 100644 src/015-essential-types-and-annotations/020-basic-types-with-function-parameters.problem.ts create mode 100644 src/015-essential-types-and-annotations/021-basic-types-with-function-parameters.solution.ts create mode 100644 src/015-essential-types-and-annotations/022-annotating-empty-parameters.problem.ts create mode 100644 src/015-essential-types-and-annotations/022-annotating-empty-parameters.solution.ts create mode 100644 src/015-essential-types-and-annotations/023-all-types.problem.ts create mode 100644 src/015-essential-types-and-annotations/023-all-types.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/023-all-types.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/024-optional-function-parameters.problem.ts create mode 100644 src/015-essential-types-and-annotations/024-optional-function-parameters.solution.ts create mode 100644 src/015-essential-types-and-annotations/025-default-parameters.problem.ts create mode 100644 src/015-essential-types-and-annotations/025-default-parameters.solution.ts create mode 100644 src/015-essential-types-and-annotations/026-object-literal-types.problem.ts create mode 100644 src/015-essential-types-and-annotations/026-object-literal-types.solution.ts create mode 100644 src/015-essential-types-and-annotations/027-optional-property-types.problem.ts create mode 100644 src/015-essential-types-and-annotations/027-optional-property-types.solution.ts create mode 100644 src/015-essential-types-and-annotations/028-type-keyword.problem.ts create mode 100644 src/015-essential-types-and-annotations/028-type-keyword.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/028-type-keyword.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/028-type-keyword.solution.3.ts create mode 100644 src/015-essential-types-and-annotations/029-arrays.problem.ts create mode 100644 src/015-essential-types-and-annotations/029-arrays.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/029-arrays.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/030-arrays-of-objects.problem.ts create mode 100644 src/015-essential-types-and-annotations/030-arrays-of-objects.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/030-arrays-of-objects.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/030-arrays-of-objects.solution.3.ts create mode 100644 src/015-essential-types-and-annotations/030-arrays-of-objects.solution.4.ts create mode 100644 src/015-essential-types-and-annotations/031-rest-parameters-of-functions.problem.ts create mode 100644 src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/032-tuples.problem.ts create mode 100644 src/015-essential-types-and-annotations/032-tuples.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/032-tuples.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/033-optional-members-of-tuples.problem.ts create mode 100644 src/015-essential-types-and-annotations/033-optional-members-of-tuples.solution.ts create mode 100644 src/015-essential-types-and-annotations/034-pass-types-to-set.problem.ts create mode 100644 src/015-essential-types-and-annotations/034-pass-types-to-set.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/034-pass-types-to-set.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/035-pass-types-to-map.problem.ts create mode 100644 src/015-essential-types-and-annotations/035-pass-types-to-map.solution.1.ts create mode 100644 src/015-essential-types-and-annotations/035-pass-types-to-map.solution.2.ts create mode 100644 src/015-essential-types-and-annotations/035-pass-types-to-map.solution.3.ts create mode 100644 src/015-essential-types-and-annotations/035-pass-types-to-map.solution.4.ts create mode 100644 src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.problem.ts create mode 100644 src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.solution.ts create mode 100644 src/015-essential-types-and-annotations/037-type-async-functions.problem.ts create mode 100644 src/015-essential-types-and-annotations/037-type-async-functions.solution.ts create mode 100644 src/helpers/type-utils.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..9ee4bf0 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,21 @@ +name: CI +on: + push: + branches: + - "**" + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: "pnpm" + + - run: pnpm install --frozen-lockfile + - run: pnpm run ci diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59ecb4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.vscode +tsconfig.temp.json \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a3ee86 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +React with TypeScript, tutorial by Matt Pocock + +## Quickstart + +Clone this repo or [open in Gitpod](https://gitpod.io/#https://github.com/total-typescript/react-typescript-tutorial). + +```sh +# Installs all dependencies +npm install + +# Starts the first exercise +npm run exercise 01 + +# Runs linting and tests on the solution +npm run solution 01 +``` + +## How to take the course + +You'll notice that the course is split into exercises. Each exercise is split into a `*.problem.ts` and a `*.solution.ts`. + +To take an exercise: + +1. Go into `*.problem.ts` +2. Run `npm run exercise 01`, where `01` is the number of the exercise you're on. + +The `exercise` script will run TypeScript typechecks and a test suite on the exercise. + +This course encourages **active, exploratory learning**. In the video, I'll explain a problem, and **you'll be asked to try to find a solution**. To attempt a solution, you'll need to: + +1. Check out [TypeScript's docs](https://www.typescriptlang.org/docs/handbook/intro.html) or the [React TypeScript cheatsheet](https://react-typescript-cheatsheet.netlify.app/) +1. Try to find something that looks relevant. +1. Give it a go to see if it solves the problem. + +You'll know if you've succeeded because the tests will pass. + +**If you succeed**, or **if you get stuck**, unpause the video and check out the `*.solution.ts`. You can see if your solution is better or worse than mine! + +You can run `npm run solution 01` to run the tests and typechecking on the solution. + +## Acknowledgements + +Say thanks to Matt on [Twitter](https://twitter.com/mattpocockuk) or by joining his [Discord](https://discord.gg/8S5ujhfTB3). Consider signing up to his [Total TypeScript course](https://totaltypescript.com). + +## Reference + +### `npm run exercise 01` + +Alias: `npm run e 01` + +Run the corresponding `*.problem.ts` file. + +### `npm run solution 01` + +Alias: `npm run s 01` + +Run the corresponding `*.solution.ts` file. If there are multiple, it runs only the first one. diff --git a/og-image.png b/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..bc16cc1695f4e417b461d64483c5b3822174ff89 GIT binary patch literal 166463 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 w{", + "license": "GPL", + "devDependencies": { + "@total-typescript/exercise-cli": "^0.2.2", + "cross-fetch": "^3.1.5", + "jsdom": "^21.1.1", + "prettier": "^2.8.7", + "typescript": "^5.1.3", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.31.1" + }, + "scripts": { + "exercise": "tt-cli run", + "e": "npm run exercise", + "solution": "tt-cli run --solution", + "s": "npm run solution", + "ci": "(cd scripts/tests && npx vitest run)", + "update-snapshots": "(cd scripts/tests && npx vitest run -u)", + "prepare": "tt-cli prepare-stackblitz", + "e-09": "tt-cli run 09", + "s-09": "tt-cli run 09 --solution", + "e-10": "tt-cli run 10", + "s-10": "tt-cli run 10 --solution", + "e-18": "npm run exercise -- 18", + "s-18": "npm run solution -- 18", + "e-19": "tt-cli run 19", + "s-19": "tt-cli run 19 --solution", + "e-20": "tt-cli run 20", + "s-20": "tt-cli run 20 --solution", + "e-21": "tt-cli run 21", + "s-21": "tt-cli run 21 --solution", + "e-22": "tt-cli run 22", + "s-22": "tt-cli run 22 --solution", + "e-26": "tt-cli run 26", + "s-26": "tt-cli run 26 --solution", + "e-28": "tt-cli run 28", + "s-28": "tt-cli run 28 --solution", + "e-12": "tt-cli run 12", + "s-12": "tt-cli run 12 --solution", + "e-14": "tt-cli run 14", + "s-14": "tt-cli run 14 --solution", + "e-32": "tt-cli run 32", + "s-32": "tt-cli run 32 --solution", + "e-33": "tt-cli run 33", + "s-33": "tt-cli run 33 --solution", + "e-34": "tt-cli run 34", + "s-34": "tt-cli run 34 --solution", + "e-35": "tt-cli run 35", + "s-35": "tt-cli run 35 --solution", + "e-39": "tt-cli run 39", + "s-39": "tt-cli run 39 --solution", + "e-36": "tt-cli run 36", + "s-36": "tt-cli run 36 --solution", + "e-40": "tt-cli run 40", + "s-40": "tt-cli run 40 --solution", + "e-03": "tt-cli run 03", + "s-03": "tt-cli run 03 --solution", + "e-04": "tt-cli run 04", + "s-04": "tt-cli run 04 --solution", + "e-05": "tt-cli run 05", + "s-05": "tt-cli run 05 --solution", + "e-06": "tt-cli run 06", + "s-06": "tt-cli run 06 --solution", + "e-07": "tt-cli run 07", + "s-07": "tt-cli run 07 --solution", + "e-08": "tt-cli run 08", + "s-08": "tt-cli run 08 --solution", + "e-11": "tt-cli run 11", + "s-11": "tt-cli run 11 --solution", + "e-13": "tt-cli run 13", + "s-13": "tt-cli run 13 --solution", + "e-15": "tt-cli run 15", + "s-15": "tt-cli run 15 --solution", + "e-16": "tt-cli run 16", + "s-16": "tt-cli run 16 --solution", + "e-17": "tt-cli run 17", + "s-17": "tt-cli run 17 --solution", + "e-23": "tt-cli run 23", + "s-23": "tt-cli run 23 --solution", + "e-24": "tt-cli run 24", + "s-24": "tt-cli run 24 --solution", + "e-25": "tt-cli run 25", + "s-25": "tt-cli run 25 --solution", + "e-27": "tt-cli run 27", + "s-27": "tt-cli run 27 --solution", + "e-29": "tt-cli run 29", + "s-29": "tt-cli run 29 --solution", + "e-30": "tt-cli run 30", + "s-30": "tt-cli run 30 --solution", + "e-31": "tt-cli run 31", + "s-31": "tt-cli run 31 --solution", + "e-37": "tt-cli run 37", + "s-37": "tt-cli run 37 --solution", + "e-38": "tt-cli run 38", + "s-38": "tt-cli run 38 --solution", + "e-41": "tt-cli run 41", + "s-41": "tt-cli run 41 --solution", + "e-44": "tt-cli run 44", + "s-44": "tt-cli run 44 --solution", + "e-46": "tt-cli run 46", + "s-46": "tt-cli run 46 --solution", + "e-47": "tt-cli run 47", + "s-47": "tt-cli run 47 --solution", + "e-48": "tt-cli run 48", + "s-48": "tt-cli run 48 --solution", + "e-49": "tt-cli run 49", + "s-49": "tt-cli run 49 --solution", + "e-50": "tt-cli run 50", + "s-50": "tt-cli run 50 --solution", + "e-51": "tt-cli run 51", + "s-51": "tt-cli run 51 --solution", + "e-54": "tt-cli run 54", + "s-54": "tt-cli run 54 --solution", + "e-55": "tt-cli run 55", + "s-55": "tt-cli run 55 --solution", + "e-56": "tt-cli run 56", + "s-56": "tt-cli run 56 --solution", + "e-57": "tt-cli run 57", + "s-57": "tt-cli run 57 --solution", + "e-58": "tt-cli run 58", + "s-58": "tt-cli run 58 --solution", + "e-59": "tt-cli run 59", + "s-59": "tt-cli run 59 --solution", + "e-60": "tt-cli run 60", + "s-60": "tt-cli run 60 --solution", + "e-61": "tt-cli run 61", + "s-61": "tt-cli run 61 --solution", + "e-62": "tt-cli run 62", + "s-62": "tt-cli run 62 --solution", + "e-63": "tt-cli run 63", + "s-63": "tt-cli run 63 --solution", + "e-42": "tt-cli run 42", + "s-42": "tt-cli run 42 --solution", + "e-45": "tt-cli run 45", + "s-45": "tt-cli run 45 --solution", + "e-52": "tt-cli run 52", + "s-52": "tt-cli run 52 --solution", + "e-64": "tt-cli run 64", + "s-64": "tt-cli run 64 --solution", + "e-65": "tt-cli run 65", + "s-65": "tt-cli run 65 --solution", + "e-66": "tt-cli run 66", + "s-66": "tt-cli run 66 --solution", + "e-43": "tt-cli run 43", + "s-43": "tt-cli run 43 --solution", + "e-67": "tt-cli run 67", + "s-67": "tt-cli run 67 --solution", + "e-68": "tt-cli run 68", + "s-68": "tt-cli run 68 --solution", + "e-70": "tt-cli run 70", + "s-70": "tt-cli run 70 --solution", + "e-71": "tt-cli run 71", + "s-71": "tt-cli run 71 --solution", + "e-73": "tt-cli run 73", + "s-73": "tt-cli run 73 --solution", + "e-69": "tt-cli run 69", + "s-69": "tt-cli run 69 --solution", + "e-74": "tt-cli run 74", + "s-74": "tt-cli run 74 --solution", + "e-76": "tt-cli run 76", + "s-76": "tt-cli run 76 --solution", + "e-020": "tt-cli run 020", + "s-020": "tt-cli run 020 --solution", + "e-022": "tt-cli run 022", + "s-022": "tt-cli run 022 --solution", + "e-023": "tt-cli run 023", + "s-023": "tt-cli run 023 --solution", + "e-024": "tt-cli run 024", + "s-024": "tt-cli run 024 --solution", + "e-025": "tt-cli run 025", + "s-025": "tt-cli run 025 --solution", + "e-026": "tt-cli run 026", + "s-026": "tt-cli run 026 --solution", + "e-027": "tt-cli run 027", + "s-027": "tt-cli run 027 --solution", + "e-028": "tt-cli run 028", + "s-028": "tt-cli run 028 --solution", + "e-029": "tt-cli run 029", + "s-029": "tt-cli run 029 --solution", + "e-030": "tt-cli run 030", + "s-030": "tt-cli run 030 --solution", + "e-031": "tt-cli run 031", + "s-031": "tt-cli run 031 --solution", + "e-032": "tt-cli run 032", + "s-032": "tt-cli run 032 --solution", + "e-033": "tt-cli run 033", + "s-033": "tt-cli run 033 --solution", + "e-034": "tt-cli run 034", + "s-034": "tt-cli run 034 --solution", + "e-035": "tt-cli run 035", + "s-035": "tt-cli run 035 --solution", + "e-036": "tt-cli run 036", + "s-036": "tt-cli run 036 --solution", + "e-037": "tt-cli run 037", + "s-037": "tt-cli run 037 --solution" + }, + "dependencies": { + "@tanstack/react-query": "^4.29.12", + "@types/express": "^4.17.13", + "@types/react": "^18.2.8", + "@types/react-dom": "^18.2.4", + "express": "^4.18.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.44.3", + "react-select": "^5.7.3", + "zod": "^3.21.4" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b2008d3 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2343 @@ +lockfileVersion: 5.4 + +specifiers: + '@tanstack/react-query': ^4.29.12 + '@total-typescript/exercise-cli': ^0.2.2 + '@types/express': ^4.17.13 + '@types/react': ^18.2.8 + '@types/react-dom': ^18.2.4 + cross-fetch: ^3.1.5 + express: ^4.18.1 + jsdom: ^21.1.1 + prettier: ^2.8.7 + react: ^18.2.0 + react-dom: ^18.2.0 + react-hook-form: ^7.44.3 + react-select: ^5.7.3 + typescript: ^5.1.3 + vite-tsconfig-paths: ^4.0.7 + vitest: ^0.31.1 + zod: ^3.21.4 + +dependencies: + '@tanstack/react-query': 4.32.6_biqbaboplfbrettd7655fr4n2y + '@types/express': 4.17.17 + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 + express: 4.18.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-hook-form: 7.45.4_react@18.2.0 + react-select: 5.7.4_qflmzdebv2ewfrqz6op6ohcc2q + zod: 3.22.0 + +devDependencies: + '@total-typescript/exercise-cli': 0.2.2 + cross-fetch: 3.1.8 + jsdom: 21.1.2 + prettier: 2.8.8 + typescript: 5.1.6 + vite-tsconfig-paths: 4.2.0_typescript@5.1.6 + vitest: 0.31.4_jsdom@21.1.2 + +packages: + + /@babel/code-frame/7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: false + + /@babel/helper-module-imports/7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + dev: false + + /@babel/helper-string-parser/7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier/7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/highlight/7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/runtime/7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@babel/types/7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: false + + /@emotion/babel-plugin/11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.5 + '@babel/runtime': 7.22.10 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache/11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash/0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/memoize/0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react/11.11.1_j3ahe22lw6ac2w6qvqp4kjqnqy: + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1_react@18.2.0 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.20 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize/1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet/1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/unitless/0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks/1.0.1_react@18.2.0: + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils/1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize/0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@floating-ui/core/1.4.1: + resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==} + dependencies: + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/dom/1.5.1: + resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==} + dependencies: + '@floating-ui/core': 1.4.1 + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/utils/0.1.1: + resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} + dev: false + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@tanstack/query-core/4.32.6: + resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + dev: false + + /@tanstack/react-query/4.32.6_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.32.6 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false + + /@tootallnate/once/2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@total-typescript/exercise-cli/0.2.2: + resolution: {integrity: sha512-0DYEpYQThv+kzj3Pqi1lN08XB22YgHTXnAnnQqO5/7jQ6yQtty4rEu0FoSm+xwzO8nn8NAwjotpYrEq5Lf6jBg==} + hasBin: true + dependencies: + chokidar: 3.5.3 + commander: 10.0.1 + fast-glob: 3.3.1 + jsonc-parser: 3.2.0 + dev: true + + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 20.5.0 + dev: false + + /@types/chai-subset/1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai/4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 20.5.0 + dev: false + + /@types/express-serve-static-core/4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 20.5.0 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + dev: false + + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 + dev: false + + /@types/http-errors/2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: false + + /@types/mime/1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: false + + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: false + + /@types/node/20.5.0: + resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: false + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: false + + /@types/react-dom/18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + dependencies: + '@types/react': 18.2.20 + dev: false + + /@types/react-transition-group/4.4.6: + resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} + dependencies: + '@types/react': 18.2.20 + dev: false + + /@types/react/18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: false + + /@types/scheduler/0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: false + + /@types/send/0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 20.5.0 + dev: false + + /@types/serve-static/1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + dependencies: + '@types/http-errors': 2.0.1 + '@types/mime': 3.0.1 + '@types/node': 20.5.0 + dev: false + + /@vitest/expect/0.31.4: + resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==} + dependencies: + '@vitest/spy': 0.31.4 + '@vitest/utils': 0.31.4 + chai: 4.3.7 + dev: true + + /@vitest/runner/0.31.4: + resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==} + dependencies: + '@vitest/utils': 0.31.4 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot/0.31.4: + resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==} + dependencies: + magic-string: 0.30.2 + pathe: 1.1.1 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy/0.31.4: + resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils/0.31.4: + resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-globals/7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + dependencies: + acorn: 8.10.0 + acorn-walk: 8.2.0 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /babel-plugin-macros/3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.10 + cosmiconfig: 7.1.0 + resolve: 1.22.4 + dev: false + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /blueimp-md5/2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /chai/4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /check-error/1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /concordance/5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.4 + well-known-symbols: 2.0.0 + dev: true + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cross-fetch/3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: true + + /cssstyle/3.0.0: + resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} + engines: {node: '>=14'} + dependencies: + rrweb-cssom: 0.6.0 + dev: true + + /csstype/3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false + + /data-urls/4.0.0: + resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} + engines: {node: '>=14'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + dev: true + + /date-time/3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /deep-eql/4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dom-helpers/5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.22.10 + csstype: 3.1.2 + dev: false + + /domexception/4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /entities/4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /escodegen/2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-diff/1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob/3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /find-root/1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /get-func-name/2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic/1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /html-encoding-sniffer/3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /http-proxy-agent/5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /js-string-escape/1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /jsdom/21.1.2: + resolution: {integrity: sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.10.0 + acorn-globals: 7.0.1 + cssstyle: 3.0.0 + data-urls: 4.0.0 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.1.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + ws: 8.13.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /local-pkg/0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /loupe/2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string/0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5-hex/3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /memoize-one/6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mlly/1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-fetch/2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /nwsapi/2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /parse5/7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /pathe/1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pkg-types/1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prettier/2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-hook-form/7.45.4_react@18.2.0: + resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-select/5.7.4_qflmzdebv2ewfrqz6op6ohcc2q: + resolution: {integrity: sha512-NhuE56X+p9QDFh4BgeygHFIvJJszO1i1KSkg/JPcIJrbovyRtI+GuOEa4XzFCEpZRAEoEI8u/cAHK+jG/PgUzQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.22.10 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.1_j3ahe22lw6ac2w6qvqp4kjqnqy + '@floating-ui/dom': 1.5.1 + '@types/react-transition-group': 4.4.6 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y + use-isomorphic-layout-effect: 1.1.2_j3ahe22lw6ac2w6qvqp4kjqnqy + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.22.10 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regenerator-runtime/0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve/1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /rrweb-cssom/0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /saxes/6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /siginfo/2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + + /stackback/0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /std-env/3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /strip-literal/1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /stylis/4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /time-zone/1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /tinybench/2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool/0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy/2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /tough-cookie/4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46/4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.0 + dev: true + + /tsconfck/2.1.2_typescript@5.1.6: + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.6 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo/1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /use-isomorphic-layout-effect/1.1.2_j3ahe22lw6ac2w6qvqp4kjqnqy: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.20 + react: 18.2.0 + dev: false + + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vite-node/0.31.4_@types+node@20.5.0: + resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9_@types+node@20.5.0 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths/4.2.0_typescript@5.1.6: + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2_typescript@5.1.6 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite/4.4.9_@types+node@20.5.0: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.0 + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest/0.31.4_jsdom@21.1.2: + resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.5.0 + '@vitest/expect': 0.31.4 + '@vitest/runner': 0.31.4 + '@vitest/snapshot': 0.31.4 + '@vitest/spy': 0.31.4 + '@vitest/utils': 0.31.4 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + jsdom: 21.1.2 + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.5.0 + vite: 4.4.9_@types+node@20.5.0 + vite-node: 0.31.4_@types+node@20.5.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /w3c-xmlserializer/4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions/7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /well-known-symbols/2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /whatwg-encoding/2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype/3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url/12.0.1: + resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} + engines: {node: '>=14'} + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /why-is-node-running/2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator/4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zod/3.22.0: + resolution: {integrity: sha512-y5KZY/ssf5n7hCGDGGtcJO/EBJEm5Pa+QQvFBeyMOtnFYOSflalxIFFvdaYevPhePcmcKC4aTbFkCcXN7D0O8Q==} + dev: false diff --git a/scripts/setup.ts b/scripts/setup.ts new file mode 100644 index 0000000..354d20d --- /dev/null +++ b/scripts/setup.ts @@ -0,0 +1,3 @@ +import { fetch } from "cross-fetch"; + +global.fetch = fetch; diff --git a/scripts/tests/__snapshots__/all.test.ts.snap b/scripts/tests/__snapshots__/all.test.ts.snap new file mode 100644 index 0000000..a1f75ec --- /dev/null +++ b/scripts/tests/__snapshots__/all.test.ts.snap @@ -0,0 +1,1287 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`tsc > Should have the correct TypeScript errors 1`] = ` +",src/01-introduction/03-navigating-jsx-types.problem.tsx(5,21): error TS17000: JSX attributes must only be assigned a non-empty 'expression'. +src/02-components/04-typing-components.problem.tsx(4,29): error TS18046: 'props' is of type 'unknown'. +src/02-components/04-typing-components.problem.tsx(10,8): error TS2578: Unused '@ts-expect-error' directive. +src/02-components/04-typing-components.problem.tsx(13,15): error TS2322: Type '{ className: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'className' does not exist on type 'IntrinsicAttributes'. +src/02-components/05-typing-components-as-functions.problem.tsx(7,1): error TS2578: Unused '@ts-expect-error' directive. +src/02-components/05-typing-components-as-functions.problem.tsx(17,8): error TS2786: 'Button' cannot be used as a JSX component. + Its type '(props: Props) => { ohDear: string; }' is not a valid JSX element type. + Type '(props: Props) => { ohDear: string; }' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'. + Type '{ ohDear: string; }' is not assignable to type 'ReactNode'. +src/02-components/06-typing-children.problem.tsx(4,25): error TS2339: Property 'children' does not exist on type '{}'. +src/02-components/06-typing-children.problem.tsx(10,8): error TS2578: Unused '@ts-expect-error' directive. +src/02-components/06-typing-children.problem.tsx(12,8): error TS2559: Type '{ children: string; }' has no properties in common with type 'IntrinsicAttributes'. +src/02-components/07-typing-onclick-handlers.problem.tsx(8,47): error TS2339: Property 'onClick' does not exist on type 'ButtonProps'. +src/02-components/08-using-html-props.problem.tsx(3,26): error TS2339: Property 'className' does not exist on type '{}'. +src/02-components/08-using-html-props.problem.tsx(10,18): error TS2322: Type '{ onClick: () => void; type: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'onClick' does not exist on type 'IntrinsicAttributes'. +src/02-components/09-html-props-with-one-changed.problem.tsx(23,28): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/02-components/10-extracting-props-from-custom-components.problem.tsx(18,3): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/03-hooks/11-use-state.problem.tsx(8,30): error TS2339: Property 'id' does not exist on type 'never'. +src/03-hooks/11-use-state.problem.tsx(8,39): error TS2339: Property 'value' does not exist on type 'never'. +src/03-hooks/11-use-state.problem.tsx(13,13): error TS2322: Type '{ id: number; value: string; }' is not assignable to type 'never'. +src/03-hooks/11-use-state.problem.tsx(14,13): error TS2322: Type '{ id: number; value: string; }' is not assignable to type 'never'. +src/03-hooks/12-use-state-with-undefined.problem.ts(18,15): error TS2345: Argument of type '{ id: number; name: string; }' is not assignable to parameter of type 'SetStateAction'. + Type '{ id: number; name: string; }' provides no match for the signature '(prevState: undefined): undefined'. +src/03-hooks/12-use-state-with-undefined.problem.ts(22,23): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/03-hooks/13-use-state-excess-properties.problem.tsx(22,17): error TS2578: Unused '@ts-expect-error' directive. +src/03-hooks/13-use-state-excess-properties.problem.tsx(40,17): error TS2578: Unused '@ts-expect-error' directive. +src/03-hooks/14-use-effect.problem.ts(6,7): error TS2322: Type 'Timeout' is not assignable to type 'void | Destructor'. +src/03-hooks/15-use-callback.problem.tsx(5,31): error TS2344: Type 'string' does not satisfy the constraint 'Function'. +src/03-hooks/15-use-callback.problem.tsx(6,6): error TS7006: Parameter 'buttonName' implicitly has an 'any' type. +src/03-hooks/15-use-callback.problem.tsx(12,22): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/03-hooks/15-use-callback.problem.tsx(16,30): error TS2349: This expression is not callable. + Type 'String' has no call signatures. +src/03-hooks/15-use-callback.problem.tsx(17,30): error TS2349: This expression is not callable. + Type 'String' has no call signatures. +src/03-hooks/15-use-callback.problem.tsx(18,30): error TS2349: This expression is not callable. + Type 'String' has no call signatures. +src/03-hooks/16-use-memo.problem.tsx(5,52): error TS2345: Argument of type '() => string[]' is not assignable to parameter of type '() => () => string[]'. + Type 'string[]' is not assignable to type '() => string[]'. + Type 'string[]' provides no match for the signature '(): string[]'. +src/03-hooks/16-use-memo.problem.tsx(12,22): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/03-hooks/17-use-ref-basics.problem.tsx(7,5): error TS2322: Type '\\"Random value!\\"' is not assignable to type 'undefined'. +src/03-hooks/18-element-refs.explainer.tsx(19,7): error TS2322: Type 'undefined' is not assignable to type 'HTMLDivElement | null'. +src/03-hooks/19-use-ref-with-elements.problem.tsx(6,15): error TS2322: Type 'MutableRefObject' is not assignable to type 'LegacyRef | undefined'. + Type 'MutableRefObject' is not assignable to type 'RefObject'. + Types of property 'current' are incompatible. + Type 'HTMLDivElement | undefined' is not assignable to type 'HTMLDivElement | null'. + Type 'undefined' is not assignable to type 'HTMLDivElement | null'. +src/03-hooks/20-why-is-my-ref-readonly.problem.tsx(7,7): error TS2540: Cannot assign to 'current' because it is a read-only property. +src/03-hooks/20-why-is-my-ref-readonly.solution.tsx(10,18): error TS2540: Cannot assign to 'current' because it is a read-only property. +src/03-hooks/21-use-reducer.problem.ts(5,11): error TS18046: 'action' is of type 'unknown'. +src/03-hooks/21-use-reducer.problem.ts(7,23): error TS18046: 'state' is of type 'unknown'. +src/03-hooks/21-use-reducer.problem.ts(7,37): error TS18046: 'action' is of type 'unknown'. +src/03-hooks/21-use-reducer.problem.ts(9,23): error TS18046: 'state' is of type 'unknown'. +src/03-hooks/21-use-reducer.problem.ts(9,37): error TS18046: 'action' is of type 'unknown'. +src/03-hooks/21-use-reducer.problem.ts(21,1): error TS2578: Unused '@ts-expect-error' directive. +src/03-hooks/21-use-reducer.problem.ts(24,1): error TS2578: Unused '@ts-expect-error' directive. +src/03-hooks/21-use-reducer.problem.ts(27,1): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/22-discriminated-union-props.problem.tsx(34,9): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/23-destructuring-discriminated-unions.problem.tsx(19,34): error TS2339: Property 'title' does not exist on type 'ModalProps'. +src/04-advanced-props/23-destructuring-discriminated-unions.solution.1.tsx(18,31): error TS2339: Property 'title' does not exist on type '{} | { title: string; }'. + Property 'title' does not exist on type '{}'. +src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx(21,36): error TS2339: Property 'buttonColor' does not exist on type '{ variant: \\"no-title\\"; }'. +src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx(34,36): error TS2339: Property 'buttonColor' does not exist on type '{ variant: \\"title\\"; title: string; }'. +src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx(50,9): error TS2322: Type '{ buttonColor: string; variant: \\"no-title\\"; title: string; }' is not assignable to type 'IntrinsicAttributes & ModalProps'. + Property 'buttonColor' does not exist on type 'IntrinsicAttributes & { variant: \\"no-title\\"; }'. +src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx(52,9): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx(55,44): error TS2322: Type '{ variant: \\"title\\"; title: string; buttonColor: string; }' is not assignable to type 'IntrinsicAttributes & ModalProps'. + Property 'buttonColor' does not exist on type 'IntrinsicAttributes & { variant: \\"title\\"; title: string; }'. +src/04-advanced-props/25-toggle-props.problem.tsx(38,5): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/25-toggle-props.problem.tsx(42,4): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/27-either-all-these-props-or-none.problem.tsx(40,8): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/27-either-all-these-props-or-none.problem.tsx(43,8): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(15,30): error TS2345: Argument of type 'ReactNode' is not assignable to parameter of type '(value: number, index: number, array: number[]) => ReactNode'. + Type 'undefined' is not assignable to type '(value: number, index: number, array: number[]) => ReactNode'. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(22,19): error TS2322: Type '(index: any) => Element' is not assignable to type 'ReactNode'. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(22,21): error TS7006: Parameter 'index' implicitly has an 'any' type. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(23,30): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(28,19): error TS2322: Type '(index: any) => null' is not assignable to type 'ReactNode'. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(28,21): error TS7006: Parameter 'index' implicitly has an 'any' type. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(33,9): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(37,9): error TS2322: Type '(index: any) => any' is not assignable to type 'ReactNode'. +src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx(37,21): error TS7006: Parameter 'index' implicitly has an 'any' type. +src/04-advanced-props/31-as-const.problem.ts(13,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/04-advanced-props/31-as-const.problem.ts(14,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/04-advanced-props/32-satisfies-vs-annotation-vs-as.problem.tsx(6,3): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/32-satisfies-vs-annotation-vs-as.problem.tsx(11,4): error TS2322: Type '{ children: string; type: string; illegalProperty: string; }' is not assignable to type 'DetailedHTMLProps, HTMLButtonElement>'. + Type '{ children: string; type: string; illegalProperty: string; }' is not assignable to type 'ButtonHTMLAttributes'. + Types of property 'type' are incompatible. + Type 'string' is not assignable to type '\\"button\\" | \\"submit\\" | \\"reset\\" | undefined'. +src/04-advanced-props/32-satisfies-vs-annotation-vs-as.problem.tsx(16,20): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/04-advanced-props/33-prop-groups-with-variants.problem.tsx(7,5): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/33-prop-groups-with-variants.problem.tsx(13,5): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/33-prop-groups-with-variants.problem.tsx(19,5): error TS2578: Unused '@ts-expect-error' directive. +src/04-advanced-props/33-prop-groups-with-variants.problem.tsx(48,11): error TS2322: Type '{ children: string; className: string; type: string; illegalProperty: string; } | { children: string; className: string; type: string; illegalProperty: string; } | { children: string; className: string; type: string; illegalProperty: string; }' is not assignable to type 'DetailedHTMLProps, HTMLButtonElement>'. + Type '{ children: string; className: string; type: string; illegalProperty: string; }' is not assignable to type 'DetailedHTMLProps, HTMLButtonElement>'. + Type '{ children: string; className: string; type: string; illegalProperty: string; }' is not assignable to type 'ButtonHTMLAttributes'. + Types of property 'type' are incompatible. + Type 'string' is not assignable to type '\\"button\\" | \\"submit\\" | \\"reset\\" | undefined'. +src/05-generics/36-type-helpers-with-constraints.problem.tsx(14,3): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/36-type-helpers-with-constraints.problem.tsx(16,3): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/36-type-helpers-with-constraints.problem.tsx(18,3): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/37-generic-localstorage-hook.problem.ts(28,30): error TS2558: Expected 0 type arguments, but got 1. +src/05-generics/37-generic-localstorage-hook.problem.ts(35,24): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/37-generic-localstorage-hook.problem.ts(41,5): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/38-generic-hooks.problem.ts(23,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/38-generic-hooks.problem.ts(25,5): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/38-generic-hooks.problem.ts(35,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/38-generic-hooks.problem.ts(36,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/39-generic-props.problem.tsx(41,30): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/39-generic-props.problem.tsx(45,17): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/40-generic-class-components.problem.tsx(37,30): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/40-generic-class-components.problem.tsx(41,17): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/41-passing-types-to-components.problem.tsx(29,5): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/41-passing-types-to-components.problem.tsx(32,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/41-passing-types-to-components.problem.tsx(33,23): error TS2339: Property 'name' does not exist on type 'number'. +src/05-generics/41-passing-types-to-components.problem.tsx(44,9): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/41-passing-types-to-components.problem.tsx(51,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/42-generic-inference-through-multiple-helpers.problem.tsx(44,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/42-passing-types-to-components.problem.tsx(35,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/42-passing-types-to-components.problem.tsx(36,23): error TS2339: Property 'name' does not exist on type 'number'. +src/05-generics/42-passing-types-to-components.problem.tsx(47,9): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/42-passing-types-to-components.problem.tsx(54,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/05-generics/43-inference-flow-with-constraints.problem.ts(42,1): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/43-inference-flow-with-constraints.problem.ts(52,5): error TS2578: Unused '@ts-expect-error' directive. +src/05-generics/43-inference-flow-with-constraints.problem.ts(60,5): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/45-tuple-return-type.problem.ts(23,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/45-tuple-return-type.problem.ts(24,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/46-required-context.problem.tsx(33,55): error TS2558: Expected 0 type arguments, but got 1. +src/06-advanced-hooks/46-required-context.problem.tsx(37,57): error TS2558: Expected 0 type arguments, but got 1. +src/06-advanced-hooks/46-required-context.problem.tsx(42,16): error TS2554: Expected 1 arguments, but got 0. +src/06-advanced-hooks/46-required-context.problem.tsx(45,5): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/46-required-context.problem.tsx(53,17): error TS2554: Expected 1 arguments, but got 0. +src/06-advanced-hooks/46-required-context.problem.tsx(56,5): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/46-required-context.problem.tsx(70,21): error TS2322: Type '{ name: string; }' is not assignable to type 'null'. +src/06-advanced-hooks/46-required-context.problem.tsx(72,11): error TS2322: Type '{ primaryColor: string; }' is not assignable to type 'null'. +src/06-advanced-hooks/47-unions-in-usestate.problem.tsx(45,3): error TS2578: Unused '@ts-expect-error' directive. +src/06-advanced-hooks/47-unions-in-usestate.problem.tsx(62,22): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/48-discriminated-unions-in-usestate.problem.tsx(28,37): error TS2345: Argument of type '{ status: string; error: any; }' is not assignable to parameter of type 'SetStateAction<{ status: string; }>'. + Object literal may only specify known properties, and 'error' does not exist in type 'SetStateAction<{ status: string; }>'. +src/06-advanced-hooks/48-discriminated-unions-in-usestate.problem.tsx(36,3): error TS2578: Unused '@ts-expect-error' directive. +src/06-advanced-hooks/48-discriminated-unions-in-usestate.problem.tsx(46,25): error TS2339: Property 'error' does not exist on type '{ status: string; }'. +src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx(46,25): error TS18048: 'value' is possibly 'undefined'. +src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx(46,31): error TS2339: Property 'message' does not exist on type 'Error | { title: string; }'. + Property 'message' does not exist on type '{ title: string; }'. +src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx(49,16): error TS18048: 'value' is possibly 'undefined'. +src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx(49,22): error TS2339: Property 'title' does not exist on type 'Error | { title: string; }'. + Property 'title' does not exist on type 'Error'. +src/06-advanced-hooks/50-use-state-overloads.problem.ts(36,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/51-function-overloads-in-hooks.problem.ts(37,22): error TS2554: Expected 1 arguments, but got 0. +src/06-advanced-hooks/51-function-overloads-in-hooks.problem.ts(40,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/51-function-overloads-in-hooks.problem.ts(42,5): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/06-advanced-hooks/52-currying-hooks.problem.ts(38,22): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/07-types-deep-dive/54-understanding-jsx-element.explainer.tsx(52,3): error TS2322: Type 'string' is not assignable to type 'ReactElement>'. +src/07-types-deep-dive/55-strongly-typing-children.explainer.tsx(32,3): error TS2322: Type 'Element' is not assignable to type 'OptionType'. + Type 'ReactElement' is not assignable to type '{ __brand: \\"OPTION_TYPE\\"; } & ReactPortal'. + Property '__brand' is missing in type 'ReactElement' but required in type '{ __brand: \\"OPTION_TYPE\\"; }'. +src/07-types-deep-dive/56-understanding-jsx-intrinsic-elements.explainer.tsx(30,1): error TS2339: Property 'myNewElement' does not exist on type 'JSX.IntrinsicElements'. +src/07-types-deep-dive/58-appending-to-global-namespace.problem.ts(15,20): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/07-types-deep-dive/58-appending-to-global-namespace.problem.ts(15,32): error TS2694: Namespace 'React' has no exported member 'MyInterface'. +src/07-types-deep-dive/59-declaration-merging-in-global-namespace.problem.ts(25,3): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/07-types-deep-dive/60-add-new-global-element.problem.tsx(14,3): error TS2339: Property 'something' does not exist on type 'JSX.IntrinsicElements'. +src/07-types-deep-dive/60-add-new-global-element.problem.tsx(14,23): error TS2339: Property 'something' does not exist on type 'JSX.IntrinsicElements'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(10,8): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLDivElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLDivElement>'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(11,10): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLAudioElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLAudioElement>'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(12,10): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLVideoElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLVideoElement>'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(13,6): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLAnchorElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLAnchorElement>'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(14,9): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLElement>'. +src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx(15,12): error TS2322: Type '{ testId: string; }' is not assignable to type 'DetailedHTMLProps, HTMLElement>'. + Property 'testId' does not exist on type 'DetailedHTMLProps, HTMLElement>'. +src/08-advanced-patterns/63-lazy-load-component.problem.tsx(18,44): error TS2345: Argument of type 'unknown' is not assignable to parameter of type '() => Promise<{ default: ComponentType; }>'. +src/08-advanced-patterns/63-lazy-load-component.problem.tsx(28,62): error TS2322: Type '{ loader: () => Promise; id: string; }' is not assignable to type 'IntrinsicAttributes & Props'. + Property 'id' does not exist on type 'IntrinsicAttributes & Props'. +src/08-advanced-patterns/63-lazy-load-component.problem.tsx(36,4): error TS2578: Unused '@ts-expect-error' directive. +src/08-advanced-patterns/65-render-props.problem.tsx(43,9): error TS7006: Parameter 'props' implicitly has an 'any' type. +src/08-advanced-patterns/65-render-props.problem.tsx(44,28): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/66-forward-ref-with-generics.explainer.1.tsx(45,28): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/66-forward-ref-with-generics.explainer.2.tsx(26,28): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/66-forward-ref-with-generics.explainer.3.ts(52,21): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/67-forward-ref-as-local-function.problem.tsx(30,19): error TS7006: Parameter 'row' implicitly has an 'any' type. +src/08-advanced-patterns/67-forward-ref-as-local-function.problem.tsx(31,28): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/68-hoc.problem.tsx(43,5): error TS2578: Unused '@ts-expect-error' directive. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(16,10): error TS7006: Parameter 'props' implicitly has an 'any' type. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(19,12): error TS7006: Parameter 'props' implicitly has an 'any' type. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(22,14): error TS7006: Parameter 'props' implicitly has an 'any' type. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(28,21): error TS7053: Element implicitly has an 'any' type because expression of type 'any' can't be used to index type '{ text: (props: any) => Element; number: (props: any) => Element; password: (props: any) => Element; }'. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(28,32): error TS18046: 'props' is of type 'unknown'. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(29,25): error TS2698: Spread types may only be created from object types. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(34,5): error TS2322: Type '{ type: string; onChange: (e: any) => void; }' is not assignable to type 'IntrinsicAttributes'. + Property 'type' does not exist on type 'IntrinsicAttributes'. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(35,16): error TS7006: Parameter 'e' implicitly has an 'any' type. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(37,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(40,10): error TS2322: Type '{ type: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'type' does not exist on type 'IntrinsicAttributes'. +src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx(41,10): error TS2322: Type '{ type: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'type' does not exist on type 'IntrinsicAttributes'. +src/08-advanced-patterns/70-as-prop.problem.tsx(37,5): error TS2578: Unused '@ts-expect-error' directive. +src/08-advanced-patterns/71-as-prop-with-custom-components.problem.tsx(14,11): error TS2604: JSX element type 'Comp' does not have any construct or call signatures. +src/08-advanced-patterns/71-as-prop-with-custom-components.problem.tsx(14,11): error TS2786: 'Comp' cannot be used as a JSX component. + Its type 'unknown' is not a valid JSX element type. +src/08-advanced-patterns/71-as-prop-with-custom-components.problem.tsx(21,20): error TS2322: Type '{ as: (props: { href: string; children?: ReactNode; }) => Element; href: string; }' is not assignable to type 'IntrinsicAttributes & { as: unknown; }'. + Property 'href' does not exist on type 'IntrinsicAttributes & { as: unknown; }'. +src/08-advanced-patterns/72-as-prop-with-default.problem.tsx(10,11): error TS2322: Type 'Omit<{ as: T; } & ComponentPropsWithoutRef, \\"as\\">' is not assignable to type 'IntrinsicAttributes & LibraryManagedAttributes'. + Type 'Omit<{ as: T; } & ComponentPropsWithoutRef, \\"as\\">' is not assignable to type 'LibraryManagedAttributes'. +src/08-advanced-patterns/72-as-prop-with-default.problem.tsx(14,2): error TS2741: Property 'as' is missing in type '{ href: string; }' but required in type '{ as: ElementType; }'. +src/09-external-libraries/74-react-hook-form-wrapper.problem.tsx(29,3): error TS2578: Unused '@ts-expect-error' directive. +src/09-external-libraries/74-react-hook-form-wrapper.problem.tsx(42,5): error TS2344: Type 'boolean' does not satisfy the constraint 'true'. +src/09-external-libraries/75-react-select.problem.tsx(10,24): error TS7006: Parameter 'props' implicitly has an 'any' type. +src/09-external-libraries/75-react-select.problem.tsx(33,16): error TS7006: Parameter 'option' implicitly has an 'any' type. +src/09-external-libraries/75-react-select.problem.tsx(36,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/09-external-libraries/75-react-select.problem.tsx(43,16): error TS7006: Parameter 'option' implicitly has an 'any' type. +src/09-external-libraries/75-react-select.problem.tsx(45,26): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/09-external-libraries/77-react-query-wrapper.problem.ts(30,12): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/09-external-libraries/77-react-query-wrapper.problem.ts(44,10): error TS2344: Type 'false' does not satisfy the constraint 'true'. +src/09-external-libraries/77-react-query-wrapper.problem.ts(50,22): error TS2344: Type 'false' does not satisfy the constraint 'true'. +," +`; + +exports[`vitest > Should have the correct Vitest errors 1`] = ` +{ + "success": false, + "testResults": [ + { + "assertionResults": [], + "message": "No test found in suite src/01-introduction/01-react-in-typescript.explainer.tsx", + "name": "/src/01-introduction/01-react-in-typescript.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/01-introduction/02-typescript-in-react-frameworks.explainer.ts", + "name": "/src/01-introduction/02-typescript-in-react-frameworks.explainer.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Transform failed with 1 error: +/src/01-introduction/03-navigating-jsx-types.problem.tsx:5:21: ERROR: Unexpected \\"}\\"", + "name": "/src/01-introduction/03-navigating-jsx-types.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/01-introduction/03-navigating-jsx-types.solution.tsx", + "name": "/src/01-introduction/03-navigating-jsx-types.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/04-typing-components.problem.tsx", + "name": "/src/02-components/04-typing-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/04-typing-components.solution.1.tsx", + "name": "/src/02-components/04-typing-components.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/04-typing-components.solution.2.tsx", + "name": "/src/02-components/04-typing-components.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/04-typing-components.solution.3.tsx", + "name": "/src/02-components/04-typing-components.solution.3.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/04-typing-components.solution.4.tsx", + "name": "/src/02-components/04-typing-components.solution.4.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/05-typing-components-as-functions.problem.tsx", + "name": "/src/02-components/05-typing-components-as-functions.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/05-typing-components-as-functions.solution.tsx", + "name": "/src/02-components/05-typing-components-as-functions.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/06-typing-children.problem.tsx", + "name": "/src/02-components/06-typing-children.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/06-typing-children.solution.tsx", + "name": "/src/02-components/06-typing-children.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/07-typing-onclick-handlers.problem.tsx", + "name": "/src/02-components/07-typing-onclick-handlers.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/07-typing-onclick-handlers.solution.tsx", + "name": "/src/02-components/07-typing-onclick-handlers.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/08-using-html-props.problem.tsx", + "name": "/src/02-components/08-using-html-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/08-using-html-props.solution.1.tsx", + "name": "/src/02-components/08-using-html-props.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/08-using-html-props.solution.2.tsx", + "name": "/src/02-components/08-using-html-props.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/09-html-props-with-one-changed.problem.tsx", + "name": "/src/02-components/09-html-props-with-one-changed.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/09-html-props-with-one-changed.solution.1.tsx", + "name": "/src/02-components/09-html-props-with-one-changed.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/09-html-props-with-one-changed.solution.2.tsx", + "name": "/src/02-components/09-html-props-with-one-changed.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/09-html-props-with-one-changed.solution.3.tsx", + "name": "/src/02-components/09-html-props-with-one-changed.solution.3.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/09-html-props-with-one-changed.solution.4.tsx", + "name": "/src/02-components/09-html-props-with-one-changed.solution.4.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/10-extracting-props-from-custom-components.problem.tsx", + "name": "/src/02-components/10-extracting-props-from-custom-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/02-components/10-extracting-props-from-custom-components.solution.tsx", + "name": "/src/02-components/10-extracting-props-from-custom-components.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/11-use-state.problem.tsx", + "name": "/src/03-hooks/11-use-state.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/11-use-state.solution.tsx", + "name": "/src/03-hooks/11-use-state.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/12-use-state-with-undefined.problem.ts", + "name": "/src/03-hooks/12-use-state-with-undefined.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/12-use-state-with-undefined.solution.1.ts", + "name": "/src/03-hooks/12-use-state-with-undefined.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/12-use-state-with-undefined.solution.2.ts", + "name": "/src/03-hooks/12-use-state-with-undefined.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/13-use-state-excess-properties.problem.tsx", + "name": "/src/03-hooks/13-use-state-excess-properties.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/13-use-state-excess-properties.solution.tsx", + "name": "/src/03-hooks/13-use-state-excess-properties.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/14-use-effect.problem.ts", + "name": "/src/03-hooks/14-use-effect.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/14-use-effect.solution.ts", + "name": "/src/03-hooks/14-use-effect.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/15-use-callback.problem.tsx", + "name": "/src/03-hooks/15-use-callback.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/15-use-callback.solution.tsx", + "name": "/src/03-hooks/15-use-callback.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/16-use-memo.problem.tsx", + "name": "/src/03-hooks/16-use-memo.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/16-use-memo.solution.1.tsx", + "name": "/src/03-hooks/16-use-memo.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/16-use-memo.solution.2.tsx", + "name": "/src/03-hooks/16-use-memo.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/16-use-memo.solution.3.tsx", + "name": "/src/03-hooks/16-use-memo.solution.3.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/17-use-ref-basics.problem.tsx", + "name": "/src/03-hooks/17-use-ref-basics.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/17-use-ref-basics.solution.tsx", + "name": "/src/03-hooks/17-use-ref-basics.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/18-element-refs.explainer.tsx", + "name": "/src/03-hooks/18-element-refs.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/19-use-ref-with-elements.problem.tsx", + "name": "/src/03-hooks/19-use-ref-with-elements.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/19-use-ref-with-elements.solution.tsx", + "name": "/src/03-hooks/19-use-ref-with-elements.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/20-why-is-my-ref-readonly.problem.tsx", + "name": "/src/03-hooks/20-why-is-my-ref-readonly.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/03-hooks/20-why-is-my-ref-readonly.solution.tsx", + "name": "/src/03-hooks/20-why-is-my-ref-readonly.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useReducer')", + "name": "/src/03-hooks/21-use-reducer.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useReducer')", + "name": "/src/03-hooks/21-use-reducer.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useReducer')", + "name": "/src/03-hooks/21-use-reducer.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useReducer')", + "name": "/src/03-hooks/21-use-reducer.solution.3.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/22-discriminated-union-props.problem.tsx", + "name": "/src/04-advanced-props/22-discriminated-union-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/22-discriminated-union-props.solution.tsx", + "name": "/src/04-advanced-props/22-discriminated-union-props.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/23-destructuring-discriminated-unions.problem.tsx", + "name": "/src/04-advanced-props/23-destructuring-discriminated-unions.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/23-destructuring-discriminated-unions.solution.1.tsx", + "name": "/src/04-advanced-props/23-destructuring-discriminated-unions.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/23-destructuring-discriminated-unions.solution.2.tsx", + "name": "/src/04-advanced-props/23-destructuring-discriminated-unions.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx", + "name": "/src/04-advanced-props/24-discriminated-union-with-other-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/24-discriminated-union-with-other-props.solution.tsx", + "name": "/src/04-advanced-props/24-discriminated-union-with-other-props.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/25-toggle-props.problem.tsx", + "name": "/src/04-advanced-props/25-toggle-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/25-toggle-props.solution.tsx", + "name": "/src/04-advanced-props/25-toggle-props.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/26-empty-object-type.explainer.tsx", + "name": "/src/04-advanced-props/26-empty-object-type.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/27-either-all-these-props-or-none.problem.tsx", + "name": "/src/04-advanced-props/27-either-all-these-props-or-none.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/27-either-all-these-props-or-none.solution.tsx", + "name": "/src/04-advanced-props/27-either-all-these-props-or-none.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx", + "name": "/src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.solution.1.tsx", + "name": "/src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.solution.2.tsx", + "name": "/src/04-advanced-props/28-passing-react-components-vs-passing-react-nodes.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/29-variants-with-classnames.problem.tsx", + "name": "/src/04-advanced-props/29-variants-with-classnames.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/29-variants-with-classnames.solution.tsx", + "name": "/src/04-advanced-props/29-variants-with-classnames.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/30-partial-autocomplete.problem.tsx", + "name": "/src/04-advanced-props/30-partial-autocomplete.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/30-partial-autocomplete.solution.tsx", + "name": "/src/04-advanced-props/30-partial-autocomplete.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/31-as-const.problem.ts", + "name": "/src/04-advanced-props/31-as-const.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/31-as-const.solution.ts", + "name": "/src/04-advanced-props/31-as-const.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/32-satisfies-vs-annotation-vs-as.problem.tsx", + "name": "/src/04-advanced-props/32-satisfies-vs-annotation-vs-as.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/32-satisfies-vs-annotation-vs-as.solution.tsx", + "name": "/src/04-advanced-props/32-satisfies-vs-annotation-vs-as.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/33-prop-groups-with-variants.problem.tsx", + "name": "/src/04-advanced-props/33-prop-groups-with-variants.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/04-advanced-props/33-prop-groups-with-variants.solution.tsx", + "name": "/src/04-advanced-props/33-prop-groups-with-variants.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/34-type-helpers.problem.tsx", + "name": "/src/05-generics/34-type-helpers.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/34-type-helpers.solution.tsx", + "name": "/src/05-generics/34-type-helpers.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/35-type-helpers-2.problem.tsx", + "name": "/src/05-generics/35-type-helpers-2.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/35-type-helpers-2.solution.tsx", + "name": "/src/05-generics/35-type-helpers-2.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/36-type-helpers-with-constraints.problem.tsx", + "name": "/src/05-generics/36-type-helpers-with-constraints.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/36-type-helpers-with-constraints.solution.1.tsx", + "name": "/src/05-generics/36-type-helpers-with-constraints.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/36-type-helpers-with-constraints.solution.2.tsx", + "name": "/src/05-generics/36-type-helpers-with-constraints.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [ + { + "ancestorTitles": [ + "", + ], + "failureMessages": [], + "fullName": " Should let you set and get values", + "status": "passed", + "title": "Should let you set and get values", + }, + { + "ancestorTitles": [ + "", + ], + "failureMessages": [], + "fullName": " Should not let you set a value that is not the same type as the type argument passed", + "status": "passed", + "title": "Should not let you set a value that is not the same type as the type argument passed", + }, + ], + "message": "", + "name": "/src/05-generics/37-generic-localstorage-hook.problem.ts", + "status": "passed", + }, + { + "assertionResults": [ + { + "ancestorTitles": [ + "", + ], + "failureMessages": [], + "fullName": " Should let you set and get values", + "status": "passed", + "title": "Should let you set and get values", + }, + { + "ancestorTitles": [ + "", + ], + "failureMessages": [], + "fullName": " Should not let you set a value that is not the same type as the type argument passed", + "status": "passed", + "title": "Should not let you set a value that is not the same type as the type argument passed", + }, + ], + "message": "", + "name": "/src/05-generics/37-generic-localstorage-hook.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.solution.3.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.solution.4.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/38-generic-hooks.solution.5.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/39-generic-props.problem.tsx", + "name": "/src/05-generics/39-generic-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/39-generic-props.solution.tsx", + "name": "/src/05-generics/39-generic-props.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "React is not defined", + "name": "/src/05-generics/40-generic-class-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "React is not defined", + "name": "/src/05-generics/40-generic-class-components.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/41-passing-types-to-components.problem.tsx", + "name": "/src/05-generics/41-passing-types-to-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/41-passing-types-to-components.solution.tsx", + "name": "/src/05-generics/41-passing-types-to-components.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/42-generic-inference-through-multiple-helpers.problem.tsx", + "name": "/src/05-generics/42-generic-inference-through-multiple-helpers.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/42-generic-inference-through-multiple-helpers.solution.tsx", + "name": "/src/05-generics/42-generic-inference-through-multiple-helpers.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/42-passing-types-to-components.problem.tsx", + "name": "/src/05-generics/42-passing-types-to-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/43-inference-flow-with-constraints.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/05-generics/43-inference-flow-with-constraints.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/44-generics-vs-discriminated-unions.problem.tsx", + "name": "/src/05-generics/44-generics-vs-discriminated-unions.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/05-generics/44-generics-vs-discriminated-unions.solution.tsx", + "name": "/src/05-generics/44-generics-vs-discriminated-unions.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/45-tuple-return-type.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/45-tuple-return-type.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/45-tuple-return-type.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/46-required-context.problem.tsx", + "name": "/src/06-advanced-hooks/46-required-context.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/46-required-context.solution.1.tsx", + "name": "/src/06-advanced-hooks/46-required-context.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/46-required-context.solution.2.tsx", + "name": "/src/06-advanced-hooks/46-required-context.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/47-unions-in-usestate.problem.tsx", + "name": "/src/06-advanced-hooks/47-unions-in-usestate.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/47-unions-in-usestate.solution.tsx", + "name": "/src/06-advanced-hooks/47-unions-in-usestate.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/48-discriminated-unions-in-usestate.problem.tsx", + "name": "/src/06-advanced-hooks/48-discriminated-unions-in-usestate.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/48-discriminated-unions-in-usestate.solution.tsx", + "name": "/src/06-advanced-hooks/48-discriminated-unions-in-usestate.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx", + "name": "/src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.solution.tsx", + "name": "/src/06-advanced-hooks/49-discriminated-tuples-from-custom-hooks.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/50-use-state-overloads.problem.ts", + "name": "/src/06-advanced-hooks/50-use-state-overloads.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/50-use-state-overloads.solution.1.ts", + "name": "/src/06-advanced-hooks/50-use-state-overloads.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/50-use-state-overloads.solution.2.ts", + "name": "/src/06-advanced-hooks/50-use-state-overloads.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/51-function-overloads-in-hooks.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/51-function-overloads-in-hooks.solution.1.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useState')", + "name": "/src/06-advanced-hooks/51-function-overloads-in-hooks.solution.2.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/52-currying-hooks.problem.ts", + "name": "/src/06-advanced-hooks/52-currying-hooks.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/06-advanced-hooks/52-currying-hooks.solution.ts", + "name": "/src/06-advanced-hooks/52-currying-hooks.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "React is not defined", + "name": "/src/07-types-deep-dive/53-understand-react-namespace-export.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "React is not defined", + "name": "/src/07-types-deep-dive/53-understand-react-namespace-export.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/54-understanding-jsx-element.explainer.tsx", + "name": "/src/07-types-deep-dive/54-understanding-jsx-element.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/55-strongly-typing-children.explainer.tsx", + "name": "/src/07-types-deep-dive/55-strongly-typing-children.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/56-understanding-jsx-intrinsic-elements.explainer.tsx", + "name": "/src/07-types-deep-dive/56-understanding-jsx-intrinsic-elements.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "React is not defined", + "name": "/src/07-types-deep-dive/57-react-component-type.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/58-appending-to-global-namespace.problem.ts", + "name": "/src/07-types-deep-dive/58-appending-to-global-namespace.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/58-appending-to-global-namespace.solution.ts", + "name": "/src/07-types-deep-dive/58-appending-to-global-namespace.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/59-declaration-merging-in-global-namespace.problem.ts", + "name": "/src/07-types-deep-dive/59-declaration-merging-in-global-namespace.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/59-declaration-merging-in-global-namespace.solution.ts", + "name": "/src/07-types-deep-dive/59-declaration-merging-in-global-namespace.solution.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/60-add-new-global-element.problem.tsx", + "name": "/src/07-types-deep-dive/60-add-new-global-element.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/60-add-new-global-element.solution.tsx", + "name": "/src/07-types-deep-dive/60-add-new-global-element.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/61-html-attributes.explainer.tsx", + "name": "/src/07-types-deep-dive/61-html-attributes.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx", + "name": "/src/07-types-deep-dive/62-add-attribute-to-all-elements.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/07-types-deep-dive/62-add-attribute-to-all-elements.solution.tsx", + "name": "/src/07-types-deep-dive/62-add-attribute-to-all-elements.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/63-lazy-load-component.problem.tsx", + "name": "/src/08-advanced-patterns/63-lazy-load-component.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/63-lazy-load-component.solution.tsx", + "name": "/src/08-advanced-patterns/63-lazy-load-component.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/64-const-generics-in-generic-components.problem.tsx", + "name": "/src/08-advanced-patterns/64-const-generics-in-generic-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/65-render-props.problem.tsx", + "name": "/src/08-advanced-patterns/65-render-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/65-render-props.solution.tsx", + "name": "/src/08-advanced-patterns/65-render-props.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/66-forward-ref-with-generics.explainer.1.tsx", + "name": "/src/08-advanced-patterns/66-forward-ref-with-generics.explainer.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/66-forward-ref-with-generics.explainer.2.tsx", + "name": "/src/08-advanced-patterns/66-forward-ref-with-generics.explainer.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/66-forward-ref-with-generics.explainer.3.ts", + "name": "/src/08-advanced-patterns/66-forward-ref-with-generics.explainer.3.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/67-forward-ref-as-local-function.problem.tsx", + "name": "/src/08-advanced-patterns/67-forward-ref-as-local-function.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/67-forward-ref-as-local-function.solution.tsx", + "name": "/src/08-advanced-patterns/67-forward-ref-as-local-function.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/68-hoc.problem.tsx", + "name": "/src/08-advanced-patterns/68-hoc.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/68-hoc.solution.tsx", + "name": "/src/08-advanced-patterns/68-hoc.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx", + "name": "/src/08-advanced-patterns/69-record-of-components-with-same-props.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/69-record-of-components-with-same-props.solution.1.tsx", + "name": "/src/08-advanced-patterns/69-record-of-components-with-same-props.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/69-record-of-components-with-same-props.solution.2.tsx", + "name": "/src/08-advanced-patterns/69-record-of-components-with-same-props.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/70-as-prop.problem.tsx", + "name": "/src/08-advanced-patterns/70-as-prop.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/70-as-prop.solution.1.tsx", + "name": "/src/08-advanced-patterns/70-as-prop.solution.1.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/70-as-prop.solution.2.tsx", + "name": "/src/08-advanced-patterns/70-as-prop.solution.2.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/71-as-prop-with-custom-components.problem.tsx", + "name": "/src/08-advanced-patterns/71-as-prop-with-custom-components.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/71-as-prop-with-custom-components.solution.tsx", + "name": "/src/08-advanced-patterns/71-as-prop-with-custom-components.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/72-as-prop-with-default.problem.tsx", + "name": "/src/08-advanced-patterns/72-as-prop-with-default.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/08-advanced-patterns/72-as-prop-with-default.solution.tsx", + "name": "/src/08-advanced-patterns/72-as-prop-with-default.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useRef')", + "name": "/src/09-external-libraries/73-react-hook-form.explainer.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useRef')", + "name": "/src/09-external-libraries/74-react-hook-form-wrapper.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useRef')", + "name": "/src/09-external-libraries/74-react-hook-form-wrapper.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/09-external-libraries/75-react-select.problem.tsx", + "name": "/src/09-external-libraries/75-react-select.problem.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "No test found in suite src/09-external-libraries/75-react-select.solution.tsx", + "name": "/src/09-external-libraries/75-react-select.solution.tsx", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useContext')", + "name": "/src/09-external-libraries/76-react-query.explainer.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useContext')", + "name": "/src/09-external-libraries/77-react-query-wrapper.problem.ts", + "status": "passed", + }, + { + "assertionResults": [], + "message": "Cannot read properties of null (reading 'useContext')", + "name": "/src/09-external-libraries/77-react-query-wrapper.solution.ts", + "status": "passed", + }, + ], +} +`; diff --git a/scripts/tests/all.test.ts b/scripts/tests/all.test.ts new file mode 100644 index 0000000..fe5ea8d --- /dev/null +++ b/scripts/tests/all.test.ts @@ -0,0 +1,51 @@ +import path from "path"; +import { describe, expect, it } from "vitest"; +import { execSync } from "child_process"; +import { cleanVitestOutput } from "./cleanVitestOutput"; + +const rootFolder = path.resolve(__dirname, "../.."); + +const sanitizeForRegex = (str: string) => { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string +}; + +describe("tsc", async () => { + it("Should have the correct TypeScript errors", () => { + let result: string; + + try { + result = execSync(`npx tsc`, { + cwd: rootFolder, + }).toString(); + } catch (error) { + result = error.output.toString(); + } + + result = result.replace(new RegExp(sanitizeForRegex(rootFolder), "g"), ""); + + expect(result).toMatchSnapshot(); + }); +}); + +describe("vitest", async () => { + it("Should have the correct Vitest errors", () => { + let result: string; + + try { + result = execSync(`npx vitest run --reporter=json`, { + cwd: rootFolder, + stdio: "pipe", + }).toString(); + } catch (error) { + result = error.output.toString(); + } + + result = result.replace(new RegExp(sanitizeForRegex(rootFolder), "g"), ""); + + expect( + cleanVitestOutput(result, { + rootFolder, + }), + ).toMatchSnapshot(); + }); +}); diff --git a/scripts/tests/cleanVitestOutput.ts b/scripts/tests/cleanVitestOutput.ts new file mode 100644 index 0000000..81efa6b --- /dev/null +++ b/scripts/tests/cleanVitestOutput.ts @@ -0,0 +1,61 @@ +import path from "path"; + +export const cleanVitestOutput = ( + result: string, + context: { + rootFolder: string; + }, +) => { + const asJson: { + startTime?: number; + endTime?: number; + duration?: number; + numFailedTestSuites?: number; + numFailedTests?: number; + numPassedTestSuites?: number; + numPassedTests?: number; + numPendingTestSuites?: number; + numPendingTests?: number; + numTodoTests?: number; + numTotalTestSuites?: number; + numTotalTests?: number; + testResults: { + name: string; + startTime?: number; + endTime?: number; + duration?: number; + assertionResults: { + duration?: number; + }[]; + }[]; + } = JSON.parse(result.slice(1, -1)); + + delete asJson.startTime; + delete asJson.endTime; + delete asJson.duration; + delete asJson.numFailedTestSuites; + delete asJson.numFailedTests; + delete asJson.numPassedTestSuites; + delete asJson.numPassedTests; + delete asJson.numPendingTestSuites; + delete asJson.numPendingTests; + delete asJson.numTodoTests; + delete asJson.numTotalTestSuites; + delete asJson.numTotalTests; + + asJson.testResults.forEach((testResult) => { + delete testResult.startTime; + delete testResult.endTime; + delete testResult.duration; + + // testResult.name = path.relative(context.rootFolder, testResult.name); + + testResult.assertionResults.forEach((assertionResult) => { + delete assertionResult.duration; + }); + }); + + asJson.testResults.sort((a, b) => a.name.localeCompare(b.name)); + + return asJson; +}; diff --git a/scripts/tests/vite.config.ts b/scripts/tests/vite.config.ts new file mode 100644 index 0000000..8fb6f2d --- /dev/null +++ b/scripts/tests/vite.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({}); diff --git a/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/example.ts b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/index.html b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/index.html new file mode 100644 index 0000000..39cdd4e --- /dev/null +++ b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.problem/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/example.js b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/example.js new file mode 100644 index 0000000..85f0f81 --- /dev/null +++ b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/example.js @@ -0,0 +1,5 @@ +const run = (message) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/index.html b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/index.html new file mode 100644 index 0000000..f51d0df --- /dev/null +++ b/src/010-typescript-in-the-build-process/010-typescript-in-the-browser.solution/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/example.ts b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/index.html b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/index.html new file mode 100644 index 0000000..39cdd4e --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.problem/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/.gitignore b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/.gitignore new file mode 100644 index 0000000..4c43fe6 --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/.gitignore @@ -0,0 +1 @@ +*.js \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/example.ts b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/index.html b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/index.html new file mode 100644 index 0000000..f51d0df --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/tsconfig.json b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/tsconfig.json new file mode 100644 index 0000000..75dcaea --- /dev/null +++ b/src/010-typescript-in-the-build-process/011-compile-typescript-to-javascript.solution/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/.gitignore b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/.gitignore new file mode 100644 index 0000000..4c43fe6 --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/.gitignore @@ -0,0 +1 @@ +*.js \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/example.ts b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/index.html b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/index.html new file mode 100644 index 0000000..f51d0df --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/tsconfig.json b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/tsconfig.json new file mode 100644 index 0000000..68a773d --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.problem/tsconfig.json @@ -0,0 +1,95 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/.gitignore b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/.gitignore new file mode 100644 index 0000000..4c43fe6 --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/.gitignore @@ -0,0 +1 @@ +*.js \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/example.ts b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/index.html b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/index.html new file mode 100644 index 0000000..f51d0df --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/tsconfig.json b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/tsconfig.json new file mode 100644 index 0000000..68a773d --- /dev/null +++ b/src/010-typescript-in-the-build-process/012-tsc-watch-mode.solution/tsconfig.json @@ -0,0 +1,95 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/.gitignore b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/.gitignore new file mode 100644 index 0000000..4c43fe6 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/.gitignore @@ -0,0 +1 @@ +*.js \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/example.ts b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/index.html b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/index.html new file mode 100644 index 0000000..f51d0df --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/tsconfig.json b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/tsconfig.json new file mode 100644 index 0000000..68a773d --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.problem/tsconfig.json @@ -0,0 +1,95 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/.gitignore b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/.gitignore new file mode 100644 index 0000000..53c37a1 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/.gitignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/example.ts b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/index.html b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/index.html new file mode 100644 index 0000000..7202bf0 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/index.html @@ -0,0 +1,11 @@ + + + + + + My App + + + + + diff --git a/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/tsconfig.json b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/tsconfig.json new file mode 100644 index 0000000..0bb8d58 --- /dev/null +++ b/src/010-typescript-in-the-build-process/013-compiling-to-a-directory.solution/tsconfig.json @@ -0,0 +1,95 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/.gitignore b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/.gitignore new file mode 100644 index 0000000..53c37a1 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/.gitignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/example.ts b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/example.ts new file mode 100644 index 0000000..09e34e9 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/example.ts @@ -0,0 +1,5 @@ +const run = (message: string) => { + console.log(message); +}; + +run("Hello!"); diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/index.html b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/index.html new file mode 100644 index 0000000..889a61f --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/index.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/tsconfig.json b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/tsconfig.json new file mode 100644 index 0000000..0bb8d58 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.problem/tsconfig.json @@ -0,0 +1,95 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/.gitignore b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/index.html b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +

+ + + diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/package.json b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/package.json new file mode 100644 index 0000000..c9a6741 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/package.json @@ -0,0 +1,15 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/public/vite.svg b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/counter.ts b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/main.ts b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/style.css b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/typescript.svg b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/tsconfig.json b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/014-setting-up-a-frontend-app-with-vite.solution/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/.gitignore b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/index.html b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/package.json b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/package.json new file mode 100644 index 0000000..c9a6741 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/package.json @@ -0,0 +1,15 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/public/vite.svg b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/counter.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/main.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/style.css b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/typescript.svg b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/tsconfig.json b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.problem/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/.gitignore b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/index.html b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/package.json b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/package.json new file mode 100644 index 0000000..c9a6741 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/package.json @@ -0,0 +1,15 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/public/vite.svg b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/counter.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/main.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/style.css b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/typescript.svg b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/tsconfig.json b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/015-typescript-as-a-linter.solution/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.github/workflows/ci.yml b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.github/workflows/ci.yml new file mode 100644 index 0000000..b268647 --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +name: CI +on: + # Runs against all pushes + push: + branches: + - "**" + + # Runs against all pull requests + pull_request: + branches: + - "**" + +jobs: + ci: + # Runs on the latest version of Ubuntu, a linux distro + runs-on: ubuntu-latest + steps: + # Checks out the current branch using git checkout + - uses: actions/checkout@v3 + + # Sets up pnpm with version 7 + - uses: pnpm/action-setup@v2 + with: + version: 7 + + # Sets up node + - uses: actions/setup-node@v3 + with: + node-version: 16.x + # Sets up pnpm's cache + cache: "pnpm" + + # Install with frozen lockfile to ensure packages + # are not accidentally updated + - run: pnpm install --frozen-lockfile + + # Run the 'ci' script defined in package.json + - run: pnpm run ci diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.gitignore b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/index.html b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/package.json b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/package.json new file mode 100644 index 0000000..0c4b2ec --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/package.json @@ -0,0 +1,16 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "ci": "tsc", + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/public/vite.svg b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/counter.ts b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/main.ts b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/style.css b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/typescript.svg b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/tsconfig.json b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/016-typescript-on-ci.explainer/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/.gitignore b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/index.html b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/package.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/package.json new file mode 100644 index 0000000..0c4b2ec --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/package.json @@ -0,0 +1,16 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "ci": "tsc", + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/public/vite.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/counter.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/main.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/style.css b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/typescript.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/tsconfig.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.problem/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/.gitignore b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/index.html b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/package.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/package.json new file mode 100644 index 0000000..4fd9184 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/package.json @@ -0,0 +1,17 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "ci": "tsc", + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5", + "vite-plugin-checker": "^0.6.1" + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/pnpm-lock.yaml new file mode 100644 index 0000000..26be38e --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/pnpm-lock.yaml @@ -0,0 +1,803 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + vite-plugin-checker: ^0.6.1 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + vite-plugin-checker: 0.6.1_vxtpzrd3ijvkhh2fvnu2mlkwnm + +packages: + + /@babel/code-frame/7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: true + + /@babel/helper-validator-identifier/7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight/7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /fast-glob/3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fs-extra/11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.pick/4.4.0: + resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /tiny-invariant/1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /vite-plugin-checker/0.6.1_vxtpzrd3ijvkhh2fvnu2mlkwnm: + resolution: {integrity: sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==} + engines: {node: '>=14.16'} + peerDependencies: + eslint: '>=7' + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: '>=13' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: '>=1.3.9' + peerDependenciesMeta: + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + dependencies: + '@babel/code-frame': 7.22.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.5.3 + commander: 8.3.0 + fast-glob: 3.3.1 + fs-extra: 11.1.1 + lodash.debounce: 4.0.8 + lodash.pick: 4.4.0 + npm-run-path: 4.0.1 + semver: 7.5.4 + strip-ansi: 6.0.1 + tiny-invariant: 1.3.1 + typescript: 5.1.6 + vite: 4.4.9 + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-uri: 3.0.7 + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vscode-jsonrpc/6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + dev: true + + /vscode-languageclient/7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + dependencies: + minimatch: 3.1.2 + semver: 7.5.4 + vscode-languageserver-protocol: 3.16.0 + dev: true + + /vscode-languageserver-protocol/3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + dev: true + + /vscode-languageserver-textdocument/1.0.8: + resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} + dev: true + + /vscode-languageserver-types/3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + dev: true + + /vscode-languageserver/7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.16.0 + dev: true + + /vscode-uri/3.0.7: + resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/public/vite.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/counter.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/main.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/main.ts new file mode 100644 index 0000000..5c558cd --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/main.ts @@ -0,0 +1,26 @@ +import "./style.css"; +import typescriptLogo from "./typescript.svg"; +import viteLogo from "/vite.svg"; +import { setupCounter } from "./counter"; + +document.querySelector("#app")!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+`; + +let num: string = 123; + +setupCounter(document.querySelector("#counter")!); diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/style.css b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/typescript.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/tsconfig.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/vite.config.js b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/vite.config.js new file mode 100644 index 0000000..a7a1c70 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.1/vite.config.js @@ -0,0 +1,9 @@ +import checker from "vite-plugin-checker"; + +export default { + plugins: [ + checker({ + typescript: true, + }), + ], +}; diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/.gitignore b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/index.html b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/package.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/package.json new file mode 100644 index 0000000..78ebb22 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/package.json @@ -0,0 +1,19 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "ci": "tsc", + "dev": "run-p dev:*", + "dev:vite": "vite", + "dev:tsc": "tsc --watch", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5", + "npm-run-all": "^4.1.5" + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/pnpm-lock.yaml new file mode 100644 index 0000000..4902449 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/pnpm-lock.yaml @@ -0,0 +1,1039 @@ +lockfileVersion: 5.4 + +specifiers: + npm-run-all: ^4.1.5 + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + npm-run-all: 4.1.5 + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /array-buffer-byte-length/1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /arraybuffer.prototype.slice/1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-intrinsic/1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module/2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array/1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.4 + dev: true + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /regexp.prototype.flags/1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /resolve/1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /safe-array-concat/1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /semver/5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shell-quote/1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /spdx-correct/3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids/3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /string.prototype.padend/3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trim/1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /typed-array-buffer/1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length/1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset/1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array/1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/public/vite.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/counter.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/main.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/main.ts new file mode 100644 index 0000000..5c558cd --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/main.ts @@ -0,0 +1,26 @@ +import "./style.css"; +import typescriptLogo from "./typescript.svg"; +import viteLogo from "/vite.svg"; +import { setupCounter } from "./counter"; + +document.querySelector("#app")!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+`; + +let num: string = 123; + +setupCounter(document.querySelector("#counter")!); diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/style.css b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/typescript.svg b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/tsconfig.json b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/017-blocking-your-dev-server-with-typescript.solution.2/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/018-typescript-in-different-frameworks.explainer/explainer.ts b/src/010-typescript-in-the-build-process/018-typescript-in-different-frameworks.explainer/explainer.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/.gitignore b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/index.html b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/package.json b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/package.json new file mode 100644 index 0000000..0c4b2ec --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/package.json @@ -0,0 +1,16 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "ci": "tsc", + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/pnpm-lock.yaml new file mode 100644 index 0000000..9af6dfc --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/pnpm-lock.yaml @@ -0,0 +1,320 @@ +lockfileVersion: 5.4 + +specifiers: + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/public/vite.svg b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/counter.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/main.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/style.css b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/typescript.svg b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/tsconfig.json b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.problem/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/.gitignore b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/index.html b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/index.html new file mode 100644 index 0000000..f86e483 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/package.json b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/package.json new file mode 100644 index 0000000..8fcf5c0 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/package.json @@ -0,0 +1,18 @@ +{ + "name": "013-setting-up-a-frontend-app-with-vite.solution", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "do-something": "tsx scripts/doSomething.ts", + "ci": "tsc", + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "tsx": "^3.12.7", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/pnpm-lock.yaml b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/pnpm-lock.yaml new file mode 100644 index 0000000..507c4e2 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/pnpm-lock.yaml @@ -0,0 +1,608 @@ +lockfileVersion: 5.4 + +specifiers: + tsx: ^3.12.7 + typescript: ^5.0.2 + vite: ^4.4.5 + +devDependencies: + tsx: 3.12.7 + typescript: 5.1.6 + vite: 4.4.9 + +packages: + + /@esbuild-kit/cjs-loader/2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.7.0 + dev: true + + /@esbuild-kit/core-utils/3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.19 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader/2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.7.0 + dev: true + + /@esbuild/android-arm/0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm/0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /esbuild/0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + + /esbuild/0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /get-tsconfig/4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /resolve-pkg-maps/1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /rollup/3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /tsx/3.12.7: + resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /vite/4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/public/vite.svg b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/scripts/doSomething.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/scripts/doSomething.ts new file mode 100644 index 0000000..de9598d --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/scripts/doSomething.ts @@ -0,0 +1,5 @@ +console.log("The script is working!"); + +const [, , ...args] = process.argv; + +console.log(args); diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/counter.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/counter.ts new file mode 100644 index 0000000..09e5afd --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener('click', () => setCounter(counter + 1)) + setCounter(0) +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/main.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/main.ts new file mode 100644 index 0000000..791547b --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/main.ts @@ -0,0 +1,24 @@ +import './style.css' +import typescriptLogo from './typescript.svg' +import viteLogo from '/vite.svg' +import { setupCounter } from './counter.ts' + +document.querySelector('#app')!.innerHTML = ` +
+ + + + + + +

Vite + TypeScript

+
+ +
+

+ Click on the Vite and TypeScript logos to learn more +

+
+` + +setupCounter(document.querySelector('#counter')!) diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/style.css b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/style.css new file mode 100644 index 0000000..b528b6c --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/typescript.svg b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/vite-env.d.ts b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/tsconfig.json b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/src/010-typescript-in-the-build-process/019-using-tsx-to-create-quick-scripts.solution/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/src/015-essential-types-and-annotations/020-basic-types-with-function-parameters.problem.ts b/src/015-essential-types-and-annotations/020-basic-types-with-function-parameters.problem.ts new file mode 100644 index 0000000..11fa918 --- /dev/null +++ b/src/015-essential-types-and-annotations/020-basic-types-with-function-parameters.problem.ts @@ -0,0 +1,11 @@ +// CODE + +const add = (a: boolean, b: boolean) => { + return a + b; +}; + +// TESTS + +const result = add(1, 2); + +type test = Expect>; diff --git a/src/015-essential-types-and-annotations/021-basic-types-with-function-parameters.solution.ts b/src/015-essential-types-and-annotations/021-basic-types-with-function-parameters.solution.ts new file mode 100644 index 0000000..3291437 --- /dev/null +++ b/src/015-essential-types-and-annotations/021-basic-types-with-function-parameters.solution.ts @@ -0,0 +1,11 @@ +// CODE + +const add = (a: number, b: number) => { + return a + b; +}; + +// TESTS + +const result = add(1, 2); + +type test = Expect>; diff --git a/src/015-essential-types-and-annotations/022-annotating-empty-parameters.problem.ts b/src/015-essential-types-and-annotations/022-annotating-empty-parameters.problem.ts new file mode 100644 index 0000000..b4a6581 --- /dev/null +++ b/src/015-essential-types-and-annotations/022-annotating-empty-parameters.problem.ts @@ -0,0 +1,11 @@ +// CODE + +const concatTwoStrings = (a, b) => { + return [a, b].join(" "); +}; + +// TESTS + +const result = concatTwoStrings("Hello", "World"); + +type test = Expect>; diff --git a/src/015-essential-types-and-annotations/022-annotating-empty-parameters.solution.ts b/src/015-essential-types-and-annotations/022-annotating-empty-parameters.solution.ts new file mode 100644 index 0000000..e425ed3 --- /dev/null +++ b/src/015-essential-types-and-annotations/022-annotating-empty-parameters.solution.ts @@ -0,0 +1,11 @@ +// CODE + +const concatTwoStrings = (a: string, b: string) => { + return [a, b].join(" "); +}; + +// TESTS + +const result = concatTwoStrings("Hello", "World"); + +type test = Expect>; diff --git a/src/015-essential-types-and-annotations/023-all-types.problem.ts b/src/015-essential-types-and-annotations/023-all-types.problem.ts new file mode 100644 index 0000000..9a7aa9f --- /dev/null +++ b/src/015-essential-types-and-annotations/023-all-types.problem.ts @@ -0,0 +1,5 @@ +let example1: string = "Hello World!"; +let example2: string = 42; +let example3: string = true; +let example4: string = Symbol(); +let example5: string = 123n; diff --git a/src/015-essential-types-and-annotations/023-all-types.solution.1.ts b/src/015-essential-types-and-annotations/023-all-types.solution.1.ts new file mode 100644 index 0000000..5778f8b --- /dev/null +++ b/src/015-essential-types-and-annotations/023-all-types.solution.1.ts @@ -0,0 +1,5 @@ +let example1: string = "Hello World!"; +let example2: number = 42; +let example3: boolean = true; +let example4: symbol = Symbol(); +let example5: bigint = 123n; diff --git a/src/015-essential-types-and-annotations/023-all-types.solution.2.ts b/src/015-essential-types-and-annotations/023-all-types.solution.2.ts new file mode 100644 index 0000000..4606fa6 --- /dev/null +++ b/src/015-essential-types-and-annotations/023-all-types.solution.2.ts @@ -0,0 +1,5 @@ +let example1 = "Hello World!"; +let example2 = 42; +let example3 = true; +let example4 = Symbol(); +let example5 = 123n; diff --git a/src/015-essential-types-and-annotations/024-optional-function-parameters.problem.ts b/src/015-essential-types-and-annotations/024-optional-function-parameters.problem.ts new file mode 100644 index 0000000..a4af788 --- /dev/null +++ b/src/015-essential-types-and-annotations/024-optional-function-parameters.problem.ts @@ -0,0 +1,15 @@ +const concatName = (first: string, last?: string) => { + if (!last) { + return first; + } + + return `${first} ${last}`; +}; + +const result = concatName("John", "Doe"); + +type test = Expect>; + +const result2 = concatName("John"); + +type test2 = Expect>; diff --git a/src/015-essential-types-and-annotations/024-optional-function-parameters.solution.ts b/src/015-essential-types-and-annotations/024-optional-function-parameters.solution.ts new file mode 100644 index 0000000..a4af788 --- /dev/null +++ b/src/015-essential-types-and-annotations/024-optional-function-parameters.solution.ts @@ -0,0 +1,15 @@ +const concatName = (first: string, last?: string) => { + if (!last) { + return first; + } + + return `${first} ${last}`; +}; + +const result = concatName("John", "Doe"); + +type test = Expect>; + +const result2 = concatName("John"); + +type test2 = Expect>; diff --git a/src/015-essential-types-and-annotations/025-default-parameters.problem.ts b/src/015-essential-types-and-annotations/025-default-parameters.problem.ts new file mode 100644 index 0000000..bfa719c --- /dev/null +++ b/src/015-essential-types-and-annotations/025-default-parameters.problem.ts @@ -0,0 +1,25 @@ +import { expect, it } from "vitest"; + +const concatName = (first: string, last?: string) => { + if (!last) { + return first; + } + + return `${first} ${last}`; +}; + +it("should return the full name", () => { + const result = concatName("John", "Doe"); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); + +it("should return the first name", () => { + const result = concatName("John"); + + type test = Expect>; + + expect(result).toEqual("John Pocock"); +}); diff --git a/src/015-essential-types-and-annotations/025-default-parameters.solution.ts b/src/015-essential-types-and-annotations/025-default-parameters.solution.ts new file mode 100644 index 0000000..a867a67 --- /dev/null +++ b/src/015-essential-types-and-annotations/025-default-parameters.solution.ts @@ -0,0 +1,25 @@ +import { expect, it } from "vitest"; + +const concatName = (first: string, last = "Pocock") => { + if (!last) { + return first; + } + + return `${first} ${last}`; +}; + +it("should return the full name", () => { + const result = concatName("John", "Doe"); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); + +it("should return the first name", () => { + const result = concatName("John"); + + type test = Expect>; + + expect(result).toEqual("John Pocock"); +}); diff --git a/src/015-essential-types-and-annotations/026-object-literal-types.problem.ts b/src/015-essential-types-and-annotations/026-object-literal-types.problem.ts new file mode 100644 index 0000000..8b2d1f1 --- /dev/null +++ b/src/015-essential-types-and-annotations/026-object-literal-types.problem.ts @@ -0,0 +1,16 @@ +import { expect, it } from "vitest"; + +const concatName = (user) => { + return `${user.first} ${user.last}`; +}; + +it("should return the full name", () => { + const result = concatName({ + first: "John", + last: "Doe", + }); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); diff --git a/src/015-essential-types-and-annotations/026-object-literal-types.solution.ts b/src/015-essential-types-and-annotations/026-object-literal-types.solution.ts new file mode 100644 index 0000000..a5af713 --- /dev/null +++ b/src/015-essential-types-and-annotations/026-object-literal-types.solution.ts @@ -0,0 +1,16 @@ +import { expect, it } from "vitest"; + +const concatName = (user: { first: string; last: string }) => { + return `${user.first} ${user.last}`; +}; + +it("should return the full name", () => { + const result = concatName({ + first: "John", + last: "Doe", + }); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); diff --git a/src/015-essential-types-and-annotations/027-optional-property-types.problem.ts b/src/015-essential-types-and-annotations/027-optional-property-types.problem.ts new file mode 100644 index 0000000..4cc7f78 --- /dev/null +++ b/src/015-essential-types-and-annotations/027-optional-property-types.problem.ts @@ -0,0 +1,29 @@ +import { expect, it } from "vitest"; + +const concatName = (user: { first: string; last: string }) => { + if (!user.last) { + return user.first; + } + return `${user.first} ${user.last}`; +}; + +it("should return the full name", () => { + const result = concatName({ + first: "John", + last: "Doe", + }); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); + +it("should only return the first name if last name not provided", () => { + const result = concatName({ + first: "John", + }); + + type test = Expect>; + + expect(result).toEqual("John"); +}); diff --git a/src/015-essential-types-and-annotations/027-optional-property-types.solution.ts b/src/015-essential-types-and-annotations/027-optional-property-types.solution.ts new file mode 100644 index 0000000..64f8dff --- /dev/null +++ b/src/015-essential-types-and-annotations/027-optional-property-types.solution.ts @@ -0,0 +1,29 @@ +import { expect, it } from "vitest"; + +const concatName = (user: { first: string; last?: string }) => { + if (!user.last) { + return user.first; + } + return `${user.first} ${user.last}`; +}; + +it("should return the full name", () => { + const result = concatName({ + first: "John", + last: "Doe", + }); + + type test = Expect>; + + expect(result).toEqual("John Doe"); +}); + +it("should only return the first name if last name not provided", () => { + const result = concatName({ + first: "John", + }); + + type test = Expect>; + + expect(result).toEqual("John"); +}); diff --git a/src/015-essential-types-and-annotations/028-type-keyword.problem.ts b/src/015-essential-types-and-annotations/028-type-keyword.problem.ts new file mode 100644 index 0000000..4f89118 --- /dev/null +++ b/src/015-essential-types-and-annotations/028-type-keyword.problem.ts @@ -0,0 +1,34 @@ +import { expect, it } from "vitest"; + +const getRectangleArea = (rectangle: { width: number; height: number }) => { + return rectangle.width * rectangle.height; +}; + +const getRectanglePerimeter = (rectangle: { + width: number; + height: number; +}) => { + return 2 * (rectangle.width + rectangle.height); +}; + +it("should return the area of a rectangle", () => { + const result = getRectangleArea({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(200); +}); + +it("should return the perimeter of a rectangle", () => { + const result = getRectanglePerimeter({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(60); +}); diff --git a/src/015-essential-types-and-annotations/028-type-keyword.solution.1.ts b/src/015-essential-types-and-annotations/028-type-keyword.solution.1.ts new file mode 100644 index 0000000..d3176de --- /dev/null +++ b/src/015-essential-types-and-annotations/028-type-keyword.solution.1.ts @@ -0,0 +1,36 @@ +import { expect, it } from "vitest"; + +type Rectangle = { + width: number; + height: number; +}; + +const getRectangleArea = (rectangle: Rectangle) => { + return rectangle.width * rectangle.height; +}; + +const getRectanglePerimeter = (rectangle: Rectangle) => { + return 2 * (rectangle.width + rectangle.height); +}; + +it("should return the area of a rectangle", () => { + const result = getRectangleArea({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(200); +}); + +it("should return the perimeter of a rectangle", () => { + const result = getRectanglePerimeter({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(60); +}); diff --git a/src/015-essential-types-and-annotations/028-type-keyword.solution.2.ts b/src/015-essential-types-and-annotations/028-type-keyword.solution.2.ts new file mode 100644 index 0000000..d3d1791 --- /dev/null +++ b/src/015-essential-types-and-annotations/028-type-keyword.solution.2.ts @@ -0,0 +1,32 @@ +import { expect, it } from "vitest"; +import { Rectangle } from "./028-type-keyword.solution.3"; + +const getRectangleArea = (rectangle: Rectangle) => { + return rectangle.width * rectangle.height; +}; + +const getRectanglePerimeter = (rectangle: Rectangle) => { + return 2 * (rectangle.width + rectangle.height); +}; + +it("should return the area of a rectangle", () => { + const result = getRectangleArea({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(200); +}); + +it("should return the perimeter of a rectangle", () => { + const result = getRectanglePerimeter({ + width: 10, + height: 20, + }); + + type test = Expect>; + + expect(result).toEqual(60); +}); diff --git a/src/015-essential-types-and-annotations/028-type-keyword.solution.3.ts b/src/015-essential-types-and-annotations/028-type-keyword.solution.3.ts new file mode 100644 index 0000000..af9548f --- /dev/null +++ b/src/015-essential-types-and-annotations/028-type-keyword.solution.3.ts @@ -0,0 +1,4 @@ +export type Rectangle = { + width: number; + height: number; +}; diff --git a/src/015-essential-types-and-annotations/029-arrays.problem.ts b/src/015-essential-types-and-annotations/029-arrays.problem.ts new file mode 100644 index 0000000..578b7c2 --- /dev/null +++ b/src/015-essential-types-and-annotations/029-arrays.problem.ts @@ -0,0 +1,13 @@ +// How do we type 'items' in the ShoppingCart? +type ShoppingCart = { + userId: string; +}; + +const processCart = (cart: ShoppingCart) => { + // Do something with the cart in here +}; + +processCart({ + userId: "user123", + items: ["item1", "item2", "item3"], +}); diff --git a/src/015-essential-types-and-annotations/029-arrays.solution.1.ts b/src/015-essential-types-and-annotations/029-arrays.solution.1.ts new file mode 100644 index 0000000..fd51452 --- /dev/null +++ b/src/015-essential-types-and-annotations/029-arrays.solution.1.ts @@ -0,0 +1,14 @@ +// How do we type 'items' in the ShoppingCart? +type ShoppingCart = { + userId: string; + items: string[]; +}; + +const processCart = (cart: ShoppingCart) => { + // Do something with the cart in here +}; + +processCart({ + userId: "user123", + items: ["item1", "item2", "item3"], +}); diff --git a/src/015-essential-types-and-annotations/029-arrays.solution.2.ts b/src/015-essential-types-and-annotations/029-arrays.solution.2.ts new file mode 100644 index 0000000..92bacba --- /dev/null +++ b/src/015-essential-types-and-annotations/029-arrays.solution.2.ts @@ -0,0 +1,14 @@ +// How do we type 'items' in the ShoppingCart? +type ShoppingCart = { + userId: string; + items: Array; +}; + +const processCart = (cart: ShoppingCart) => { + // Do something with the cart in here +}; + +processCart({ + userId: "user123", + items: ["item1", "item2", "item3"], +}); diff --git a/src/015-essential-types-and-annotations/030-arrays-of-objects.problem.ts b/src/015-essential-types-and-annotations/030-arrays-of-objects.problem.ts new file mode 100644 index 0000000..91375d6 --- /dev/null +++ b/src/015-essential-types-and-annotations/030-arrays-of-objects.problem.ts @@ -0,0 +1,17 @@ +type Recipe = { + title: string; + instructions: string; +}; + +const processRecipe = (recipe: Recipe) => { + // Do something with the recipe in here +}; + +processRecipe({ + title: "Chocolate Chip Cookies", + ingredients: [ + { name: "Flour", quantity: "2 cups" }, + { name: "Sugar", quantity: "1 cup" }, + ], + instructions: "...", +}); diff --git a/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.1.ts b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.1.ts new file mode 100644 index 0000000..1c8e68b --- /dev/null +++ b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.1.ts @@ -0,0 +1,23 @@ +type Ingredient = { + name: string; + quantity: string; +}; + +type Recipe = { + title: string; + instructions: string; + ingredients: Ingredient[]; +}; + +const processRecipe = (recipe: Recipe) => { + // Do something with the recipe in here +}; + +processRecipe({ + title: "Chocolate Chip Cookies", + ingredients: [ + { name: "Flour", quantity: "2 cups" }, + { name: "Sugar", quantity: "1 cup" }, + ], + instructions: "...", +}); diff --git a/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.2.ts b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.2.ts new file mode 100644 index 0000000..527d397 --- /dev/null +++ b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.2.ts @@ -0,0 +1,23 @@ +type Ingredient = { + name: string; + quantity: string; +}; + +type Recipe = { + title: string; + instructions: string; + ingredients: Array; +}; + +const processRecipe = (recipe: Recipe) => { + // Do something with the recipe in here +}; + +processRecipe({ + title: "Chocolate Chip Cookies", + ingredients: [ + { name: "Flour", quantity: "2 cups" }, + { name: "Sugar", quantity: "1 cup" }, + ], + instructions: "...", +}); diff --git a/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.3.ts b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.3.ts new file mode 100644 index 0000000..2091ae8 --- /dev/null +++ b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.3.ts @@ -0,0 +1,21 @@ +type Recipe = { + title: string; + instructions: string; + ingredients: { + name: string; + quantity: string; + }[]; +}; + +const processRecipe = (recipe: Recipe) => { + // Do something with the recipe in here +}; + +processRecipe({ + title: "Chocolate Chip Cookies", + ingredients: [ + { name: "Flour", quantity: "2 cups" }, + { name: "Sugar", quantity: "1 cup" }, + ], + instructions: "...", +}); diff --git a/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.4.ts b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.4.ts new file mode 100644 index 0000000..656bc7d --- /dev/null +++ b/src/015-essential-types-and-annotations/030-arrays-of-objects.solution.4.ts @@ -0,0 +1,21 @@ +type Recipe = { + title: string; + instructions: string; + ingredients: Array<{ + name: string; + quantity: string; + }>; +}; + +const processRecipe = (recipe: Recipe) => { + // Do something with the recipe in here +}; + +processRecipe({ + title: "Chocolate Chip Cookies", + ingredients: [ + { name: "Flour", quantity: "2 cups" }, + { name: "Sugar", quantity: "1 cup" }, + ], + instructions: "...", +}); diff --git a/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.problem.ts b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.problem.ts new file mode 100644 index 0000000..e0bc75d --- /dev/null +++ b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.problem.ts @@ -0,0 +1,12 @@ +import { expect, it } from "vitest"; + +export function concatenate(...strings): string { + return strings.join(""); +} + +it("should concatenate strings", () => { + const result = concatenate("Hello", " ", "World"); + expect(result).toEqual("Hello World"); + + type test = Expect>; +}); diff --git a/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.1.ts b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.1.ts new file mode 100644 index 0000000..476545c --- /dev/null +++ b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.1.ts @@ -0,0 +1,12 @@ +import { expect, it } from "vitest"; + +export function concatenate(...strings: string[]): string { + return strings.join(""); +} + +it("should concatenate strings", () => { + const result = concatenate("Hello", " ", "World"); + expect(result).toEqual("Hello World"); + + type test = Expect>; +}); diff --git a/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.2.ts b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.2.ts new file mode 100644 index 0000000..9a92c84 --- /dev/null +++ b/src/015-essential-types-and-annotations/031-rest-parameters-of-functions.solution.2.ts @@ -0,0 +1,12 @@ +import { expect, it } from "vitest"; + +export function concatenate(...strings: Array): string { + return strings.join(""); +} + +it("should concatenate strings", () => { + const result = concatenate("Hello", " ", "World"); + expect(result).toEqual("Hello World"); + + type test = Expect>; +}); diff --git a/src/015-essential-types-and-annotations/032-tuples.problem.ts b/src/015-essential-types-and-annotations/032-tuples.problem.ts new file mode 100644 index 0000000..9da2732 --- /dev/null +++ b/src/015-essential-types-and-annotations/032-tuples.problem.ts @@ -0,0 +1,23 @@ +const setRange = (range: Array) => { + const x = range[0]; + const y = range[1]; + + // Do something with x and y in here + + // x and y should both be numbers! + type tests = [ + Expect>, + Expect>, + ]; +}; + +setRange([0, 10]); + +// @ts-expect-error string is not assignable to number +setRange([0, "10"]); + +// @ts-expect-error too few arguments +setRange([0]); + +// @ts-expect-error too many arguments +setRange([0, 10, 20]); diff --git a/src/015-essential-types-and-annotations/032-tuples.solution.1.ts b/src/015-essential-types-and-annotations/032-tuples.solution.1.ts new file mode 100644 index 0000000..716c056 --- /dev/null +++ b/src/015-essential-types-and-annotations/032-tuples.solution.1.ts @@ -0,0 +1,22 @@ +const setRange = (range: [number, number]) => { + const x = range[0]; + const y = range[1]; + + // Do something with x and y in here + + type tests = [ + Expect>, + Expect>, + ]; +}; + +setRange([0, 10]); + +// @ts-expect-error string is not assignable to number +setRange([0, "10"]); + +// @ts-expect-error too few arguments +setRange([0]); + +// @ts-expect-error too many arguments +setRange([0, 10, 20]); diff --git a/src/015-essential-types-and-annotations/032-tuples.solution.2.ts b/src/015-essential-types-and-annotations/032-tuples.solution.2.ts new file mode 100644 index 0000000..3ab827c --- /dev/null +++ b/src/015-essential-types-and-annotations/032-tuples.solution.2.ts @@ -0,0 +1,22 @@ +const setRange = (range: [x: number, y: number]) => { + const x = range[0]; + const y = range[1]; + + // Do something with x and y in here + + type tests = [ + Expect>, + Expect>, + ]; +}; + +setRange([0, 10]); + +// @ts-expect-error string is not assignable to number +setRange([0, "10"]); + +// @ts-expect-error too few arguments +setRange([0]); + +// @ts-expect-error too many arguments +setRange([0, 10, 20]); diff --git a/src/015-essential-types-and-annotations/033-optional-members-of-tuples.problem.ts b/src/015-essential-types-and-annotations/033-optional-members-of-tuples.problem.ts new file mode 100644 index 0000000..70b786d --- /dev/null +++ b/src/015-essential-types-and-annotations/033-optional-members-of-tuples.problem.ts @@ -0,0 +1 @@ +// TODO diff --git a/src/015-essential-types-and-annotations/033-optional-members-of-tuples.solution.ts b/src/015-essential-types-and-annotations/033-optional-members-of-tuples.solution.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/015-essential-types-and-annotations/034-pass-types-to-set.problem.ts b/src/015-essential-types-and-annotations/034-pass-types-to-set.problem.ts new file mode 100644 index 0000000..228d2eb --- /dev/null +++ b/src/015-essential-types-and-annotations/034-pass-types-to-set.problem.ts @@ -0,0 +1,10 @@ +const userIds = new Set(); + +userIds.add(1); +userIds.add(2); +userIds.add(3); + +// @ts-expect-error +userIds.add("123"); +// @ts-expect-error +userIds.add({ name: "Max" }); diff --git a/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.1.ts b/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.1.ts new file mode 100644 index 0000000..906d8a6 --- /dev/null +++ b/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.1.ts @@ -0,0 +1,10 @@ +const userIds = new Set(); + +userIds.add(1); +userIds.add(2); +userIds.add(3); + +// @ts-expect-error +userIds.add("123"); +// @ts-expect-error +userIds.add({ name: "Max" }); diff --git a/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.2.ts b/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.2.ts new file mode 100644 index 0000000..85e70e6 --- /dev/null +++ b/src/015-essential-types-and-annotations/034-pass-types-to-set.solution.2.ts @@ -0,0 +1,10 @@ +const userIds: Set = new Set(); + +userIds.add(1); +userIds.add(2); +userIds.add(3); + +// @ts-expect-error +userIds.add("123"); +// @ts-expect-error +userIds.add({ name: "Max" }); diff --git a/src/015-essential-types-and-annotations/035-pass-types-to-map.problem.ts b/src/015-essential-types-and-annotations/035-pass-types-to-map.problem.ts new file mode 100644 index 0000000..0bd5785 --- /dev/null +++ b/src/015-essential-types-and-annotations/035-pass-types-to-map.problem.ts @@ -0,0 +1,10 @@ +const userMap = new Map(); + +userMap.set(1, { name: "Max", age: 30 }); +userMap.set(2, { name: "Manuel", age: 31 }); + +// @ts-expect-error +userMap.set("3", { name: "Anna", age: 29 }); + +// @ts-expect-error +userMap.set(3, "123"); diff --git a/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.1.ts b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.1.ts new file mode 100644 index 0000000..f13f0b4 --- /dev/null +++ b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.1.ts @@ -0,0 +1,15 @@ +type User = { + name: string; + age: number; +}; + +const userMap = new Map(); + +userMap.set(1, { name: "Max", age: 30 }); +userMap.set(2, { name: "Manuel", age: 31 }); + +// @ts-expect-error +userMap.set("3", { name: "Anna", age: 29 }); + +// @ts-expect-error +userMap.set(3, "123"); diff --git a/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.2.ts b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.2.ts new file mode 100644 index 0000000..2fbe32e --- /dev/null +++ b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.2.ts @@ -0,0 +1,10 @@ +const userMap = new Map(); + +userMap.set(1, { name: "Max", age: 30 }); +userMap.set(2, { name: "Manuel", age: 31 }); + +// @ts-expect-error +userMap.set("3", { name: "Anna", age: 29 }); + +// @ts-expect-error +userMap.set(3, "123"); diff --git a/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.3.ts b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.3.ts new file mode 100644 index 0000000..271934f --- /dev/null +++ b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.3.ts @@ -0,0 +1,10 @@ +const userMap: Map = new Map(); + +userMap.set(1, { name: "Max", age: 30 }); +userMap.set(2, { name: "Manuel", age: 31 }); + +// @ts-expect-error +userMap.set("3", { name: "Anna", age: 29 }); + +// @ts-expect-error +userMap.set(3, "123"); diff --git a/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.4.ts b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.4.ts new file mode 100644 index 0000000..3f32429 --- /dev/null +++ b/src/015-essential-types-and-annotations/035-pass-types-to-map.solution.4.ts @@ -0,0 +1,15 @@ +type User = { + name: string; + age: number; +}; + +const userMap: Map = new Map(); + +userMap.set(1, { name: "Max", age: 30 }); +userMap.set(2, { name: "Manuel", age: 31 }); + +// @ts-expect-error +userMap.set("3", { name: "Anna", age: 29 }); + +// @ts-expect-error +userMap.set(3, "123"); diff --git a/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.problem.ts b/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.problem.ts new file mode 100644 index 0000000..4616ffd --- /dev/null +++ b/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.problem.ts @@ -0,0 +1,23 @@ +import { expect, it } from "vitest"; + +const parsedData = JSON.parse<{ + name: string; + age: number; +}>('{"name": "Alice", "age": 30}'); + +type test = Expect< + Equal< + typeof parsedData, + { + name: string; + age: number; + } + > +>; + +it("Should be the correct shape", () => { + expect(parsedData).toEqual({ + name: "Alice", + age: 30, + }); +}); diff --git a/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.solution.ts b/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.solution.ts new file mode 100644 index 0000000..f6928cc --- /dev/null +++ b/src/015-essential-types-and-annotations/036-json-parse-cant-receive-type-arguments.solution.ts @@ -0,0 +1,23 @@ +import { expect, it } from "vitest"; + +const parsedData: { + name: string; + age: number; +} = JSON.parse('{"name": "Alice", "age": 30}'); + +type test = Expect< + Equal< + typeof parsedData, + { + name: string; + age: number; + } + > +>; + +it("Should be the correct shape", () => { + expect(parsedData).toEqual({ + name: "Alice", + age: 30, + }); +}); diff --git a/src/015-essential-types-and-annotations/037-type-async-functions.problem.ts b/src/015-essential-types-and-annotations/037-type-async-functions.problem.ts new file mode 100644 index 0000000..b80552b --- /dev/null +++ b/src/015-essential-types-and-annotations/037-type-async-functions.problem.ts @@ -0,0 +1,11 @@ +async function fetchData() { + const response = await fetch("https://api.example.com/data"); + const data = await response.json(); + return data; +} + +const example = async () => { + const data = await fetchData(); + + type test = Expect>; +}; diff --git a/src/015-essential-types-and-annotations/037-type-async-functions.solution.ts b/src/015-essential-types-and-annotations/037-type-async-functions.solution.ts new file mode 100644 index 0000000..1a32817 --- /dev/null +++ b/src/015-essential-types-and-annotations/037-type-async-functions.solution.ts @@ -0,0 +1,11 @@ +async function fetchData(): Promise { + const response = await fetch("https://api.example.com/data"); + const data = await response.json(); + return data; +} + +const example = async () => { + const data = await fetchData(); + + type test = Expect>; +}; diff --git a/src/helpers/type-utils.ts b/src/helpers/type-utils.ts new file mode 100644 index 0000000..8f9a01a --- /dev/null +++ b/src/helpers/type-utils.ts @@ -0,0 +1,47 @@ +export type Expect = T; +export type ExpectTrue = T; +export type ExpectFalse = T; +export type IsTrue = T; +export type IsFalse = T; + +export type Equal = (() => T extends X ? 1 : 2) extends < + T, +>() => T extends Y ? 1 : 2 + ? true + : false; +export type NotEqual = true extends Equal ? false : true; + +// https://stackoverflow.com/questions/49927523/disallow-call-with-any/49928360#49928360 +export type IsAny = 0 extends 1 & T ? true : false; +export type NotAny = true extends IsAny ? false : true; + +export type Debug = { [K in keyof T]: T[K] }; +export type MergeInsertions = T extends object + ? { [K in keyof T]: MergeInsertions } + : T; + +export type Alike = Equal, MergeInsertions>; + +/** + * Expect that one type is assignable to another. + * + * @example + * + * type tests = [ + * // Expect that `number` is assignable to `1`. + * Expect>, + * // Expect that `abc` is assignable to `string` + * Expect>, + * ]; + */ +export type Extends = EXPECTED extends VALUE ? true : false; +export type ExpectValidArgs< + FUNC extends (...args: any[]) => any, + ARGS extends any[], +> = ARGS extends Parameters ? true : false; + +export type UnionToIntersection = ( + U extends any ? (k: U) => void : never +) extends (k: infer I) => void + ? I + : never; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f482adb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2020", + "jsx": "react-jsx", + "module": "ES2022", + "moduleResolution": "node", + "noEmit": true, + "isolatedModules": true, + "moduleDetection": "force", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + }, + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..251dac0 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; +import path from "path"; + +export default defineConfig({ + test: { + include: ["src/**/*{problem,solution,explainer}*.{ts,tsx}"], + setupFiles: [path.resolve(__dirname, "scripts/setup.ts")], + passWithNoTests: true, + environment: "jsdom", + }, + plugins: [tsconfigPaths()], +});

delxwx<5c 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