From 9cbea0dc4b42758e80431758177e696d4de45a08 Mon Sep 17 00:00:00 2001 From: nigiri <168690269+0xnigir1@users.noreply.github.com> Date: Wed, 26 Feb 2025 12:56:09 -0300 Subject: [PATCH] fix: use multiformats library and allow paths in cid --- packages/metadata/package.json | 1 + packages/metadata/src/utils/index.ts | 25 ++++++++++++++++--- .../utils/{index.test.ts => index.spec.ts} | 5 ++++ pnpm-lock.yaml | 3 +++ 4 files changed, 31 insertions(+), 3 deletions(-) rename packages/metadata/test/utils/{index.test.ts => index.spec.ts} (83%) diff --git a/packages/metadata/package.json b/packages/metadata/package.json index d68631f2..63d83705 100644 --- a/packages/metadata/package.json +++ b/packages/metadata/package.json @@ -31,6 +31,7 @@ "@grants-stack-indexer/repository": "workspace:*", "@grants-stack-indexer/shared": "workspace:*", "axios": "1.7.7", + "multiformats": "13.3.2", "pinata": "1.10.1", "ts-retry": "5.0.1", "zod": "3.23.8" diff --git a/packages/metadata/src/utils/index.ts b/packages/metadata/src/utils/index.ts index f3d2faa4..ac5c1b4b 100644 --- a/packages/metadata/src/utils/index.ts +++ b/packages/metadata/src/utils/index.ts @@ -1,4 +1,23 @@ -export const isValidCid = (cid: string): boolean => { - const cidRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|baf[0-9A-Za-z]{50,})$/; - return cidRegex.test(cid); +import { CID } from "multiformats/cid"; + +export const isValidCid = (input: string): boolean => { + try { + // Extract CID part from optional paths/params + const match = input.match(/^([^/?#]+)(?:[/?#].*)?$/); + if (!match) return false; + + const cid = match[1]; + + if (!cid) return false; + + // Quick regex check for basic format + const cidRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|baf[0-9A-Za-z]+)$/; + if (!cidRegex.test(cid)) return false; + + // Full validation using multiformats/cid + CID.parse(cid); + return true; + } catch { + return false; + } }; diff --git a/packages/metadata/test/utils/index.test.ts b/packages/metadata/test/utils/index.spec.ts similarity index 83% rename from packages/metadata/test/utils/index.test.ts rename to packages/metadata/test/utils/index.spec.ts index f6394c3c..e4c27472 100644 --- a/packages/metadata/test/utils/index.test.ts +++ b/packages/metadata/test/utils/index.spec.ts @@ -36,4 +36,9 @@ describe("isValidCid", () => { expect(isValidCid(input as unknown as string)).toBe(false); }); }); + + it("returns true when CID has path or query parameters", () => { + const cidWithParams = "QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/path?param=value"; + expect(isValidCid(cidWithParams)).toBe(true); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 995025d7..0719ed4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -201,6 +201,9 @@ importers: axios: specifier: 1.7.7 version: 1.7.7 + multiformats: + specifier: 13.3.2 + version: 13.3.2 pinata: specifier: 1.10.1 version: 1.10.1