diff --git a/next.config.mjs b/next.config.mjs index 82d918d..7e4a77f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -20,6 +20,14 @@ const config = { locales: ["en"], defaultLocale: "en", }, + + webpack: (config) => { + config.module.rules.push({ + test: /\.txt$/, + use: "raw-loader", + }); + return config; + }, }; export default nextRoutes()(config); diff --git a/package.json b/package.json index 2a23384..2b21546 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "postinstall": "prisma generate", "lint": "next lint", "start": "next start", - "codegen": "tsx src/codegen/export-openai-schema.ts" + "codegen": "tsx src/codegen/export-openai-types.ts" }, "dependencies": { "@chakra-ui/next-js": "^2.1.4", @@ -19,7 +19,7 @@ "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", "@emotion/styled": "^11.11.0", - "@monaco-editor/react": "^4.5.1", + "@monaco-editor/loader": "^1.3.3", "@next-auth/prisma-adapter": "^1.0.5", "@prisma/client": "^4.14.0", "@t3-oss/env-nextjs": "^0.3.1", @@ -33,10 +33,13 @@ "concurrently": "^8.2.0", "cors": "^2.8.5", "dayjs": "^1.11.8", + "dedent": "^1.0.1", "dotenv": "^16.3.1", "express": "^4.18.2", "framer-motion": "^10.12.17", "gpt-tokens": "^1.0.10", + "immer": "^10.0.2", + "isolated-vm": "^4.5.0", "json-stringify-pretty-compact": "^4.0.0", "lodash": "^4.17.21", "next": "^13.4.2", @@ -74,9 +77,12 @@ "eslint": "^8.40.0", "eslint-config-next": "^13.4.2", "eslint-plugin-unused-imports": "^2.0.0", + "openapi-typescript": "^6.3.4", "prettier": "^3.0.0", "prisma": "^4.14.0", + "raw-loader": "^4.0.2", "typescript": "^5.0.4", + "vitest": "^0.33.0", "yaml": "^2.3.1" }, "ct3aMetadata": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78ab7a7..69f99d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,9 @@ dependencies: '@emotion/styled': specifier: ^11.11.0 version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.6)(react@18.2.0) - '@monaco-editor/react': - specifier: ^4.5.1 - version: 4.5.1(monaco-editor@0.39.0)(react-dom@18.2.0)(react@18.2.0) + '@monaco-editor/loader': + specifier: ^1.3.3 + version: 1.3.3(monaco-editor@0.39.0) '@next-auth/prisma-adapter': specifier: ^1.0.5 version: 1.0.5(@prisma/client@4.14.0)(next-auth@4.22.1) @@ -62,6 +62,9 @@ dependencies: dayjs: specifier: ^1.11.8 version: 1.11.8 + dedent: + specifier: ^1.0.1 + version: 1.0.1 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -74,6 +77,12 @@ dependencies: gpt-tokens: specifier: ^1.0.10 version: 1.0.10 + immer: + specifier: ^10.0.2 + version: 10.0.2 + isolated-vm: + specifier: ^4.5.0 + version: 4.5.0 json-stringify-pretty-compact: specifier: ^4.0.0 version: 4.0.0 @@ -130,7 +139,7 @@ dependencies: version: 3.21.4 zustand: specifier: ^4.3.9 - version: 4.3.9(react@18.2.0) + version: 4.3.9(immer@10.0.2)(react@18.2.0) devDependencies: '@openapi-contrib/openapi-schema-to-json-schema': @@ -181,15 +190,24 @@ devDependencies: eslint-plugin-unused-imports: specifier: ^2.0.0 version: 2.0.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.40.0) + openapi-typescript: + specifier: ^6.3.4 + version: 6.3.4 prettier: specifier: ^3.0.0 version: 3.0.0 prisma: specifier: ^4.14.0 version: 4.14.0 + raw-loader: + specifier: ^4.0.2 + version: 4.0.2(webpack@5.88.1) typescript: specifier: ^5.0.4 version: 5.0.4 + vitest: + specifier: ^0.33.0 + version: 0.33.0 yaml: specifier: ^2.3.1 version: 2.3.1 @@ -1519,6 +1537,15 @@ packages: dev: false optional: true + /@esbuild/android-arm64@0.18.12: + resolution: {integrity: sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -1528,6 +1555,15 @@ packages: dev: false optional: true + /@esbuild/android-arm@0.18.12: + resolution: {integrity: sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -1537,6 +1573,15 @@ packages: dev: false optional: true + /@esbuild/android-x64@0.18.12: + resolution: {integrity: sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==} + 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'} @@ -1546,6 +1591,15 @@ packages: dev: false optional: true + /@esbuild/darwin-arm64@0.18.12: + resolution: {integrity: sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==} + 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'} @@ -1555,6 +1609,15 @@ packages: dev: false optional: true + /@esbuild/darwin-x64@0.18.12: + resolution: {integrity: sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==} + 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'} @@ -1564,6 +1627,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-arm64@0.18.12: + resolution: {integrity: sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==} + 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'} @@ -1573,6 +1645,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-x64@0.18.12: + resolution: {integrity: sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -1582,6 +1663,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm64@0.18.12: + resolution: {integrity: sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -1591,6 +1681,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm@0.18.12: + resolution: {integrity: sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -1600,6 +1699,15 @@ packages: dev: false optional: true + /@esbuild/linux-ia32@0.18.12: + resolution: {integrity: sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==} + 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'} @@ -1609,6 +1717,15 @@ packages: dev: false optional: true + /@esbuild/linux-loong64@0.18.12: + resolution: {integrity: sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==} + 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'} @@ -1618,6 +1735,15 @@ packages: dev: false optional: true + /@esbuild/linux-mips64el@0.18.12: + resolution: {integrity: sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==} + 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'} @@ -1627,6 +1753,15 @@ packages: dev: false optional: true + /@esbuild/linux-ppc64@0.18.12: + resolution: {integrity: sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==} + 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'} @@ -1636,6 +1771,15 @@ packages: dev: false optional: true + /@esbuild/linux-riscv64@0.18.12: + resolution: {integrity: sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==} + 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'} @@ -1645,6 +1789,15 @@ packages: dev: false optional: true + /@esbuild/linux-s390x@0.18.12: + resolution: {integrity: sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==} + 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'} @@ -1654,6 +1807,15 @@ packages: dev: false optional: true + /@esbuild/linux-x64@0.18.12: + resolution: {integrity: sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==} + 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'} @@ -1663,6 +1825,15 @@ packages: dev: false optional: true + /@esbuild/netbsd-x64@0.18.12: + resolution: {integrity: sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==} + 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'} @@ -1672,6 +1843,15 @@ packages: dev: false optional: true + /@esbuild/openbsd-x64@0.18.12: + resolution: {integrity: sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==} + 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'} @@ -1681,6 +1861,15 @@ packages: dev: false optional: true + /@esbuild/sunos-x64@0.18.12: + resolution: {integrity: sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==} + 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'} @@ -1690,6 +1879,15 @@ packages: dev: false optional: true + /@esbuild/win32-arm64@0.18.12: + resolution: {integrity: sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==} + 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'} @@ -1699,6 +1897,15 @@ packages: dev: false optional: true + /@esbuild/win32-ia32@0.18.12: + resolution: {integrity: sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==} + 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'} @@ -1708,6 +1915,15 @@ packages: dev: false optional: true + /@esbuild/win32-x64@0.18.12: + resolution: {integrity: sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.40.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1765,6 +1981,54 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /@monaco-editor/loader@1.3.3(monaco-editor@0.39.0): resolution: {integrity: sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==} peerDependencies: @@ -1774,19 +2038,6 @@ packages: state-local: 1.0.7 dev: false - /@monaco-editor/react@4.5.1(monaco-editor@0.39.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NNDFdP+2HojtNhCkRfE6/D6ro6pBNihaOzMbGK84lNWzRu+CfBjwzGt4jmnqimLuqp5yE5viHS2vi+QOAnD5FQ==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@monaco-editor/loader': 1.3.3(monaco-editor@0.39.0) - monaco-editor: 0.39.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /@next-auth/prisma-adapter@1.0.5(@prisma/client@4.14.0)(next-auth@4.22.1): resolution: {integrity: sha512-VqMS11IxPXrPGXw6Oul6jcyS/n8GLOWzRMrPr3EMdtD6eOalM6zz05j08PcNiis8QzkfuYnCv49OvufTuaEwYQ==} peerDependencies: @@ -1927,7 +2178,7 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: cross-spawn: 7.0.3 - fast-glob: 3.2.12 + fast-glob: 3.3.0 is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 @@ -1964,6 +2215,10 @@ packages: resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} dev: true + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@socket.io/component-emitter@3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: false @@ -2087,6 +2342,16 @@ packages: '@types/node': 18.16.0 dev: true + /@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/chroma-js@2.4.0: resolution: {integrity: sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==} dev: true @@ -2106,6 +2371,13 @@ packages: dependencies: '@types/node': 18.16.0 + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.37.0 + '@types/estree': 1.0.1 + dev: true + /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: @@ -2377,6 +2649,158 @@ packages: eslint-visitor-keys: 3.4.1 dev: true + /@vitest/expect@0.33.0: + resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==} + dependencies: + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.33.0: + resolution: {integrity: sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==} + dependencies: + '@vitest/utils': 0.33.0 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.33.0: + resolution: {integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==} + dependencies: + magic-string: 0.30.1 + pathe: 1.1.1 + pretty-format: 29.6.1 + dev: true + + /@vitest/spy@0.33.0: + resolution: {integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.33.0: + resolution: {integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 29.6.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + /@zag-js/element-size@0.3.2: resolution: {integrity: sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ==} dev: false @@ -2400,6 +2824,14 @@ packages: negotiator: 0.6.3 dev: false + /acorn-import-assertions@1.9.0(acorn@8.9.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.9.0 + dev: true + /acorn-jsx@5.3.2(acorn@8.9.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2408,6 +2840,11 @@ packages: acorn: 8.9.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.9.0: resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} @@ -2425,6 +2862,14 @@ packages: - supports-color dev: false + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2434,6 +2879,11 @@ packages: uri-js: 4.4.1 dev: true + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2451,6 +2901,11 @@ packages: dependencies: color-convert: 2.0.1 + /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'} @@ -2533,6 +2988,10 @@ packages: get-intrinsic: 1.2.1 dev: true + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true @@ -2588,6 +3047,10 @@ packages: engines: {node: '>=0.6'} dev: true + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2633,13 +3096,23 @@ packages: dependencies: fill-range: 7.0.1 + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001506 + electron-to-chromium: 1.4.459 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + /buffer-from@0.1.2: resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} dev: false /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} @@ -2659,6 +3132,11 @@ packages: 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: @@ -2671,7 +3149,19 @@ packages: /caniuse-lite@1.0.30001506: resolution: {integrity: sha512-6XNEcpygZMCKaufIcgpQNZNf00GEqc7VQON+9Rd0K1bMYo8xhMZRAo5zpbnbMNizi4YNgIDAFrdykWsvY3H4Hw==} - 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==} @@ -2705,6 +3195,10 @@ packages: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 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'} @@ -2724,6 +3218,11 @@ packages: resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} dev: false + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false @@ -2771,6 +3270,10 @@ packages: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} dev: false + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + /compute-scroll-into-view@1.0.20: resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} dev: false @@ -2935,6 +3438,19 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: false + /dedent@1.0.1: + resolution: {integrity: sha512-ISfLyH40XVmphoIMyGwOpN4w9kB4Jjz5r62myZDJMbjJSwur7r/EZ0xg64yyZl50qoDVIvCT9UMLmQAjepmjiA==} + dependencies: + babel-plugin-macros: 3.1.0 + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -2994,6 +3510,11 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /digest-fetch@1.3.0: resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} dependencies: @@ -3037,6 +3558,10 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false + /electron-to-chromium@1.4.459: + resolution: {integrity: sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false @@ -3045,6 +3570,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -3143,6 +3673,10 @@ packages: which-typed-array: 1.1.9 dev: true + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -3197,10 +3731,39 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: false + /esbuild@0.18.12: + resolution: {integrity: sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.12 + '@esbuild/android-arm64': 0.18.12 + '@esbuild/android-x64': 0.18.12 + '@esbuild/darwin-arm64': 0.18.12 + '@esbuild/darwin-x64': 0.18.12 + '@esbuild/freebsd-arm64': 0.18.12 + '@esbuild/freebsd-x64': 0.18.12 + '@esbuild/linux-arm': 0.18.12 + '@esbuild/linux-arm64': 0.18.12 + '@esbuild/linux-ia32': 0.18.12 + '@esbuild/linux-loong64': 0.18.12 + '@esbuild/linux-mips64el': 0.18.12 + '@esbuild/linux-ppc64': 0.18.12 + '@esbuild/linux-riscv64': 0.18.12 + '@esbuild/linux-s390x': 0.18.12 + '@esbuild/linux-x64': 0.18.12 + '@esbuild/netbsd-x64': 0.18.12 + '@esbuild/openbsd-x64': 0.18.12 + '@esbuild/sunos-x64': 0.18.12 + '@esbuild/win32-arm64': 0.18.12 + '@esbuild/win32-ia32': 0.18.12 + '@esbuild/win32-x64': 0.18.12 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -3533,6 +4096,11 @@ packages: engines: {node: '>=6'} dev: false + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3606,8 +4174,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3775,7 +4343,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: false optional: true /function-bind@1.1.1: @@ -3800,6 +4367,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} 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: @@ -3844,6 +4415,10 @@ packages: is-glob: 4.0.3 dev: true + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: @@ -3890,7 +4465,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -3901,7 +4476,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -4046,6 +4621,10 @@ packages: engines: {node: '>= 4'} dev: true + /immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4296,6 +4875,21 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /isolated-vm@4.5.0: + resolution: {integrity: sha512-Kse0m5t+B9wZQVeTDqzPoX1SIFNTNfyaUxhnCuFgpXL1+5GYJ9GUAN3mpD+ainixGmUXgeYaVBX+QPDjEBBu0w==} + engines: {node: '>=10.4.0'} + requiresBuild: true + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.16.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jose@4.14.4: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} dev: false @@ -4322,7 +4916,6 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -4343,6 +4936,16 @@ packages: minimist: 1.2.8 dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + /jsx-ast-utils@3.3.3: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} @@ -4373,6 +4976,25 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: false + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -4398,6 +5020,12 @@ packages: dependencies: js-tokens: 4.0.0 + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + /lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} dependencies: @@ -4411,6 +5039,13 @@ packages: dependencies: yallist: 4.0.0 + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: @@ -4453,14 +5088,12 @@ packages: /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: false /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: false /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -4493,6 +5126,15 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.9.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + /monaco-editor@0.39.0: resolution: {integrity: sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==} dev: false @@ -4518,7 +5160,6 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -4533,6 +5174,10 @@ packages: engines: {node: '>= 0.6'} dev: false + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + /next-auth@4.22.1(next@13.4.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NTR3f6W7/AWXKw8GSsgSyQcDW6jkslZLH8AiZa5PQ09w1kR8uHtR9rez/E9gAq/o17+p0JYHE8QjF3RoniiObA==} peerDependencies: @@ -4630,6 +5275,10 @@ packages: whatwg-url: 5.0.0 dev: false + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4791,6 +5440,18 @@ packages: yargs-parser: 21.1.1 dev: true + /openapi-typescript@6.3.4: + resolution: {integrity: sha512-icWb7WBBFr8+RxX7NZC5ez0WkTSQAScLnI33vHRLvWxkpOGKLlp94C0wcicZWzh85EoIoFjO+tujcQxo7zeZdA==} + hasBin: true + dependencies: + ansi-colors: 4.1.3 + fast-glob: 3.3.0 + js-yaml: 4.1.0 + supports-color: 9.4.0 + undici: 5.22.1 + yargs-parser: 21.1.1 + dev: true + /openid-client@5.4.2: resolution: {integrity: sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==} dependencies: @@ -4819,6 +5480,13 @@ packages: yocto-queue: 0.1.0 dev: true + /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 + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -4889,6 +5557,14 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /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==} @@ -4896,6 +5572,14 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /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 + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -4910,6 +5594,15 @@ packages: source-map-js: 1.0.2 dev: false + /postcss@8.4.26: + resolution: {integrity: sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /posthog-js@1.68.4: resolution: {integrity: sha512-rHk4uk99nvWiDTU7P2mFdEfzFR6km0hvOpCR3tm/+F7kCJKs7QDkMblOZZHZultxM4wSNyB4neeohmnHjKYUhQ==} dependencies: @@ -4946,6 +5639,15 @@ packages: hasBin: true dev: true + /pretty-format@29.6.1: + resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false @@ -5009,6 +5711,12 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -5024,6 +5732,17 @@ packages: unpipe: 1.0.0 dev: false + /raw-loader@4.0.2(webpack@5.88.1): + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.88.1 + dev: true + /react-clientside-effect@1.2.6(react@18.2.0): resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} peerDependencies: @@ -5077,6 +5796,10 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /react-remove-scroll-bar@2.3.4(@types/react@18.2.6)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} @@ -5260,6 +5983,14 @@ packages: glob: 7.2.3 dev: true + /rollup@3.26.2: + resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} @@ -5285,7 +6016,6 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -5305,6 +6035,15 @@ packages: loose-envify: 1.4.0 dev: false + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -5339,6 +6078,12 @@ packages: - supports-color dev: false + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -5378,6 +6123,10 @@ packages: get-intrinsic: 1.2.1 object-inspect: 1.12.3 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -5445,14 +6194,12 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: false /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: false /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -5462,7 +6209,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -5472,6 +6218,10 @@ packages: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} dev: false + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} dev: false @@ -5481,6 +6231,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -5568,6 +6322,12 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.9.0 + dev: true + /styled-jsx@5.1.1(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -5614,7 +6374,11 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: false + + /supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -5633,6 +6397,41 @@ packages: engines: {node: '>=6'} dev: true + /terser-webpack-plugin@5.3.9(webpack@5.88.1): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.0 + webpack: 5.88.1 + dev: true + + /terser@5.19.0: + resolution: {integrity: sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.9.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -5659,6 +6458,20 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.6.0: + resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -5741,6 +6554,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -5767,6 +6585,10 @@ packages: engines: {node: '>=12.20'} hasBin: true + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -5793,6 +6615,17 @@ packages: engines: {node: '>=8'} dev: true + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -5892,6 +6725,137 @@ packages: engines: {node: '>= 0.8'} dev: false + /vite-node@0.33.0(@types/node@18.16.0): + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} + 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.3(@types/node@18.16.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.4.3(@types/node@18.16.0): + resolution: {integrity: sha512-IMnXQXXWgLi5brBQx/4WzDxdzW0X3pjO4nqFJAuNvwKtxzAmPzFE1wszW3VDpAGQJm3RZkm/brzRdyGsnwgJIA==} + 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': 18.16.0 + esbuild: 0.18.12 + postcss: 8.4.26 + rollup: 3.26.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.33.0: + resolution: {integrity: sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==} + 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': 18.16.0 + '@vitest/expect': 0.33.0 + '@vitest/runner': 0.33.0 + '@vitest/snapshot': 0.33.0 + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + acorn: 8.9.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.1 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.6.0 + vite: 4.4.3(@types/node@18.16.0) + vite-node: 0.33.0(@types/node@18.16.0) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + /web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -5901,6 +6865,51 @@ packages: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.1: + resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.9.0 + acorn-import-assertions: 1.9.0(acorn@8.9.0) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.1) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -5938,6 +6947,15 @@ packages: isexe: 2.0.0 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 + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -6026,11 +7044,16 @@ packages: engines: {node: '>=10'} dev: true + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zustand@4.3.9(react@18.2.0): + /zustand@4.3.9(immer@10.0.2)(react@18.2.0): resolution: {integrity: sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -6042,6 +7065,7 @@ packages: react: optional: true dependencies: + immer: 10.0.2 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/prisma/migrations/20230714004556_add_construct_fn_to_prompt_variant/migration.sql b/prisma/migrations/20230714004556_add_construct_fn_to_prompt_variant/migration.sql new file mode 100644 index 0000000..b8c2b23 --- /dev/null +++ b/prisma/migrations/20230714004556_add_construct_fn_to_prompt_variant/migration.sql @@ -0,0 +1,15 @@ +-- 1. Add a nullable constructFn column +ALTER TABLE "PromptVariant" +ADD COLUMN "constructFn" TEXT; + +-- 2. Populate constructFn based on the config column +UPDATE "PromptVariant" +SET "constructFn" = 'prompt = ' || "config"::text; + +-- 3. Remove the config column +ALTER TABLE "PromptVariant" +DROP COLUMN "config"; + +-- 4. Make constructFn not null +ALTER TABLE "PromptVariant" +ALTER COLUMN "constructFn" SET NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8a6f07b..3bad8cc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -29,7 +29,7 @@ model PromptVariant { id String @id @default(uuid()) @db.Uuid label String - config Json + constructFn String uiId String @default(uuid()) @db.Uuid visible Boolean @default(true) diff --git a/prisma/seed.ts b/prisma/seed.ts index 0770598..c7676e9 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -36,17 +36,17 @@ await prisma.promptVariant.createMany({ experimentId, label: "Prompt Variant 1", sortIndex: 0, - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [{ role: "user", content: "What is the capital of {{country}}?" }], temperature: 0, - }, + }`, }, { experimentId, label: "Prompt Variant 2", sortIndex: 1, - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [ { @@ -56,7 +56,7 @@ await prisma.promptVariant.createMany({ }, ], temperature: 0, - }, + }`, }, ], }); diff --git a/prisma/seedDemo.ts b/prisma/seedDemo.ts index 95f2233..a2213e0 100644 --- a/prisma/seedDemo.ts +++ b/prisma/seedDemo.ts @@ -12,7 +12,7 @@ await prisma.promptVariant.createMany({ { experimentId: functionCallsExperiment.id, label: "No Fn Calls", - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [ { @@ -25,12 +25,12 @@ await prisma.promptVariant.createMany({ content: "Text:\n---\n{{text}}", }, ], - }, + }`, }, { experimentId: functionCallsExperiment.id, label: "Fn Calls", - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [ { @@ -60,7 +60,7 @@ await prisma.promptVariant.createMany({ function_call: { name: "analyze_sentiment", }, - }, + }`, }, ], }); @@ -92,7 +92,7 @@ await prisma.promptVariant.createMany({ experimentId: redditExperiment.id, label: "3.5 Base", sortIndex: 0, - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [ { @@ -101,13 +101,13 @@ await prisma.promptVariant.createMany({ 'Reddit post:\n\n title: {{title}}\n body: {{body}}\n \n How likely is it that the poster has the following need? Answer with just "high", "medium" or "low" in quotes.\n \n Need: {{need}}.', }, ], - }, + }`, }, { experimentId: redditExperiment.id, label: "4 Base", sortIndex: 1, - config: { + constructFn: `prompt = { model: "gpt-4-0613", messages: [ { @@ -116,13 +116,13 @@ await prisma.promptVariant.createMany({ 'Reddit post:\n\n title: {{title}}\n body: {{body}}\n \n How likely is it that the poster has the following need? Answer with just "high", "medium" or "low" in quotes.\n \n Need: {{need}}.', }, ], - }, + }`, }, { experimentId: redditExperiment.id, label: "3.5 CoT + Functions", sortIndex: 2, - config: { + constructFn: `prompt = { model: "gpt-3.5-turbo-0613", messages: [ { @@ -161,7 +161,7 @@ await prisma.promptVariant.createMany({ function_call: { name: "extract_relevance", }, - }, + }`, }, ], }); diff --git a/public/favicon.ico b/public/favicon.ico index 048b1f0..ab78348 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/favicons/site.webmanifest b/public/favicons/site.webmanifest index b20abb7..fa99de7 100644 --- a/public/favicons/site.webmanifest +++ b/public/favicons/site.webmanifest @@ -1,19 +1,19 @@ { - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" } diff --git a/src/codegen/export-openai-types.ts b/src/codegen/export-openai-types.ts new file mode 100644 index 0000000..f17e2ed --- /dev/null +++ b/src/codegen/export-openai-types.ts @@ -0,0 +1,52 @@ +import fs from "fs"; +import path from "path"; +import openapiTS, { type OpenAPI3 } from "openapi-typescript"; +import YAML from "yaml"; +import _ from "lodash"; +import assert from "assert"; + +const OPENAPI_URL = + "https://raw.githubusercontent.com/openai/openai-openapi/0c432eb66fd0c758fd8b9bd69db41c1096e5f4db/openapi.yaml"; + +// Generate TypeScript types from OpenAPI + +const schema = await fetch(OPENAPI_URL) + .then((res) => res.text()) + .then((txt) => YAML.parse(txt) as OpenAPI3); + +console.log(schema.components?.schemas?.CreateChatCompletionRequest); + +// @ts-expect-error just assume this works, the assert will catch it if it doesn't +const modelProperty = schema.components?.schemas?.CreateChatCompletionRequest?.properties?.model; + +assert(modelProperty.oneOf.length === 2, "Expected model to have oneOf length of 2"); + +// We need to do a bit of surgery here since the Monaco editor doesn't like +// the fact that the schema says `model` can be either a string or an enum, +// and displays a warning in the editor. Let's stick with just an enum for +// now and drop the string option. +modelProperty.type = "string"; +modelProperty.enum = modelProperty.oneOf[1].enum; +modelProperty.oneOf = undefined; + +delete schema["paths"]; +assert(schema.components?.schemas); +schema.components.schemas = _.pick(schema.components?.schemas, [ + "CreateChatCompletionRequest", + "ChatCompletionRequestMessage", + "ChatCompletionFunctions", + "ChatCompletionFunctionParameters", +]); +console.log(schema); + +let openApiTypes = await openapiTS(schema); + +// Remove the `export` from any line that starts with `export` +openApiTypes = openApiTypes.replaceAll("\nexport ", "\n"); + +// Get the directory of the current script +const currentDirectory = path.dirname(import.meta.url).replace("file://", ""); + +// Write the TypeScript types. We only want to use this in our in-app editor, so +// save as a .txt so VS Code doesn't try to auto-import definitions from it. +fs.writeFileSync(path.join(currentDirectory, "openai.types.ts.txt"), openApiTypes); diff --git a/src/codegen/openai.types.ts.txt b/src/codegen/openai.types.ts.txt new file mode 100644 index 0000000..3fcb5ab --- /dev/null +++ b/src/codegen/openai.types.ts.txt @@ -0,0 +1,148 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +/** OneOf type helpers */ +type Without = { [P in Exclude]?: never }; +type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U; +type OneOf = T extends [infer Only] ? Only : T extends [infer A, infer B, ...infer Rest] ? OneOf<[XOR, ...Rest]> : never; + +type paths = Record; + +type webhooks = Record; + +interface components { + schemas: { + CreateChatCompletionRequest: { + /** + * @description ID of the model to use. See the [model endpoint compatibility](/docs/models/model-endpoint-compatibility) table for details on which models work with the Chat API. + * @example gpt-3.5-turbo + * @enum {string} + */ + model: "gpt-4" | "gpt-4-0613" | "gpt-4-32k" | "gpt-4-32k-0613" | "gpt-3.5-turbo" | "gpt-3.5-turbo-16k" | "gpt-3.5-turbo-0613" | "gpt-3.5-turbo-16k-0613"; + /** @description A list of messages comprising the conversation so far. [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb). */ + messages: (components["schemas"]["ChatCompletionRequestMessage"])[]; + /** @description A list of functions the model may generate JSON inputs for. */ + functions?: (components["schemas"]["ChatCompletionFunctions"])[]; + /** @description Controls how the model responds to function calls. "none" means the model does not call a function, and responds to the end-user. "auto" means the model can pick between an end-user or calling a function. Specifying a particular function via `{"name":\ "my_function"}` forces the model to call that function. "none" is the default when no functions are present. "auto" is the default if functions are present. */ + function_call?: OneOf<["none" | "auto", { + /** @description The name of the function to call. */ + name: string; + }]>; + /** + * @description What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + * + * We generally recommend altering this or `top_p` but not both. + * + * @default 1 + * @example 1 + */ + temperature?: number | null; + /** + * @description An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. + * + * We generally recommend altering this or `temperature` but not both. + * + * @default 1 + * @example 1 + */ + top_p?: number | null; + /** + * @description How many chat completion choices to generate for each input message. + * @default 1 + * @example 1 + */ + n?: number | null; + /** + * @description If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb). + * + * @default false + */ + stream?: boolean | null; + /** + * @description Up to 4 sequences where the API will stop generating further tokens. + * + * @default null + */ + stop?: (string | null) | (string)[]; + /** + * @description The maximum number of [tokens](/tokenizer) to generate in the chat completion. + * + * The total length of input tokens and generated tokens is limited by the model's context length. [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb) for counting tokens. + * + * @default inf + */ + max_tokens?: number; + /** + * @description Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. + * + * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details) + * + * @default 0 + */ + presence_penalty?: number | null; + /** + * @description Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + * + * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details) + * + * @default 0 + */ + frequency_penalty?: number | null; + /** + * @description Modify the likelihood of specified tokens appearing in the completion. + * + * Accepts a json object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. + * + * @default null + */ + logit_bias?: Record | null; + /** + * @description A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids). + * + * @example user-1234 + */ + user?: string; + }; + ChatCompletionRequestMessage: { + /** + * @description The role of the messages author. One of `system`, `user`, `assistant`, or `function`. + * @enum {string} + */ + role: "system" | "user" | "assistant" | "function"; + /** @description The contents of the message. `content` is required for all messages except assistant messages with function calls. */ + content?: string; + /** @description The name of the author of this message. `name` is required if role is `function`, and it should be the name of the function whose response is in the `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of 64 characters. */ + name?: string; + /** @description The name and arguments of a function that should be called, as generated by the model. */ + function_call?: { + /** @description The name of the function to call. */ + name?: string; + /** @description The arguments to call the function with, as generated by the model in JSON format. Note that the model does not always generate valid JSON, and may hallucinate parameters not defined by your function schema. Validate the arguments in your code before calling your function. */ + arguments?: string; + }; + }; + ChatCompletionFunctions: { + /** @description The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64. */ + name: string; + /** @description The description of what the function does. */ + description?: string; + parameters?: components["schemas"]["ChatCompletionFunctionParameters"]; + }; + /** @description The parameters the functions accepts, described as a JSON Schema object. See the [guide](/docs/guides/gpt/function-calling) for examples, and the [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for documentation about the format. */ + ChatCompletionFunctionParameters: { + [key: string]: unknown; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} + +type external = Record; + +type operations = Record; diff --git a/src/codegen/tsconfig.json b/src/codegen/tsconfig.json new file mode 100644 index 0000000..15c6db1 --- /dev/null +++ b/src/codegen/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "nodenext" + } +} diff --git a/src/components/OutputsTable/OutputCell/OutputCell.tsx b/src/components/OutputsTable/OutputCell/OutputCell.tsx index 79bf0e6..6f0f615 100644 --- a/src/components/OutputsTable/OutputCell/OutputCell.tsx +++ b/src/components/OutputsTable/OutputCell/OutputCell.tsx @@ -10,8 +10,6 @@ import { type ChatCompletion } from "openai/resources/chat"; import { generateChannel } from "~/utils/generateChannel"; import { isObject } from "lodash"; import useSocket from "~/utils/useSocket"; -import { type JSONSerializable } from "~/server/types"; -import { getModelName } from "~/server/utils/getModelName"; import { OutputStats } from "./OutputStats"; import { ErrorHandler } from "./ErrorHandler"; @@ -36,10 +34,12 @@ export default function OutputCell({ if (!templateHasVariables) disabledReason = "Add a value to the scenario variables to see output"; - if (variant.config === null || Object.keys(variant.config).length === 0) - disabledReason = "Save your prompt variant to see output"; + // if (variant.config === null || Object.keys(variant.config).length === 0) + // disabledReason = "Save your prompt variant to see output"; - const model = getModelName(variant.config as JSONSerializable); + // const model = getModelName(variant.config as JSONSerializable); + // TODO: Temporarily hardcoding this while we get other stuff working + const model = "gpt-3.5-turbo"; const outputMutation = api.outputs.get.useMutation(); diff --git a/src/components/OutputsTable/ScenarioEditor.tsx b/src/components/OutputsTable/ScenarioEditor.tsx index 38115f2..ae97ccc 100644 --- a/src/components/OutputsTable/ScenarioEditor.tsx +++ b/src/components/OutputsTable/ScenarioEditor.tsx @@ -107,7 +107,7 @@ export default function ScenarioEditor({ cursor: "pointer", }} > - + state.drawerOpen); - const closeDrawer = useStore((state) => state.closeDrawer); + const isOpen = useAppStore((state) => state.drawerOpen); + const closeDrawer = useAppStore((state) => state.closeDrawer); return ( diff --git a/src/components/OutputsTable/VariantConfigEditor.tsx b/src/components/OutputsTable/VariantEditor.tsx similarity index 58% rename from src/components/OutputsTable/VariantConfigEditor.tsx rename to src/components/OutputsTable/VariantEditor.tsx index 2017aee..3aa5eed 100644 --- a/src/components/OutputsTable/VariantConfigEditor.tsx +++ b/src/components/OutputsTable/VariantEditor.tsx @@ -1,66 +1,67 @@ import { Box, Button, HStack, Tooltip, useToast } from "@chakra-ui/react"; -import { useMonaco } from "@monaco-editor/react"; -import { useRef, useEffect, useState, useCallback, useMemo } from "react"; +import { useRef, useEffect, useState, useCallback } from "react"; import { useHandledAsyncCallback, useModifierKeyLabel } from "~/utils/hooks"; import { type PromptVariant } from "./types"; -import { type JSONSerializable } from "~/server/types"; import { api } from "~/utils/api"; -import openaiSchema from "~/codegen/openai.schema.json"; - -let isEditorConfigured = false; +import { useAppStore } from "~/state/store"; +// import openAITypes from "~/codegen/openai.types.ts.txt"; export default function VariantConfigEditor(props: { variant: PromptVariant }) { - const monaco = useMonaco(); + const monaco = useAppStore.use.variantEditor.monaco(); const editorRef = useRef["editor"]["create"]> | null>(null); const [editorId] = useState(() => `editor_${Math.random().toString(36).substring(7)}`); const [isChanged, setIsChanged] = useState(false); - const savedConfig = useMemo( - () => JSON.stringify(props.variant.config, null, 2), - [props.variant.config], - ); - const savedConfigRef = useRef(savedConfig); + const lastSavedFn = props.variant.constructFn; const modifierKey = useModifierKeyLabel(); const checkForChanges = useCallback(() => { if (!editorRef.current) return; const currentConfig = editorRef.current.getValue(); - setIsChanged(currentConfig !== savedConfigRef.current); - }, []); + setIsChanged(currentConfig !== lastSavedFn); + }, [lastSavedFn]); - const replaceWithConfig = api.promptVariants.replaceWithConfig.useMutation(); + const replaceVariant = api.promptVariants.replaceVariant.useMutation(); const utils = api.useContext(); const toast = useToast(); const [onSave] = useHandledAsyncCallback(async () => { - const currentConfig = editorRef.current?.getValue(); - if (!currentConfig) return; + const currentFn = editorRef.current?.getValue(); + if (!currentFn) return; - let parsedConfig: JSONSerializable; - try { - parsedConfig = JSON.parse(currentConfig) as JSONSerializable; - } catch (e) { + // Check if the editor has any typescript errors + const model = editorRef.current?.getModel(); + if (!model) return; + + const markers = monaco?.editor.getModelMarkers({ resource: model.uri }); + const hasErrors = markers?.some((m) => m.severity === monaco?.MarkerSeverity.Error); + + if (hasErrors) { toast({ - title: "Invalid JSON", - description: "Please fix the JSON before saving.", + title: "Invalid TypeScript", + description: "Please fix the TypeScript errors before saving.", status: "error", }); return; } - if (parsedConfig === null) { + // Make sure the user defined the prompt with the string "prompt\w*=" somewhere + const promptRegex = /prompt\s*=/; + if (!promptRegex.test(currentFn)) { + console.log("no prompt"); + console.log(currentFn); toast({ - title: "Invalid JSON", - description: "Please fix the JSON before saving.", + title: "Missing prompt", + description: "Please define the prompt (eg. `prompt = { ...`).", status: "error", }); return; } - await replaceWithConfig.mutateAsync({ + await replaceVariant.mutateAsync({ id: props.variant.id, - config: currentConfig, + constructFn: currentFn, }); await utils.promptVariants.list.invalidate(); @@ -70,37 +71,11 @@ export default function VariantConfigEditor(props: { variant: PromptVariant }) { useEffect(() => { if (monaco) { - if (!isEditorConfigured) { - monaco.editor.defineTheme("customTheme", { - base: "vs", - inherit: true, - rules: [], - colors: { - "editor.background": "#fafafa", - }, - }); - monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ - validate: true, - schemas: [ - { - uri: "https://api.openai.com/v1", - fileMatch: ["*"], - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - $ref: "#/components/schemas/CreateChatCompletionRequest", - components: openaiSchema.components, - }, - }, - ], - }); - isEditorConfigured = true; - } - const container = document.getElementById(editorId) as HTMLElement; editorRef.current = monaco.editor.create(container, { - value: savedConfig, - language: "json", + value: lastSavedFn, + language: "typescript", theme: "customTheme", lineNumbers: "off", minimap: { enabled: false }, @@ -114,6 +89,7 @@ export default function VariantConfigEditor(props: { variant: PromptVariant }) { }, wordWrapBreakAfterCharacters: "", wordWrapBreakBeforeCharacters: "", + quickSuggestions: true, }); editorRef.current.onDidFocusEditorText(() => { @@ -141,17 +117,17 @@ export default function VariantConfigEditor(props: { variant: PromptVariant }) { /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [monaco, editorId]); - useEffect(() => { - const savedConfigChanged = savedConfigRef.current !== savedConfig; + // useEffect(() => { + // const savedConfigChanged = lastSavedFn !== savedConfig; - savedConfigRef.current = savedConfig; + // lastSavedFn = savedConfig; - if (savedConfigChanged && editorRef.current?.getValue() !== savedConfig) { - editorRef.current?.setValue(savedConfig); - } + // if (savedConfigChanged && editorRef.current?.getValue() !== savedConfig) { + // editorRef.current?.setValue(savedConfig); + // } - checkForChanges(); - }, [savedConfig, checkForChanges]); + // checkForChanges(); + // }, [savedConfig, checkForChanges]); return ( @@ -162,7 +138,7 @@ export default function VariantConfigEditor(props: { variant: PromptVariant }) { colorScheme="gray" size="sm" onClick={() => { - editorRef.current?.setValue(savedConfig); + editorRef.current?.setValue(lastSavedFn); checkForChanges(); }} > diff --git a/src/components/OutputsTable/index.tsx b/src/components/OutputsTable/index.tsx index 9a81740..e8cd365 100644 --- a/src/components/OutputsTable/index.tsx +++ b/src/components/OutputsTable/index.tsx @@ -3,12 +3,12 @@ import { api } from "~/utils/api"; import NewScenarioButton from "./NewScenarioButton"; import NewVariantButton from "./NewVariantButton"; import ScenarioRow from "./ScenarioRow"; -import VariantConfigEditor from "./VariantConfigEditor"; +import VariantConfigEditor from "./VariantEditor"; import VariantHeader from "./VariantHeader"; import { cellPadding } from "../constants"; import { BsPencil } from "react-icons/bs"; -import { useStore } from "~/utils/store"; import VariantStats from "./VariantStats"; +import { useAppStore } from "~/state/store"; const stickyHeaderStyle: SystemStyleObject = { position: "sticky", @@ -22,7 +22,7 @@ export default function OutputsTable({ experimentId }: { experimentId: string | { experimentId: experimentId as string }, { enabled: !!experimentId }, ); - const openDrawer = useStore((s) => s.openDrawer); + const openDrawer = useAppStore((s) => s.openDrawer); const scenarios = api.scenarios.list.useQuery( { experimentId: experimentId as string }, @@ -57,7 +57,7 @@ export default function OutputsTable({ experimentId }: { experimentId: string | py={cellPadding.y} // TODO: This is a hack to get the sticky header to work. It's not ideal because it's not responsive to the height of the header, // so if the header height changes, this will need to be updated. - sx={{...stickyHeaderStyle, top: "-337px"}} + sx={{ ...stickyHeaderStyle, top: "-337px" }} > diff --git a/src/pages/experiments/[id].tsx b/src/pages/experiments/[id].tsx index 0fa4847..4d5e3a7 100644 --- a/src/pages/experiments/[id].tsx +++ b/src/pages/experiments/[id].tsx @@ -29,7 +29,8 @@ import SettingsDrawer from "~/components/OutputsTable/SettingsDrawer"; import AppShell from "~/components/nav/AppShell"; import { api } from "~/utils/api"; import { useExperiment, useHandledAsyncCallback } from "~/utils/hooks"; -import { useStore } from "~/utils/store"; +import { useAppStore } from "~/state/store"; +import { useSyncVariantEditor } from "~/state/sync"; const DeleteButton = () => { const experiment = useExperiment(); @@ -94,7 +95,8 @@ export default function Experiment() { const router = useRouter(); const experiment = useExperiment(); const utils = api.useContext(); - const openDrawer = useStore((s) => s.openDrawer); + const openDrawer = useAppStore((s) => s.openDrawer); + useSyncVariantEditor(); const [label, setLabel] = useState(experiment.data?.label || ""); useEffect(() => { diff --git a/src/server/api/autogen.ts b/src/server/api/autogen.ts index 5fe56cd..516599a 100644 --- a/src/server/api/autogen.ts +++ b/src/server/api/autogen.ts @@ -70,13 +70,10 @@ export const autogenerateScenarioValues = async ( }, ]; - const promptText = JSON.stringify(prompt.config); - if (variables.some((variable) => promptHasVariable(promptText, variable.label))) { - messages.push({ - role: "user", - content: `Prompt template:\n---\n${promptText}`, - }); - } + messages.push({ + role: "user", + content: `Prompt constructor function:\n---\n${prompt.constructFn}`, + }); existingScenarios .map( diff --git a/src/server/api/routers/experiments.router.ts b/src/server/api/routers/experiments.router.ts index 886952b..21e6b52 100644 --- a/src/server/api/routers/experiments.router.ts +++ b/src/server/api/routers/experiments.router.ts @@ -1,6 +1,7 @@ import { z } from "zod"; import { createTRPCRouter, publicProcedure } from "~/server/api/trpc"; import { prisma } from "~/server/db"; +import dedent from "dedent"; export const experimentsRouter = createTRPCRouter({ list: publicProcedure.query(async () => { @@ -69,16 +70,11 @@ export const experimentsRouter = createTRPCRouter({ experimentId: exp.id, label: "Prompt Variant 1", sortIndex: 0, - config: { + constructFn: dedent`prompt = { model: "gpt-3.5-turbo-0613", stream: true, - messages: [ - { - role: "system", - content: "Return 'Ready to go!'", - }, - ], - }, + messages: [{ role: "system", content: "Return 'Ready to go!'" }], + }`, }, }), prisma.testScenario.create({ diff --git a/src/server/api/routers/modelOutputs.router.ts b/src/server/api/routers/modelOutputs.router.ts index 7b66038..848305d 100644 --- a/src/server/api/routers/modelOutputs.router.ts +++ b/src/server/api/routers/modelOutputs.router.ts @@ -1,12 +1,11 @@ import { z } from "zod"; import { createTRPCRouter, publicProcedure } from "~/server/api/trpc"; import { prisma } from "~/server/db"; -import { fillTemplateJson, type VariableMap } from "~/server/utils/fillTemplate"; -import { type JSONSerializable } from "~/server/types"; import crypto from "crypto"; import type { Prisma } from "@prisma/client"; import { reevaluateVariant } from "~/server/utils/evaluations"; import { getCompletion } from "~/server/utils/getCompletion"; +import { constructPrompt } from "~/server/utils/constructPrompt"; export const modelOutputsRouter = createTRPCRouter({ get: publicProcedure @@ -44,15 +43,9 @@ export const modelOutputsRouter = createTRPCRouter({ if (!variant || !scenario) return null; - const filledTemplate = fillTemplateJson( - variant.config as JSONSerializable, - scenario.variableValues as VariableMap, - ); + const prompt = await constructPrompt(variant, scenario); - const inputHash = crypto - .createHash("sha256") - .update(JSON.stringify(filledTemplate)) - .digest("hex"); + const inputHash = crypto.createHash("sha256").update(JSON.stringify(prompt)).digest("hex"); // TODO: we should probably only use this if temperature=0 const existingResponse = await prisma.modelOutput.findFirst({ @@ -72,7 +65,7 @@ export const modelOutputsRouter = createTRPCRouter({ }; } else { try { - modelResponse = await getCompletion(filledTemplate, input.channel); + modelResponse = await getCompletion(prompt, input.channel); } catch (e) { console.error(e); throw e; diff --git a/src/server/api/routers/promptVariants.router.ts b/src/server/api/routers/promptVariants.router.ts index 12c384d..6e10ea6 100644 --- a/src/server/api/routers/promptVariants.router.ts +++ b/src/server/api/routers/promptVariants.router.ts @@ -1,8 +1,6 @@ import { z } from "zod"; import { createTRPCRouter, publicProcedure } from "~/server/api/trpc"; import { prisma } from "~/server/db"; -import { type OpenAIChatConfig } from "~/server/types"; -import { getModelName } from "~/server/utils/getModelName"; import { recordExperimentUpdated } from "~/server/utils/recordExperimentUpdated"; import { calculateTokenCost } from "~/utils/calculateTokenCost"; @@ -59,7 +57,9 @@ export const promptVariantsRouter = createTRPCRouter({ }, }); - const model = getModelName(variant.config); + // TODO: fix this + const model = "gpt-3.5-turbo-0613"; + // const model = getModelName(variant.config); const promptTokens = overallTokens._sum?.promptTokens ?? 0; const overallPromptCost = calculateTokenCost(model, promptTokens); @@ -105,13 +105,13 @@ export const promptVariantsRouter = createTRPCRouter({ experimentId: input.experimentId, label: `Prompt Variant ${largestSortIndex + 2}`, sortIndex: (lastVariant?.sortIndex ?? 0) + 1, - config: lastVariant?.config ?? {}, + constructFn: lastVariant?.constructFn ?? "", }, }); const [newVariant] = await prisma.$transaction([ createNewVariantAction, - recordExperimentUpdated(input.experimentId) + recordExperimentUpdated(input.experimentId), ]); return newVariant; @@ -143,12 +143,12 @@ export const promptVariantsRouter = createTRPCRouter({ }, data: input.updates, }); - + const [updatedPromptVariant] = await prisma.$transaction([ updatePromptVariantAction, - recordExperimentUpdated(existing.experimentId) + recordExperimentUpdated(existing.experimentId), ]); - + return updatedPromptVariant; }), @@ -159,7 +159,7 @@ export const promptVariantsRouter = createTRPCRouter({ }), ) .mutation(async ({ input }) => { - const updatedPromptVariant = await prisma.promptVariant.update({ + const updatedPromptVariant = await prisma.promptVariant.update({ where: { id: input.id }, data: { visible: false, experiment: { update: { updatedAt: new Date() } } }, }); @@ -167,11 +167,11 @@ export const promptVariantsRouter = createTRPCRouter({ return updatedPromptVariant; }), - replaceWithConfig: publicProcedure + replaceVariant: publicProcedure .input( z.object({ id: z.string(), - config: z.string(), + constructFn: z.string(), }), ) .mutation(async ({ input }) => { @@ -181,13 +181,6 @@ export const promptVariantsRouter = createTRPCRouter({ }, }); - let parsedConfig; - try { - parsedConfig = JSON.parse(input.config) as OpenAIChatConfig; - } catch (e) { - throw new Error(`Invalid JSON: ${(e as Error).message}`); - } - if (!existing) { throw new Error(`Prompt Variant with id ${input.id} does not exist`); } @@ -199,7 +192,7 @@ export const promptVariantsRouter = createTRPCRouter({ label: existing.label, sortIndex: existing.sortIndex, uiId: existing.uiId, - config: parsedConfig, + constructFn: input.constructFn, }, }); @@ -218,7 +211,7 @@ export const promptVariantsRouter = createTRPCRouter({ await prisma.$transaction([ hideOldVariantsAction, - recordExperimentUpdated(existing.experimentId) + recordExperimentUpdated(existing.experimentId), ]); return newVariant; diff --git a/src/server/api/routers/scenarios.router.ts b/src/server/api/routers/scenarios.router.ts index 601b831..dbc2096 100644 --- a/src/server/api/routers/scenarios.router.ts +++ b/src/server/api/routers/scenarios.router.ts @@ -50,12 +50,12 @@ export const scenariosRouter = createTRPCRouter({ await prisma.$transaction([ createNewScenarioAction, - recordExperimentUpdated(input.experimentId) + recordExperimentUpdated(input.experimentId), ]); }), hide: publicProcedure.input(z.object({ id: z.string() })).mutation(async ({ input }) => { - const hiddenScenario = await prisma.testScenario.update({ + const hiddenScenario = await prisma.testScenario.update({ where: { id: input.id }, data: { visible: false, experiment: { update: { updatedAt: new Date() } } }, }); diff --git a/src/server/utils/constructPrompt.test.ts b/src/server/utils/constructPrompt.test.ts new file mode 100644 index 0000000..78c485f --- /dev/null +++ b/src/server/utils/constructPrompt.test.ts @@ -0,0 +1,17 @@ +import { test } from "vitest"; +import { constructPrompt } from "./constructPrompt"; + +test.skip("constructPrompt", async () => { + const constructed = await constructPrompt( + { + constructFn: `prompt = { "fooz": "bar" }`, + }, + { + variableValues: { + foo: "bar", + }, + }, + ); + + console.log(constructed); +}); diff --git a/src/server/utils/constructPrompt.ts b/src/server/utils/constructPrompt.ts new file mode 100644 index 0000000..30eb5e6 --- /dev/null +++ b/src/server/utils/constructPrompt.ts @@ -0,0 +1,37 @@ +import { type PromptVariant, type TestScenario } from "@prisma/client"; +import ivm from "isolated-vm"; +import { type JSONSerializable } from "../types"; + +const isolate = new ivm.Isolate({ memoryLimit: 128 }); + +export async function constructPrompt( + variant: Pick, + testScenario: Pick, +): Promise { + const scenario = testScenario.variableValues as JSONSerializable; + + const code = ` + const scenario = ${JSON.stringify(scenario, null, 2)}; + let prompt + + ${variant.constructFn} + + global.prompt = prompt; + `; + + console.log("code is", code); + + const context = await isolate.createContext(); + + const jail = context.global; + await jail.set("global", jail.derefInto()); + + const script = await isolate.compileScript(code); + + await script.run(context); + const promptReference = (await context.global.get("prompt")) as ivm.Reference; + + const prompt = await promptReference.copy(); // Get the actual value from the isolate + + return prompt as JSONSerializable; +} diff --git a/src/server/utils/evaluations.ts b/src/server/utils/evaluations.ts index 24d519a..690cad8 100644 --- a/src/server/utils/evaluations.ts +++ b/src/server/utils/evaluations.ts @@ -13,7 +13,11 @@ export const reevaluateVariant = async (variantId: string) => { }); const modelOutputs = await prisma.modelOutput.findMany({ - where: { promptVariantId: variantId, statusCode: { notIn: [429] }, testScenario: { visible: true } }, + where: { + promptVariantId: variantId, + statusCode: { notIn: [429] }, + testScenario: { visible: true }, + }, include: { testScenario: true }, }); @@ -96,4 +100,4 @@ export const reevaluateAll = async (experimentId: string) => { }); await Promise.all(evaluations.map(reevaluateEvaluation)); -} +}; diff --git a/src/server/utils/openai.ts b/src/server/utils/openai.ts index c975d60..f43d350 100644 --- a/src/server/utils/openai.ts +++ b/src/server/utils/openai.ts @@ -8,8 +8,6 @@ import { type CompletionCreateParams, } from "openai/resources/chat"; -// console.log("creating openai client"); - export const openai = new OpenAI({ apiKey: env.OPENAI_API_KEY }); export const mergeStreamedChunks = ( diff --git a/src/state/createSelectors.ts b/src/state/createSelectors.ts new file mode 100644 index 0000000..9985a92 --- /dev/null +++ b/src/state/createSelectors.ts @@ -0,0 +1,35 @@ +import { type StoreApi, type UseBoundStore } from "zustand"; + +type NestedSelectors = { + [K in keyof T]: T[K] extends object + ? { [NestedK in keyof T[K]]: () => T[K][NestedK] } + : () => T[K]; +}; + +type WithSelectors = S extends { getState: () => infer T } + ? S & { use: NestedSelectors } + : never; + +// Adapted from https://docs.pmnd.rs/zustand/guides/auto-generating-selectors + +/* eslint-disable */ + +export const createSelectors = >>(_store: S) => { + const store = _store as WithSelectors; + store.use = {}; + for (const k of Object.keys(store.getState())) { + // @ts-expect-error black magic + const stateValue = store.getState()[k]; + if (typeof stateValue === "object" && stateValue !== null) { + (store.use as any)[k] = {}; + for (const nestedK of Object.keys(stateValue)) { + // @ts-expect-error black magic + (store.use as any)[k][nestedK] = () => store((s) => s[k][nestedK as keyof (typeof s)[k]]); + } + } else { + (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]); + } + } + + return store; +}; diff --git a/src/state/store.ts b/src/state/store.ts new file mode 100644 index 0000000..27fb902 --- /dev/null +++ b/src/state/store.ts @@ -0,0 +1,35 @@ +import { type StateCreator, create } from "zustand"; +import { immer } from "zustand/middleware/immer"; +import { createSelectors } from "./createSelectors"; +import { type VariantEditorSlice, createVariantEditorSlice } from "./variantEditor.slice"; + +export type State = { + drawerOpen: boolean; + openDrawer: () => void; + closeDrawer: () => void; + variantEditor: VariantEditorSlice; +}; + +export type SliceCreator = StateCreator; + +export type SetFn = Parameters>[0]; +export type GetFn = Parameters>[1]; + +const useBaseStore = create( + immer((set, get, ...rest) => ({ + drawerOpen: false, + openDrawer: () => + set((state) => { + state.drawerOpen = true; + }), + closeDrawer: () => + set((state) => { + state.drawerOpen = false; + }), + variantEditor: createVariantEditorSlice(set, get, ...rest), + })), +); + +export const useAppStore = createSelectors(useBaseStore); + +useAppStore.getState().variantEditor.loadMonaco().catch(console.error); diff --git a/src/state/sync.ts b/src/state/sync.ts new file mode 100644 index 0000000..d5f4d54 --- /dev/null +++ b/src/state/sync.ts @@ -0,0 +1,17 @@ +import { useEffect } from "react"; +import { api } from "~/utils/api"; +import { useExperiment } from "~/utils/hooks"; +import { useAppStore } from "./store"; + +export function useSyncVariantEditor() { + const experiment = useExperiment(); + const scenarios = api.scenarios.list.useQuery( + { experimentId: experiment.data?.id ?? "" }, + { enabled: !!experiment.data?.id }, + ); + useEffect(() => { + if (scenarios.data) { + useAppStore.getState().variantEditor.setScenarios(scenarios.data); + } + }, [scenarios.data]); +} diff --git a/src/state/variantEditor.slice.ts b/src/state/variantEditor.slice.ts new file mode 100644 index 0000000..620456f --- /dev/null +++ b/src/state/variantEditor.slice.ts @@ -0,0 +1,87 @@ +import { type RouterOutputs } from "~/utils/api"; +import { type SliceCreator } from "./store"; +import loader from "@monaco-editor/loader"; +import openAITypes from "~/codegen/openai.types.ts.txt"; + +export type VariantEditorSlice = { + monaco: null | ReturnType; + loadMonaco: () => Promise; + scenarios: RouterOutputs["scenarios"]["list"]; + updateScenariosModel: () => void; + setScenarios: (scenarios: RouterOutputs["scenarios"]["list"]) => void; +}; + +export const createVariantEditorSlice: SliceCreator = (set, get) => ({ + monaco: loader.__getMonacoInstance(), + loadMonaco: async () => { + const monaco = await loader.init(); + + monaco.editor.defineTheme("customTheme", { + base: "vs", + inherit: true, + rules: [], + colors: { + "editor.background": "#fafafa", + }, + }); + + monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ + allowNonTsExtensions: true, + lib: ["esnext"], + }); + + monaco.editor.createModel( + ` + ${openAITypes} + + declare var prompt: components["schemas"]["CreateChatCompletionRequest"]; + `, + "typescript", + monaco.Uri.parse("file:///openai.types.ts"), + ); + + set((state) => { + state.variantEditor.monaco = monaco; + }); + get().variantEditor.updateScenariosModel(); + }, + scenarios: [], + // scenariosModel: null, + setScenarios: (scenarios) => { + set((state) => { + state.variantEditor.scenarios = scenarios; + }); + + get().variantEditor.updateScenariosModel(); + }, + + updateScenariosModel: () => { + const monaco = get().variantEditor.monaco; + if (!monaco) return; + + const modelContents = ` + const scenarios = ${JSON.stringify( + get().variantEditor.scenarios.map((s) => s.variableValues), + null, + 2, + )} as const; + + type Scenario = typeof scenarios[number]; + declare var scenario: Scenario | null; + `; + + console.log(modelContents); + + const scenariosModel = monaco.editor.getModel(monaco.Uri.parse("file:///scenarios.ts")); + + if (scenariosModel) { + scenariosModel.setValue(modelContents); + } else { + monaco.editor.createModel( + modelContents, + "typescript", + monaco.Uri.parse("file:///scenarios.ts"), + ); + } + }, +}); diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 0000000..e0938dc --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1,6 @@ +// Any import that ends in .txt should be treated as a string + +declare module "*.txt" { + const content: string; + export default content; +} diff --git a/src/utils/store.ts b/src/utils/store.ts deleted file mode 100644 index 3b200e6..0000000 --- a/src/utils/store.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { create } from "zustand"; - -type StoreState = { - drawerOpen: boolean; - openDrawer: () => void; - closeDrawer: () => void; -}; - -export const useStore = create()((set) => ({ - drawerOpen: false, - openDrawer: () => set({ drawerOpen: true }), - closeDrawer: () => set({ drawerOpen: false }), -}));