@adland/data 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.cjs +6 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -70,17 +70,13 @@ var AdlandAPI = class {
|
|
|
70
70
|
domain
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
-
async getMiniappMetadata({
|
|
74
|
-
url
|
|
75
|
-
}) {
|
|
73
|
+
async getMiniappMetadata({ url }) {
|
|
76
74
|
return this.get(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);
|
|
77
75
|
}
|
|
78
76
|
async getLinkMetadata({
|
|
79
77
|
url
|
|
80
78
|
}) {
|
|
81
|
-
return this.get(
|
|
82
|
-
`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`
|
|
83
|
-
);
|
|
79
|
+
return this.get(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);
|
|
84
80
|
}
|
|
85
81
|
async getCastMetadata({ hash }) {
|
|
86
82
|
return this.get(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
@@ -136,7 +132,8 @@ var linkAd = defineAd({
|
|
|
136
132
|
metadata: zod.z.object({
|
|
137
133
|
title: zod.z.string().optional(),
|
|
138
134
|
description: zod.z.string().optional(),
|
|
139
|
-
image: zod.z.string().optional()
|
|
135
|
+
image: zod.z.string().optional(),
|
|
136
|
+
icon: zod.z.string().optional()
|
|
140
137
|
}),
|
|
141
138
|
async verify({ url }) {
|
|
142
139
|
if (!url.startsWith("http")) {
|
|
@@ -148,7 +145,8 @@ var linkAd = defineAd({
|
|
|
148
145
|
return {
|
|
149
146
|
title: metadata.title,
|
|
150
147
|
description: metadata.description,
|
|
151
|
-
image: metadata.image
|
|
148
|
+
image: metadata.image,
|
|
149
|
+
icon: metadata.icon
|
|
152
150
|
};
|
|
153
151
|
}
|
|
154
152
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n\nexport const debug = true;\n","import { z } from \"zod\";\nimport { debug } from \"../constants\";\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({\n url,\n }: {\n url: string;\n }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({\n url,\n }: {\n url: string;\n }): Promise<{ title: string; description: string; image: string }> {\n return this.get<{ title: string; description: string; image: string }>(\n `${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`,\n );\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n} as const;\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n\nexport const debug = true;\n","import { z } from \"zod\";\nimport { debug } from \"../constants\";\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({ url }: { url: string }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({\n url,\n }: {\n url: string;\n }): Promise<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }> {\n return this.get<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }>(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n} as const;\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -65,6 +65,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
65
65
|
title: z.ZodOptional<z.ZodString>;
|
|
66
66
|
description: z.ZodOptional<z.ZodString>;
|
|
67
67
|
image: z.ZodOptional<z.ZodString>;
|
|
68
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
68
69
|
}, z.core.$strip>> & {
|
|
69
70
|
process: (input: {
|
|
70
71
|
url: string;
|
|
@@ -76,6 +77,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
76
77
|
title?: string | undefined;
|
|
77
78
|
description?: string | undefined;
|
|
78
79
|
image?: string | undefined;
|
|
80
|
+
icon?: string | undefined;
|
|
79
81
|
} | undefined;
|
|
80
82
|
}>;
|
|
81
83
|
safeProcess: (input: {
|
|
@@ -89,6 +91,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
89
91
|
title?: string | undefined;
|
|
90
92
|
description?: string | undefined;
|
|
91
93
|
image?: string | undefined;
|
|
94
|
+
icon?: string | undefined;
|
|
92
95
|
} | undefined;
|
|
93
96
|
error?: z.ZodError | string;
|
|
94
97
|
}>;
|
|
@@ -257,6 +260,7 @@ declare const ads: {
|
|
|
257
260
|
title: z.ZodOptional<z.ZodString>;
|
|
258
261
|
description: z.ZodOptional<z.ZodString>;
|
|
259
262
|
image: z.ZodOptional<z.ZodString>;
|
|
263
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
260
264
|
}, z.core.$strip>> & {
|
|
261
265
|
process: (input: {
|
|
262
266
|
url: string;
|
|
@@ -268,6 +272,7 @@ declare const ads: {
|
|
|
268
272
|
title?: string | undefined;
|
|
269
273
|
description?: string | undefined;
|
|
270
274
|
image?: string | undefined;
|
|
275
|
+
icon?: string | undefined;
|
|
271
276
|
} | undefined;
|
|
272
277
|
}>;
|
|
273
278
|
safeProcess: (input: {
|
|
@@ -281,6 +286,7 @@ declare const ads: {
|
|
|
281
286
|
title?: string | undefined;
|
|
282
287
|
description?: string | undefined;
|
|
283
288
|
image?: string | undefined;
|
|
289
|
+
icon?: string | undefined;
|
|
284
290
|
} | undefined;
|
|
285
291
|
error?: z.ZodError | string;
|
|
286
292
|
}>;
|
|
@@ -374,6 +380,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
374
380
|
title: z.ZodOptional<z.ZodString>;
|
|
375
381
|
description: z.ZodOptional<z.ZodString>;
|
|
376
382
|
image: z.ZodOptional<z.ZodString>;
|
|
383
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
377
384
|
}, z.core.$strip>> & {
|
|
378
385
|
process: (input: {
|
|
379
386
|
url: string;
|
|
@@ -385,6 +392,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
385
392
|
title?: string | undefined;
|
|
386
393
|
description?: string | undefined;
|
|
387
394
|
image?: string | undefined;
|
|
395
|
+
icon?: string | undefined;
|
|
388
396
|
} | undefined;
|
|
389
397
|
}>;
|
|
390
398
|
safeProcess: (input: {
|
|
@@ -398,6 +406,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
398
406
|
title?: string | undefined;
|
|
399
407
|
description?: string | undefined;
|
|
400
408
|
image?: string | undefined;
|
|
409
|
+
icon?: string | undefined;
|
|
401
410
|
} | undefined;
|
|
402
411
|
error?: z.ZodError | string;
|
|
403
412
|
}>;
|
|
@@ -493,6 +502,7 @@ declare const adDefinitions: {
|
|
|
493
502
|
title: z.ZodOptional<z.ZodString>;
|
|
494
503
|
description: z.ZodOptional<z.ZodString>;
|
|
495
504
|
image: z.ZodOptional<z.ZodString>;
|
|
505
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
496
506
|
}, z.core.$strip>> & {
|
|
497
507
|
process: (input: {
|
|
498
508
|
url: string;
|
|
@@ -504,6 +514,7 @@ declare const adDefinitions: {
|
|
|
504
514
|
title?: string | undefined;
|
|
505
515
|
description?: string | undefined;
|
|
506
516
|
image?: string | undefined;
|
|
517
|
+
icon?: string | undefined;
|
|
507
518
|
} | undefined;
|
|
508
519
|
}>;
|
|
509
520
|
safeProcess: (input: {
|
|
@@ -517,6 +528,7 @@ declare const adDefinitions: {
|
|
|
517
528
|
title?: string | undefined;
|
|
518
529
|
description?: string | undefined;
|
|
519
530
|
image?: string | undefined;
|
|
531
|
+
icon?: string | undefined;
|
|
520
532
|
} | undefined;
|
|
521
533
|
error?: z.ZodError | string;
|
|
522
534
|
}>;
|
|
@@ -603,6 +615,7 @@ declare const adModels: {
|
|
|
603
615
|
title: z.ZodOptional<z.ZodString>;
|
|
604
616
|
description: z.ZodOptional<z.ZodString>;
|
|
605
617
|
image: z.ZodOptional<z.ZodString>;
|
|
618
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
606
619
|
}, z.core.$strip>> & {
|
|
607
620
|
process: (input: {
|
|
608
621
|
url: string;
|
|
@@ -614,6 +627,7 @@ declare const adModels: {
|
|
|
614
627
|
title?: string | undefined;
|
|
615
628
|
description?: string | undefined;
|
|
616
629
|
image?: string | undefined;
|
|
630
|
+
icon?: string | undefined;
|
|
617
631
|
} | undefined;
|
|
618
632
|
}>;
|
|
619
633
|
safeProcess: (input: {
|
|
@@ -627,6 +641,7 @@ declare const adModels: {
|
|
|
627
641
|
title?: string | undefined;
|
|
628
642
|
description?: string | undefined;
|
|
629
643
|
image?: string | undefined;
|
|
644
|
+
icon?: string | undefined;
|
|
630
645
|
} | undefined;
|
|
631
646
|
error?: z.ZodError | string;
|
|
632
647
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
65
65
|
title: z.ZodOptional<z.ZodString>;
|
|
66
66
|
description: z.ZodOptional<z.ZodString>;
|
|
67
67
|
image: z.ZodOptional<z.ZodString>;
|
|
68
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
68
69
|
}, z.core.$strip>> & {
|
|
69
70
|
process: (input: {
|
|
70
71
|
url: string;
|
|
@@ -76,6 +77,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
76
77
|
title?: string | undefined;
|
|
77
78
|
description?: string | undefined;
|
|
78
79
|
image?: string | undefined;
|
|
80
|
+
icon?: string | undefined;
|
|
79
81
|
} | undefined;
|
|
80
82
|
}>;
|
|
81
83
|
safeProcess: (input: {
|
|
@@ -89,6 +91,7 @@ declare const linkAd: AdDefinition<z.ZodObject<{
|
|
|
89
91
|
title?: string | undefined;
|
|
90
92
|
description?: string | undefined;
|
|
91
93
|
image?: string | undefined;
|
|
94
|
+
icon?: string | undefined;
|
|
92
95
|
} | undefined;
|
|
93
96
|
error?: z.ZodError | string;
|
|
94
97
|
}>;
|
|
@@ -257,6 +260,7 @@ declare const ads: {
|
|
|
257
260
|
title: z.ZodOptional<z.ZodString>;
|
|
258
261
|
description: z.ZodOptional<z.ZodString>;
|
|
259
262
|
image: z.ZodOptional<z.ZodString>;
|
|
263
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
260
264
|
}, z.core.$strip>> & {
|
|
261
265
|
process: (input: {
|
|
262
266
|
url: string;
|
|
@@ -268,6 +272,7 @@ declare const ads: {
|
|
|
268
272
|
title?: string | undefined;
|
|
269
273
|
description?: string | undefined;
|
|
270
274
|
image?: string | undefined;
|
|
275
|
+
icon?: string | undefined;
|
|
271
276
|
} | undefined;
|
|
272
277
|
}>;
|
|
273
278
|
safeProcess: (input: {
|
|
@@ -281,6 +286,7 @@ declare const ads: {
|
|
|
281
286
|
title?: string | undefined;
|
|
282
287
|
description?: string | undefined;
|
|
283
288
|
image?: string | undefined;
|
|
289
|
+
icon?: string | undefined;
|
|
284
290
|
} | undefined;
|
|
285
291
|
error?: z.ZodError | string;
|
|
286
292
|
}>;
|
|
@@ -374,6 +380,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
374
380
|
title: z.ZodOptional<z.ZodString>;
|
|
375
381
|
description: z.ZodOptional<z.ZodString>;
|
|
376
382
|
image: z.ZodOptional<z.ZodString>;
|
|
383
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
377
384
|
}, z.core.$strip>> & {
|
|
378
385
|
process: (input: {
|
|
379
386
|
url: string;
|
|
@@ -385,6 +392,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
385
392
|
title?: string | undefined;
|
|
386
393
|
description?: string | undefined;
|
|
387
394
|
image?: string | undefined;
|
|
395
|
+
icon?: string | undefined;
|
|
388
396
|
} | undefined;
|
|
389
397
|
}>;
|
|
390
398
|
safeProcess: (input: {
|
|
@@ -398,6 +406,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
398
406
|
title?: string | undefined;
|
|
399
407
|
description?: string | undefined;
|
|
400
408
|
image?: string | undefined;
|
|
409
|
+
icon?: string | undefined;
|
|
401
410
|
} | undefined;
|
|
402
411
|
error?: z.ZodError | string;
|
|
403
412
|
}>;
|
|
@@ -493,6 +502,7 @@ declare const adDefinitions: {
|
|
|
493
502
|
title: z.ZodOptional<z.ZodString>;
|
|
494
503
|
description: z.ZodOptional<z.ZodString>;
|
|
495
504
|
image: z.ZodOptional<z.ZodString>;
|
|
505
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
496
506
|
}, z.core.$strip>> & {
|
|
497
507
|
process: (input: {
|
|
498
508
|
url: string;
|
|
@@ -504,6 +514,7 @@ declare const adDefinitions: {
|
|
|
504
514
|
title?: string | undefined;
|
|
505
515
|
description?: string | undefined;
|
|
506
516
|
image?: string | undefined;
|
|
517
|
+
icon?: string | undefined;
|
|
507
518
|
} | undefined;
|
|
508
519
|
}>;
|
|
509
520
|
safeProcess: (input: {
|
|
@@ -517,6 +528,7 @@ declare const adDefinitions: {
|
|
|
517
528
|
title?: string | undefined;
|
|
518
529
|
description?: string | undefined;
|
|
519
530
|
image?: string | undefined;
|
|
531
|
+
icon?: string | undefined;
|
|
520
532
|
} | undefined;
|
|
521
533
|
error?: z.ZodError | string;
|
|
522
534
|
}>;
|
|
@@ -603,6 +615,7 @@ declare const adModels: {
|
|
|
603
615
|
title: z.ZodOptional<z.ZodString>;
|
|
604
616
|
description: z.ZodOptional<z.ZodString>;
|
|
605
617
|
image: z.ZodOptional<z.ZodString>;
|
|
618
|
+
icon: z.ZodOptional<z.ZodString>;
|
|
606
619
|
}, z.core.$strip>> & {
|
|
607
620
|
process: (input: {
|
|
608
621
|
url: string;
|
|
@@ -614,6 +627,7 @@ declare const adModels: {
|
|
|
614
627
|
title?: string | undefined;
|
|
615
628
|
description?: string | undefined;
|
|
616
629
|
image?: string | undefined;
|
|
630
|
+
icon?: string | undefined;
|
|
617
631
|
} | undefined;
|
|
618
632
|
}>;
|
|
619
633
|
safeProcess: (input: {
|
|
@@ -627,6 +641,7 @@ declare const adModels: {
|
|
|
627
641
|
title?: string | undefined;
|
|
628
642
|
description?: string | undefined;
|
|
629
643
|
image?: string | undefined;
|
|
644
|
+
icon?: string | undefined;
|
|
630
645
|
} | undefined;
|
|
631
646
|
error?: z.ZodError | string;
|
|
632
647
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -68,17 +68,13 @@ var AdlandAPI = class {
|
|
|
68
68
|
domain
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
async getMiniappMetadata({
|
|
72
|
-
url
|
|
73
|
-
}) {
|
|
71
|
+
async getMiniappMetadata({ url }) {
|
|
74
72
|
return this.get(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);
|
|
75
73
|
}
|
|
76
74
|
async getLinkMetadata({
|
|
77
75
|
url
|
|
78
76
|
}) {
|
|
79
|
-
return this.get(
|
|
80
|
-
`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`
|
|
81
|
-
);
|
|
77
|
+
return this.get(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);
|
|
82
78
|
}
|
|
83
79
|
async getCastMetadata({ hash }) {
|
|
84
80
|
return this.get(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
@@ -134,7 +130,8 @@ var linkAd = defineAd({
|
|
|
134
130
|
metadata: z.object({
|
|
135
131
|
title: z.string().optional(),
|
|
136
132
|
description: z.string().optional(),
|
|
137
|
-
image: z.string().optional()
|
|
133
|
+
image: z.string().optional(),
|
|
134
|
+
icon: z.string().optional()
|
|
138
135
|
}),
|
|
139
136
|
async verify({ url }) {
|
|
140
137
|
if (!url.startsWith("http")) {
|
|
@@ -146,7 +143,8 @@ var linkAd = defineAd({
|
|
|
146
143
|
return {
|
|
147
144
|
title: metadata.title,
|
|
148
145
|
description: metadata.description,
|
|
149
|
-
image: metadata.image
|
|
146
|
+
image: metadata.image,
|
|
147
|
+
icon: metadata.icon
|
|
150
148
|
};
|
|
151
149
|
}
|
|
152
150
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n\nexport const debug = true;\n","import { z } from \"zod\";\nimport { debug } from \"../constants\";\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({\n url,\n }: {\n url: string;\n }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({\n url,\n }: {\n url: string;\n }): Promise<{ title: string; description: string; image: string }> {\n return this.get<{ title: string; description: string; image: string }>(\n `${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`,\n );\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n} as const;\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n\nexport const debug = true;\n","import { z } from \"zod\";\nimport { debug } from \"../constants\";\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({ url }: { url: string }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({\n url,\n }: {\n url: string;\n }): Promise<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }> {\n return this.get<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }>(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n} as const;\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|