Modify data models, add slug and just kebab dependency, seed data for mechanics and categories if none exist in the DB.

This commit is contained in:
Bradley Shellnut 2023-06-22 16:52:25 -07:00
parent 9e7e6687a4
commit b23a101c0f
6 changed files with 2247 additions and 171 deletions

View file

@ -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",

View file

@ -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

859
prisma/categories.json Normal file
View file

@ -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"
}
]
}

1129
prisma/mechanics.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -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")
}

View file

@ -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: {