diff --git a/.gitignore b/.gitignore index fb697236..75cb7e23 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,7 @@ loadedPlugins /uploads packages/graphql/apollo-react-hooks.* -!packages/graphql/apollo-react-hooks.tsx \ No newline at end of file +!packages/graphql/apollo-react-hooks.tsx + +nft_results +node_modules_nft \ No newline at end of file diff --git a/apps/homepage/src/next.config.js b/apps/homepage/src/next.config.js index ac802970..faf2f867 100644 --- a/apps/homepage/src/next.config.js +++ b/apps/homepage/src/next.config.js @@ -15,6 +15,7 @@ module.exports = () => { poweredByHeader: false, distDir: `../.next`, trailingSlash: false, + output: "standalone", redirects() { return [ { diff --git a/backend/server/package.json b/backend/server/package.json index 417ad96e..d980a161 100644 --- a/backend/server/package.json +++ b/backend/server/package.json @@ -1,7 +1,18 @@ { "name": "@repo/server", "version": "0.0.0", - "main": "dist/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, "scripts": { "build": "pkgroll", "start": "sh ./scripts/process-public-next-env.sh && node -r @repo/config/env -r @repo/observability/initTracing dist/index.js", diff --git a/package.json b/package.json index 82dd37b5..0c2af5f2 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "devDependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.1.0", + "@vercel/nft": "^0.29.2", "concurrently": "^9.1.0", "nodemon": "^3.1.7", "patch-package": "^8.0.0", diff --git a/production.Dockerfile b/production.Dockerfile index 2216a07e..799ec95e 100644 --- a/production.Dockerfile +++ b/production.Dockerfile @@ -86,6 +86,8 @@ RUN yarn workspace @repo/base-plugin build COPY packages/ui/ /app/packages/ui/ RUN yarn workspace @repo/ui build +RUN node scripts/build_utils/extract_core.js + ################################################################################ # Build stage 3 - Build server @@ -97,6 +99,8 @@ RUN yarn worker build COPY backend/server/ /app/backend/server/ RUN yarn server build +RUN node scripts/build_utils/extract_server.js + ################################################################################ # Build stage 4 - Build client @@ -148,8 +152,20 @@ RUN yarn workspace @repo/plugin-radio build COPY plugins/worship-pads/ /app/plugins/worship-pads/ RUN yarn workspace @repo/plugin-worship-pads build +RUN node scripts/build_utils/extract_plugins.js + +################################################################################ +# Build stage 6 - Extract just the needed dependencies for runtime + +FROM deps AS nft-extract + +# We don't need to copy from core since both builder extends core +COPY --from=builder-server /app/nft_results /app/nft_results +COPY --from=builder-plugin /app/nft_results /app/nft_results +RUN node scripts/build_utils/copy_deps.js + ################################################################################ -# Build stage 6 - Combine deps and build, taking only needed files +# Build stage 7 - Combine deps and build, taking only needed files FROM node:22-alpine AS clean # Import our shared args @@ -159,7 +175,17 @@ ARG ROOT_URL # Copy over selectively just the tings we need, try and avoid the rest COPY --from=deps /app/turbo.json /app/package.json /app/yarn.lock /app/.yarnrc.yml /app/ COPY --from=deps /app/.yarn /app/.yarn/ -COPY --from=deps /app/node_modules /app/node_modules/ +# Copy only the dependencies we need +COPY --from=nft-extract /app/node_modules_nft/node_modules /app/node_modules +# Get the standalone deps from next +COPY --from=builder-client /app/apps/homepage/.next/standalone/node_modules /app/node_modules +# Copy over the yarn state +COPY --from=deps /app/node_modules/.yarn-state.yml /app/node_modules/ +# And also the @repo symlink +COPY --from=deps /app/node_modules/@repo /app/node_modules/@repo/ +# And last but not least, get next specifically due to its complicated require setup. We'll get problems otherwise +COPY --from=deps /app/node_modules/next /app/node_modules/next/ + COPY --from=builder-core /app/packages/graphql/ /app/packages/graphql/ COPY --from=builder-core /app/backend/config/ /app/backend/config/ COPY --from=builder-core /app/packages/observability/ /app/packages/observability/ @@ -174,9 +200,8 @@ COPY --from=builder-client /app/apps/remote/.env.production /app/apps/remote/ COPY --from=builder-client /app/apps/renderer/package.json /app/apps/renderer/ COPY --from=builder-client /app/apps/renderer/dist/ /app/apps/renderer/dist/ COPY --from=builder-client /app/apps/renderer/.env.production /app/apps/renderer/ -COPY --from=builder-client /app/apps/homepage/package.json /app/apps/homepage/ -COPY --from=builder-client /app/apps/homepage/src/next.config.js /app/apps/homepage/src/next.config.js -COPY --from=builder-client /app/apps/homepage/.next /app/apps/homepage/.next +COPY --from=builder-client /app/apps/homepage/.next/standalone/apps/homepage /app/apps/homepage +COPY --from=builder-client /app/apps/homepage/.next/static /app/apps/homepage/.next/static/ COPY --from=builder-server /app/backend/server/package.json /app/backend/server/ COPY --from=builder-server /app/backend/server/postgraphile.tags.jsonc /app/backend/server/ diff --git a/scripts/build_utils/copy_deps.js b/scripts/build_utils/copy_deps.js new file mode 100644 index 00000000..39295186 --- /dev/null +++ b/scripts/build_utils/copy_deps.js @@ -0,0 +1,37 @@ +const fs = require("fs"); +const path = require("path"); + +const run = () => { + const targetDir = "./node_modules_nft"; + + const files = fs.readdirSync("./nft_results"); + + let filesToCopy = []; + + for (const file of files) { + if (!file.endsWith("json")) { + continue; + } + + const data = JSON.parse( + fs.readFileSync(path.join("./nft_results", file), "utf-8"), + ); + filesToCopy.push(...data); + } + + const uniqueFilesToCopy = Array.from(new Set(filesToCopy)).filter((x) => + x.startsWith("node_modules"), + ); + + for (const filePath of uniqueFilesToCopy) { + const targetPath = path.join(targetDir, filePath); + + // Create necessary directories + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + + // Copy the file + fs.copyFileSync(filePath, targetPath); + } +}; + +run(); diff --git a/scripts/build_utils/extract_core.js b/scripts/build_utils/extract_core.js new file mode 100644 index 00000000..f098a78a --- /dev/null +++ b/scripts/build_utils/extract_core.js @@ -0,0 +1,31 @@ +const { nodeFileTrace } = require("@vercel/nft"); +const fs = require("fs"); + +const files = [ + "./packages/graphql/dist/index.js", + "./backend/config/dist/index.js", + "./backend/config/env.js", + "./packages/lib/dist/index.js", + "./packages/observability/dist/index.js", + "./packages/observability/initTracing.js", + "./backend/backend-shared/dist/index.js", + "./packages/base-plugin/dist/index.js", + "./packages/base-plugin/dist/server/index.js", +]; + +(async () => { + try { + const { fileList } = await nodeFileTrace(files, { + ignore: (prop) => + !prop.startsWith("node_modules") || prop.includes("/@repo/"), + }); + + fs.mkdirSync("./nft_results", { recursive: true }); + fs.writeFileSync( + "./nft_results/core.json", + JSON.stringify(Array.from(fileList)), + ); + } catch (e) { + console.error(e); + } +})(); diff --git a/scripts/build_utils/extract_plugins.js b/scripts/build_utils/extract_plugins.js new file mode 100644 index 00000000..23dc8754 --- /dev/null +++ b/scripts/build_utils/extract_plugins.js @@ -0,0 +1,24 @@ +const { nodeFileTrace } = require("@vercel/nft"); +const fs = require("fs"); +const path = require("path"); + +const plugins = fs.readdirSync("./plugins"); + +const files = plugins.map((x) => path.join("./plugins", x, "dist/index.js")); + +(async () => { + try { + const { fileList } = await nodeFileTrace(files, { + ignore: (prop) => + !prop.startsWith("node_modules") || prop.includes("/@repo/"), + }); + + fs.mkdirSync("./nft_results", { recursive: true }); + fs.writeFileSync( + "./nft_results/plugins.json", + JSON.stringify(Array.from(fileList)), + ); + } catch (e) { + console.error(e); + } +})(); diff --git a/scripts/build_utils/extract_server.js b/scripts/build_utils/extract_server.js new file mode 100644 index 00000000..f337faf4 --- /dev/null +++ b/scripts/build_utils/extract_server.js @@ -0,0 +1,21 @@ +const { nodeFileTrace } = require("@vercel/nft"); +const fs = require("fs"); + +const files = ["./backend/server/dist/index.js"]; + +(async () => { + try { + const { fileList } = await nodeFileTrace(files, { + ignore: (prop) => + !prop.startsWith("node_modules") || prop.includes("/@repo/"), + }); + + fs.mkdirSync("./nft_results", { recursive: true }); + fs.writeFileSync( + "./nft_results/server.json", + JSON.stringify(Array.from(fileList)), + ); + } catch (e) { + console.error(e); + } +})(); diff --git a/yarn.lock b/yarn.lock index 820df874..1eebdc0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4361,6 +4361,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + "@istanbuljs/load-nyc-config@npm:^1.0.0": version: 1.1.0 resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" @@ -4712,6 +4721,23 @@ __metadata: languageName: node linkType: hard +"@mapbox/node-pre-gyp@npm:^2.0.0": + version: 2.0.0 + resolution: "@mapbox/node-pre-gyp@npm:2.0.0" + dependencies: + consola: "npm:^3.2.3" + detect-libc: "npm:^2.0.0" + https-proxy-agent: "npm:^7.0.5" + node-fetch: "npm:^2.6.7" + nopt: "npm:^8.0.0" + semver: "npm:^7.5.3" + tar: "npm:^7.4.0" + bin: + node-pre-gyp: bin/node-pre-gyp + checksum: 10c0/7d874c7f6f5560a87be7207f28d9a4e53b750085a82167608fd573aab8073645e95b3608f69e244df0e1d24e90a66525aeae708aba82ca73ff668ed0ab6abda6 + languageName: node + linkType: hard + "@microsoft/api-extractor-model@npm:7.30.3": version: 7.30.3 resolution: "@microsoft/api-extractor-model@npm:7.30.3" @@ -7866,6 +7892,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.1.3": + version: 5.1.4 + resolution: "@rollup/pluginutils@npm:5.1.4" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.26.0": version: 4.26.0 resolution: "@rollup/rollup-android-arm-eabi@npm:4.26.0" @@ -10653,6 +10695,28 @@ __metadata: languageName: node linkType: hard +"@vercel/nft@npm:^0.29.2": + version: 0.29.2 + resolution: "@vercel/nft@npm:0.29.2" + dependencies: + "@mapbox/node-pre-gyp": "npm:^2.0.0" + "@rollup/pluginutils": "npm:^5.1.3" + acorn: "npm:^8.6.0" + acorn-import-attributes: "npm:^1.9.5" + async-sema: "npm:^3.1.1" + bindings: "npm:^1.4.0" + estree-walker: "npm:2.0.2" + glob: "npm:^10.4.5" + graceful-fs: "npm:^4.2.9" + node-gyp-build: "npm:^4.2.2" + picomatch: "npm:^4.0.2" + resolve-from: "npm:^5.0.0" + bin: + nft: out/cli.js + checksum: 10c0/3f1e3d3d2565e6e4ac191fc4f9b9b9676959de82165d6ae789410c5c0df058802f2ff9221ac325857ddc1f11f30509c73e01c43f0a91b56371d595a2eab5205f + languageName: node + linkType: hard + "@vercel/style-guide@npm:^6.0.0": version: 6.0.0 resolution: "@vercel/style-guide@npm:6.0.0" @@ -11031,6 +11095,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 + languageName: node + linkType: hard + "accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -11078,7 +11149,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -11105,6 +11176,13 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -11515,6 +11593,13 @@ __metadata: languageName: node linkType: hard +"async-sema@npm:^3.1.1": + version: 3.1.1 + resolution: "async-sema@npm:3.1.1" + checksum: 10c0/a16da9f7f2dbdd00a969bf264b7ad331b59df3eac2b38f529b881c5cc8662594e68ed096d927ec2aabdc13454379cdc6d677bcdb0a3d2db338fb4be17957832b + languageName: node + linkType: hard + "async@npm:^0.2.9": version: 0.2.10 resolution: "async@npm:0.2.10" @@ -11880,6 +11965,15 @@ __metadata: languageName: node linkType: hard +"bindings@npm:^1.4.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -12411,6 +12505,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + "ci-info@npm:^3.2.0, ci-info@npm:^3.7.0": version: 3.9.0 resolution: "ci-info@npm:3.9.0" @@ -13655,6 +13756,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + "detect-newline@npm:3.1.0, detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -15152,6 +15260,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + "estree-walker@npm:^0.6.1": version: 0.6.1 resolution: "estree-walker@npm:0.6.1" @@ -15159,13 +15274,6 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - "estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" @@ -15580,6 +15688,13 @@ __metadata: languageName: node linkType: hard +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + "filelist@npm:^1.0.4": version: 1.0.4 resolution: "filelist@npm:1.0.4" @@ -16155,7 +16270,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.3, glob@npm:^10.4.1": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.3, glob@npm:^10.3.7, glob@npm:^10.4.1, glob@npm:^10.4.5": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -16888,6 +17003,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.5": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + "human-signals@npm:^1.1.1": version: 1.1.1 resolution: "human-signals@npm:1.1.1" @@ -19811,7 +19936,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 @@ -19828,6 +19953,16 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + "mitt@npm:^3.0.1": version: 3.0.1 resolution: "mitt@npm:3.0.1" @@ -20592,7 +20727,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.9": +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -20606,6 +20741,17 @@ __metadata: languageName: node linkType: hard +"node-gyp-build@npm:^4.2.2": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" @@ -20689,6 +20835,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + languageName: node + linkType: hard + "normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -24205,6 +24362,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + "rndm@npm:1.2.0": version: 1.2.0 resolution: "rndm@npm:1.2.0" @@ -25790,6 +25958,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.0": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + "terser@npm:^5.17.4": version: 5.36.0 resolution: "terser@npm:5.36.0" @@ -25846,6 +26028,7 @@ __metadata: dependencies: "@testing-library/dom": "npm:^10.4.0" "@testing-library/react": "npm:^16.1.0" + "@vercel/nft": "npm:^0.29.2" concurrently: "npm:^9.1.0" graphql: "npm:^15.9.0" nodemon: "npm:^3.1.7" @@ -27718,6 +27901,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yaml-ast-parser@npm:^0.0.43": version: 0.0.43 resolution: "yaml-ast-parser@npm:0.0.43"