From: MTRNord Date: Mon, 13 Jan 2025 12:38:25 +0000 (+0100) Subject: Provide docker image X-Git-Url: https://gerrit.midnightthoughts.space/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F64%2F164%2F1;p=neoboard-miro-converter.git Provide docker image Change-Id: I73ca9637b70bf4da77fe4a8b95e09424118317a2 --- diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..170afd4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ed117ad --- /dev/null +++ b/Dockerfile @@ -0,0 +1,69 @@ +# syntax=docker.io/docker/dockerfile:1 + +FROM node:23-alpine AS base +# Install dependencies only when needed +FROM base AS deps +WORKDIR /app + +# Most needed by canvas lib +RUN apk add --no-cache libc6-compat patch python3 pkgconfig pixman-dev cairo-dev pango-dev make g++ + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Run patch to fix miro package +COPY miro_api_styles_fix.patch ./ +RUN patch -p1 < miro_api_styles_fix.patch + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +# Uncomment the following line in case you want to disable telemetry during runtime. +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] \ No newline at end of file diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..214b4a1 --- /dev/null +++ b/next.config.js @@ -0,0 +1,3 @@ +module.exports = { + output: 'standalone', +} \ No newline at end of file diff --git a/package.json b/package.json index e9a425a..04c219f 100644 --- a/package.json +++ b/package.json @@ -9,25 +9,25 @@ }, "dependencies": { "@mirohq/miro-api": "^2.2.2", - "cookie": "^0.5.0", + "canvas": "^3.0.1", + "cookie": "^1.0.2", "dotenv": "^16.4.7", "mirotone": "^5.3.0", "next": "15.1.4", - "react": "19.0.0", - "react-dom": "19.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "sass": "^1.83.1", "string-strip-html": "^13.4.8", - "zod": "^3.24.1", - "canvas": "^3.0.1" + "zod": "^3.24.1" }, "devDependencies": { - "@mirohq/websdk-types": "latest", - "@types/cookie": "^0.5.4", - "@types/node": "^18.19.70", - "@types/react": "19.0.4", - "@types/react-dom": "19.0.2", + "@mirohq/websdk-types": "^2.16.1", + "@types/node": "^22.10.5", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", "eslint": "^9.18.0", "eslint-config-next": "15.1.4", - "typescript": "4.9.5" - } -} \ No newline at end of file + "typescript": "^5.7.3" + }, + "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ac7b58..94f4b05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 cookie: - specifier: ^0.5.0 - version: 0.5.0 + specifier: ^1.0.2 + version: 1.0.2 dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -27,10 +27,10 @@ importers: specifier: 15.1.4 version: 15.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.83.1) react: - specifier: 19.0.0 + specifier: ^19.0.0 version: 19.0.0 react-dom: - specifier: 19.0.0 + specifier: ^19.0.0 version: 19.0.0(react@19.0.0) sass: specifier: ^1.83.1 @@ -43,29 +43,26 @@ importers: version: 3.24.1 devDependencies: '@mirohq/websdk-types': - specifier: latest - version: 2.16.1(@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint@9.18.0)(typescript@4.9.5))(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-plugin-import@2.31.0)(eslint@9.18.0) - '@types/cookie': - specifier: ^0.5.4 - version: 0.5.4 + specifier: ^2.16.1 + version: 2.16.1(@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.18.0) '@types/node': - specifier: ^18.19.70 - version: 18.19.70 + specifier: ^22.10.5 + version: 22.10.5 '@types/react': - specifier: 19.0.4 - version: 19.0.4 + specifier: ^19.0.6 + version: 19.0.6 '@types/react-dom': - specifier: 19.0.2 - version: 19.0.2(@types/react@19.0.4) + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.6) eslint: specifier: ^9.18.0 version: 9.18.0 eslint-config-next: specifier: 15.1.4 - version: 15.1.4(eslint@9.18.0)(typescript@4.9.5) + version: 15.1.4(eslint@9.18.0)(typescript@5.7.3) typescript: - specifier: 4.9.5 - version: 4.9.5 + specifier: ^5.7.3 + version: 5.7.3 packages: @@ -433,9 +430,6 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@types/cookie@0.5.4': - resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -451,16 +445,16 @@ packages: '@types/lodash@4.17.14': resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} - '@types/node@18.19.70': - resolution: {integrity: sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} - '@types/react-dom@19.0.2': - resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} + '@types/react-dom@19.0.3': + resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.4': - resolution: {integrity: sha512-3O4QisJDYr1uTUMZHA2YswiQZRq+Pd8D+GdVFYikTutYsTz+QZgWkAPnP7rx9txoI6EXKcPiluMqWPFV3tT9Wg==} + '@types/react@19.0.6': + resolution: {integrity: sha512-gIlMztcTeDgXCUj0vCBOqEuSEhX//63fW9SZtCJ+agxoQTOklwDfiEMlTWn4mR/C/UK5VHlpwsCsOyf7/hc4lw==} '@typescript-eslint/eslint-plugin@8.19.1': resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} @@ -685,9 +679,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -892,8 +886,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.3: - resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -1576,6 +1570,9 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -1709,6 +1706,9 @@ packages: string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -1801,17 +1801,17 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} hasBin: true unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2014,14 +2014,14 @@ snapshots: transitivePeerDependencies: - encoding - '@mirohq/websdk-types@2.16.1(@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint@9.18.0)(typescript@4.9.5))(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-plugin-import@2.31.0)(eslint@9.18.0)': + '@mirohq/websdk-types@2.16.1(@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.18.0)': dependencies: - typescript: 4.9.5 + typescript: 5.7.3 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint@9.18.0)(typescript@4.9.5) - '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@5.7.3) eslint: 9.18.0 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) '@next/env@15.1.4': {} @@ -2138,8 +2138,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@types/cookie@0.5.4': {} - '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} @@ -2152,44 +2150,44 @@ snapshots: '@types/lodash@4.17.14': {} - '@types/node@18.19.70': + '@types/node@22.10.5': dependencies: - undici-types: 5.26.5 + undici-types: 6.20.0 - '@types/react-dom@19.0.2(@types/react@19.0.4)': + '@types/react-dom@19.0.3(@types/react@19.0.6)': dependencies: - '@types/react': 19.0.4 + '@types/react': 19.0.6 - '@types/react@19.0.4': + '@types/react@19.0.6': dependencies: csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint@9.18.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.19.1 - '@typescript-eslint/type-utils': 8.19.1(eslint@9.18.0)(typescript@4.9.5) - '@typescript-eslint/utils': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 8.19.1(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.18.0)(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.19.1 eslint: 9.18.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5)': + '@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.19.1 '@typescript-eslint/types': 8.19.1 - '@typescript-eslint/typescript-estree': 8.19.1(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.19.1 debug: 4.4.0 eslint: 9.18.0 - typescript: 4.9.5 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -2198,20 +2196,20 @@ snapshots: '@typescript-eslint/types': 8.19.1 '@typescript-eslint/visitor-keys': 8.19.1 - '@typescript-eslint/type-utils@8.19.1(eslint@9.18.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.19.1(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.19.1(typescript@4.9.5) - '@typescript-eslint/utils': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.18.0)(typescript@5.7.3) debug: 4.4.0 eslint: 9.18.0 - ts-api-utils: 2.0.0(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.19.1': {} - '@typescript-eslint/typescript-estree@8.19.1(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.19.1 '@typescript-eslint/visitor-keys': 8.19.1 @@ -2220,19 +2218,19 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.19.1(eslint@9.18.0)(typescript@4.9.5)': + '@typescript-eslint/utils@8.19.1(eslint@9.18.0)(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) '@typescript-eslint/scope-manager': 8.19.1 '@typescript-eslint/types': 8.19.1 - '@typescript-eslint/typescript-estree': 8.19.1(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) eslint: 9.18.0 - typescript: 4.9.5 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -2450,7 +2448,7 @@ snapshots: concat-map@0.0.1: {} - cookie@0.5.0: {} + cookie@1.0.2: {} core-util-is@1.0.3: {} @@ -2644,21 +2642,21 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.4(eslint@9.18.0)(typescript@4.9.5): + eslint-config-next@15.1.4(eslint@9.18.0)(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.1.4 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint@9.18.0)(typescript@4.9.5) - '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@5.7.3) eslint: 9.18.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0) - eslint-plugin-react: 7.37.3(eslint@9.18.0) + eslint-plugin-react: 7.37.4(eslint@9.18.0) eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0) optionalDependencies: - typescript: 4.9.5 + typescript: 5.7.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -2684,22 +2682,22 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@5.7.3) eslint: 9.18.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -2710,7 +2708,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.18.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2722,7 +2720,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.19.1(eslint@9.18.0)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -2751,7 +2749,7 @@ snapshots: dependencies: eslint: 9.18.0 - eslint-plugin-react@7.37.3(eslint@9.18.0): + eslint-plugin-react@7.37.4(eslint@9.18.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3454,7 +3452,7 @@ snapshots: readable-stream@3.6.2: dependencies: inherits: 2.0.4 - string_decoder: 1.1.1 + string_decoder: 1.3.0 util-deprecate: 1.0.2 readdirp@4.1.1: {} @@ -3517,6 +3515,8 @@ snapshots: safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -3725,6 +3725,10 @@ snapshots: dependencies: safe-buffer: 5.1.2 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-bom@3.0.0: {} strip-json-comments@2.0.1: {} @@ -3772,9 +3776,9 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@2.0.0(typescript@4.9.5): + ts-api-utils@2.0.0(typescript@5.7.3): dependencies: - typescript: 4.9.5 + typescript: 5.7.3 tsconfig-paths@3.15.0: dependencies: @@ -3787,7 +3791,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 type-check@0.4.0: dependencies: @@ -3826,7 +3830,7 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 - typescript@4.9.5: {} + typescript@5.7.3: {} unbox-primitive@1.1.0: dependencies: @@ -3835,7 +3839,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} + undici-types@6.20.0: {} uri-js@4.4.1: dependencies: diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29