diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a5456bb..8e1ab6c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "ConvertX Development Environment", + "name": "ConvertX", "build": { "dockerfile": "Dockerfile" }, @@ -46,5 +46,8 @@ }, "postCreateCommand": "bun install", "remoteUser": "root", - "mounts": ["source=${localWorkspaceFolder}/data,target=/app/data,type=bind"] + "mounts": ["source=${localWorkspaceFolder}/data,target=/app/data,type=bind"], + "containerEnv": { + "JWT_SECRET": "jwt_secret_only_used_in_testing_for_easier_hot_reloading" + } } diff --git a/bun.lock b/bun.lock index 679619f..55808eb 100644 --- a/bun.lock +++ b/bun.lock @@ -14,17 +14,14 @@ }, "devDependencies": { "@eslint/js": "^9.37.0", - "@ianvs/prettier-plugin-sort-imports": "^4.7.0", "@kitajs/ts-html-plugin": "^4.1.3", "@tailwindcss/cli": "^4.1.14", "@tailwindcss/postcss": "^4.1.14", - "@total-typescript/ts-reset": "^0.6.1", "@types/bun": "latest", "@types/node": "^24.6.2", "@typescript-eslint/parser": "^8.45.0", "eslint": "^9.37.0", "eslint-plugin-better-tailwindcss": "^3.7.9", - "eslint-plugin-simple-import-sort": "^12.1.1", "globals": "^16.4.0", "knip": "^5.64.1", "npm-run-all2": "^8.0.4", @@ -45,24 +42,6 @@ "packages": { "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], - - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], - - "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], - - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - - "@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], - - "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], - "@elysiajs/html": ["@elysiajs/html@1.4.0", "", { "dependencies": { "@kitajs/html": "^4.1.0", "@kitajs/ts-html-plugin": "^4.0.1" }, "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-j4jFqGEkIC8Rg2XiTOujb9s0WLnz1dnY/4uqczyCdOVruDeJtGP+6+GvF0A76SxEvltn8UR1yCUnRdLqRi3vuw=="], "@elysiajs/jwt": ["@elysiajs/jwt@1.4.0", "", { "dependencies": { "jose": "^6.0.11" }, "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-Z0PvZhQxdDeKZ8HslXzDoXXD83NKExNPmoiAPki3nI2Xvh5wtUrBH+zWOD17yP14IbRo8fxGj3L25MRCAPsgPA=="], @@ -97,8 +76,6 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@ianvs/prettier-plugin-sort-imports": ["@ianvs/prettier-plugin-sort-imports@4.7.0", "", { "dependencies": { "@babel/generator": "^7.26.2", "@babel/parser": "^7.26.2", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "semver": "^7.5.2" }, "peerDependencies": { "@prettier/plugin-oxc": "^0.0.4", "@vue/compiler-sfc": "2.7.x || 3.x", "content-tag": "^4.0.0", "prettier": "2 || 3 || ^4.0.0-0", "prettier-plugin-ember-template-tag": "^2.1.0" }, "optionalPeers": ["@prettier/plugin-oxc", "@vue/compiler-sfc", "content-tag", "prettier-plugin-ember-template-tag"] }, "sha512-soa2bPUJAFruLL4z/CnMfSEKGznm5ebz29fIa9PxYtu8HHyLKNE1NXAs6dylfw1jn/ilEIfO2oLLN6uAafb7DA=="], - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -225,8 +202,6 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.14", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.14", "@tailwindcss/oxide": "4.1.14", "postcss": "^8.4.41", "tailwindcss": "4.1.14" } }, "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg=="], - "@total-typescript/ts-reset": ["@total-typescript/ts-reset@0.6.1", "", {}, "sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg=="], - "@types/bun": ["@types/bun@1.2.23", "", { "dependencies": { "bun-types": "1.2.23" } }, "sha512-le8ueOY5b6VKYf19xT3McVbXqLqmxzPXHsQT/q9JHgikJ2X22wyTW3g3ohz2ZMnp7dod6aduIiq8A14Xyimm0A=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], @@ -323,8 +298,6 @@ "eslint-plugin-better-tailwindcss": ["eslint-plugin-better-tailwindcss@3.7.9", "", { "dependencies": { "@eslint/css-tree": "^3.6.5", "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "postcss": "^8.5.6", "postcss-import": "^16.1.1", "synckit": "^0.11.11", "tailwind-csstree": "^0.1.4", "tsconfig-paths-webpack-plugin": "^4.2.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "tailwindcss": "^3.3.0 || ^4.1.6" } }, "sha512-xmd3YqRoc57ngplFBZLn13bLpKsq6fe+ipdObilG46llJi0MvHSx8+uQ1VNBE1/ieIcedmVY7quol4WLntM8iw=="], - "eslint-plugin-simple-import-sort": ["eslint-plugin-simple-import-sort@12.1.1", "", { "peerDependencies": { "eslint": ">=5.0.0" } }, "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], @@ -405,12 +378,8 @@ "jose": ["jose@6.1.0", "", {}, "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-parse-even-better-errors": ["json-parse-even-better-errors@4.0.0", "", {}, "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA=="], diff --git a/eslint.config.ts b/eslint.config.ts index 7af097f..f159401 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,7 +1,6 @@ import js from "@eslint/js"; import eslintParserTypeScript from "@typescript-eslint/parser"; import eslintPluginBetterTailwindcss from "eslint-plugin-better-tailwindcss"; -import simpleImportSortPlugin from "eslint-plugin-simple-import-sort"; import globals from "globals"; import tseslint from "typescript-eslint"; @@ -10,7 +9,6 @@ export default tseslint.config( tseslint.configs.recommended, { plugins: { - "simple-import-sort": simpleImportSortPlugin, "better-tailwindcss": eslintPluginBetterTailwindcss, }, ignores: ["**/node_modules/**", "eslint.config.ts"], diff --git a/package.json b/package.json index 7a8dc58..a848abf 100644 --- a/package.json +++ b/package.json @@ -31,17 +31,14 @@ }, "devDependencies": { "@eslint/js": "^9.37.0", - "@ianvs/prettier-plugin-sort-imports": "^4.7.0", "@kitajs/ts-html-plugin": "^4.1.3", "@tailwindcss/cli": "^4.1.14", "@tailwindcss/postcss": "^4.1.14", - "@total-typescript/ts-reset": "^0.6.1", "@types/bun": "latest", "@types/node": "^24.6.2", "@typescript-eslint/parser": "^8.45.0", "eslint": "^9.37.0", "eslint-plugin-better-tailwindcss": "^3.7.9", - "eslint-plugin-simple-import-sort": "^12.1.1", "globals": "^16.4.0", "knip": "^5.64.1", "npm-run-all2": "^8.0.4", diff --git a/prettier.config.js b/prettier.config.js index df16566..b6bca47 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,5 +1,5 @@ /** - * @type {import('prettier').Config & import("@ianvs/prettier-plugin-sort-imports").PluginConfig} + * @type {import('prettier').Config} */ const config = { arrowParens: "always", @@ -7,7 +7,6 @@ const config = { singleQuote: false, semi: true, tabWidth: 2, - plugins: ["@ianvs/prettier-plugin-sort-imports"], }; export default config; diff --git a/public/results.js b/public/results.js index b125e93..60c07eb 100644 --- a/public/results.js +++ b/public/results.js @@ -22,3 +22,17 @@ const refreshData = () => { }; refreshData(); + +window.downloadAll = function () { + // Get all download links + const downloadLinks = document.querySelectorAll("tbody a[download]"); + + // Trigger download for each link + downloadLinks.forEach((link, index) => { + // We add a delay for each download to prevent them from starting at the same time + setTimeout(() => { + const event = new MouseEvent("click"); + link.dispatchEvent(event); + }, index * 300); + }); +}; diff --git a/reset.d.ts b/reset.d.ts deleted file mode 100644 index a3d4a03..0000000 --- a/reset.d.ts +++ /dev/null @@ -1 +0,0 @@ -import "@total-typescript/ts-reset"; diff --git a/src/components/base.tsx b/src/components/base.tsx index 9804813..c44d1f6 100644 --- a/src/components/base.tsx +++ b/src/components/base.tsx @@ -1,4 +1,3 @@ -import { Html } from "@elysiajs/html"; import { version } from "../../package.json"; export const BaseHtml = ({ diff --git a/src/components/header.tsx b/src/components/header.tsx index 75fa627..7f72fea 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -1,5 +1,3 @@ -import { Html } from "@kitajs/html"; - export const Header = ({ loggedIn, accountRegistration, diff --git a/src/icons/download.tsx b/src/icons/download.tsx new file mode 100644 index 0000000..f4c44c3 --- /dev/null +++ b/src/icons/download.tsx @@ -0,0 +1,18 @@ +export function DownloadIcon() { + return ( + + + + ); +} diff --git a/src/icons/eye.tsx b/src/icons/eye.tsx new file mode 100644 index 0000000..02bcd49 --- /dev/null +++ b/src/icons/eye.tsx @@ -0,0 +1,19 @@ +export function EyeIcon() { + return ( + + + + + ); +} diff --git a/src/pages/chooseConverter.tsx b/src/pages/chooseConverter.tsx index 8e7a3f8..98b5f8c 100644 --- a/src/pages/chooseConverter.tsx +++ b/src/pages/chooseConverter.tsx @@ -1,4 +1,3 @@ -import { Html } from "@elysiajs/html"; import Elysia, { t } from "elysia"; import { getPossibleTargets } from "../converters/main"; import { userService } from "./user"; diff --git a/src/pages/history.tsx b/src/pages/history.tsx index 82ce6f6..7229b85 100644 --- a/src/pages/history.tsx +++ b/src/pages/history.tsx @@ -1,4 +1,3 @@ -import { Html } from "@elysiajs/html"; import { Elysia } from "elysia"; import { BaseHtml } from "../components/base"; import { Header } from "../components/header"; diff --git a/src/pages/listConverters.tsx b/src/pages/listConverters.tsx index 1950b46..71343b8 100644 --- a/src/pages/listConverters.tsx +++ b/src/pages/listConverters.tsx @@ -1,4 +1,3 @@ -import { Html } from "@elysiajs/html"; import Elysia from "elysia"; import { BaseHtml } from "../components/base"; import { Header } from "../components/header"; diff --git a/src/pages/results.tsx b/src/pages/results.tsx index 9293071..8b9a773 100644 --- a/src/pages/results.tsx +++ b/src/pages/results.tsx @@ -1,4 +1,3 @@ -import { Html } from "@elysiajs/html"; import { JWTPayloadSpec } from "@elysiajs/jwt"; import { Elysia } from "elysia"; import { BaseHtml } from "../components/base"; @@ -6,6 +5,8 @@ import { Header } from "../components/header"; import db from "../db/db"; import { Filename, Jobs } from "../db/types"; import { ALLOW_UNAUTHENTICATED, WEBROOT } from "../helpers/env"; +import { DownloadIcon } from "../icons/download"; +import { EyeIcon } from "../icons/eye"; import { userService } from "./user"; function ResultsArticle({ @@ -25,25 +26,24 @@ function ResultsArticle({

Results

-
+
- View - - - Download + Actions @@ -103,7 +95,7 @@ function ResultsArticle({ {file.output_file_name} {file.status} - + - View + - - - Download + diff --git a/src/pages/root.tsx b/src/pages/root.tsx index fdf7f2f..f2a83de 100644 --- a/src/pages/root.tsx +++ b/src/pages/root.tsx @@ -1,5 +1,4 @@ import { randomInt } from "node:crypto"; -import { Html } from "@elysiajs/html"; import { JWTPayloadSpec } from "@elysiajs/jwt"; import { Elysia, t } from "elysia"; import { BaseHtml } from "../components/base"; diff --git a/src/pages/user.tsx b/src/pages/user.tsx index 29dae0a..0fd9065 100644 --- a/src/pages/user.tsx +++ b/src/pages/user.tsx @@ -1,5 +1,4 @@ import { randomUUID } from "node:crypto"; -import { Html } from "@elysiajs/html"; import { jwt } from "@elysiajs/jwt"; import { Elysia, t } from "elysia"; import { BaseHtml } from "../components/base"; diff --git a/tests/converters/helpers/converters.ts b/tests/converters/helpers/converters.ts index 12942f6..912f6e2 100644 --- a/tests/converters/helpers/converters.ts +++ b/tests/converters/helpers/converters.ts @@ -1,5 +1,5 @@ -import type { ExecFileException } from "node:child_process"; import { expect } from "bun:test"; +import type { ExecFileException } from "node:child_process"; import { ConvertFnWithExecFile, ExecFileFn } from "../../../src/converters/types"; export async function runConvertSuccessTest(convertFn: ConvertFnWithExecFile) { diff --git a/tests/converters/imagemagick.test.ts b/tests/converters/imagemagick.test.ts index dd47b7a..e7b17aa 100644 --- a/tests/converters/imagemagick.test.ts +++ b/tests/converters/imagemagick.test.ts @@ -1,5 +1,5 @@ -import type { ExecFileException } from "node:child_process"; import { beforeEach, expect, test } from "bun:test"; +import type { ExecFileException } from "node:child_process"; import { convert } from "../../src/converters/imagemagick"; import { ExecFileFn } from "../../src/converters/types"; import { runCommonTests } from "./helpers/commonTests"; diff --git a/tests/converters/libjxl.test.ts b/tests/converters/libjxl.test.ts index 7171bdb..c1a27af 100644 --- a/tests/converters/libjxl.test.ts +++ b/tests/converters/libjxl.test.ts @@ -1,5 +1,5 @@ -import type { ExecFileException } from "node:child_process"; import { beforeEach, expect, test } from "bun:test"; +import type { ExecFileException } from "node:child_process"; import { convert } from "../../src/converters/libjxl"; import { ExecFileFn } from "../../src/converters/types"; import { runCommonTests } from "./helpers/commonTests"; diff --git a/tests/converters/msgconvert.test.ts b/tests/converters/msgconvert.test.ts index 7ef0dca..2a6631b 100644 --- a/tests/converters/msgconvert.test.ts +++ b/tests/converters/msgconvert.test.ts @@ -1,5 +1,5 @@ -import type { ExecFileException } from "node:child_process"; import { expect, test } from "bun:test"; +import type { ExecFileException } from "node:child_process"; import { convert } from "../../src/converters/msgconvert"; import { ExecFileFn } from "../../src/converters/types"; diff --git a/tests/converters/vips.test.ts b/tests/converters/vips.test.ts index b97be81..9f94449 100644 --- a/tests/converters/vips.test.ts +++ b/tests/converters/vips.test.ts @@ -1,5 +1,5 @@ -import type { ExecFileException } from "node:child_process"; import { beforeEach, expect, test } from "bun:test"; +import type { ExecFileException } from "node:child_process"; import { ExecFileFn } from "../../src/converters/types"; import { convert } from "../../src/converters/vips"; import { runCommonTests } from "./helpers/commonTests"; diff --git a/tsconfig.json b/tsconfig.json index ffd5668..ac50753 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,9 +12,8 @@ "strict": true, "downlevelIteration": true, "skipLibCheck": true, - "jsx": "react", - "jsxFactory": "Html.createElement", - "jsxFragmentFactory": "Html.Fragment", + "jsx": "react-jsx", + "jsxImportSource": "@kitajs/html", "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, "allowJs": true, @@ -30,5 +29,5 @@ "esModuleInterop": true // "noImplicitReturns": true }, - "include": ["src", "tests", "package.json", "reset.d.ts"] + "include": ["src", "tests", "package.json"] }