From 872aad70015831c09fe3c6a25f674d7f9be2ceb9 Mon Sep 17 00:00:00 2001 From: bigben-7 Date: Thu, 23 Jul 2026 20:31:05 +0100 Subject: [PATCH 1/5] fix(frontend): add missing dependencies to package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit framer-motion, gsap, @gsap/react, clsx, tailwind-merge, chart.js and react-chartjs-2 were imported in src but not declared, breaking a clean npm install / next build. Note: chart.js/react-chartjs-2 are only used by charter.jsx/prowler.js, removed in #867 — once that lands these two can be dropped. Fixes #860 Co-Authored-By: Claude Opus 4.8 --- Frontend/package-lock.json | 136 ++++++++++++++++++++++++++++++++++++- Frontend/package.json | 7 ++ 2 files changed, 140 insertions(+), 3 deletions(-) diff --git a/Frontend/package-lock.json b/Frontend/package-lock.json index a277402a..c9f55b8a 100644 --- a/Frontend/package-lock.json +++ b/Frontend/package-lock.json @@ -8,12 +8,19 @@ "name": "gistpin", "version": "0.1.0", "dependencies": { + "@gsap/react": "^2.1.2", + "chart.js": "^4.5.1", + "clsx": "^2.1.1", + "framer-motion": "^12.42.2", + "gsap": "^3.15.0", "leaflet": "^1.9.4", "lucide-react": "^0.539.0", "next": "15.4.6", "react": "19.1.0", + "react-chartjs-2": "^5.3.1", "react-dom": "19.1.0", "react-leaflet": "^5.0.0", + "tailwind-merge": "^3.6.0", "viem": "^2.33.3", "wagmi": "^2.16.3" }, @@ -99,6 +106,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@base-org/account/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@base-org/account/node_modules/ox": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", @@ -168,6 +184,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@coinbase/wallet-sdk/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@coinbase/wallet-sdk/node_modules/ox": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", @@ -461,6 +486,16 @@ "viem": ">=2.0.0" } }, + "node_modules/@gsap/react": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@gsap/react/-/react-2.1.2.tgz", + "integrity": "sha512-JqliybO1837UcgH2hVOM4VO+38APk3ECNrsuSM4MuXp+rbf+/2IG2K1YJiqfTcXQHH7XlA0m3ykniFYstfq0Iw==", + "license": "SEE LICENSE AT https://gsap.com/standard-license", + "peerDependencies": { + "gsap": "^3.12.5", + "react": ">=17" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -997,6 +1032,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", @@ -4921,6 +4962,15 @@ "sha.js": "^2.4.11" } }, + "node_modules/cbw-sdk/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4938,6 +4988,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -4981,9 +5043,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -6429,6 +6491,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/framer-motion": { + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", + "integrity": "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.42.2", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6615,6 +6704,12 @@ "dev": true, "license": "MIT" }, + "node_modules/gsap": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.15.0.tgz", + "integrity": "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." + }, "node_modules/h3": { "version": "1.15.4", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", @@ -7936,6 +8031,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/motion-dom": { + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.2.tgz", + "integrity": "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8738,6 +8848,16 @@ "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", @@ -9638,6 +9758,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", diff --git a/Frontend/package.json b/Frontend/package.json index 65947e97..95429ed5 100644 --- a/Frontend/package.json +++ b/Frontend/package.json @@ -9,12 +9,19 @@ "lint": "next lint" }, "dependencies": { + "@gsap/react": "^2.1.2", + "chart.js": "^4.5.1", + "clsx": "^2.1.1", + "framer-motion": "^12.42.2", + "gsap": "^3.15.0", "leaflet": "^1.9.4", "lucide-react": "^0.539.0", "next": "15.4.6", "react": "19.1.0", + "react-chartjs-2": "^5.3.1", "react-dom": "19.1.0", "react-leaflet": "^5.0.0", + "tailwind-merge": "^3.6.0", "viem": "^2.33.3", "wagmi": "^2.16.3" }, From a7316769d1c5bf51f2d8324758ba780d5b6fe847 Mon Sep 17 00:00:00 2001 From: bigben-7 Date: Thu, 23 Jul 2026 20:31:05 +0100 Subject: [PATCH 2/5] fix(frontend): use @/ alias in MapLoader dynamic import 'components/map/Map' is a bare specifier and tsconfig defines no baseUrl, so it could not resolve. Use the '@/' path alias. Fixes #861 Co-Authored-By: Claude Opus 4.8 --- Frontend/src/components/map/MapLoader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frontend/src/components/map/MapLoader.tsx b/Frontend/src/components/map/MapLoader.tsx index 440b9306..f144a4de 100644 --- a/Frontend/src/components/map/MapLoader.tsx +++ b/Frontend/src/components/map/MapLoader.tsx @@ -6,7 +6,7 @@ import { useMemo } from 'react'; export default function MapLoader() { const Map = useMemo( () => - dynamic(() => import('components/map/Map'), { + dynamic(() => import('@/components/map/Map'), { loading: () =>

Map is loading...

, ssr: false, // This is allowed here! }), From 74739a0cfb866637219fe1f9c76666597ff7f87c Mon Sep 17 00:00:00 2001 From: bigben-7 Date: Thu, 23 Jul 2026 20:31:05 +0100 Subject: [PATCH 3/5] fix(backend): resolve duplicate authorAddress field in CreateGistDto authorAddress was declared twice (a duplicate-identifier compile error) and @IsStellarAddress was used without being imported, plus a stray 'author' field. Collapse to a single validated authorAddress, import the decorator, and drop the '?? dto.author' workaround in the service. Fixes #862 Co-Authored-By: Claude Opus 4.8 --- Backend/src/gists/dto/create-gist.dto.ts | 15 ++------------- Backend/src/gists/gists.service.ts | 2 +- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/Backend/src/gists/dto/create-gist.dto.ts b/Backend/src/gists/dto/create-gist.dto.ts index 2bbc261b..853845ce 100644 --- a/Backend/src/gists/dto/create-gist.dto.ts +++ b/Backend/src/gists/dto/create-gist.dto.ts @@ -1,5 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { IsInt, IsLatitude, IsLongitude, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator'; +import { IsInt, IsLatitude, IsLongitude, IsOptional, Max, MaxLength, Min } from 'class-validator'; +import { IsStellarAddress } from '../../common/validators'; export class CreateGistDto { @ApiProperty({ @@ -26,18 +27,6 @@ export class CreateGistDto { @IsOptional() @IsStellarAddress() authorAddress?: string; - @IsString() - @MaxLength(80) - author?: string; - - @ApiPropertyOptional({ - description: 'Optional Stellar address alias for the author', - example: 'GABC...XYZ', - }) - @IsOptional() - @IsString() - @MaxLength(80) - authorAddress?: string; @ApiPropertyOptional({ description: 'Time-to-live in hours (default: 24, max: 168)', diff --git a/Backend/src/gists/gists.service.ts b/Backend/src/gists/gists.service.ts index 80f4a830..919f5632 100644 --- a/Backend/src/gists/gists.service.ts +++ b/Backend/src/gists/gists.service.ts @@ -47,7 +47,7 @@ export class GistsService { created_at: new Date().toISOString(), }); - const author = dto.authorAddress ?? dto.author; + const author = dto.authorAddress; const { gistId, txHash } = await this.sorobanService.postGist(locationCell, cid, author); this.logger.log(`Gist posted → cell=${locationCell} cid=${cid} gistId=${gistId}`); From 9feb36b8e0e62aa02b0ff9a9adfa2d60272a2f33 Mon Sep 17 00:00:00 2001 From: bigben-7 Date: Thu, 23 Jul 2026 20:31:05 +0100 Subject: [PATCH 4/5] fix(backend): rename migration file to plain ASCII The migration filename contained a mangled non-ASCII ellipsis character, which can break migration runs/tooling on some shells and CI. Rename to 1700000000000-EnablePostGIS.ts (matches the class timestamp and the TypeORM migrations glob). Fixes #863 Co-Authored-By: Claude Opus 4.8 --- .../src/database/migrations/1700000000000-EnablePostGIS.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "Backend/src/database/migrations/\342\200\246EnablePostGIS.ts" => Backend/src/database/migrations/1700000000000-EnablePostGIS.ts (100%) diff --git "a/Backend/src/database/migrations/\342\200\246EnablePostGIS.ts" b/Backend/src/database/migrations/1700000000000-EnablePostGIS.ts similarity index 100% rename from "Backend/src/database/migrations/\342\200\246EnablePostGIS.ts" rename to Backend/src/database/migrations/1700000000000-EnablePostGIS.ts From ae94c23c64fc3c6a71a707c6eea0e910948dea23 Mon Sep 17 00:00:00 2001 From: bigben-7 Date: Thu, 23 Jul 2026 21:13:09 +0100 Subject: [PATCH 5/5] fix(backend): repair backend build (IsString import, CacheEntry type) Two build blockers surfaced by CI: - create-gist.dto.ts: restore the IsString import (still used by the content field) that was dropped while removing the stray author field. - gists.service.ts: define the missing CacheEntry interface referenced by contentCache (left undefined by an earlier merge), which broke the whole backend compile. nest build now passes. --- Backend/src/gists/dto/create-gist.dto.ts | 2 +- Backend/src/gists/gists.service.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Backend/src/gists/dto/create-gist.dto.ts b/Backend/src/gists/dto/create-gist.dto.ts index 853845ce..dd71bb14 100644 --- a/Backend/src/gists/dto/create-gist.dto.ts +++ b/Backend/src/gists/dto/create-gist.dto.ts @@ -1,5 +1,5 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { IsInt, IsLatitude, IsLongitude, IsOptional, Max, MaxLength, Min } from 'class-validator'; +import { IsInt, IsLatitude, IsLongitude, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator'; import { IsStellarAddress } from '../../common/validators'; export class CreateGistDto { diff --git a/Backend/src/gists/gists.service.ts b/Backend/src/gists/gists.service.ts index 919f5632..c7468a49 100644 --- a/Backend/src/gists/gists.service.ts +++ b/Backend/src/gists/gists.service.ts @@ -13,6 +13,11 @@ import { stripHtml } from '../common/utils/sanitize'; const DEFAULT_TTL_HOURS = 24; +interface CacheEntry { + data: Record; + expiresAt: number; +} + export interface CountNearbyResult { count: number; radius: number;