From b23a101c0f14875994a4d03378e603c3df938948 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Thu, 22 Jun 2023 16:52:25 -0700 Subject: [PATCH] Modify data models, add slug and just kebab dependency, seed data for mechanics and categories if none exist in the DB. --- package.json | 17 +- pnpm-lock.yaml | 306 ++++++----- prisma/categories.json | 859 ++++++++++++++++++++++++++++++ prisma/mechanics.json | 1129 ++++++++++++++++++++++++++++++++++++++++ prisma/schema.prisma | 72 +-- prisma/seed.ts | 35 +- 6 files changed, 2247 insertions(+), 171 deletions(-) create mode 100644 prisma/categories.json create mode 100644 prisma/mechanics.json diff --git a/package.json b/package.json index e5014ff..5200391 100644 --- a/package.json +++ b/package.json @@ -40,15 +40,15 @@ "postcss": "^8.4.24", "postcss-import": "^15.1.0", "postcss-load-config": "^4.0.1", - "postcss-preset-env": "^8.5.0", + "postcss-preset-env": "^8.5.1", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.1", - "prisma": "^4.16.0", - "sass": "^1.63.4", - "svelte": "^3.59.1", + "prisma": "^4.16.1", + "sass": "^1.63.6", + "svelte": "^3.59.2", "svelte-check": "^2.10.3", "svelte-preprocess": "^5.0.4", - "sveltekit-superforms": "^1.1.0", + "sveltekit-superforms": "^1.1.1", "ts-node": "^10.9.1", "tslib": "^2.5.3", "typescript": "^4.9.5", @@ -71,14 +71,15 @@ "@lucia-auth/adapter-mysql": "^1.1.1", "@lucia-auth/adapter-prisma": "^2.0.0", "@lukeed/uuid": "^2.0.1", - "@prisma/client": "4.15.0", + "@prisma/client": "4.16.1", "@types/feather-icons": "^4.29.1", "cookie": "^0.5.0", "feather-icons": "^4.29.0", - "iconify-icon": "^1.0.7", + "iconify-icon": "^1.0.8", + "just-kebab-case": "^4.2.0", "loader": "^2.1.1", "lucia-auth": "^1.8.0", - "open-props": "^1.5.9", + "open-props": "^1.5.10", "svelte-lazy": "^1.2.1", "svelte-lazy-loader": "^1.0.0", "svelte-legos": "^0.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7367ea..c8633f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,13 +28,13 @@ dependencies: version: 1.1.1(lucia-auth@1.8.0) '@lucia-auth/adapter-prisma': specifier: ^2.0.0 - version: 2.0.0(@prisma/client@4.15.0)(lucia-auth@1.8.0) + version: 2.0.0(@prisma/client@4.16.1)(lucia-auth@1.8.0) '@lukeed/uuid': specifier: ^2.0.1 version: 2.0.1 '@prisma/client': - specifier: 4.15.0 - version: 4.15.0(prisma@4.16.0) + specifier: 4.16.1 + version: 4.16.1(prisma@4.16.1) '@types/feather-icons': specifier: ^4.29.1 version: 4.29.1 @@ -45,8 +45,11 @@ dependencies: specifier: ^4.29.0 version: 4.29.0 iconify-icon: - specifier: ^1.0.7 - version: 1.0.7 + specifier: ^1.0.8 + version: 1.0.8 + just-kebab-case: + specifier: ^4.2.0 + version: 4.2.0 loader: specifier: ^2.1.1 version: 2.1.1 @@ -54,20 +57,20 @@ dependencies: specifier: ^1.8.0 version: 1.8.0 open-props: - specifier: ^1.5.9 - version: 1.5.9 + specifier: ^1.5.10 + version: 1.5.10 svelte-lazy: specifier: ^1.2.1 - version: 1.2.1(svelte@3.59.1) + version: 1.2.1(svelte@3.59.2) svelte-lazy-loader: specifier: ^1.0.0 version: 1.0.0 svelte-legos: specifier: ^0.2.1 - version: 0.2.1(svelte@3.59.1) + version: 0.2.1(svelte@3.59.2) sveltekit-flash-message: specifier: ^0.11.3 - version: 0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.1) + version: 0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.2) zod-to-json-schema: specifier: ^3.21.2 version: 3.21.2(zod@3.21.4) @@ -78,10 +81,10 @@ devDependencies: version: 1.35.1 '@rgossiaux/svelte-headlessui': specifier: 1.0.2 - version: 1.0.2(svelte@3.59.1) + version: 1.0.2(svelte@3.59.2) '@rgossiaux/svelte-heroicons': specifier: ^0.1.2 - version: 0.1.2(svelte@3.59.1) + version: 0.1.2(svelte@3.59.2) '@sveltejs/adapter-auto': specifier: ^1.0.3 version: 1.0.3(@sveltejs/kit@1.20.4) @@ -90,7 +93,7 @@ devDependencies: version: 1.0.6(@sveltejs/kit@1.20.4) '@sveltejs/kit': specifier: ^1.20.4 - version: 1.20.4(svelte@3.59.1)(vite@4.3.9) + version: 1.20.4(svelte@3.59.2)(vite@4.3.9) '@types/cookie': specifier: ^0.5.1 version: 0.5.1 @@ -114,7 +117,7 @@ devDependencies: version: 8.8.0(eslint@8.43.0) eslint-plugin-svelte: specifier: ^2.31.0 - version: 2.31.0(eslint@8.43.0)(svelte@3.59.1)(ts-node@10.9.1) + version: 2.31.0(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -131,32 +134,32 @@ devDependencies: specifier: ^4.0.1 version: 4.0.1(postcss@8.4.24)(ts-node@10.9.1) postcss-preset-env: - specifier: ^8.5.0 - version: 8.5.0(postcss@8.4.24) + specifier: ^8.5.1 + version: 8.5.1(postcss@8.4.24) prettier: specifier: ^2.8.8 version: 2.8.8 prettier-plugin-svelte: specifier: ^2.10.1 - version: 2.10.1(prettier@2.8.8)(svelte@3.59.1) + version: 2.10.1(prettier@2.8.8)(svelte@3.59.2) prisma: - specifier: ^4.16.0 - version: 4.16.0 + specifier: ^4.16.1 + version: 4.16.1 sass: - specifier: ^1.63.4 - version: 1.63.4 + specifier: ^1.63.6 + version: 1.63.6 svelte: - specifier: ^3.59.1 - version: 3.59.1 + specifier: ^3.59.2 + version: 3.59.2 svelte-check: specifier: ^2.10.3 - version: 2.10.3(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1) + version: 2.10.3(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2) svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@4.9.5) + version: 5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5) sveltekit-superforms: - specifier: ^1.1.0 - version: 1.1.0(@sveltejs/kit@1.20.4)(svelte@3.59.1)(zod@3.21.4) + specifier: ^1.1.1 + version: 1.1.1(@sveltejs/kit@1.20.4)(svelte@3.59.2)(zod@3.21.4) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@18.16.18)(typescript@4.9.5) @@ -168,10 +171,10 @@ devDependencies: version: 4.9.5 vite: specifier: ^4.3.9 - version: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + version: 4.3.9(@types/node@18.16.18)(sass@1.63.6) vitest: specifier: ^0.25.3 - version: 0.25.8(sass@1.63.4) + version: 0.25.8(sass@1.63.6) zod: specifier: ^3.21.4 version: 3.21.4 @@ -220,6 +223,17 @@ packages: '@csstools/css-tokenizer': 2.1.1 dev: true + /@csstools/cascade-layer-name-parser@1.0.2(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1): + resolution: {integrity: sha512-xm7Mgwej/wBfLoK0K5LfntmPJzoULayl1XZY9JYgQgT29JiqNw++sLnx95u5y9zCihblzkyaRYJrsRMhIBzRdg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.1.1 + '@csstools/css-tokenizer': ^2.1.1 + dependencies: + '@csstools/css-parser-algorithms': 2.2.0(@csstools/css-tokenizer@2.1.1) + '@csstools/css-tokenizer': 2.1.1 + dev: true + /@csstools/color-helpers@2.1.0: resolution: {integrity: sha512-OWkqBa7PDzZuJ3Ha7T5bxdSVfSCfTq6K1mbAhbO1MD+GSULGjrp45i5RudyJOedstSarN/3mdwu9upJE7gDXfw==} engines: {node: ^14 || ^16 || >=18} @@ -296,14 +310,14 @@ packages: engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/media-query-list-parser@2.1.0(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1): - resolution: {integrity: sha512-MXkR+TeaS2q9IkpyO6jVCdtA/bfpABJxIrfkLswThFN8EZZgI2RfAHhm6sDNDuYV25d5+b8Lj1fpTccIcSLPsQ==} + /@csstools/media-query-list-parser@2.1.1(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1): + resolution: {integrity: sha512-pUjtFbaKbiFNjJo8pprrIaXLvQvWIlwPiFnRI4sEnc4F0NIGTOsw8kaJSR3CmZAKEvV8QYckovgAnWQC0bgLLQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.1.1 + '@csstools/css-parser-algorithms': ^2.2.0 '@csstools/css-tokenizer': ^2.1.1 dependencies: - '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1) + '@csstools/css-parser-algorithms': 2.2.0(@csstools/css-tokenizer@2.1.1) '@csstools/css-tokenizer': 2.1.1 dev: true @@ -430,28 +444,28 @@ packages: postcss: 8.4.24 dev: true - /@csstools/postcss-media-minmax@1.0.3(postcss@8.4.24): - resolution: {integrity: sha512-os7qe2HV/qBILKCGa/dl5AbpO6c+MZyunFBWPWJBrEVhulCYo13FgEWbhyERFM5FeJghiqYgJxM54oiJASpBnw==} + /@csstools/postcss-media-minmax@1.0.4(postcss@8.4.24): + resolution: {integrity: sha512-olnKTQk9+RMzpIpkjv55d44L4Ni02j8ZJoedJezQC5M03a56npcM1hx0apaTRG4Fz1wfPCQ0DBjQ8zsiJFelmA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.1(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1) - '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1) + '@csstools/css-calc': 1.1.1(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1) + '@csstools/css-parser-algorithms': 2.2.0(@csstools/css-tokenizer@2.1.1) '@csstools/css-tokenizer': 2.1.1 - '@csstools/media-query-list-parser': 2.1.0(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1) + '@csstools/media-query-list-parser': 2.1.1(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1) postcss: 8.4.24 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@1.0.3(postcss@8.4.24): - resolution: {integrity: sha512-JHdwBSNZsur/mJXwzuC/gxyekhfSdWJaTiSOhUITk2D8pYRYcjV1MZiCiWupQNfM2Qp2W7w1A/gEU6U/xlpIyA==} + /@csstools/postcss-media-queries-aspect-ratio-number-values@1.0.4(postcss@8.4.24): + resolution: {integrity: sha512-IwyTbyR8E2y3kh6Fhrs251KjKBJeUPV5GlnUKnpU70PRFEN2DolWbf2V4+o/B9+Oj77P/DullLTulWEQ8uFtAA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1) + '@csstools/css-parser-algorithms': 2.2.0(@csstools/css-tokenizer@2.1.1) '@csstools/css-tokenizer': 2.1.1 - '@csstools/media-query-list-parser': 2.1.0(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1) + '@csstools/media-query-list-parser': 2.1.1(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1) postcss: 8.4.24 dev: true @@ -1076,13 +1090,13 @@ packages: lucia-auth: 1.8.0 dev: false - /@lucia-auth/adapter-prisma@2.0.0(@prisma/client@4.15.0)(lucia-auth@1.8.0): + /@lucia-auth/adapter-prisma@2.0.0(@prisma/client@4.16.1)(lucia-auth@1.8.0): resolution: {integrity: sha512-8qxEcoVNJDbK8zXzyMK/4SHnLTaih0oNjTfp7l4ndRg5WI+eMgP3N0OUGQVaq3C5N0iIfkXxgj/ZGH8ZidwVeQ==} peerDependencies: '@prisma/client': ^4.2.0 lucia-auth: ^1.3.0 dependencies: - '@prisma/client': 4.15.0(prisma@4.16.0) + '@prisma/client': 4.16.1(prisma@4.16.1) lucia-auth: 1.8.0 dev: false @@ -1151,8 +1165,8 @@ packages: /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - /@prisma/client@4.15.0(prisma@4.16.0): - resolution: {integrity: sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw==} + /@prisma/client@4.16.1(prisma@4.16.1): + resolution: {integrity: sha512-CoDHu7Bt+NuDo40ijoeHP79EHtECsPBTy3yte5Yo3op8TqXt/kV0OT5OrsWewKvQGKFMHhYQ+ePed3zzjYdGAw==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -1161,32 +1175,32 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944 - prisma: 4.16.0 + '@prisma/engines-version': 4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c + prisma: 4.16.1 dev: false - /@prisma/engines-version@4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944: - resolution: {integrity: sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==} + /@prisma/engines-version@4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c: + resolution: {integrity: sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==} dev: false - /@prisma/engines@4.16.0: - resolution: {integrity: sha512-M6XoMRXnqL0rqZGQS8ZpNiHYG4G1fKBdoqW/oBtHnr1in5UYgerZqal3CXchmd6OBD/770PE9dtjQuqcilZJUA==} + /@prisma/engines@4.16.1: + resolution: {integrity: sha512-gpZG0kGGxfemgvK/LghHdBIz+crHkZjzszja94xp4oytpsXrgt/Ice82MvPsWMleVIniKuARrowtsIsim0PFJQ==} requiresBuild: true - /@rgossiaux/svelte-headlessui@1.0.2(svelte@3.59.1): + /@rgossiaux/svelte-headlessui@1.0.2(svelte@3.59.2): resolution: {integrity: sha512-sauopYTSivhzXe1kAvgawkhyYJcQlK8Li3p0d2OtcCIVprOzdbard5lbqWB4xHDv83zAobt2mR08oizO2poHLQ==} peerDependencies: svelte: ^3.44.0 dependencies: - svelte: 3.59.1 + svelte: 3.59.2 dev: true - /@rgossiaux/svelte-heroicons@0.1.2(svelte@3.59.1): + /@rgossiaux/svelte-heroicons@0.1.2(svelte@3.59.2): resolution: {integrity: sha512-c5Ep1QDvBo9HD/P0AxbXItDbn6x77fldCjjL0aBjNseUntV4fkdHkBde1IaLr8i0kmrhTSovjkIen8W83jUPzg==} peerDependencies: svelte: ^3.44.0 dependencies: - svelte: 3.59.1 + svelte: 3.59.2 dev: true /@rollup/pluginutils@4.2.1: @@ -1202,7 +1216,7 @@ packages: peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@sveltejs/kit': 1.20.4(svelte@3.59.1)(vite@4.3.9) + '@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) import-meta-resolve: 2.2.0 dev: true @@ -1211,7 +1225,7 @@ packages: peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@sveltejs/kit': 1.20.4(svelte@3.59.1)(vite@4.3.9) + '@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) '@vercel/nft': 0.22.6 esbuild: 0.16.8 transitivePeerDependencies: @@ -1219,7 +1233,7 @@ packages: - supports-color dev: true - /@sveltejs/kit@1.20.4(svelte@3.59.1)(vite@4.3.9): + /@sveltejs/kit@1.20.4(svelte@3.59.2)(vite@4.3.9): resolution: {integrity: sha512-MmAzIuMrP7A+8fqDVbxm6ekGHRHL/+Fk8sQPAzPG4G2TxUDtHdn/WcIxeEqHzARMf0OtGSC+VPyOSFuw2Cy2Mg==} engines: {node: ^16.14 || >=18} hasBin: true @@ -1228,7 +1242,7 @@ packages: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) + '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.2)(vite@4.3.9) '@types/cookie': 0.5.1 cookie: 0.5.0 devalue: 4.3.1 @@ -1239,13 +1253,13 @@ packages: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.2 - svelte: 3.59.1 + svelte: 3.59.2 undici: 5.22.0 - vite: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + vite: 4.3.9(@types/node@18.16.18)(sass@1.63.6) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.1)(vite@4.3.9): + /@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.2)(vite@4.3.9): resolution: {integrity: sha512-Cy1dUMcYCnDVV/hPLXa43YZJ2jGKVW5rA0xuNL9dlmYhT0yoS1g7+FOFSRlgk0BXKk/Oc7grs+8BVA5Iz2fr8A==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -1253,28 +1267,28 @@ packages: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) + '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.2)(vite@4.3.9) debug: 4.3.4 - svelte: 3.59.1 - vite: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + svelte: 3.59.2 + vite: 4.3.9(@types/node@18.16.18)(sass@1.63.6) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@2.4.1(svelte@3.59.1)(vite@4.3.9): + /@sveltejs/vite-plugin-svelte@2.4.1(svelte@3.59.2)(vite@4.3.9): resolution: {integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.1)(vite@4.3.9) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.2)(vite@4.3.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.0 - svelte: 3.59.1 - svelte-hmr: 0.15.2(svelte@3.59.1) - vite: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + svelte: 3.59.2 + svelte-hmr: 0.15.2(svelte@3.59.2) + vite: 4.3.9(@types/node@18.16.18)(sass@1.63.6) vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color @@ -1672,6 +1686,17 @@ packages: update-browserslist-db: 1.0.11(browserslist@4.21.5) dev: true + /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.438 + node-releases: 2.0.12 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true @@ -1691,6 +1716,10 @@ packages: resolution: {integrity: sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==} dev: true + /caniuse-lite@1.0.30001506: + resolution: {integrity: sha512-6XNEcpygZMCKaufIcgpQNZNf00GEqc7VQON+9Rd0K1bMYo8xhMZRAo5zpbnbMNizi4YNgIDAFrdykWsvY3H4Hw==} + dev: true + /canvas-confetti@1.6.0: resolution: {integrity: sha512-ej+w/m8Jzpv9Z7W7uJZer14Ke8P2ogsjg4ZMGIuq4iqUOqY2Jq8BNW42iGmNfRwREaaEfFIczLuZZiEVSYNHAA==} dev: false @@ -1908,6 +1937,10 @@ packages: resolution: {integrity: sha512-MrlFq/j+TYHOjeWsWGYfzevc25HNeJdsF6qaLFrqBTRWZQtWkb1myq/Q2veLWezVaa5OcSZ99CFwTT4aF4Mung==} dev: true + /electron-to-chromium@1.4.438: + resolution: {integrity: sha512-x94U0FhphEsHsOloCvlsujHCvoir0ZQ73ZAs/QN4PLx98uNvyEU79F75rq1db75Bx/atvuh7KPeuxelh+xfYJw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -1994,7 +2027,7 @@ packages: eslint: 8.43.0 dev: true - /eslint-plugin-svelte@2.31.0(eslint@8.43.0)(svelte@3.59.1)(ts-node@10.9.1): + /eslint-plugin-svelte@2.31.0(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1): resolution: {integrity: sha512-Q70jPFRraTkc/giPSfY7yuatmJcb5fPelWNplevqd45gfaJDjc3qXRtWQ6m9U5tWVVYERU9dcdUod294vwD8Gw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -2014,8 +2047,8 @@ packages: postcss-load-config: 3.1.4(postcss@8.4.24)(ts-node@10.9.1) postcss-safe-parser: 6.0.0(postcss@8.4.24) postcss-selector-parser: 6.0.13 - svelte: 3.59.1 - svelte-eslint-parser: 0.31.0(svelte@3.59.1) + svelte: 3.59.2 + svelte-eslint-parser: 0.31.0(svelte@3.59.2) transitivePeerDependencies: - supports-color - ts-node @@ -2357,8 +2390,8 @@ packages: - supports-color dev: true - /iconify-icon@1.0.7: - resolution: {integrity: sha512-MxaO3Jhf3f5ymPWGHR9x74f90TNKcq1D+B2iGucGhVtqAgbC9EtM06kKiTGH2CKELNnexckwhrA3/+OpT4HKFw==} + /iconify-icon@1.0.8: + resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} dependencies: '@iconify/types': 2.0.0 dev: false @@ -2471,6 +2504,10 @@ packages: resolution: {integrity: sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==} dev: true + /just-kebab-case@4.2.0: + resolution: {integrity: sha512-p2BdO7o4BI+pMun3J+dhaOfYan5JsZrw9wjshRjkWY9+p+u+kKSMhNWYnot2yHDR9CSahZ9iT3dcqJ+V72qHMw==} + dev: false + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -2699,6 +2736,10 @@ packages: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true + /node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + dev: true + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -2736,8 +2777,8 @@ packages: wrappy: 1.0.2 dev: true - /open-props@1.5.9: - resolution: {integrity: sha512-7cY+O+QPiLFcm1a/nnkSK7CHLIW55XBwnnKYS2ajGcWw/xmY990JkgPzYFbohOODyCGM6oJZ+XzRJF7207QqiA==} + /open-props@1.5.10: + resolution: {integrity: sha512-iE+B7Zo0ytgeUNI38uHiBrxF5Nnv3uX8AzogBXzf7wqeNyG6oqQEEBs1gnAZdRF+h7IRO0zOGM5d9/huiNFR+w==} dev: false /optionator@0.9.1: @@ -2870,16 +2911,16 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@9.1.4(postcss@8.4.24): - resolution: {integrity: sha512-4A7WEG3iIyKwfpxL5bkuSlHoHHGRTHl0212Z3uvpwJPyVfZJlkZAQNNgVC+oogrJgksDnfKyuuMbG6HafZPW8Q==} + /postcss-custom-media@9.1.5(postcss@8.4.24): + resolution: {integrity: sha512-GStyWMz7Qbo/Gtw1xVspzVSX8eipgNg4lpsO3CAeY4/A1mzok+RV6MCv3fg62trWijh/lYEj6vps4o8JcBBpDA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.2(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1) - '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1) + '@csstools/cascade-layer-name-parser': 1.0.2(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1) + '@csstools/css-parser-algorithms': 2.2.0(@csstools/css-tokenizer@2.1.1) '@csstools/css-tokenizer': 2.1.1 - '@csstools/media-query-list-parser': 2.1.0(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1) + '@csstools/media-query-list-parser': 2.1.1(@csstools/css-parser-algorithms@2.2.0)(@csstools/css-tokenizer@2.1.1) postcss: 8.4.24 dev: true @@ -3104,8 +3145,8 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@8.5.0(postcss@8.4.24): - resolution: {integrity: sha512-aqAbT5dXqYX5ZvicGKQpaW/eDEZFRfnhV6Hn1Jn2bCKEB9L2MgsTdnIsXsZyFUQflIV2wIs9HTEQgkH5duMCNg==} + /postcss-preset-env@8.5.1(postcss@8.4.24): + resolution: {integrity: sha512-qhWnJJjP6ArLUINWJ38t6Aftxnv9NW6cXK0NuwcLCcRilbuw72dSFLkCVUJeCfHGgJiKzX+pnhkGiki0PEynWg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -3121,8 +3162,8 @@ packages: '@csstools/postcss-logical-float-and-clear': 1.0.1(postcss@8.4.24) '@csstools/postcss-logical-resize': 1.0.1(postcss@8.4.24) '@csstools/postcss-logical-viewport-units': 1.0.3(postcss@8.4.24) - '@csstools/postcss-media-minmax': 1.0.3(postcss@8.4.24) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 1.0.3(postcss@8.4.24) + '@csstools/postcss-media-minmax': 1.0.4(postcss@8.4.24) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 1.0.4(postcss@8.4.24) '@csstools/postcss-nested-calc': 2.0.2(postcss@8.4.24) '@csstools/postcss-normalize-display-values': 2.0.1(postcss@8.4.24) '@csstools/postcss-oklab-function': 2.2.3(postcss@8.4.24) @@ -3134,7 +3175,7 @@ packages: '@csstools/postcss-trigonometric-functions': 2.1.1(postcss@8.4.24) '@csstools/postcss-unset-value': 2.0.1(postcss@8.4.24) autoprefixer: 10.4.14(postcss@8.4.24) - browserslist: 4.21.5 + browserslist: 4.21.9 css-blank-pseudo: 5.0.2(postcss@8.4.24) css-has-pseudo: 5.0.2(postcss@8.4.24) css-prefers-color-scheme: 8.0.2(postcss@8.4.24) @@ -3145,7 +3186,7 @@ packages: postcss-color-functional-notation: 5.1.0(postcss@8.4.24) postcss-color-hex-alpha: 9.0.2(postcss@8.4.24) postcss-color-rebeccapurple: 8.0.2(postcss@8.4.24) - postcss-custom-media: 9.1.4(postcss@8.4.24) + postcss-custom-media: 9.1.5(postcss@8.4.24) postcss-custom-properties: 13.2.0(postcss@8.4.24) postcss-custom-selectors: 7.1.3(postcss@8.4.24) postcss-dir-pseudo-class: 7.0.2(postcss@8.4.24) @@ -3240,14 +3281,14 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@3.59.1): + /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@3.59.2): resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 dependencies: prettier: 2.8.8 - svelte: 3.59.1 + svelte: 3.59.2 dev: true /prettier@2.8.8: @@ -3260,13 +3301,13 @@ packages: resolution: {integrity: sha512-db91Bf3pRGKDPz1lAqLFSJXeW13mulUJxhycysFpfXV5MIK7RgWWK2E5aPAa71s8TCzQUXxF5JOV42/iOs6QkA==} dev: false - /prisma@4.16.0: - resolution: {integrity: sha512-kSCwbTm3LCephyGfZMJYqBXpPJXdJStg5xwfzeFmR5C05zfkOURK9pQpJF6uUQvFWm3lI9ZMSNkObmFkAPnB+g==} + /prisma@4.16.1: + resolution: {integrity: sha512-C2Xm7yxHxjFjjscBEW4tmoraPHH/Vyu/A0XABdbaFtoiOZARsxvOM7rwc2iZ0qVxbh0bGBGBWZUSXO/52/nHBQ==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.16.0 + '@prisma/engines': 4.16.1 /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} @@ -3384,8 +3425,8 @@ packages: rimraf: 2.7.1 dev: true - /sass@1.63.4: - resolution: {integrity: sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ==} + /sass@1.63.6: + resolution: {integrity: sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -3539,7 +3580,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-check@2.10.3(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1): + /svelte-check@2.10.3(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2): resolution: {integrity: sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==} hasBin: true peerDependencies: @@ -3551,8 +3592,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 3.59.1 - svelte-preprocess: 4.10.7(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@4.9.5) + svelte: 3.59.2 + svelte-preprocess: 4.10.7(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/core' @@ -3567,7 +3608,7 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.31.0(svelte@3.59.1): + /svelte-eslint-parser@0.31.0(svelte@3.59.2): resolution: {integrity: sha512-/31RpBf/e3YjoFphjsyo3JRyN1r4UalGAGafXrZ6EJK4h4COOO0rbfBoen5byGsXnIJKsrlC1lkEd2Vzpq2IDg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3581,30 +3622,30 @@ packages: espree: 9.5.2 postcss: 8.4.24 postcss-scss: 4.0.6(postcss@8.4.24) - svelte: 3.59.1 + svelte: 3.59.2 dev: true - /svelte-hmr@0.15.2(svelte@3.59.1): + /svelte-hmr@0.15.2(svelte@3.59.2): resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0-next.0 dependencies: - svelte: 3.59.1 + svelte: 3.59.2 /svelte-lazy-loader@1.0.0: resolution: {integrity: sha512-AZD6R60vksyojn21FgXLglmBiBB9K5Dkdu0hdGrLbCaRCYT68IsWkZfRUqKhMx1IfzqWcZQ8X9y/f+Ih0oNQkQ==} dev: false - /svelte-lazy@1.2.1(svelte@3.59.1): + /svelte-lazy@1.2.1(svelte@3.59.2): resolution: {integrity: sha512-8L+GrU5p0ia/nLDeGDMTC+DtmbXlFcoaTPoSf8jIy1NoKicqSJXz5tjiu6GUsD7ra0RjgIvhQiLcdZYR9VECeA==} peerDependencies: svelte: 3.x dependencies: - svelte: 3.59.1 + svelte: 3.59.2 dev: false - /svelte-legos@0.2.1(svelte@3.59.1): + /svelte-legos@0.2.1(svelte@3.59.2): resolution: {integrity: sha512-M7IncWP2e8FaHzQN1DSzxLSoq/6aQYWZ93REZam9bYlvLEjdPGWLAYdpPNnnZtXlHco+o3zrgYTdwsyyS9beUQ==} peerDependencies: svelte: ^3.54.0 @@ -3612,10 +3653,10 @@ packages: canvas-confetti: 1.6.0 prism-svelte: 0.5.0 prismjs: 1.29.0 - svelte: 3.59.1 + svelte: 3.59.2 dev: false - /svelte-preprocess@4.10.7(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@4.9.5): + /svelte-preprocess@4.10.7(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -3662,14 +3703,14 @@ packages: magic-string: 0.25.9 postcss: 8.4.24 postcss-load-config: 4.0.1(postcss@8.4.24)(ts-node@10.9.1) - sass: 1.63.4 + sass: 1.63.6 sorcery: 0.10.0 strip-indent: 3.0.0 - svelte: 3.59.1 + svelte: 3.59.2 typescript: 4.9.5 dev: true - /svelte-preprocess@5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.4)(svelte@3.59.1)(typescript@4.9.5): + /svelte-preprocess@5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -3712,36 +3753,36 @@ packages: magic-string: 0.27.0 postcss: 8.4.24 postcss-load-config: 4.0.1(postcss@8.4.24)(ts-node@10.9.1) - sass: 1.63.4 + sass: 1.63.6 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 3.59.1 + svelte: 3.59.2 typescript: 4.9.5 dev: true - /svelte@3.59.1: - resolution: {integrity: sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==} + /svelte@3.59.2: + resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} engines: {node: '>= 8'} - /sveltekit-flash-message@0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.1): + /sveltekit-flash-message@0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.2): resolution: {integrity: sha512-tMKBobVFLYth0z2Kq9M+pi7Ip2OBhOrzivzx64v9+D2bWRwnZ3pmdWStYfQYxlz5CayozRQsmtipNg1vM+JN9Q==} peerDependencies: '@sveltejs/kit': ^1.0.0 svelte: ^3 dependencies: - '@sveltejs/kit': 1.20.4(svelte@3.59.1)(vite@4.3.9) - svelte: 3.59.1 + '@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) + svelte: 3.59.2 dev: false - /sveltekit-superforms@1.1.0(@sveltejs/kit@1.20.4)(svelte@3.59.1)(zod@3.21.4): - resolution: {integrity: sha512-90k2x3PwrH9APg2/QzB0DXw1U8LsGqZescjti/tOpu4yTfDOm/pU3/rdrNugwuRvpfBIAh+Zljj0o6uMqcfrow==} + /sveltekit-superforms@1.1.1(@sveltejs/kit@1.20.4)(svelte@3.59.2)(zod@3.21.4): + resolution: {integrity: sha512-lD3ov06C/O8hD7mCzEQZ7CTsbHrh6kWhRP3njI9ZSwvG5DW6vhfi6Re/cyYy//cS0oMONI0xBieWyr9s24Y9jA==} peerDependencies: '@sveltejs/kit': 1.x svelte: 3.x zod: 3.x dependencies: - '@sveltejs/kit': 1.20.4(svelte@3.59.1)(vite@4.3.9) - svelte: 3.59.1 + '@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) + svelte: 3.59.2 zod: 3.21.4 dev: true @@ -3888,6 +3929,17 @@ packages: picocolors: 1.0.0 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: @@ -3901,7 +3953,7 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /vite@4.3.9(@types/node@18.16.18)(sass@1.63.4): + /vite@4.3.9(@types/node@18.16.18)(sass@1.63.6): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -3930,7 +3982,7 @@ packages: esbuild: 0.17.18 postcss: 8.4.24 rollup: 3.21.0 - sass: 1.63.4 + sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 @@ -3942,9 +3994,9 @@ packages: vite: optional: true dependencies: - vite: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + vite: 4.3.9(@types/node@18.16.18)(sass@1.63.6) - /vitest@0.25.8(sass@1.63.4): + /vitest@0.25.8(sass@1.63.6): resolution: {integrity: sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==} engines: {node: '>=v14.16.0'} hasBin: true @@ -3979,7 +4031,7 @@ packages: tinybench: 2.3.1 tinypool: 0.3.0 tinyspy: 1.0.2 - vite: 4.3.9(@types/node@18.16.18)(sass@1.63.4) + vite: 4.3.9(@types/node@18.16.18)(sass@1.63.6) transitivePeerDependencies: - less - sass diff --git a/prisma/categories.json b/prisma/categories.json new file mode 100644 index 0000000..7949790 --- /dev/null +++ b/prisma/categories.json @@ -0,0 +1,859 @@ +{ + "categories": [ + { + "id": "2bdFPJUvFo", + "name": "18XX", + "url": "https://www.boardgameatlas.com/category/2bdFPJUvFo/18xx" + }, + { + "id": "85OKv8p5Ow", + "name": "4x", + "url": "https://www.boardgameatlas.com/category/85OKv8p5Ow/4x" + }, + { + "id": "FMKgeuNEII", + "name": "80s", + "url": "https://www.boardgameatlas.com/category/FMKgeuNEII/80s" + }, + { + "id": "hBqZ3Ar4RJ", + "name": "Abstract", + "url": "https://www.boardgameatlas.com/category/hBqZ3Ar4RJ/abstract" + }, + { + "id": "GtuMb7ei27", + "name": "Accessory", + "url": "https://www.boardgameatlas.com/category/GtuMb7ei27/accessory" + }, + { + "id": "OE07lsfVqf", + "name": "Adult", + "url": "https://www.boardgameatlas.com/category/OE07lsfVqf/adult" + }, + { + "id": "KUBCKBkGxV", + "name": "Adventure", + "url": "https://www.boardgameatlas.com/category/KUBCKBkGxV/adventure" + }, + { + "id": "DjAhqEHOD0", + "name": "Aerial Warfare", + "url": "https://www.boardgameatlas.com/category/DjAhqEHOD0/aerial-warfare" + }, + { + "id": "20iDvpbh7A", + "name": "Age of Reason", + "url": "https://www.boardgameatlas.com/category/20iDvpbh7A/age-of-reason" + }, + { + "id": "tJxatX2ZbW", + "name": "Aliens", + "url": "https://www.boardgameatlas.com/category/tJxatX2ZbW/aliens" + }, + { + "id": "nWDac9tQzt", + "name": "Alternate History", + "url": "https://www.boardgameatlas.com/category/nWDac9tQzt/alternate-history" + }, + { + "id": "dghLhwyxVb", + "name": "American History", + "url": "https://www.boardgameatlas.com/category/dghLhwyxVb/american-history" + }, + { + "id": "4mOtRRwSoj", + "name": "American West", + "url": "https://www.boardgameatlas.com/category/4mOtRRwSoj/american-west" + }, + { + "id": "a8NM5cugJX", + "name": "Ancient", + "url": "https://www.boardgameatlas.com/category/a8NM5cugJX/ancient" + }, + { + "id": "MWoxgHrOJD", + "name": "Animals", + "url": "https://www.boardgameatlas.com/category/MWoxgHrOJD/animals" + }, + { + "id": "eFaACC6y2c", + "name": "Apocalyptic", + "url": "https://www.boardgameatlas.com/category/eFaACC6y2c/apocalyptic" + }, + { + "id": "CBboNLI1Uj", + "name": "Arabian", + "url": "https://www.boardgameatlas.com/category/CBboNLI1Uj/arabian" + }, + { + "id": "k0dglq5j6N", + "name": "Art", + "url": "https://www.boardgameatlas.com/category/k0dglq5j6N/art" + }, + { + "id": "Bq6M0TJyg7", + "name": "Asymmetric", + "url": "https://www.boardgameatlas.com/category/Bq6M0TJyg7/asymmetric" + }, + { + "id": "QB4sEpx1Uu", + "name": "Aviation", + "url": "https://www.boardgameatlas.com/category/QB4sEpx1Uu/aviation" + }, + { + "id": "wpItJuRDiz", + "name": "Banking", + "url": "https://www.boardgameatlas.com/category/wpItJuRDiz/banking" + }, + { + "id": "pwt9HAzEa6", + "name": "Battle Royale", + "url": "https://www.boardgameatlas.com/category/pwt9HAzEa6/battle-royale" + }, + { + "id": "PinhJrhnxU", + "name": "Bluffing", + "url": "https://www.boardgameatlas.com/category/PinhJrhnxU/bluffing" + }, + { + "id": "wLpYxHBexW", + "name": "Book", + "url": "https://www.boardgameatlas.com/category/wLpYxHBexW/book" + }, + { + "id": "fW5vusE96B", + "name": "Campaign", + "url": "https://www.boardgameatlas.com/category/fW5vusE96B/campaign" + }, + { + "id": "eX8uuNlQkQ", + "name": "Card Game", + "url": "https://www.boardgameatlas.com/category/eX8uuNlQkQ/card-game" + }, + { + "id": "HKaYVNIxAJ", + "name": "Children's Game", + "url": "https://www.boardgameatlas.com/category/HKaYVNIxAJ/childrens-game" + }, + { + "id": "36WFElclV3", + "name": "Christian", + "url": "https://www.boardgameatlas.com/category/36WFElclV3/christian" + }, + { + "id": "3Y1dIDLCRw", + "name": "Christmas", + "url": "https://www.boardgameatlas.com/category/3Y1dIDLCRw/christmas" + }, + { + "id": "ODWOjWAJj3", + "name": "City Building", + "url": "https://www.boardgameatlas.com/category/ODWOjWAJj3/city-building" + }, + { + "id": "w8XD66FUZ2", + "name": "Civil War", + "url": "https://www.boardgameatlas.com/category/w8XD66FUZ2/civil-war" + }, + { + "id": "329DxyFL9D", + "name": "Civilization", + "url": "https://www.boardgameatlas.com/category/329DxyFL9D/civilization" + }, + { + "id": "bVMxJo31bS", + "name": "Cold war", + "url": "https://www.boardgameatlas.com/category/bVMxJo31bS/cold-war" + }, + { + "id": "vXxLT0FDTZ", + "name": "Collectible Components", + "url": "https://www.boardgameatlas.com/category/vXxLT0FDTZ/collectible-components" + }, + { + "id": "bSzUpE5oOZ", + "name": "Colonial", + "url": "https://www.boardgameatlas.com/category/bSzUpE5oOZ/colonial" + }, + { + "id": "gscaL52VDG", + "name": "Combat", + "url": "https://www.boardgameatlas.com/category/gscaL52VDG/combat" + }, + { + "id": "G5kfqnPBP6", + "name": "Comic Book / Strip", + "url": "https://www.boardgameatlas.com/category/G5kfqnPBP6/comic-book--strip" + }, + { + "id": "pacCjl7His", + "name": "Competitive", + "url": "https://www.boardgameatlas.com/category/pacCjl7His/competitive" + }, + { + "id": "ge8pIhEUGE", + "name": "Cooperative", + "url": "https://www.boardgameatlas.com/category/ge8pIhEUGE/cooperative" + }, + { + "id": "7DfHn28Pcf", + "name": "Crime", + "url": "https://www.boardgameatlas.com/category/7DfHn28Pcf/crime" + }, + { + "id": "nfQONtMbDU", + "name": "Cube Rail", + "url": "https://www.boardgameatlas.com/category/nfQONtMbDU/cube-rail" + }, + { + "id": "Ef4oYLHNhI", + "name": "Cyberpunk", + "url": "https://www.boardgameatlas.com/category/Ef4oYLHNhI/cyberpunk" + }, + { + "id": "bCBXJy9qDw", + "name": "Deduction", + "url": "https://www.boardgameatlas.com/category/bCBXJy9qDw/deduction" + }, + { + "id": "fh4V5SOLFj", + "name": "Deluxe Edition", + "url": "https://www.boardgameatlas.com/category/fh4V5SOLFj/deluxe-edition" + }, + { + "id": "bKrxqD9mYc", + "name": "Dexterity", + "url": "https://www.boardgameatlas.com/category/bKrxqD9mYc/dexterity" + }, + { + "id": "mavSOM8vjH", + "name": "Dice", + "url": "https://www.boardgameatlas.com/category/mavSOM8vjH/dice" + }, + { + "id": "o7Macrb9q7", + "name": "Dice Tower Combat", + "url": "https://www.boardgameatlas.com/category/o7Macrb9q7/dice-tower-combat" + }, + { + "id": "42pmul4oHH", + "name": "Dinosaurs", + "url": "https://www.boardgameatlas.com/category/42pmul4oHH/dinosaurs" + }, + { + "id": "zoOGfQ9rK3", + "name": "Dogs", + "url": "https://www.boardgameatlas.com/category/zoOGfQ9rK3/dogs" + }, + { + "id": "JMM0TG2MSe", + "name": "Drawing", + "url": "https://www.boardgameatlas.com/category/JMM0TG2MSe/drawing" + }, + { + "id": "We3MM46qBr", + "name": "Drinking", + "url": "https://www.boardgameatlas.com/category/We3MM46qBr/drinking" + }, + { + "id": "g2Hwv8t0Y5", + "name": "Dungeon Crawl", + "url": "https://www.boardgameatlas.com/category/g2Hwv8t0Y5/dungeon-crawl" + }, + { + "id": "N0TkEGfEsF", + "name": "Economic", + "url": "https://www.boardgameatlas.com/category/N0TkEGfEsF/economic" + }, + { + "id": "B3NRLMK4xD", + "name": "Educational", + "url": "https://www.boardgameatlas.com/category/B3NRLMK4xD/educational" + }, + { + "id": "crxgUzJSEz", + "name": "Electronic", + "url": "https://www.boardgameatlas.com/category/crxgUzJSEz/electronic" + }, + { + "id": "gsekjrPJz0", + "name": "Environmental", + "url": "https://www.boardgameatlas.com/category/gsekjrPJz0/environmental" + }, + { + "id": "pflvcNyHPe", + "name": "Escape Room", + "url": "https://www.boardgameatlas.com/category/pflvcNyHPe/escape-room" + }, + { + "id": "u5ZiYctU6T", + "name": "Espionage", + "url": "https://www.boardgameatlas.com/category/u5ZiYctU6T/espionage" + }, + { + "id": "v4SfYtS2Lr", + "name": "Expansion", + "url": "https://www.boardgameatlas.com/category/v4SfYtS2Lr/expansion" + }, + { + "id": "yq6hVlbM2R", + "name": "Exploration", + "url": "https://www.boardgameatlas.com/category/yq6hVlbM2R/exploration" + }, + { + "id": "7rV11PKqME", + "name": "Family Game", + "url": "https://www.boardgameatlas.com/category/7rV11PKqME/family-game" + }, + { + "id": "ctumBZyj5l", + "name": "Fan Made", + "url": "https://www.boardgameatlas.com/category/ctumBZyj5l/fan-made" + }, + { + "id": "ZTneo8TaIO", + "name": "Fantasy", + "url": "https://www.boardgameatlas.com/category/ZTneo8TaIO/fantasy" + }, + { + "id": "Wr8uXcoR9p", + "name": "Farming", + "url": "https://www.boardgameatlas.com/category/Wr8uXcoR9p/farming" + }, + { + "id": "upXZ8vNfNO", + "name": "Fighting", + "url": "https://www.boardgameatlas.com/category/upXZ8vNfNO/fighting" + }, + { + "id": "ELg06sncRX", + "name": "Finance", + "url": "https://www.boardgameatlas.com/category/ELg06sncRX/finance" + }, + { + "id": "YrDuNj8lvr", + "name": "Food", + "url": "https://www.boardgameatlas.com/category/YrDuNj8lvr/food" + }, + { + "id": "JvIs75sWte", + "name": "Game System", + "url": "https://www.boardgameatlas.com/category/JvIs75sWte/game-system" + }, + { + "id": "cQnyClrGPU", + "name": "Gamefound", + "url": "https://www.boardgameatlas.com/category/cQnyClrGPU/gamefound" + }, + { + "id": "Eyuf8PzjDo", + "name": "Gulf War", + "url": "https://www.boardgameatlas.com/category/Eyuf8PzjDo/gulf-war" + }, + { + "id": "KzEQIwIub7", + "name": "Historic", + "url": "https://www.boardgameatlas.com/category/KzEQIwIub7/historic" + }, + { + "id": "cAIkk5aLdQ", + "name": "Horror", + "url": "https://www.boardgameatlas.com/category/cAIkk5aLdQ/horror" + }, + { + "id": "TYnxiuiI3X", + "name": "Humor", + "url": "https://www.boardgameatlas.com/category/TYnxiuiI3X/humor" + }, + { + "id": "zqFmdU4Fp2", + "name": "Industry/Manufacturing", + "url": "https://www.boardgameatlas.com/category/zqFmdU4Fp2/industrymanufacturing" + }, + { + "id": "rrvd68LjOR", + "name": "Kickstarter", + "url": "https://www.boardgameatlas.com/category/rrvd68LjOR/kickstarter" + }, + { + "id": "3souLOXUqI", + "name": "Korean War", + "url": "https://www.boardgameatlas.com/category/3souLOXUqI/korean-war" + }, + { + "id": "AGKGd3txp9", + "name": "Law", + "url": "https://www.boardgameatlas.com/category/AGKGd3txp9/law" + }, + { + "id": "XeYUw9159M", + "name": "Legacy", + "url": "https://www.boardgameatlas.com/category/XeYUw9159M/legacy" + }, + { + "id": "HZ7kUiqEbs", + "name": "Letters", + "url": "https://www.boardgameatlas.com/category/HZ7kUiqEbs/letters" + }, + { + "id": "GCwXmvBCvA", + "name": "Mad Scientist", + "url": "https://www.boardgameatlas.com/category/GCwXmvBCvA/mad-scientist" + }, + { + "id": "pIMmuVYnQp", + "name": "Mafia", + "url": "https://www.boardgameatlas.com/category/pIMmuVYnQp/mafia" + }, + { + "id": "POlqwScVxD", + "name": "Math", + "url": "https://www.boardgameatlas.com/category/POlqwScVxD/math" + }, + { + "id": "ZhlfIPxYsw", + "name": "Mature / Adult", + "url": "https://www.boardgameatlas.com/category/ZhlfIPxYsw/mature--adult" + }, + { + "id": "ruQAhyLfum", + "name": "Maze", + "url": "https://www.boardgameatlas.com/category/ruQAhyLfum/maze" + }, + { + "id": "AeWXMxbm91", + "name": "Medical", + "url": "https://www.boardgameatlas.com/category/AeWXMxbm91/medical" + }, + { + "id": "QAYkTHK1Dd", + "name": "Medieval", + "url": "https://www.boardgameatlas.com/category/QAYkTHK1Dd/medieval" + }, + { + "id": "AujCle9cUq", + "name": "Memory", + "url": "https://www.boardgameatlas.com/category/AujCle9cUq/memory" + }, + { + "id": "Cc10AY9UX5", + "name": "Mental Health", + "url": "https://www.boardgameatlas.com/category/Cc10AY9UX5/mental-health" + }, + { + "id": "FC6ElKI9tk", + "name": "Miniatures", + "url": "https://www.boardgameatlas.com/category/FC6ElKI9tk/miniatures" + }, + { + "id": "L6NUwNdblq", + "name": "Modern Warfare", + "url": "https://www.boardgameatlas.com/category/L6NUwNdblq/modern-warfare" + }, + { + "id": "Sod2YBWMKi", + "name": "Movies / TV / Radio theme", + "url": "https://www.boardgameatlas.com/category/Sod2YBWMKi/movies--tv--radio-theme" + }, + { + "id": "1e709CZ42V", + "name": "Murder", + "url": "https://www.boardgameatlas.com/category/1e709CZ42V/murder" + }, + { + "id": "Kk70K0524Z", + "name": "Murder/Mystery", + "url": "https://www.boardgameatlas.com/category/Kk70K0524Z/murdermystery" + }, + { + "id": "herNFAxMdz", + "name": "Music", + "url": "https://www.boardgameatlas.com/category/herNFAxMdz/music" + }, + { + "id": "BBZb2d0ePt", + "name": "Mystery", + "url": "https://www.boardgameatlas.com/category/BBZb2d0ePt/mystery" + }, + { + "id": "MHkqIVxwtx", + "name": "Mythology", + "url": "https://www.boardgameatlas.com/category/MHkqIVxwtx/mythology" + }, + { + "id": "IpcJzp0TVC", + "name": "Napoleonic", + "url": "https://www.boardgameatlas.com/category/IpcJzp0TVC/napoleonic" + }, + { + "id": "o5dH2ssbuu", + "name": "Nature", + "url": "https://www.boardgameatlas.com/category/o5dH2ssbuu/nature" + }, + { + "id": "vqZ5XzGWQD", + "name": "Nautical", + "url": "https://www.boardgameatlas.com/category/vqZ5XzGWQD/nautical" + }, + { + "id": "jZEDOpx07e", + "name": "Negotiation", + "url": "https://www.boardgameatlas.com/category/jZEDOpx07e/negotiation" + }, + { + "id": "rtslXnT90O", + "name": "Ninjas", + "url": "https://www.boardgameatlas.com/category/rtslXnT90O/ninjas" + }, + { + "id": "dO9HVl2TW7", + "name": "Novel-based", + "url": "https://www.boardgameatlas.com/category/dO9HVl2TW7/novelbased" + }, + { + "id": "9r6mtYVCAZ", + "name": "Number", + "url": "https://www.boardgameatlas.com/category/9r6mtYVCAZ/number" + }, + { + "id": "i9YgN1u0Al", + "name": "Objectives", + "url": "https://www.boardgameatlas.com/category/i9YgN1u0Al/objectives" + }, + { + "id": "TCYEfWLB8c", + "name": "One vs Many", + "url": "https://www.boardgameatlas.com/category/TCYEfWLB8c/one-vs-many" + }, + { + "id": "SE2CndXU4V", + "name": "Paranormal", + "url": "https://www.boardgameatlas.com/category/SE2CndXU4V/paranormal" + }, + { + "id": "X8J7RM6dxX", + "name": "Party Game", + "url": "https://www.boardgameatlas.com/category/X8J7RM6dxX/party-game" + }, + { + "id": "B70QTH9k5o", + "name": "Path building", + "url": "https://www.boardgameatlas.com/category/B70QTH9k5o/path-building" + }, + { + "id": "UL3b9M86gA", + "name": "Pike and Shot", + "url": "https://www.boardgameatlas.com/category/UL3b9M86gA/pike-and-shot" + }, + { + "id": "9EIayX6n5a", + "name": "Pirates", + "url": "https://www.boardgameatlas.com/category/9EIayX6n5a/pirates" + }, + { + "id": "vRbkg1W0AB", + "name": "Plants/Gardening", + "url": "https://www.boardgameatlas.com/category/vRbkg1W0AB/plants-gardening" + }, + { + "id": "3EjfGzCuWE", + "name": "Point Salad", + "url": "https://www.boardgameatlas.com/category/3EjfGzCuWE/point-salad" + }, + { + "id": "TKQncFVX74", + "name": "Political", + "url": "https://www.boardgameatlas.com/category/TKQncFVX74/political" + }, + { + "id": "8Z7nWG2kOw", + "name": "Post-Apocalyptic", + "url": "https://www.boardgameatlas.com/category/8Z7nWG2kOw/postapocalyptic" + }, + { + "id": "5APB1MWk6X", + "name": "Post-Napoleonic", + "url": "https://www.boardgameatlas.com/category/5APB1MWk6X/postnapoleonic" + }, + { + "id": "YyszHun1HP", + "name": "Prehistoric", + "url": "https://www.boardgameatlas.com/category/YyszHun1HP/prehistoric" + }, + { + "id": "ov6sEmlkiC", + "name": "Print & Play", + "url": "https://www.boardgameatlas.com/category/ov6sEmlkiC/print--play" + }, + { + "id": "dAyk5NtNTV", + "name": "Prison Escape", + "url": "https://www.boardgameatlas.com/category/dAyk5NtNTV/prison-escape" + }, + { + "id": "AlrfWcR5aT", + "name": "Promo", + "url": "https://www.boardgameatlas.com/category/AlrfWcR5aT/promo" + }, + { + "id": "WVMOS3s2pb", + "name": "Puzzle", + "url": "https://www.boardgameatlas.com/category/WVMOS3s2pb/puzzle" + }, + { + "id": "2Gu62aKdma", + "name": "RPG", + "url": "https://www.boardgameatlas.com/category/2Gu62aKdma/rpg" + }, + { + "id": "tQGLgwdbYH", + "name": "Racing", + "url": "https://www.boardgameatlas.com/category/tQGLgwdbYH/racing" + }, + { + "id": "PzWI2uaif0", + "name": "Real-time", + "url": "https://www.boardgameatlas.com/category/PzWI2uaif0/realtime" + }, + { + "id": "DRqeVkXWqX", + "name": "Religious", + "url": "https://www.boardgameatlas.com/category/DRqeVkXWqX/religious" + }, + { + "id": "nuHYRFmMjU", + "name": "Renaissance", + "url": "https://www.boardgameatlas.com/category/nuHYRFmMjU/renaissance" + }, + { + "id": "zyj9ZK3mHB", + "name": "Resource Management", + "url": "https://www.boardgameatlas.com/category/zyj9ZK3mHB/resource-management" + }, + { + "id": "oojGpMQQ2l", + "name": "Robots", + "url": "https://www.boardgameatlas.com/category/oojGpMQQ2l/robots" + }, + { + "id": "KSBdPfxs6F", + "name": "Roman Empire", + "url": "https://www.boardgameatlas.com/category/KSBdPfxs6F/roman-empire" + }, + { + "id": "E5rYwP0Ybr", + "name": "Romance", + "url": "https://www.boardgameatlas.com/category/E5rYwP0Ybr/romance" + }, + { + "id": "SzUZdSjCN2", + "name": "Route Building", + "url": "https://www.boardgameatlas.com/category/SzUZdSjCN2/route-building" + }, + { + "id": "UH3xvKjaCQ", + "name": "Safari", + "url": "https://www.boardgameatlas.com/category/UH3xvKjaCQ/safari" + }, + { + "id": "2m6sfYeeGI", + "name": "Sandbox", + "url": "https://www.boardgameatlas.com/category/2m6sfYeeGI/sandbox" + }, + { + "id": "3B3QpKvXD3", + "name": "Sci-Fi", + "url": "https://www.boardgameatlas.com/category/3B3QpKvXD3/scifi" + }, + { + "id": "UjUO40mmeL", + "name": "Screen Printed Meeples", + "url": "https://www.boardgameatlas.com/category/UjUO40mmeL/screen-printed-meeples" + }, + { + "id": "WCMkyAqVlf", + "name": "Semi-Cooperative", + "url": "https://www.boardgameatlas.com/category/WCMkyAqVlf/semicooperative" + }, + { + "id": "VzyslQJGrG", + "name": "Solo / Solitaire", + "url": "https://www.boardgameatlas.com/category/VzyslQJGrG/solo--solitaire" + }, + { + "id": "0MdRqhkNpw", + "name": "Space Exploration", + "url": "https://www.boardgameatlas.com/category/0MdRqhkNpw/space-exploration" + }, + { + "id": "Hc6vcim5DS", + "name": "Spies/Secret Agents", + "url": "https://www.boardgameatlas.com/category/Hc6vcim5DS/spiessecret-agents" + }, + { + "id": "hShsL2DktG", + "name": "Sports", + "url": "https://www.boardgameatlas.com/category/hShsL2DktG/sports" + }, + { + "id": "4hZlqoitAY", + "name": "Steampunk", + "url": "https://www.boardgameatlas.com/category/4hZlqoitAY/steampunk" + }, + { + "id": "jGXefW0E2i", + "name": "Storytelling", + "url": "https://www.boardgameatlas.com/category/jGXefW0E2i/storytelling" + }, + { + "id": "alkjFhA58S", + "name": "Strategic-Level", + "url": "https://www.boardgameatlas.com/category/alkjFhA58S/strategic-level" + }, + { + "id": "loGUMKV9K9", + "name": "Tactical-Level", + "url": "https://www.boardgameatlas.com/category/loGUMKV9K9/tactical-level" + }, + { + "id": "knFtS8LntM", + "name": "Technology", + "url": "https://www.boardgameatlas.com/category/knFtS8LntM/technology" + }, + { + "id": "buDTYyPw4D", + "name": "Territory Building", + "url": "https://www.boardgameatlas.com/category/buDTYyPw4D/territory-building" + }, + { + "id": "XN9Byxf3MK", + "name": "Theme Park", + "url": "https://www.boardgameatlas.com/category/XN9Byxf3MK/theme-park" + }, + { + "id": "BHxvD7ZjfA", + "name": "Tile Placement", + "url": "https://www.boardgameatlas.com/category/BHxvD7ZjfA/tile-placement" + }, + { + "id": "L18sB21wyi", + "name": "Tile drafting", + "url": "https://www.boardgameatlas.com/category/L18sB21wyi/tile-drafting" + }, + { + "id": "2KVQJ2k60k", + "name": "Time Travel", + "url": "https://www.boardgameatlas.com/category/2KVQJ2k60k/time-travel" + }, + { + "id": "JwHcKqxh33", + "name": "Trains", + "url": "https://www.boardgameatlas.com/category/JwHcKqxh33/trains" + }, + { + "id": "CWYOF9xu7O", + "name": "Transportation", + "url": "https://www.boardgameatlas.com/category/CWYOF9xu7O/transportation" + }, + { + "id": "TR4CiP8Huj", + "name": "Travel", + "url": "https://www.boardgameatlas.com/category/TR4CiP8Huj/travel" + }, + { + "id": "NYSQmZLSOS", + "name": "Treasure Hunt", + "url": "https://www.boardgameatlas.com/category/NYSQmZLSOS/treasure-hunt" + }, + { + "id": "YGHGDjahKY", + "name": "Trivia", + "url": "https://www.boardgameatlas.com/category/YGHGDjahKY/trivia" + }, + { + "id": "a2eMKxxlVW", + "name": "Two player Only Game", + "url": "https://www.boardgameatlas.com/category/a2eMKxxlVW/two-player-only-game" + }, + { + "id": "oHSL7C6i9y", + "name": "Undersea", + "url": "https://www.boardgameatlas.com/category/oHSL7C6i9y/undersea" + }, + { + "id": "djokexoK0U", + "name": "Video Game Theme", + "url": "https://www.boardgameatlas.com/category/djokexoK0U/video-game-theme" + }, + { + "id": "jS8aA9kDFW", + "name": "Vietnam War", + "url": "https://www.boardgameatlas.com/category/jS8aA9kDFW/vietnam-war" + }, + { + "id": "muDQil3Mkb", + "name": "Viking", + "url": "https://www.boardgameatlas.com/category/muDQil3Mkb/viking" + }, + { + "id": "jX8asGGR6o", + "name": "Wargame", + "url": "https://www.boardgameatlas.com/category/jX8asGGR6o/wargame" + }, + { + "id": "uJgSEPT6zE", + "name": "Werewolves", + "url": "https://www.boardgameatlas.com/category/uJgSEPT6zE/werewolves" + }, + { + "id": "mw3nPNWqs0", + "name": "Western", + "url": "https://www.boardgameatlas.com/category/mw3nPNWqs0/western" + }, + { + "id": "rHvAx4hH2f", + "name": "Word Game", + "url": "https://www.boardgameatlas.com/category/rHvAx4hH2f/word-game" + }, + { + "id": "wTLJSVEbm6", + "name": "World War I", + "url": "https://www.boardgameatlas.com/category/wTLJSVEbm6/world-war-i" + }, + { + "id": "fl3TogdUzX", + "name": "World War II", + "url": "https://www.boardgameatlas.com/category/fl3TogdUzX/world-war-ii" + }, + { + "id": "OlkGBmu4Va", + "name": "World War III", + "url": "https://www.boardgameatlas.com/category/OlkGBmu4Va/world-war-iii" + }, + { + "id": "djZWzjCZhM", + "name": "Writing / Dry Erase", + "url": "https://www.boardgameatlas.com/category/djZWzjCZhM/writing--dry-erase" + }, + { + "id": "30B899LSDs", + "name": "Zodiac", + "url": "https://www.boardgameatlas.com/category/30B899LSDs/zodiac" + }, + { + "id": "FmGV9rVu1c", + "name": "Zombies", + "url": "https://www.boardgameatlas.com/category/FmGV9rVu1c/zombies" + }, + { + "id": "B1N2QOByCl", + "name": "Zone Control", + "url": "https://www.boardgameatlas.com/category/B1N2QOByCl/zone-control" + }, + { + "id": "0q1ZbW8FjH", + "name": "treasure hunt", + "url": "https://www.boardgameatlas.com/category/0q1ZbW8FjH/treasure-hunt" + } + ] +} diff --git a/prisma/mechanics.json b/prisma/mechanics.json new file mode 100644 index 0000000..8fa788f --- /dev/null +++ b/prisma/mechanics.json @@ -0,0 +1,1129 @@ +{ + "mechanics": [ + { + "id": "SWJGuaim9h", + "name": "AI enemies", + "url": "https://www.boardgameatlas.com/mechanic/SWJGuaim9h/ai-enemies" + }, + { + "id": "n1GtBt35Rd", + "name": "Acting", + "url": "https://www.boardgameatlas.com/mechanic/n1GtBt35Rd/acting" + }, + { + "id": "TEmgapaEg0", + "name": "Action / Event", + "url": "https://www.boardgameatlas.com/mechanic/TEmgapaEg0/action--event" + }, + { + "id": "PGjmKGi26h", + "name": "Action / Movement Programming", + "url": "https://www.boardgameatlas.com/mechanic/PGjmKGi26h/action--movement-programming" + }, + { + "id": "UAV3t3FxVI", + "name": "Action Drafting", + "url": "https://www.boardgameatlas.com/mechanic/UAV3t3FxVI/action-drafting" + }, + { + "id": "oeg6wN9Eoc", + "name": "Action Point Allowance System", + "url": "https://www.boardgameatlas.com/mechanic/oeg6wN9Eoc/action-point-allowance-system" + }, + { + "id": "ckCp1oTVMy", + "name": "Action Queue", + "url": "https://www.boardgameatlas.com/mechanic/ckCp1oTVMy/action-queue" + }, + { + "id": "EluAnyIJKY", + "name": "Action Retrieval", + "url": "https://www.boardgameatlas.com/mechanic/EluAnyIJKY/action-retrieval" + }, + { + "id": "Bc7R8pLoGk", + "name": "Action Selection", + "url": "https://www.boardgameatlas.com/mechanic/Bc7R8pLoGk/action-selection" + }, + { + "id": "j2A0uFmdgc", + "name": "Action Timer", + "url": "https://www.boardgameatlas.com/mechanic/j2A0uFmdgc/action-timer" + }, + { + "id": "LfQ9fgn7Zu", + "name": "Action economy", + "url": "https://www.boardgameatlas.com/mechanic/LfQ9fgn7Zu/action-economy" + }, + { + "id": "9l8kOZQEEa", + "name": "Added Mechanics", + "url": "https://www.boardgameatlas.com/mechanic/9l8kOZQEEa/added-mechanics" + }, + { + "id": "klT5dZnO4G", + "name": "Advantage Token", + "url": "https://www.boardgameatlas.com/mechanic/klT5dZnO4G/advantage-token" + }, + { + "id": "Hef8hzPH7C", + "name": "Alliances", + "url": "https://www.boardgameatlas.com/mechanic/Hef8hzPH7C/alliances" + }, + { + "id": "TlGfAobFpp", + "name": "App Driven", + "url": "https://www.boardgameatlas.com/mechanic/TlGfAobFpp/app-driven" + }, + { + "id": "05zCZoLvQJ", + "name": "Area Control", + "url": "https://www.boardgameatlas.com/mechanic/05zCZoLvQJ/area-control" + }, + { + "id": "3te2oybNR4", + "name": "Area Enclosure", + "url": "https://www.boardgameatlas.com/mechanic/3te2oybNR4/area-enclosure" + }, + { + "id": "9NBcz45nN7", + "name": "Area Majority/ Influence", + "url": "https://www.boardgameatlas.com/mechanic/9NBcz45nN7/area-majority-influence" + }, + { + "id": "bgGxE0pI2B", + "name": "Area Movement", + "url": "https://www.boardgameatlas.com/mechanic/bgGxE0pI2B/area-movement" + }, + { + "id": "zlsyLiomoR", + "name": "Area development", + "url": "https://www.boardgameatlas.com/mechanic/zlsyLiomoR/area-development" + }, + { + "id": "AZxlPpi5oq", + "name": "Auction", + "url": "https://www.boardgameatlas.com/mechanic/AZxlPpi5oq/auction" + }, + { + "id": "7gpfubluzg", + "name": "Auction: Dutch", + "url": "https://www.boardgameatlas.com/mechanic/7gpfubluzg/auction-dutch" + }, + { + "id": "6Lo2vLiex6", + "name": "Auction: Sealed Bid", + "url": "https://www.boardgameatlas.com/mechanic/6Lo2vLiex6/auction-sealed-bid" + }, + { + "id": "IAuH3ICIyC", + "name": "Automatic Resource Growth", + "url": "https://www.boardgameatlas.com/mechanic/IAuH3ICIyC/automatic-resource-growth" + }, + { + "id": "1382oBW7iB", + "name": "Bag Building", + "url": "https://www.boardgameatlas.com/mechanic/1382oBW7iB/bag-building" + }, + { + "id": "3tuJiW3pps", + "name": "Betting", + "url": "https://www.boardgameatlas.com/mechanic/3tuJiW3pps/betting" + }, + { + "id": "tKZiGvSxAC", + "name": "Bias", + "url": "https://www.boardgameatlas.com/mechanic/tKZiGvSxAC/bias" + }, + { + "id": "issXRWXSLg", + "name": "Bidding", + "url": "https://www.boardgameatlas.com/mechanic/issXRWXSLg/bidding" + }, + { + "id": "71HG4TJaoD", + "name": "Bingo", + "url": "https://www.boardgameatlas.com/mechanic/71HG4TJaoD/bingo" + }, + { + "id": "ZX3hYcF9H7", + "name": "Bluffing", + "url": "https://www.boardgameatlas.com/mechanic/ZX3hYcF9H7/bluffing" + }, + { + "id": "QFxeEMMQAM", + "name": "Bribery", + "url": "https://www.boardgameatlas.com/mechanic/QFxeEMMQAM/bribery" + }, + { + "id": "xuphiSlrxI", + "name": "Campaign", + "url": "https://www.boardgameatlas.com/mechanic/xuphiSlrxI/campaign" + }, + { + "id": "ml9upz5Me9", + "name": "Campaign / Battle Card Driven", + "url": "https://www.boardgameatlas.com/mechanic/ml9upz5Me9/campaign--battle-card-driven" + }, + { + "id": "NN3nIS4Anc", + "name": "Card Crafting", + "url": "https://www.boardgameatlas.com/mechanic/NN3nIS4Anc/card-crafting" + }, + { + "id": "iWODHwRGuU", + "name": "Card Drafting", + "url": "https://www.boardgameatlas.com/mechanic/iWODHwRGuU/card-drafting" + }, + { + "id": "ngCSHHk0H2", + "name": "Card Placement", + "url": "https://www.boardgameatlas.com/mechanic/ngCSHHk0H2/card-placement" + }, + { + "id": "s0OA3pn2fn", + "name": "Card Play Conflict Resolution", + "url": "https://www.boardgameatlas.com/mechanic/s0OA3pn2fn/card-play-conflict-resolution" + }, + { + "id": "6YTZ0juKWy", + "name": "Catch the Leader", + "url": "https://www.boardgameatlas.com/mechanic/6YTZ0juKWy/catch-the-leader" + }, + { + "id": "PzEJDypMgC", + "name": "Chaining", + "url": "https://www.boardgameatlas.com/mechanic/PzEJDypMgC/chaining" + }, + { + "id": "Oz9Z9e0GO5", + "name": "Character Progression", + "url": "https://www.boardgameatlas.com/mechanic/Oz9Z9e0GO5/character-progression" + }, + { + "id": "Gan96fffLL", + "name": "Chit-Pull System", + "url": "https://www.boardgameatlas.com/mechanic/Gan96fffLL/chitpull-system" + }, + { + "id": "5VI7UEXztV", + "name": "Closed Drafting", + "url": "https://www.boardgameatlas.com/mechanic/5VI7UEXztV/closed-drafting" + }, + { + "id": "IcofZxFwqw", + "name": "Command Cards", + "url": "https://www.boardgameatlas.com/mechanic/IcofZxFwqw/command-cards" + }, + { + "id": "i8pEFk75OI", + "name": "Commodity Speculation", + "url": "https://www.boardgameatlas.com/mechanic/i8pEFk75OI/commodity-speculation" + }, + { + "id": "0ez69aUfuJ", + "name": "Communication Limits", + "url": "https://www.boardgameatlas.com/mechanic/0ez69aUfuJ/communication-limits" + }, + { + "id": "Khp7U5pHZi", + "name": "Competitive Play", + "url": "https://www.boardgameatlas.com/mechanic/Khp7U5pHZi/competitive-play" + }, + { + "id": "pEHn0BKFZ8", + "name": "Connections", + "url": "https://www.boardgameatlas.com/mechanic/pEHn0BKFZ8/connections" + }, + { + "id": "jOAB6RhwBp", + "name": "Contracts", + "url": "https://www.boardgameatlas.com/mechanic/jOAB6RhwBp/contracts" + }, + { + "id": "9mNukNBxfZ", + "name": "Cooperative Play", + "url": "https://www.boardgameatlas.com/mechanic/9mNukNBxfZ/cooperative-play" + }, + { + "id": "xVDf5dmJts", + "name": "Crayon Rail System", + "url": "https://www.boardgameatlas.com/mechanic/xVDf5dmJts/crayon-rail-system" + }, + { + "id": "4ERmAGYVPL", + "name": "Critical Hits and Failures", + "url": "https://www.boardgameatlas.com/mechanic/4ERmAGYVPL/critical-hits-and-failures" + }, + { + "id": "J6TWltoYOF", + "name": "Cube tower", + "url": "https://www.boardgameatlas.com/mechanic/J6TWltoYOF/cube-tower" + }, + { + "id": "vZsDDAdOoe", + "name": "Deck Building", + "url": "https://www.boardgameatlas.com/mechanic/vZsDDAdOoe/deck-building" + }, + { + "id": "VQQsdFilIf", + "name": "Deck Constructing", + "url": "https://www.boardgameatlas.com/mechanic/VQQsdFilIf/deck-constructing" + }, + { + "id": "M15c5LuzLT", + "name": "Deck Un-building", + "url": "https://www.boardgameatlas.com/mechanic/M15c5LuzLT/deck-un-building" + }, + { + "id": "GsNGxZFNCK", + "name": "Deduction", + "url": "https://www.boardgameatlas.com/mechanic/GsNGxZFNCK/deduction" + }, + { + "id": "3BiR0iAjoo", + "name": "Delayed Purchase", + "url": "https://www.boardgameatlas.com/mechanic/3BiR0iAjoo/delayed-purchase" + }, + { + "id": "5kvyChnWuO", + "name": "Dexterity", + "url": "https://www.boardgameatlas.com/mechanic/5kvyChnWuO/dexterity" + }, + { + "id": "edpczEaWCX", + "name": "Dice Allocation", + "url": "https://www.boardgameatlas.com/mechanic/edpczEaWCX/dice-allocation" + }, + { + "id": "lVSHu9efHv", + "name": "Dice Building", + "url": "https://www.boardgameatlas.com/mechanic/lVSHu9efHv/dice-building" + }, + { + "id": "CGtkhRuesC", + "name": "Dice Drafting", + "url": "https://www.boardgameatlas.com/mechanic/CGtkhRuesC/dice-drafting" + }, + { + "id": "zw4KMn5rcD", + "name": "Dice Movement", + "url": "https://www.boardgameatlas.com/mechanic/zw4KMn5rcD/dice-movement" + }, + { + "id": "R0bGq4cAl4", + "name": "Dice Rolling", + "url": "https://www.boardgameatlas.com/mechanic/R0bGq4cAl4/dice-rolling" + }, + { + "id": "giTLx2kROa", + "name": "Dice Tower Combat", + "url": "https://www.boardgameatlas.com/mechanic/giTLx2kROa/dice-tower-combat" + }, + { + "id": "k44nxjXeXC", + "name": "Die Icon Resolution", + "url": "https://www.boardgameatlas.com/mechanic/k44nxjXeXC/die-icon-resolution" + }, + { + "id": "wV5peB05xs", + "name": "Drafting", + "url": "https://www.boardgameatlas.com/mechanic/wV5peB05xs/drafting" + }, + { + "id": "KfTS5BwIsu", + "name": "Drawing", + "url": "https://www.boardgameatlas.com/mechanic/KfTS5BwIsu/drawing" + }, + { + "id": "6YMpwOGWmX", + "name": "Drawing Pictures", + "url": "https://www.boardgameatlas.com/mechanic/6YMpwOGWmX/drawing-pictures" + }, + { + "id": "PVJ8E0kXUE", + "name": "Dynamic Currency", + "url": "https://www.boardgameatlas.com/mechanic/PVJ8E0kXUE/dynamic-currency" + }, + { + "id": "fOkuHxnNFL", + "name": "Elapsed Real Time Ending", + "url": "https://www.boardgameatlas.com/mechanic/fOkuHxnNFL/elapsed-real-time-ending" + }, + { + "id": "YlqCkWPY0r", + "name": "Enclosure", + "url": "https://www.boardgameatlas.com/mechanic/YlqCkWPY0r/enclosure" + }, + { + "id": "9ZlbQA8L5l", + "name": "End Game Bonuses", + "url": "https://www.boardgameatlas.com/mechanic/9ZlbQA8L5l/end-game-bonuses" + }, + { + "id": "yu3eas6v7A", + "name": "Engine Building", + "url": "https://www.boardgameatlas.com/mechanic/yu3eas6v7A/engine-building" + }, + { + "id": "KFeIfeoFaK", + "name": "Events", + "url": "https://www.boardgameatlas.com/mechanic/KFeIfeoFaK/events" + }, + { + "id": "eTe5HBrJcK", + "name": "Evolving Game Board", + "url": "https://www.boardgameatlas.com/mechanic/eTe5HBrJcK/evolving-game-board" + }, + { + "id": "5vzHcNSWye", + "name": "Feeding Workers/Characters", + "url": "https://www.boardgameatlas.com/mechanic/5vzHcNSWye/feeding-workers-characters" + }, + { + "id": "rUsVFpir1t", + "name": "Finale Ending", + "url": "https://www.boardgameatlas.com/mechanic/rUsVFpir1t/finale-ending" + }, + { + "id": "S0O9ucexPS", + "name": "Flicking", + "url": "https://www.boardgameatlas.com/mechanic/S0O9ucexPS/flicking" + }, + { + "id": "G9MDotCkNd", + "name": "Flip and Write", + "url": "https://www.boardgameatlas.com/mechanic/G9MDotCkNd/flip-and-write" + }, + { + "id": "9NHXcmC2Zy", + "name": "Follow", + "url": "https://www.boardgameatlas.com/mechanic/9NHXcmC2Zy/follow" + }, + { + "id": "uztV12nNjt", + "name": "Force Commitment", + "url": "https://www.boardgameatlas.com/mechanic/uztV12nNjt/force-commitment" + }, + { + "id": "l5mXIMcD6N", + "name": "Grid Coverage", + "url": "https://www.boardgameatlas.com/mechanic/l5mXIMcD6N/grid-coverage" + }, + { + "id": "qu5BcGjAzk", + "name": "Grid Movement", + "url": "https://www.boardgameatlas.com/mechanic/qu5BcGjAzk/grid-movement" + }, + { + "id": "WPytek5P8l", + "name": "Hand Management", + "url": "https://www.boardgameatlas.com/mechanic/WPytek5P8l/hand-management" + }, + { + "id": "i3xnwJ7VPV", + "name": "Hand-Eye Coordination", + "url": "https://www.boardgameatlas.com/mechanic/i3xnwJ7VPV/handeye-coordination" + }, + { + "id": "6CyVyXRn1C", + "name": "Hex and Counter", + "url": "https://www.boardgameatlas.com/mechanic/6CyVyXRn1C/hex-and-counter" + }, + { + "id": "BeD8NYAaSU", + "name": "Hexagon Grid", + "url": "https://www.boardgameatlas.com/mechanic/BeD8NYAaSU/hexagon-grid" + }, + { + "id": "aQZ40lKv8O", + "name": "Hidden Movement", + "url": "https://www.boardgameatlas.com/mechanic/aQZ40lKv8O/hidden-movement" + }, + { + "id": "dITGE93SCS", + "name": "Hidden Objective", + "url": "https://www.boardgameatlas.com/mechanic/dITGE93SCS/hidden-objective" + }, + { + "id": "U7vKyeRc0N", + "name": "Hidden Roles", + "url": "https://www.boardgameatlas.com/mechanic/U7vKyeRc0N/hidden-roles" + }, + { + "id": "Voqy2dgrIM", + "name": "Hidden Traitor", + "url": "https://www.boardgameatlas.com/mechanic/Voqy2dgrIM/hidden-traitor" + }, + { + "id": "MPiKlI6itI", + "name": "Hidden Victory Points", + "url": "https://www.boardgameatlas.com/mechanic/MPiKlI6itI/hidden-victory-points" + }, + { + "id": "CIvmpy01Iu", + "name": "Highest-Lowest Scoring", + "url": "https://www.boardgameatlas.com/mechanic/CIvmpy01Iu/highest-lowest-scoring" + }, + { + "id": "uEUdAVKex3", + "name": "I Split, You Take", + "url": "https://www.boardgameatlas.com/mechanic/uEUdAVKex3/i-split-you-take" + }, + { + "id": "uRfUbdbX9b", + "name": "Impeded Speech", + "url": "https://www.boardgameatlas.com/mechanic/uRfUbdbX9b/impeded-speech" + }, + { + "id": "6RZAs0CCpF", + "name": "Income", + "url": "https://www.boardgameatlas.com/mechanic/6RZAs0CCpF/income" + }, + { + "id": "hXoDlzyWxx", + "name": "Increased Value of Unchosen Resources", + "url": "https://www.boardgameatlas.com/mechanic/hXoDlzyWxx/increased-value-of-unchosen-resources" + }, + { + "id": "DulpwAyknt", + "name": "Interrupts", + "url": "https://www.boardgameatlas.com/mechanic/DulpwAyknt/interrupts" + }, + { + "id": "Kc9VeRBF4i", + "name": "Investment", + "url": "https://www.boardgameatlas.com/mechanic/Kc9VeRBF4i/investment" + }, + { + "id": "iD9HiRqlaF", + "name": "King of The Hill", + "url": "https://www.boardgameatlas.com/mechanic/iD9HiRqlaF/king-of-the-hill" + }, + { + "id": "OpevqFAODe", + "name": "Ladder Climbing", + "url": "https://www.boardgameatlas.com/mechanic/OpevqFAODe/ladder-climbing" + }, + { + "id": "i4XLPK9XNM", + "name": "Layering", + "url": "https://www.boardgameatlas.com/mechanic/i4XLPK9XNM/layering" + }, + { + "id": "DwmsVEvNVd", + "name": "Legacy", + "url": "https://www.boardgameatlas.com/mechanic/DwmsVEvNVd/legacy" + }, + { + "id": "MaXzmoZUoX", + "name": "Line Drawing", + "url": "https://www.boardgameatlas.com/mechanic/MaXzmoZUoX/line-drawing" + }, + { + "id": "KixWJ4QQPE", + "name": "Line of Sight", + "url": "https://www.boardgameatlas.com/mechanic/KixWJ4QQPE/line-of-sight" + }, + { + "id": "LqtFDVjGEm", + "name": "Loans", + "url": "https://www.boardgameatlas.com/mechanic/LqtFDVjGEm/loans" + }, + { + "id": "XI7soCqc6x", + "name": "Lose a Turn", + "url": "https://www.boardgameatlas.com/mechanic/XI7soCqc6x/lose-a-turn" + }, + { + "id": "ar56ACXDNe", + "name": "Mancala", + "url": "https://www.boardgameatlas.com/mechanic/ar56ACXDNe/mancala" + }, + { + "id": "ZXn5ynKjNz", + "name": "Map Addition", + "url": "https://www.boardgameatlas.com/mechanic/ZXn5ynKjNz/map-addition" + }, + { + "id": "drYVt5pekY", + "name": "Map Deformation", + "url": "https://www.boardgameatlas.com/mechanic/drYVt5pekY/map-deformation" + }, + { + "id": "jvNWYGPDkQ", + "name": "Map Reduction", + "url": "https://www.boardgameatlas.com/mechanic/jvNWYGPDkQ/map-reduction" + }, + { + "id": "wPcKOr57ig", + "name": "Market", + "url": "https://www.boardgameatlas.com/mechanic/wPcKOr57ig/market" + }, + { + "id": "QtH2H2MXp6", + "name": "Matching", + "url": "https://www.boardgameatlas.com/mechanic/QtH2H2MXp6/matching" + }, + { + "id": "HBT0U46aiz", + "name": "Measurement Movement", + "url": "https://www.boardgameatlas.com/mechanic/HBT0U46aiz/measurement-movement" + }, + { + "id": "iK0HWpaNHg", + "name": "Melding and Splaying", + "url": "https://www.boardgameatlas.com/mechanic/iK0HWpaNHg/melding-and-splaying" + }, + { + "id": "r6yIFvyXDD", + "name": "Memory", + "url": "https://www.boardgameatlas.com/mechanic/r6yIFvyXDD/memory" + }, + { + "id": "U3zhCQH7Et", + "name": "Modular Board", + "url": "https://www.boardgameatlas.com/mechanic/U3zhCQH7Et/modular-board" + }, + { + "id": "yBC28ZgwFM", + "name": "Move Through Deck", + "url": "https://www.boardgameatlas.com/mechanic/yBC28ZgwFM/move-through-deck" + }, + { + "id": "V2rMEmnTCs", + "name": "Move with Cards", + "url": "https://www.boardgameatlas.com/mechanic/V2rMEmnTCs/move-with-cards" + }, + { + "id": "3fLVBQG50Z", + "name": "Movement Points", + "url": "https://www.boardgameatlas.com/mechanic/3fLVBQG50Z/movement-points" + }, + { + "id": "Z9qTQxuyjC", + "name": "Movement Template", + "url": "https://www.boardgameatlas.com/mechanic/Z9qTQxuyjC/movement-template" + }, + { + "id": "si2GktB6YI", + "name": "Moving Multiple Units", + "url": "https://www.boardgameatlas.com/mechanic/si2GktB6YI/moving-multiple-units" + }, + { + "id": "rtLNCHIDxl", + "name": "Multiple Maps", + "url": "https://www.boardgameatlas.com/mechanic/rtLNCHIDxl/multiple-maps" + }, + { + "id": "NS4kKxKZHZ", + "name": "Multiple-Lot Auction", + "url": "https://www.boardgameatlas.com/mechanic/NS4kKxKZHZ/multiple-lot-auction" + }, + { + "id": "gcltnDjSRQ", + "name": "Narrative Choice", + "url": "https://www.boardgameatlas.com/mechanic/gcltnDjSRQ/narrative-choice" + }, + { + "id": "jMwUJLemr6", + "name": "Negotiation", + "url": "https://www.boardgameatlas.com/mechanic/jMwUJLemr6/negotiation" + }, + { + "id": "ohABM4GjbC", + "name": "Network and Route Building", + "url": "https://www.boardgameatlas.com/mechanic/ohABM4GjbC/network-and-route-building" + }, + { + "id": "qxXud0DODh", + "name": "Once per game ability", + "url": "https://www.boardgameatlas.com/mechanic/qxXud0DODh/once-per-game-ability" + }, + { + "id": "fUnFqLGvxW", + "name": "Open Drafting", + "url": "https://www.boardgameatlas.com/mechanic/fUnFqLGvxW/open-drafting" + }, + { + "id": "5UcCsstfvR", + "name": "Order Counters", + "url": "https://www.boardgameatlas.com/mechanic/5UcCsstfvR/order-counters" + }, + { + "id": "Pn9PAvCVrW", + "name": "Order Fulfillment", + "url": "https://www.boardgameatlas.com/mechanic/Pn9PAvCVrW/order-fulfillment" + }, + { + "id": "yQ4ZptdyD1", + "name": "Ownership", + "url": "https://www.boardgameatlas.com/mechanic/yQ4ZptdyD1/ownership" + }, + { + "id": "UHdPUeuqyZ", + "name": "Paper and Pencil", + "url": "https://www.boardgameatlas.com/mechanic/UHdPUeuqyZ/paper-and-pencil" + }, + { + "id": "GNtouC8NLm", + "name": "Partnerships", + "url": "https://www.boardgameatlas.com/mechanic/GNtouC8NLm/partnerships" + }, + { + "id": "9YdRn9J9oZ", + "name": "Pattern Building", + "url": "https://www.boardgameatlas.com/mechanic/9YdRn9J9oZ/pattern-building" + }, + { + "id": "VTBonQ4yuA", + "name": "Pattern Movement", + "url": "https://www.boardgameatlas.com/mechanic/VTBonQ4yuA/pattern-movement" + }, + { + "id": "uZJS07nXF5", + "name": "Pattern Recognition", + "url": "https://www.boardgameatlas.com/mechanic/uZJS07nXF5/pattern-recognition" + }, + { + "id": "J4MpJHpMIL", + "name": "Physical Removal", + "url": "https://www.boardgameatlas.com/mechanic/J4MpJHpMIL/physical-removal" + }, + { + "id": "BbTMRkwL0b", + "name": "Pick-up and Deliver", + "url": "https://www.boardgameatlas.com/mechanic/BbTMRkwL0b/pickup-and-deliver" + }, + { + "id": "rgPb6FsESH", + "name": "Pieces as Map", + "url": "https://www.boardgameatlas.com/mechanic/rgPb6FsESH/pieces-as-map" + }, + { + "id": "BGrhzIN69D", + "name": "Player Elimination", + "url": "https://www.boardgameatlas.com/mechanic/BGrhzIN69D/player-elimination" + }, + { + "id": "hChENqTxXH", + "name": "Player Judge", + "url": "https://www.boardgameatlas.com/mechanic/hChENqTxXH/player-judge" + }, + { + "id": "MEAoOygZsA", + "name": "Point to Point Movement", + "url": "https://www.boardgameatlas.com/mechanic/MEAoOygZsA/point-to-point-movement" + }, + { + "id": "0pFuq6wbZK", + "name": "Polyomino", + "url": "https://www.boardgameatlas.com/mechanic/0pFuq6wbZK/polyomino" + }, + { + "id": "ea1eaPBQn8", + "name": "Pool Building", + "url": "https://www.boardgameatlas.com/mechanic/ea1eaPBQn8/pool-building" + }, + { + "id": "hmipYN1R1I", + "name": "Press Your Luck", + "url": "https://www.boardgameatlas.com/mechanic/hmipYN1R1I/press-your-luck" + }, + { + "id": "TKcedESdWT", + "name": "Prisoner's Dilemma", + "url": "https://www.boardgameatlas.com/mechanic/TKcedESdWT/prisoner-s-dilemma" + }, + { + "id": "lbuV691zBC", + "name": "Programmed Movement", + "url": "https://www.boardgameatlas.com/mechanic/lbuV691zBC/programmed-movement" + }, + { + "id": "qZx4PEzKKz", + "name": "Race", + "url": "https://www.boardgameatlas.com/mechanic/qZx4PEzKKz/race" + }, + { + "id": "rpPPpJPbeZ", + "name": "Random Production", + "url": "https://www.boardgameatlas.com/mechanic/rpPPpJPbeZ/random-production" + }, + { + "id": "v9L0Bf86od", + "name": "Ratio / Combat Results Table", + "url": "https://www.boardgameatlas.com/mechanic/v9L0Bf86od/ratio--combat-results-table" + }, + { + "id": "Zppn45KSY4", + "name": "Re-rolling and Locking", + "url": "https://www.boardgameatlas.com/mechanic/Zppn45KSY4/re-rolling-and-locking" + }, + { + "id": "E9VKQ8uMSP", + "name": "Real Time", + "url": "https://www.boardgameatlas.com/mechanic/E9VKQ8uMSP/real-time" + }, + { + "id": "OihbT9eA8c", + "name": "Relative Movement", + "url": "https://www.boardgameatlas.com/mechanic/OihbT9eA8c/relative-movement" + }, + { + "id": "Rt6V388y6M", + "name": "Resource Gathering", + "url": "https://www.boardgameatlas.com/mechanic/Rt6V388y6M/resource-gathering" + }, + { + "id": "i1C9sRK8TS", + "name": "Resource to Move", + "url": "https://www.boardgameatlas.com/mechanic/i1C9sRK8TS/resource-to-move" + }, + { + "id": "j7x8jY4ay2", + "name": "Rock-Paper-Scissors", + "url": "https://www.boardgameatlas.com/mechanic/j7x8jY4ay2/rockpaperscissors" + }, + { + "id": "EVeAdboGUA", + "name": "Role Playing", + "url": "https://www.boardgameatlas.com/mechanic/EVeAdboGUA/role-playing" + }, + { + "id": "gRlslORtpI", + "name": "Role Selection", + "url": "https://www.boardgameatlas.com/mechanic/gRlslORtpI/role-selection" + }, + { + "id": "SwmT0qEFSc", + "name": "Roles with Asymmetric Information", + "url": "https://www.boardgameatlas.com/mechanic/SwmT0qEFSc/roles-with-asymmetric-information" + }, + { + "id": "mGBzR68m8Z", + "name": "Roll / Spin and Move", + "url": "https://www.boardgameatlas.com/mechanic/mGBzR68m8Z/roll--spin-and-move" + }, + { + "id": "zIPRS41oiN", + "name": "Roll and Write", + "url": "https://www.boardgameatlas.com/mechanic/zIPRS41oiN/roll-and-write" + }, + { + "id": "FA6HjbhdNW", + "name": "Rondel", + "url": "https://www.boardgameatlas.com/mechanic/FA6HjbhdNW/rondel" + }, + { + "id": "AO3hFg1Vwo", + "name": "Scenario / Mission / Campaign Game", + "url": "https://www.boardgameatlas.com/mechanic/AO3hFg1Vwo/scenario--mission--campaign-game" + }, + { + "id": "7MwswcgliJ", + "name": "Score and Reset Game", + "url": "https://www.boardgameatlas.com/mechanic/7MwswcgliJ/score-and-reset-game" + }, + { + "id": "R3tFpadfxd", + "name": "Secret Information", + "url": "https://www.boardgameatlas.com/mechanic/R3tFpadfxd/secret-information" + }, + { + "id": "RwgEONzIzc", + "name": "Secret Unit Deployment", + "url": "https://www.boardgameatlas.com/mechanic/RwgEONzIzc/secret-unit-deployment" + }, + { + "id": "KBzOT0kC5a", + "name": "Semi-Cooperative", + "url": "https://www.boardgameatlas.com/mechanic/KBzOT0kC5a/semi-cooperative" + }, + { + "id": "lA3KUtVFCy", + "name": "Set Collection", + "url": "https://www.boardgameatlas.com/mechanic/lA3KUtVFCy/set-collection" + }, + { + "id": "Exm4wqdMPk", + "name": "Shared Pieces", + "url": "https://www.boardgameatlas.com/mechanic/Exm4wqdMPk/shared-pieces" + }, + { + "id": "vBsK2u85w8", + "name": "Shedding", + "url": "https://www.boardgameatlas.com/mechanic/vBsK2u85w8/shedding" + }, + { + "id": "eRe1jJCBFe", + "name": "Simulation", + "url": "https://www.boardgameatlas.com/mechanic/eRe1jJCBFe/simulation" + }, + { + "id": "DEvPj5twid", + "name": "Simultaneous Play", + "url": "https://www.boardgameatlas.com/mechanic/DEvPj5twid/simultaneous-play" + }, + { + "id": "za4PP1LH00", + "name": "Simultaneous action selection", + "url": "https://www.boardgameatlas.com/mechanic/za4PP1LH00/simultaneous-action-selection" + }, + { + "id": "4RNcc2Le80", + "name": "Singing", + "url": "https://www.boardgameatlas.com/mechanic/4RNcc2Le80/singing" + }, + { + "id": "kuRNhFADjS", + "name": "Skirmish", + "url": "https://www.boardgameatlas.com/mechanic/kuRNhFADjS/skirmish" + }, + { + "id": "jA7onZMFVY", + "name": "Slide / Push", + "url": "https://www.boardgameatlas.com/mechanic/jA7onZMFVY/slide--push" + }, + { + "id": "x3wVCq1HEP", + "name": "Social Deduction", + "url": "https://www.boardgameatlas.com/mechanic/x3wVCq1HEP/social-deduction" + }, + { + "id": "uZR0NCIA6D", + "name": "Solo / Solitaire Game", + "url": "https://www.boardgameatlas.com/mechanic/uZR0NCIA6D/solo--solitaire-game" + }, + { + "id": "L8QFIjNObL", + "name": "Solo mode (multiplayer game)", + "url": "https://www.boardgameatlas.com/mechanic/L8QFIjNObL/solo-mode-multiplayer-game-" + }, + { + "id": "QWPVu14v5P", + "name": "Spatial Reasoning", + "url": "https://www.boardgameatlas.com/mechanic/QWPVu14v5P/spatial-reasoning" + }, + { + "id": "xzG9nBn4SV", + "name": "Speed Matching", + "url": "https://www.boardgameatlas.com/mechanic/xzG9nBn4SV/speed-matching" + }, + { + "id": "0ZveDwHjpC", + "name": "Spelling Words", + "url": "https://www.boardgameatlas.com/mechanic/0ZveDwHjpC/spelling-words" + }, + { + "id": "m9IFaYKaOA", + "name": "Square Grid", + "url": "https://www.boardgameatlas.com/mechanic/m9IFaYKaOA/square-grid" + }, + { + "id": "QGpSz6qoPw", + "name": "Stacking and Balancing", + "url": "https://www.boardgameatlas.com/mechanic/QGpSz6qoPw/stacking-and-balancing" + }, + { + "id": "EJVFd5uZaH", + "name": "Static Capture", + "url": "https://www.boardgameatlas.com/mechanic/EJVFd5uZaH/static-capture" + }, + { + "id": "jbLrZb1xIb", + "name": "Stock Holding", + "url": "https://www.boardgameatlas.com/mechanic/jbLrZb1xIb/stock-holding" + }, + { + "id": "GUoWg3Mfh5", + "name": "Storytelling", + "url": "https://www.boardgameatlas.com/mechanic/GUoWg3Mfh5/storytelling" + }, + { + "id": "KbFMG5kwhn", + "name": "Submit and Judge", + "url": "https://www.boardgameatlas.com/mechanic/KbFMG5kwhn/submit-and-judge" + }, + { + "id": "xarBBVMST3", + "name": "Sudden Death Ending", + "url": "https://www.boardgameatlas.com/mechanic/xarBBVMST3/sudden-death-ending" + }, + { + "id": "xAoL3P3BIV", + "name": "Survival", + "url": "https://www.boardgameatlas.com/mechanic/xAoL3P3BIV/survival" + }, + { + "id": "u9IJEE1QBN", + "name": "Tableau Building", + "url": "https://www.boardgameatlas.com/mechanic/u9IJEE1QBN/tableau-building" + }, + { + "id": "T8JEFYwoqy", + "name": "Take That", + "url": "https://www.boardgameatlas.com/mechanic/T8JEFYwoqy/take-that" + }, + { + "id": "kNO1bm1siL", + "name": "Take This", + "url": "https://www.boardgameatlas.com/mechanic/kNO1bm1siL/take-this" + }, + { + "id": "Tb52O7Id9Q", + "name": "Targeted Clues", + "url": "https://www.boardgameatlas.com/mechanic/Tb52O7Id9Q/targeted-clues" + }, + { + "id": "9jnCsVuRat", + "name": "Teams", + "url": "https://www.boardgameatlas.com/mechanic/9jnCsVuRat/teams" + }, + { + "id": "LzMEog842j", + "name": "Tech Trees / Tech Tracks", + "url": "https://www.boardgameatlas.com/mechanic/LzMEog842j/tech-trees--tech-tracks" + }, + { + "id": "HGcSWoywV0", + "name": "Threat Progression", + "url": "https://www.boardgameatlas.com/mechanic/HGcSWoywV0/threat-progression" + }, + { + "id": "IPy36VhU8T", + "name": "Three Dimensional Movement", + "url": "https://www.boardgameatlas.com/mechanic/IPy36VhU8T/three-dimensional-movement" + }, + { + "id": "8PN2HE86wg", + "name": "Tile Placement", + "url": "https://www.boardgameatlas.com/mechanic/8PN2HE86wg/tile-placement" + }, + { + "id": "JX9P0Lda4D", + "name": "Tile movement", + "url": "https://www.boardgameatlas.com/mechanic/JX9P0Lda4D/tile-movement" + }, + { + "id": "cXd5KaXXZo", + "name": "Time Track", + "url": "https://www.boardgameatlas.com/mechanic/cXd5KaXXZo/time-track" + }, + { + "id": "wEBvff5T5c", + "name": "Tower Defense", + "url": "https://www.boardgameatlas.com/mechanic/wEBvff5T5c/tower-defense" + }, + { + "id": "gXBJh0WkGb", + "name": "Track Movement", + "url": "https://www.boardgameatlas.com/mechanic/gXBJh0WkGb/track-movement" + }, + { + "id": "AVY6EvSQTP", + "name": "Trading", + "url": "https://www.boardgameatlas.com/mechanic/AVY6EvSQTP/trading" + }, + { + "id": "tyTj0kxoRc", + "name": "Traitor", + "url": "https://www.boardgameatlas.com/mechanic/tyTj0kxoRc/traitor" + }, + { + "id": "3GSQl800lk", + "name": "Trick-taking", + "url": "https://www.boardgameatlas.com/mechanic/3GSQl800lk/tricktaking" + }, + { + "id": "dq0UYF6HCv", + "name": "Tug of War", + "url": "https://www.boardgameatlas.com/mechanic/dq0UYF6HCv/tug-of-war" + }, + { + "id": "mckyPcVJ0c", + "name": "Turn Order: Auction", + "url": "https://www.boardgameatlas.com/mechanic/mckyPcVJ0c/turn-order-auction" + }, + { + "id": "2hWNbfJ0wi", + "name": "Turn Order: Claim Action", + "url": "https://www.boardgameatlas.com/mechanic/2hWNbfJ0wi/turn-order-claim-action" + }, + { + "id": "U6W741PEHU", + "name": "Turn Order: Pass Order", + "url": "https://www.boardgameatlas.com/mechanic/U6W741PEHU/turn-order-pass-order" + }, + { + "id": "1nmCkkoKaq", + "name": "Turn Order: Progressive", + "url": "https://www.boardgameatlas.com/mechanic/1nmCkkoKaq/turn-order-progressive" + }, + { + "id": "mIbXGXV7Ok", + "name": "Turn Order: Random", + "url": "https://www.boardgameatlas.com/mechanic/mIbXGXV7Ok/turn-order-random" + }, + { + "id": "EIsPHVVFC8", + "name": "Turn Order: Roll Order", + "url": "https://www.boardgameatlas.com/mechanic/EIsPHVVFC8/turn-order-roll-order" + }, + { + "id": "ghLZBAbqCB", + "name": "Turn Order: Stat-Based", + "url": "https://www.boardgameatlas.com/mechanic/ghLZBAbqCB/turn-order-stat-based" + }, + { + "id": "zzsE4jtI1b", + "name": "Variable Phase Order", + "url": "https://www.boardgameatlas.com/mechanic/zzsE4jtI1b/variable-phase-order" + }, + { + "id": "XM2FYZmBHH", + "name": "Variable Player Powers", + "url": "https://www.boardgameatlas.com/mechanic/XM2FYZmBHH/variable-player-powers" + }, + { + "id": "qdOpNsR6iU", + "name": "Variable Setup", + "url": "https://www.boardgameatlas.com/mechanic/qdOpNsR6iU/variable-setup" + }, + { + "id": "Rvs7NYbvo1", + "name": "Victory Points as a Resource", + "url": "https://www.boardgameatlas.com/mechanic/Rvs7NYbvo1/victory-points-as-a-resource" + }, + { + "id": "JYYdBW6UCE", + "name": "Voting", + "url": "https://www.boardgameatlas.com/mechanic/JYYdBW6UCE/voting" + }, + { + "id": "bbbmSiDpdR", + "name": "Word Association", + "url": "https://www.boardgameatlas.com/mechanic/bbbmSiDpdR/word-association" + }, + { + "id": "fBOTEBUAmV", + "name": "Worker Placement", + "url": "https://www.boardgameatlas.com/mechanic/fBOTEBUAmV/worker-placement" + }, + { + "id": "B30dz3Ljjx", + "name": "Worker Placement with Dice Workers", + "url": "https://www.boardgameatlas.com/mechanic/B30dz3Ljjx/worker-placement-with-dice-workers" + }, + { + "id": "PfgjF704uD", + "name": "Worker Placement, Different Worker Types", + "url": "https://www.boardgameatlas.com/mechanic/PfgjF704uD/worker-placement-different-worker-types" + }, + { + "id": "M7pWAuRX2d", + "name": "Zone of Control", + "url": "https://www.boardgameatlas.com/mechanic/M7pWAuRX2d/zone-of-control" + } + ] +} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5949929..b9a99d1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -126,39 +126,37 @@ model WishlistItem { } model Game { - id String @id @default(cuid()) - name String - slug String - description String? - year_published Int? - min_players Int? - max_players Int? - min_playtime Int? - max_playtime Int? - min_age Int? - image_url String? - thumb_url String? - url String? - rules_url String? - weight_amount Float? - weight_units String? - bggId String? - bggUrl String? - primary_publisher_id String - primary_publisher Publisher? @relation("PrimaryPublishers", references: [id], fields: [primary_publisher_id]) - categories Category[] - mechanics Mechanic[] - designers Designer[] - publishers Publisher[] - artists Artist[] - names GameName[] - expansions Expansion[] - collection_items CollectionItem[] - wishlist_items WishlistItem[] - external_id String @unique - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) + id String @id @default(cuid()) + name String + slug String + description String? + description_preview String? + year_published Int? + min_players Int? + max_players Int? + min_playtime Int? + max_playtime Int? + min_age Int? + image_url String? + thumb_url String? + url String? + rules_url String? + primary_publisher_id String? + primary_publisher Publisher? @relation("PrimaryPublishers", references: [id], fields: [primary_publisher_id]) + categories Category[] + mechanics Mechanic[] + designers Designer[] + publishers Publisher[] + artists Artist[] + names GameName[] + expansions Expansion[] + collection_items CollectionItem[] + wishlist_items WishlistItem[] + external_id String @unique + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@index([primary_publisher_id]) @@map("games") } @@ -180,10 +178,10 @@ model Publisher { name String games Game[] primary_publisher Game[] @relation("PrimaryPublishers") - external_id String @unique created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@map("publishers") } @@ -196,17 +194,20 @@ model Category { created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@map("categories") } model Mechanic { id String @id @default(cuid()) name String + slug String games Game[] external_id String @unique created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@map("mechanics") } @@ -214,10 +215,10 @@ model Designer { id String @id @default(cuid()) name String games Game[] - external_id String @unique created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@map("designers") } @@ -225,10 +226,10 @@ model Artist { id String @id @default(cuid()) name String games Game[] - external_id String @unique created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@map("artists") } @@ -242,6 +243,7 @@ model Expansion { created_at DateTime @default(now()) @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6) + @@fulltext([name]) @@index([base_game_id]) @@map("expansions") } diff --git a/prisma/seed.ts b/prisma/seed.ts index 11490cf..07d6d1b 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,11 +1,14 @@ import { PrismaClient } from '@prisma/client'; -// import userData from '../src/lib/data.json' assert { type: 'json' }; +import kebabCase from 'just-kebab-case'; +import categories from './categories.json' assert { type: 'json' }; +import mechanics from './mechanics.json' assert { type: 'json' }; const prisma = new PrismaClient(); async function main() { console.log(`Start seeding ...`); + console.log('Creating roles ...'); const existingRoles = await prisma.role.findMany(); if (existingRoles.length === 0) { await prisma.role.createMany({ @@ -16,6 +19,36 @@ async function main() { console.log('Roles already exist. No action taken.'); } + console.log('Creating Mechanics ...'); + const existingMechanics = await prisma.mechanic.findMany(); + if (existingMechanics.length === 0) { + for (const mechanic of mechanics.mechanics) { + await prisma.mechanic.create({ + data: { + name: mechanic.name, + external_id: mechanic.id, + slug: kebabCase(mechanic.name) + } + }); + } + console.log('Mechanics created.'); + } + + console.log('Creating Categories ...'); + const existingCategories = await prisma.category.findMany(); + if (existingCategories.length === 0) { + for (const category of categories.categories) { + await prisma.category.create({ + data: { + name: category.name, + external_id: category.id, + slug: kebabCase(category.name) + } + }); + } + console.log('Categories created.'); + } + // for (const p of userData) { // const user = await prisma.user.create({ // data: {