@adland/data 0.7.0 → 0.9.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 +12 -0
- package/dist/index.cjs +47 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -42
- package/dist/index.d.ts +75 -42
- package/dist/index.js +47 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @adland/data
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 0225dd5: export new types & display metadata in ad react component
|
|
8
|
+
|
|
9
|
+
## 0.8.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 58fbfba: add metadata fetching for ad types
|
|
14
|
+
|
|
3
15
|
## 0.7.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/dist/index.cjs
CHANGED
|
@@ -27,7 +27,7 @@ async function processAd(ad, input) {
|
|
|
27
27
|
await ad.verify(input);
|
|
28
28
|
}
|
|
29
29
|
const metadata = ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : void 0;
|
|
30
|
-
return { data, metadata };
|
|
30
|
+
return { data, metadata, type: ad.type };
|
|
31
31
|
}
|
|
32
32
|
async function safeProcessAd(ad, input) {
|
|
33
33
|
const parseResult = ad.data.safeParse(input);
|
|
@@ -70,6 +70,23 @@ var AdlandAPI = class {
|
|
|
70
70
|
domain
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
async getMiniappMetadata({
|
|
74
|
+
url
|
|
75
|
+
}) {
|
|
76
|
+
return this.get(
|
|
77
|
+
`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
async getLinkMetadata({
|
|
81
|
+
url
|
|
82
|
+
}) {
|
|
83
|
+
return this.get(
|
|
84
|
+
`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
async getCastMetadata({ hash }) {
|
|
88
|
+
return this.get(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
89
|
+
}
|
|
73
90
|
async post(url, body) {
|
|
74
91
|
return fetch(url, {
|
|
75
92
|
method: "POST",
|
|
@@ -90,6 +107,7 @@ var castAd = defineAd({
|
|
|
90
107
|
}),
|
|
91
108
|
metadata: zod.z.object({
|
|
92
109
|
username: zod.z.string().optional(),
|
|
110
|
+
pfpUrl: zod.z.string().optional(),
|
|
93
111
|
text: zod.z.string().optional(),
|
|
94
112
|
timestamp: zod.z.number().optional()
|
|
95
113
|
}),
|
|
@@ -101,6 +119,15 @@ var castAd = defineAd({
|
|
|
101
119
|
if (!res.verified) {
|
|
102
120
|
throw new Error("Cast hash verification failed");
|
|
103
121
|
}
|
|
122
|
+
},
|
|
123
|
+
async getMetadata({ hash }) {
|
|
124
|
+
const cast = await adlandAPI.getCastMetadata({ hash });
|
|
125
|
+
return {
|
|
126
|
+
username: cast.username,
|
|
127
|
+
pfpUrl: cast.pfpUrl,
|
|
128
|
+
text: cast.text,
|
|
129
|
+
timestamp: cast.timestamp
|
|
130
|
+
};
|
|
104
131
|
}
|
|
105
132
|
});
|
|
106
133
|
var linkAd = defineAd({
|
|
@@ -117,6 +144,14 @@ var linkAd = defineAd({
|
|
|
117
144
|
if (!url.startsWith("http")) {
|
|
118
145
|
throw new Error("Invalid link");
|
|
119
146
|
}
|
|
147
|
+
},
|
|
148
|
+
async getMetadata({ url }) {
|
|
149
|
+
const metadata = await adlandAPI.getLinkMetadata({ url });
|
|
150
|
+
return {
|
|
151
|
+
title: metadata.title,
|
|
152
|
+
description: metadata.description,
|
|
153
|
+
image: metadata.image
|
|
154
|
+
};
|
|
120
155
|
}
|
|
121
156
|
});
|
|
122
157
|
var miniappAd = defineAd({
|
|
@@ -126,7 +161,8 @@ var miniappAd = defineAd({
|
|
|
126
161
|
}),
|
|
127
162
|
metadata: zod.z.object({
|
|
128
163
|
icon: zod.z.string().optional(),
|
|
129
|
-
title: zod.z.string().optional()
|
|
164
|
+
title: zod.z.string().optional(),
|
|
165
|
+
description: zod.z.string().optional()
|
|
130
166
|
}),
|
|
131
167
|
async verify({ url }) {
|
|
132
168
|
const errorMessage = "Miniapp domain verification failed";
|
|
@@ -140,6 +176,15 @@ var miniappAd = defineAd({
|
|
|
140
176
|
if (!res.verified) {
|
|
141
177
|
throw new Error(errorMessage);
|
|
142
178
|
}
|
|
179
|
+
},
|
|
180
|
+
async getMetadata({ url }) {
|
|
181
|
+
const res = await adlandAPI.getMiniappMetadata({ url });
|
|
182
|
+
console.log("getMetadata:res", res);
|
|
183
|
+
return {
|
|
184
|
+
icon: res.icon,
|
|
185
|
+
title: res.title,
|
|
186
|
+
description: res.description
|
|
187
|
+
};
|
|
143
188
|
}
|
|
144
189
|
});
|
|
145
190
|
|
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 } as {\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 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(url: string) {\n return fetch(url).then((res) => res.json());\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 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});\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","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\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});\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","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 }),\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});\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","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAdData, CastAdMetadata } from \"./ads/cast\";\nimport type { LinkAdData, LinkAdMetadata } from \"./ads/link\";\nimport type { MiniAppAdData, MiniAppAdMetadata } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData =\n | {\n type: \"cast\";\n data: CastAdData;\n metadata?: CastAdMetadata;\n }\n | {\n type: \"link\";\n data: LinkAdData;\n metadata?: LinkAdMetadata;\n }\n | {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata?: MiniAppAdMetadata;\n };\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({\n url,\n }: {\n url: string;\n }): Promise<{ title: string; icon: string; description: string }> {\n return this.get<{ title: string; icon: string; description: string }>(\n `${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`,\n );\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 }),\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 };\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
|
@@ -8,6 +8,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
8
8
|
hash: z.ZodString;
|
|
9
9
|
}, z.core.$strip>, z.ZodObject<{
|
|
10
10
|
username: z.ZodOptional<z.ZodString>;
|
|
11
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
11
12
|
text: z.ZodOptional<z.ZodString>;
|
|
12
13
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
13
14
|
}, z.core.$strip>> & {
|
|
@@ -19,6 +20,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
19
20
|
};
|
|
20
21
|
metadata: {
|
|
21
22
|
username?: string | undefined;
|
|
23
|
+
pfpUrl?: string | undefined;
|
|
22
24
|
text?: string | undefined;
|
|
23
25
|
timestamp?: number | undefined;
|
|
24
26
|
} | undefined;
|
|
@@ -32,6 +34,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
32
34
|
} | undefined;
|
|
33
35
|
metadata?: {
|
|
34
36
|
username?: string | undefined;
|
|
37
|
+
pfpUrl?: string | undefined;
|
|
35
38
|
text?: string | undefined;
|
|
36
39
|
timestamp?: number | undefined;
|
|
37
40
|
} | undefined;
|
|
@@ -46,6 +49,11 @@ type CastAdData = z.infer<typeof castAd.data>;
|
|
|
46
49
|
* Type inference for CastAd metadata
|
|
47
50
|
*/
|
|
48
51
|
type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;
|
|
52
|
+
type CastAd = {
|
|
53
|
+
type: "cast";
|
|
54
|
+
data: CastAdData;
|
|
55
|
+
metadata: CastAdMetadata;
|
|
56
|
+
};
|
|
49
57
|
|
|
50
58
|
/**
|
|
51
59
|
* Link Ad Definition
|
|
@@ -93,6 +101,11 @@ type LinkAdData = z.infer<typeof linkAd.data>;
|
|
|
93
101
|
* Type inference for LinkAd metadata
|
|
94
102
|
*/
|
|
95
103
|
type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;
|
|
104
|
+
type LinkAd = {
|
|
105
|
+
type: "link";
|
|
106
|
+
data: LinkAdData;
|
|
107
|
+
metadata: LinkAdMetadata;
|
|
108
|
+
};
|
|
96
109
|
|
|
97
110
|
/**
|
|
98
111
|
* MiniApp Ad Definition
|
|
@@ -103,6 +116,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
103
116
|
}, z.core.$strip>, z.ZodObject<{
|
|
104
117
|
icon: z.ZodOptional<z.ZodString>;
|
|
105
118
|
title: z.ZodOptional<z.ZodString>;
|
|
119
|
+
description: z.ZodOptional<z.ZodString>;
|
|
106
120
|
}, z.core.$strip>> & {
|
|
107
121
|
process: (input: {
|
|
108
122
|
url: string;
|
|
@@ -113,6 +127,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
113
127
|
metadata: {
|
|
114
128
|
icon?: string | undefined;
|
|
115
129
|
title?: string | undefined;
|
|
130
|
+
description?: string | undefined;
|
|
116
131
|
} | undefined;
|
|
117
132
|
}>;
|
|
118
133
|
safeProcess: (input: {
|
|
@@ -125,6 +140,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
125
140
|
metadata?: {
|
|
126
141
|
icon?: string | undefined;
|
|
127
142
|
title?: string | undefined;
|
|
143
|
+
description?: string | undefined;
|
|
128
144
|
} | undefined;
|
|
129
145
|
error?: z.ZodError | string;
|
|
130
146
|
}>;
|
|
@@ -137,6 +153,11 @@ type MiniAppAdData = z.infer<typeof miniappAd.data>;
|
|
|
137
153
|
* Type inference for MiniAppAd metadata
|
|
138
154
|
*/
|
|
139
155
|
type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;
|
|
156
|
+
type MiniAppAd = {
|
|
157
|
+
type: "miniapp";
|
|
158
|
+
data: MiniAppAdData;
|
|
159
|
+
metadata: MiniAppAdMetadata;
|
|
160
|
+
};
|
|
140
161
|
|
|
141
162
|
/**
|
|
142
163
|
* Ad Definition type
|
|
@@ -221,19 +242,7 @@ declare function safeProcessAd<TData extends z.ZodTypeAny, TMetadata extends z.Z
|
|
|
221
242
|
/**
|
|
222
243
|
* Union type for all complete ad structures with type, data, and optional metadata
|
|
223
244
|
*/
|
|
224
|
-
type AdData =
|
|
225
|
-
type: "cast";
|
|
226
|
-
data: CastAdData;
|
|
227
|
-
metadata?: CastAdMetadata;
|
|
228
|
-
} | {
|
|
229
|
-
type: "link";
|
|
230
|
-
data: LinkAdData;
|
|
231
|
-
metadata?: LinkAdMetadata;
|
|
232
|
-
} | {
|
|
233
|
-
type: "miniapp";
|
|
234
|
-
data: MiniAppAdData;
|
|
235
|
-
metadata?: MiniAppAdMetadata;
|
|
236
|
-
};
|
|
245
|
+
type AdData = CastAd | LinkAd | MiniAppAd;
|
|
237
246
|
/**
|
|
238
247
|
* Registry of all ad definitions
|
|
239
248
|
* Each entry is an AdDefinition object
|
|
@@ -277,6 +286,7 @@ declare const ads: {
|
|
|
277
286
|
hash: z.ZodString;
|
|
278
287
|
}, z.core.$strip>, z.ZodObject<{
|
|
279
288
|
username: z.ZodOptional<z.ZodString>;
|
|
289
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
280
290
|
text: z.ZodOptional<z.ZodString>;
|
|
281
291
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
282
292
|
}, z.core.$strip>> & {
|
|
@@ -288,6 +298,7 @@ declare const ads: {
|
|
|
288
298
|
};
|
|
289
299
|
metadata: {
|
|
290
300
|
username?: string | undefined;
|
|
301
|
+
pfpUrl?: string | undefined;
|
|
291
302
|
text?: string | undefined;
|
|
292
303
|
timestamp?: number | undefined;
|
|
293
304
|
} | undefined;
|
|
@@ -301,6 +312,7 @@ declare const ads: {
|
|
|
301
312
|
} | undefined;
|
|
302
313
|
metadata?: {
|
|
303
314
|
username?: string | undefined;
|
|
315
|
+
pfpUrl?: string | undefined;
|
|
304
316
|
text?: string | undefined;
|
|
305
317
|
timestamp?: number | undefined;
|
|
306
318
|
} | undefined;
|
|
@@ -312,6 +324,7 @@ declare const ads: {
|
|
|
312
324
|
}, z.core.$strip>, z.ZodObject<{
|
|
313
325
|
icon: z.ZodOptional<z.ZodString>;
|
|
314
326
|
title: z.ZodOptional<z.ZodString>;
|
|
327
|
+
description: z.ZodOptional<z.ZodString>;
|
|
315
328
|
}, z.core.$strip>> & {
|
|
316
329
|
process: (input: {
|
|
317
330
|
url: string;
|
|
@@ -322,6 +335,7 @@ declare const ads: {
|
|
|
322
335
|
metadata: {
|
|
323
336
|
icon?: string | undefined;
|
|
324
337
|
title?: string | undefined;
|
|
338
|
+
description?: string | undefined;
|
|
325
339
|
} | undefined;
|
|
326
340
|
}>;
|
|
327
341
|
safeProcess: (input: {
|
|
@@ -334,6 +348,7 @@ declare const ads: {
|
|
|
334
348
|
metadata?: {
|
|
335
349
|
icon?: string | undefined;
|
|
336
350
|
title?: string | undefined;
|
|
351
|
+
description?: string | undefined;
|
|
337
352
|
} | undefined;
|
|
338
353
|
error?: z.ZodError | string;
|
|
339
354
|
}>;
|
|
@@ -348,68 +363,71 @@ type AdType = keyof typeof ads;
|
|
|
348
363
|
* Get ad definition by type
|
|
349
364
|
*/
|
|
350
365
|
declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
351
|
-
|
|
366
|
+
url: z.ZodString;
|
|
352
367
|
}, z.core.$strip>, z.ZodObject<{
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
368
|
+
title: z.ZodOptional<z.ZodString>;
|
|
369
|
+
description: z.ZodOptional<z.ZodString>;
|
|
370
|
+
image: z.ZodOptional<z.ZodString>;
|
|
356
371
|
}, z.core.$strip>> & {
|
|
357
372
|
process: (input: {
|
|
358
|
-
|
|
373
|
+
url: string;
|
|
359
374
|
}) => Promise<{
|
|
360
375
|
data: {
|
|
361
|
-
|
|
376
|
+
url: string;
|
|
362
377
|
};
|
|
363
378
|
metadata: {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
379
|
+
title?: string | undefined;
|
|
380
|
+
description?: string | undefined;
|
|
381
|
+
image?: string | undefined;
|
|
367
382
|
} | undefined;
|
|
368
383
|
}>;
|
|
369
384
|
safeProcess: (input: {
|
|
370
|
-
|
|
385
|
+
url: string;
|
|
371
386
|
}) => Promise<{
|
|
372
387
|
success: boolean;
|
|
373
388
|
data?: {
|
|
374
|
-
|
|
389
|
+
url: string;
|
|
375
390
|
} | undefined;
|
|
376
391
|
metadata?: {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
392
|
+
title?: string | undefined;
|
|
393
|
+
description?: string | undefined;
|
|
394
|
+
image?: string | undefined;
|
|
380
395
|
} | undefined;
|
|
381
396
|
error?: z.ZodError | string;
|
|
382
397
|
}>;
|
|
383
398
|
}) | (AdDefinition<z.ZodObject<{
|
|
384
|
-
|
|
399
|
+
hash: z.ZodString;
|
|
385
400
|
}, z.core.$strip>, z.ZodObject<{
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
401
|
+
username: z.ZodOptional<z.ZodString>;
|
|
402
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
403
|
+
text: z.ZodOptional<z.ZodString>;
|
|
404
|
+
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
389
405
|
}, z.core.$strip>> & {
|
|
390
406
|
process: (input: {
|
|
391
|
-
|
|
407
|
+
hash: string;
|
|
392
408
|
}) => Promise<{
|
|
393
409
|
data: {
|
|
394
|
-
|
|
410
|
+
hash: string;
|
|
395
411
|
};
|
|
396
412
|
metadata: {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
413
|
+
username?: string | undefined;
|
|
414
|
+
pfpUrl?: string | undefined;
|
|
415
|
+
text?: string | undefined;
|
|
416
|
+
timestamp?: number | undefined;
|
|
400
417
|
} | undefined;
|
|
401
418
|
}>;
|
|
402
419
|
safeProcess: (input: {
|
|
403
|
-
|
|
420
|
+
hash: string;
|
|
404
421
|
}) => Promise<{
|
|
405
422
|
success: boolean;
|
|
406
423
|
data?: {
|
|
407
|
-
|
|
424
|
+
hash: string;
|
|
408
425
|
} | undefined;
|
|
409
426
|
metadata?: {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
427
|
+
username?: string | undefined;
|
|
428
|
+
pfpUrl?: string | undefined;
|
|
429
|
+
text?: string | undefined;
|
|
430
|
+
timestamp?: number | undefined;
|
|
413
431
|
} | undefined;
|
|
414
432
|
error?: z.ZodError | string;
|
|
415
433
|
}>;
|
|
@@ -418,6 +436,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
418
436
|
}, z.core.$strip>, z.ZodObject<{
|
|
419
437
|
icon: z.ZodOptional<z.ZodString>;
|
|
420
438
|
title: z.ZodOptional<z.ZodString>;
|
|
439
|
+
description: z.ZodOptional<z.ZodString>;
|
|
421
440
|
}, z.core.$strip>> & {
|
|
422
441
|
process: (input: {
|
|
423
442
|
url: string;
|
|
@@ -428,6 +447,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
428
447
|
metadata: {
|
|
429
448
|
icon?: string | undefined;
|
|
430
449
|
title?: string | undefined;
|
|
450
|
+
description?: string | undefined;
|
|
431
451
|
} | undefined;
|
|
432
452
|
}>;
|
|
433
453
|
safeProcess: (input: {
|
|
@@ -440,6 +460,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
440
460
|
metadata?: {
|
|
441
461
|
icon?: string | undefined;
|
|
442
462
|
title?: string | undefined;
|
|
463
|
+
description?: string | undefined;
|
|
443
464
|
} | undefined;
|
|
444
465
|
error?: z.ZodError | string;
|
|
445
466
|
}>;
|
|
@@ -495,6 +516,7 @@ declare const adDefinitions: {
|
|
|
495
516
|
hash: z.ZodString;
|
|
496
517
|
}, z.core.$strip>, z.ZodObject<{
|
|
497
518
|
username: z.ZodOptional<z.ZodString>;
|
|
519
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
498
520
|
text: z.ZodOptional<z.ZodString>;
|
|
499
521
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
500
522
|
}, z.core.$strip>> & {
|
|
@@ -506,6 +528,7 @@ declare const adDefinitions: {
|
|
|
506
528
|
};
|
|
507
529
|
metadata: {
|
|
508
530
|
username?: string | undefined;
|
|
531
|
+
pfpUrl?: string | undefined;
|
|
509
532
|
text?: string | undefined;
|
|
510
533
|
timestamp?: number | undefined;
|
|
511
534
|
} | undefined;
|
|
@@ -519,6 +542,7 @@ declare const adDefinitions: {
|
|
|
519
542
|
} | undefined;
|
|
520
543
|
metadata?: {
|
|
521
544
|
username?: string | undefined;
|
|
545
|
+
pfpUrl?: string | undefined;
|
|
522
546
|
text?: string | undefined;
|
|
523
547
|
timestamp?: number | undefined;
|
|
524
548
|
} | undefined;
|
|
@@ -530,6 +554,7 @@ declare const adDefinitions: {
|
|
|
530
554
|
}, z.core.$strip>, z.ZodObject<{
|
|
531
555
|
icon: z.ZodOptional<z.ZodString>;
|
|
532
556
|
title: z.ZodOptional<z.ZodString>;
|
|
557
|
+
description: z.ZodOptional<z.ZodString>;
|
|
533
558
|
}, z.core.$strip>> & {
|
|
534
559
|
process: (input: {
|
|
535
560
|
url: string;
|
|
@@ -540,6 +565,7 @@ declare const adDefinitions: {
|
|
|
540
565
|
metadata: {
|
|
541
566
|
icon?: string | undefined;
|
|
542
567
|
title?: string | undefined;
|
|
568
|
+
description?: string | undefined;
|
|
543
569
|
} | undefined;
|
|
544
570
|
}>;
|
|
545
571
|
safeProcess: (input: {
|
|
@@ -552,6 +578,7 @@ declare const adDefinitions: {
|
|
|
552
578
|
metadata?: {
|
|
553
579
|
icon?: string | undefined;
|
|
554
580
|
title?: string | undefined;
|
|
581
|
+
description?: string | undefined;
|
|
555
582
|
} | undefined;
|
|
556
583
|
error?: z.ZodError | string;
|
|
557
584
|
}>;
|
|
@@ -596,6 +623,7 @@ declare const adModels: {
|
|
|
596
623
|
hash: z.ZodString;
|
|
597
624
|
}, z.core.$strip>, z.ZodObject<{
|
|
598
625
|
username: z.ZodOptional<z.ZodString>;
|
|
626
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
599
627
|
text: z.ZodOptional<z.ZodString>;
|
|
600
628
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
601
629
|
}, z.core.$strip>> & {
|
|
@@ -607,6 +635,7 @@ declare const adModels: {
|
|
|
607
635
|
};
|
|
608
636
|
metadata: {
|
|
609
637
|
username?: string | undefined;
|
|
638
|
+
pfpUrl?: string | undefined;
|
|
610
639
|
text?: string | undefined;
|
|
611
640
|
timestamp?: number | undefined;
|
|
612
641
|
} | undefined;
|
|
@@ -620,6 +649,7 @@ declare const adModels: {
|
|
|
620
649
|
} | undefined;
|
|
621
650
|
metadata?: {
|
|
622
651
|
username?: string | undefined;
|
|
652
|
+
pfpUrl?: string | undefined;
|
|
623
653
|
text?: string | undefined;
|
|
624
654
|
timestamp?: number | undefined;
|
|
625
655
|
} | undefined;
|
|
@@ -631,6 +661,7 @@ declare const adModels: {
|
|
|
631
661
|
}, z.core.$strip>, z.ZodObject<{
|
|
632
662
|
icon: z.ZodOptional<z.ZodString>;
|
|
633
663
|
title: z.ZodOptional<z.ZodString>;
|
|
664
|
+
description: z.ZodOptional<z.ZodString>;
|
|
634
665
|
}, z.core.$strip>> & {
|
|
635
666
|
process: (input: {
|
|
636
667
|
url: string;
|
|
@@ -641,6 +672,7 @@ declare const adModels: {
|
|
|
641
672
|
metadata: {
|
|
642
673
|
icon?: string | undefined;
|
|
643
674
|
title?: string | undefined;
|
|
675
|
+
description?: string | undefined;
|
|
644
676
|
} | undefined;
|
|
645
677
|
}>;
|
|
646
678
|
safeProcess: (input: {
|
|
@@ -653,10 +685,11 @@ declare const adModels: {
|
|
|
653
685
|
metadata?: {
|
|
654
686
|
icon?: string | undefined;
|
|
655
687
|
title?: string | undefined;
|
|
688
|
+
description?: string | undefined;
|
|
656
689
|
} | undefined;
|
|
657
690
|
error?: z.ZodError | string;
|
|
658
691
|
}>;
|
|
659
692
|
};
|
|
660
693
|
};
|
|
661
694
|
|
|
662
|
-
export { type AdData, type AdDefinition, type AdType, type CastAdData, type CastAdMetadata, type LinkAdData, type LinkAdMetadata, type MiniAppAdData, type MiniAppAdMetadata, adDefinitions, adModels, adTypes, ads, castAd, defineAd, getAd, linkAd, miniappAd, processAd, safeProcessAd, validateAdData };
|
|
695
|
+
export { type AdData, type AdDefinition, type AdType, type CastAd, type CastAdData, type CastAdMetadata, type LinkAd, type LinkAdData, type LinkAdMetadata, type MiniAppAd, type MiniAppAdData, type MiniAppAdMetadata, adDefinitions, adModels, adTypes, ads, castAd, defineAd, getAd, linkAd, miniappAd, processAd, safeProcessAd, validateAdData };
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
8
8
|
hash: z.ZodString;
|
|
9
9
|
}, z.core.$strip>, z.ZodObject<{
|
|
10
10
|
username: z.ZodOptional<z.ZodString>;
|
|
11
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
11
12
|
text: z.ZodOptional<z.ZodString>;
|
|
12
13
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
13
14
|
}, z.core.$strip>> & {
|
|
@@ -19,6 +20,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
19
20
|
};
|
|
20
21
|
metadata: {
|
|
21
22
|
username?: string | undefined;
|
|
23
|
+
pfpUrl?: string | undefined;
|
|
22
24
|
text?: string | undefined;
|
|
23
25
|
timestamp?: number | undefined;
|
|
24
26
|
} | undefined;
|
|
@@ -32,6 +34,7 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
32
34
|
} | undefined;
|
|
33
35
|
metadata?: {
|
|
34
36
|
username?: string | undefined;
|
|
37
|
+
pfpUrl?: string | undefined;
|
|
35
38
|
text?: string | undefined;
|
|
36
39
|
timestamp?: number | undefined;
|
|
37
40
|
} | undefined;
|
|
@@ -46,6 +49,11 @@ type CastAdData = z.infer<typeof castAd.data>;
|
|
|
46
49
|
* Type inference for CastAd metadata
|
|
47
50
|
*/
|
|
48
51
|
type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;
|
|
52
|
+
type CastAd = {
|
|
53
|
+
type: "cast";
|
|
54
|
+
data: CastAdData;
|
|
55
|
+
metadata: CastAdMetadata;
|
|
56
|
+
};
|
|
49
57
|
|
|
50
58
|
/**
|
|
51
59
|
* Link Ad Definition
|
|
@@ -93,6 +101,11 @@ type LinkAdData = z.infer<typeof linkAd.data>;
|
|
|
93
101
|
* Type inference for LinkAd metadata
|
|
94
102
|
*/
|
|
95
103
|
type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;
|
|
104
|
+
type LinkAd = {
|
|
105
|
+
type: "link";
|
|
106
|
+
data: LinkAdData;
|
|
107
|
+
metadata: LinkAdMetadata;
|
|
108
|
+
};
|
|
96
109
|
|
|
97
110
|
/**
|
|
98
111
|
* MiniApp Ad Definition
|
|
@@ -103,6 +116,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
103
116
|
}, z.core.$strip>, z.ZodObject<{
|
|
104
117
|
icon: z.ZodOptional<z.ZodString>;
|
|
105
118
|
title: z.ZodOptional<z.ZodString>;
|
|
119
|
+
description: z.ZodOptional<z.ZodString>;
|
|
106
120
|
}, z.core.$strip>> & {
|
|
107
121
|
process: (input: {
|
|
108
122
|
url: string;
|
|
@@ -113,6 +127,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
113
127
|
metadata: {
|
|
114
128
|
icon?: string | undefined;
|
|
115
129
|
title?: string | undefined;
|
|
130
|
+
description?: string | undefined;
|
|
116
131
|
} | undefined;
|
|
117
132
|
}>;
|
|
118
133
|
safeProcess: (input: {
|
|
@@ -125,6 +140,7 @@ declare const miniappAd: AdDefinition<z.ZodObject<{
|
|
|
125
140
|
metadata?: {
|
|
126
141
|
icon?: string | undefined;
|
|
127
142
|
title?: string | undefined;
|
|
143
|
+
description?: string | undefined;
|
|
128
144
|
} | undefined;
|
|
129
145
|
error?: z.ZodError | string;
|
|
130
146
|
}>;
|
|
@@ -137,6 +153,11 @@ type MiniAppAdData = z.infer<typeof miniappAd.data>;
|
|
|
137
153
|
* Type inference for MiniAppAd metadata
|
|
138
154
|
*/
|
|
139
155
|
type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;
|
|
156
|
+
type MiniAppAd = {
|
|
157
|
+
type: "miniapp";
|
|
158
|
+
data: MiniAppAdData;
|
|
159
|
+
metadata: MiniAppAdMetadata;
|
|
160
|
+
};
|
|
140
161
|
|
|
141
162
|
/**
|
|
142
163
|
* Ad Definition type
|
|
@@ -221,19 +242,7 @@ declare function safeProcessAd<TData extends z.ZodTypeAny, TMetadata extends z.Z
|
|
|
221
242
|
/**
|
|
222
243
|
* Union type for all complete ad structures with type, data, and optional metadata
|
|
223
244
|
*/
|
|
224
|
-
type AdData =
|
|
225
|
-
type: "cast";
|
|
226
|
-
data: CastAdData;
|
|
227
|
-
metadata?: CastAdMetadata;
|
|
228
|
-
} | {
|
|
229
|
-
type: "link";
|
|
230
|
-
data: LinkAdData;
|
|
231
|
-
metadata?: LinkAdMetadata;
|
|
232
|
-
} | {
|
|
233
|
-
type: "miniapp";
|
|
234
|
-
data: MiniAppAdData;
|
|
235
|
-
metadata?: MiniAppAdMetadata;
|
|
236
|
-
};
|
|
245
|
+
type AdData = CastAd | LinkAd | MiniAppAd;
|
|
237
246
|
/**
|
|
238
247
|
* Registry of all ad definitions
|
|
239
248
|
* Each entry is an AdDefinition object
|
|
@@ -277,6 +286,7 @@ declare const ads: {
|
|
|
277
286
|
hash: z.ZodString;
|
|
278
287
|
}, z.core.$strip>, z.ZodObject<{
|
|
279
288
|
username: z.ZodOptional<z.ZodString>;
|
|
289
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
280
290
|
text: z.ZodOptional<z.ZodString>;
|
|
281
291
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
282
292
|
}, z.core.$strip>> & {
|
|
@@ -288,6 +298,7 @@ declare const ads: {
|
|
|
288
298
|
};
|
|
289
299
|
metadata: {
|
|
290
300
|
username?: string | undefined;
|
|
301
|
+
pfpUrl?: string | undefined;
|
|
291
302
|
text?: string | undefined;
|
|
292
303
|
timestamp?: number | undefined;
|
|
293
304
|
} | undefined;
|
|
@@ -301,6 +312,7 @@ declare const ads: {
|
|
|
301
312
|
} | undefined;
|
|
302
313
|
metadata?: {
|
|
303
314
|
username?: string | undefined;
|
|
315
|
+
pfpUrl?: string | undefined;
|
|
304
316
|
text?: string | undefined;
|
|
305
317
|
timestamp?: number | undefined;
|
|
306
318
|
} | undefined;
|
|
@@ -312,6 +324,7 @@ declare const ads: {
|
|
|
312
324
|
}, z.core.$strip>, z.ZodObject<{
|
|
313
325
|
icon: z.ZodOptional<z.ZodString>;
|
|
314
326
|
title: z.ZodOptional<z.ZodString>;
|
|
327
|
+
description: z.ZodOptional<z.ZodString>;
|
|
315
328
|
}, z.core.$strip>> & {
|
|
316
329
|
process: (input: {
|
|
317
330
|
url: string;
|
|
@@ -322,6 +335,7 @@ declare const ads: {
|
|
|
322
335
|
metadata: {
|
|
323
336
|
icon?: string | undefined;
|
|
324
337
|
title?: string | undefined;
|
|
338
|
+
description?: string | undefined;
|
|
325
339
|
} | undefined;
|
|
326
340
|
}>;
|
|
327
341
|
safeProcess: (input: {
|
|
@@ -334,6 +348,7 @@ declare const ads: {
|
|
|
334
348
|
metadata?: {
|
|
335
349
|
icon?: string | undefined;
|
|
336
350
|
title?: string | undefined;
|
|
351
|
+
description?: string | undefined;
|
|
337
352
|
} | undefined;
|
|
338
353
|
error?: z.ZodError | string;
|
|
339
354
|
}>;
|
|
@@ -348,68 +363,71 @@ type AdType = keyof typeof ads;
|
|
|
348
363
|
* Get ad definition by type
|
|
349
364
|
*/
|
|
350
365
|
declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
351
|
-
|
|
366
|
+
url: z.ZodString;
|
|
352
367
|
}, z.core.$strip>, z.ZodObject<{
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
368
|
+
title: z.ZodOptional<z.ZodString>;
|
|
369
|
+
description: z.ZodOptional<z.ZodString>;
|
|
370
|
+
image: z.ZodOptional<z.ZodString>;
|
|
356
371
|
}, z.core.$strip>> & {
|
|
357
372
|
process: (input: {
|
|
358
|
-
|
|
373
|
+
url: string;
|
|
359
374
|
}) => Promise<{
|
|
360
375
|
data: {
|
|
361
|
-
|
|
376
|
+
url: string;
|
|
362
377
|
};
|
|
363
378
|
metadata: {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
379
|
+
title?: string | undefined;
|
|
380
|
+
description?: string | undefined;
|
|
381
|
+
image?: string | undefined;
|
|
367
382
|
} | undefined;
|
|
368
383
|
}>;
|
|
369
384
|
safeProcess: (input: {
|
|
370
|
-
|
|
385
|
+
url: string;
|
|
371
386
|
}) => Promise<{
|
|
372
387
|
success: boolean;
|
|
373
388
|
data?: {
|
|
374
|
-
|
|
389
|
+
url: string;
|
|
375
390
|
} | undefined;
|
|
376
391
|
metadata?: {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
392
|
+
title?: string | undefined;
|
|
393
|
+
description?: string | undefined;
|
|
394
|
+
image?: string | undefined;
|
|
380
395
|
} | undefined;
|
|
381
396
|
error?: z.ZodError | string;
|
|
382
397
|
}>;
|
|
383
398
|
}) | (AdDefinition<z.ZodObject<{
|
|
384
|
-
|
|
399
|
+
hash: z.ZodString;
|
|
385
400
|
}, z.core.$strip>, z.ZodObject<{
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
401
|
+
username: z.ZodOptional<z.ZodString>;
|
|
402
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
403
|
+
text: z.ZodOptional<z.ZodString>;
|
|
404
|
+
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
389
405
|
}, z.core.$strip>> & {
|
|
390
406
|
process: (input: {
|
|
391
|
-
|
|
407
|
+
hash: string;
|
|
392
408
|
}) => Promise<{
|
|
393
409
|
data: {
|
|
394
|
-
|
|
410
|
+
hash: string;
|
|
395
411
|
};
|
|
396
412
|
metadata: {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
413
|
+
username?: string | undefined;
|
|
414
|
+
pfpUrl?: string | undefined;
|
|
415
|
+
text?: string | undefined;
|
|
416
|
+
timestamp?: number | undefined;
|
|
400
417
|
} | undefined;
|
|
401
418
|
}>;
|
|
402
419
|
safeProcess: (input: {
|
|
403
|
-
|
|
420
|
+
hash: string;
|
|
404
421
|
}) => Promise<{
|
|
405
422
|
success: boolean;
|
|
406
423
|
data?: {
|
|
407
|
-
|
|
424
|
+
hash: string;
|
|
408
425
|
} | undefined;
|
|
409
426
|
metadata?: {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
427
|
+
username?: string | undefined;
|
|
428
|
+
pfpUrl?: string | undefined;
|
|
429
|
+
text?: string | undefined;
|
|
430
|
+
timestamp?: number | undefined;
|
|
413
431
|
} | undefined;
|
|
414
432
|
error?: z.ZodError | string;
|
|
415
433
|
}>;
|
|
@@ -418,6 +436,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
418
436
|
}, z.core.$strip>, z.ZodObject<{
|
|
419
437
|
icon: z.ZodOptional<z.ZodString>;
|
|
420
438
|
title: z.ZodOptional<z.ZodString>;
|
|
439
|
+
description: z.ZodOptional<z.ZodString>;
|
|
421
440
|
}, z.core.$strip>> & {
|
|
422
441
|
process: (input: {
|
|
423
442
|
url: string;
|
|
@@ -428,6 +447,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
428
447
|
metadata: {
|
|
429
448
|
icon?: string | undefined;
|
|
430
449
|
title?: string | undefined;
|
|
450
|
+
description?: string | undefined;
|
|
431
451
|
} | undefined;
|
|
432
452
|
}>;
|
|
433
453
|
safeProcess: (input: {
|
|
@@ -440,6 +460,7 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
440
460
|
metadata?: {
|
|
441
461
|
icon?: string | undefined;
|
|
442
462
|
title?: string | undefined;
|
|
463
|
+
description?: string | undefined;
|
|
443
464
|
} | undefined;
|
|
444
465
|
error?: z.ZodError | string;
|
|
445
466
|
}>;
|
|
@@ -495,6 +516,7 @@ declare const adDefinitions: {
|
|
|
495
516
|
hash: z.ZodString;
|
|
496
517
|
}, z.core.$strip>, z.ZodObject<{
|
|
497
518
|
username: z.ZodOptional<z.ZodString>;
|
|
519
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
498
520
|
text: z.ZodOptional<z.ZodString>;
|
|
499
521
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
500
522
|
}, z.core.$strip>> & {
|
|
@@ -506,6 +528,7 @@ declare const adDefinitions: {
|
|
|
506
528
|
};
|
|
507
529
|
metadata: {
|
|
508
530
|
username?: string | undefined;
|
|
531
|
+
pfpUrl?: string | undefined;
|
|
509
532
|
text?: string | undefined;
|
|
510
533
|
timestamp?: number | undefined;
|
|
511
534
|
} | undefined;
|
|
@@ -519,6 +542,7 @@ declare const adDefinitions: {
|
|
|
519
542
|
} | undefined;
|
|
520
543
|
metadata?: {
|
|
521
544
|
username?: string | undefined;
|
|
545
|
+
pfpUrl?: string | undefined;
|
|
522
546
|
text?: string | undefined;
|
|
523
547
|
timestamp?: number | undefined;
|
|
524
548
|
} | undefined;
|
|
@@ -530,6 +554,7 @@ declare const adDefinitions: {
|
|
|
530
554
|
}, z.core.$strip>, z.ZodObject<{
|
|
531
555
|
icon: z.ZodOptional<z.ZodString>;
|
|
532
556
|
title: z.ZodOptional<z.ZodString>;
|
|
557
|
+
description: z.ZodOptional<z.ZodString>;
|
|
533
558
|
}, z.core.$strip>> & {
|
|
534
559
|
process: (input: {
|
|
535
560
|
url: string;
|
|
@@ -540,6 +565,7 @@ declare const adDefinitions: {
|
|
|
540
565
|
metadata: {
|
|
541
566
|
icon?: string | undefined;
|
|
542
567
|
title?: string | undefined;
|
|
568
|
+
description?: string | undefined;
|
|
543
569
|
} | undefined;
|
|
544
570
|
}>;
|
|
545
571
|
safeProcess: (input: {
|
|
@@ -552,6 +578,7 @@ declare const adDefinitions: {
|
|
|
552
578
|
metadata?: {
|
|
553
579
|
icon?: string | undefined;
|
|
554
580
|
title?: string | undefined;
|
|
581
|
+
description?: string | undefined;
|
|
555
582
|
} | undefined;
|
|
556
583
|
error?: z.ZodError | string;
|
|
557
584
|
}>;
|
|
@@ -596,6 +623,7 @@ declare const adModels: {
|
|
|
596
623
|
hash: z.ZodString;
|
|
597
624
|
}, z.core.$strip>, z.ZodObject<{
|
|
598
625
|
username: z.ZodOptional<z.ZodString>;
|
|
626
|
+
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
599
627
|
text: z.ZodOptional<z.ZodString>;
|
|
600
628
|
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
601
629
|
}, z.core.$strip>> & {
|
|
@@ -607,6 +635,7 @@ declare const adModels: {
|
|
|
607
635
|
};
|
|
608
636
|
metadata: {
|
|
609
637
|
username?: string | undefined;
|
|
638
|
+
pfpUrl?: string | undefined;
|
|
610
639
|
text?: string | undefined;
|
|
611
640
|
timestamp?: number | undefined;
|
|
612
641
|
} | undefined;
|
|
@@ -620,6 +649,7 @@ declare const adModels: {
|
|
|
620
649
|
} | undefined;
|
|
621
650
|
metadata?: {
|
|
622
651
|
username?: string | undefined;
|
|
652
|
+
pfpUrl?: string | undefined;
|
|
623
653
|
text?: string | undefined;
|
|
624
654
|
timestamp?: number | undefined;
|
|
625
655
|
} | undefined;
|
|
@@ -631,6 +661,7 @@ declare const adModels: {
|
|
|
631
661
|
}, z.core.$strip>, z.ZodObject<{
|
|
632
662
|
icon: z.ZodOptional<z.ZodString>;
|
|
633
663
|
title: z.ZodOptional<z.ZodString>;
|
|
664
|
+
description: z.ZodOptional<z.ZodString>;
|
|
634
665
|
}, z.core.$strip>> & {
|
|
635
666
|
process: (input: {
|
|
636
667
|
url: string;
|
|
@@ -641,6 +672,7 @@ declare const adModels: {
|
|
|
641
672
|
metadata: {
|
|
642
673
|
icon?: string | undefined;
|
|
643
674
|
title?: string | undefined;
|
|
675
|
+
description?: string | undefined;
|
|
644
676
|
} | undefined;
|
|
645
677
|
}>;
|
|
646
678
|
safeProcess: (input: {
|
|
@@ -653,10 +685,11 @@ declare const adModels: {
|
|
|
653
685
|
metadata?: {
|
|
654
686
|
icon?: string | undefined;
|
|
655
687
|
title?: string | undefined;
|
|
688
|
+
description?: string | undefined;
|
|
656
689
|
} | undefined;
|
|
657
690
|
error?: z.ZodError | string;
|
|
658
691
|
}>;
|
|
659
692
|
};
|
|
660
693
|
};
|
|
661
694
|
|
|
662
|
-
export { type AdData, type AdDefinition, type AdType, type CastAdData, type CastAdMetadata, type LinkAdData, type LinkAdMetadata, type MiniAppAdData, type MiniAppAdMetadata, adDefinitions, adModels, adTypes, ads, castAd, defineAd, getAd, linkAd, miniappAd, processAd, safeProcessAd, validateAdData };
|
|
695
|
+
export { type AdData, type AdDefinition, type AdType, type CastAd, type CastAdData, type CastAdMetadata, type LinkAd, type LinkAdData, type LinkAdMetadata, type MiniAppAd, type MiniAppAdData, type MiniAppAdMetadata, adDefinitions, adModels, adTypes, ads, castAd, defineAd, getAd, linkAd, miniappAd, processAd, safeProcessAd, validateAdData };
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,7 @@ async function processAd(ad, input) {
|
|
|
25
25
|
await ad.verify(input);
|
|
26
26
|
}
|
|
27
27
|
const metadata = ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : void 0;
|
|
28
|
-
return { data, metadata };
|
|
28
|
+
return { data, metadata, type: ad.type };
|
|
29
29
|
}
|
|
30
30
|
async function safeProcessAd(ad, input) {
|
|
31
31
|
const parseResult = ad.data.safeParse(input);
|
|
@@ -68,6 +68,23 @@ var AdlandAPI = class {
|
|
|
68
68
|
domain
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
+
async getMiniappMetadata({
|
|
72
|
+
url
|
|
73
|
+
}) {
|
|
74
|
+
return this.get(
|
|
75
|
+
`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
async getLinkMetadata({
|
|
79
|
+
url
|
|
80
|
+
}) {
|
|
81
|
+
return this.get(
|
|
82
|
+
`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
async getCastMetadata({ hash }) {
|
|
86
|
+
return this.get(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
87
|
+
}
|
|
71
88
|
async post(url, body) {
|
|
72
89
|
return fetch(url, {
|
|
73
90
|
method: "POST",
|
|
@@ -88,6 +105,7 @@ var castAd = defineAd({
|
|
|
88
105
|
}),
|
|
89
106
|
metadata: z.object({
|
|
90
107
|
username: z.string().optional(),
|
|
108
|
+
pfpUrl: z.string().optional(),
|
|
91
109
|
text: z.string().optional(),
|
|
92
110
|
timestamp: z.number().optional()
|
|
93
111
|
}),
|
|
@@ -99,6 +117,15 @@ var castAd = defineAd({
|
|
|
99
117
|
if (!res.verified) {
|
|
100
118
|
throw new Error("Cast hash verification failed");
|
|
101
119
|
}
|
|
120
|
+
},
|
|
121
|
+
async getMetadata({ hash }) {
|
|
122
|
+
const cast = await adlandAPI.getCastMetadata({ hash });
|
|
123
|
+
return {
|
|
124
|
+
username: cast.username,
|
|
125
|
+
pfpUrl: cast.pfpUrl,
|
|
126
|
+
text: cast.text,
|
|
127
|
+
timestamp: cast.timestamp
|
|
128
|
+
};
|
|
102
129
|
}
|
|
103
130
|
});
|
|
104
131
|
var linkAd = defineAd({
|
|
@@ -115,6 +142,14 @@ var linkAd = defineAd({
|
|
|
115
142
|
if (!url.startsWith("http")) {
|
|
116
143
|
throw new Error("Invalid link");
|
|
117
144
|
}
|
|
145
|
+
},
|
|
146
|
+
async getMetadata({ url }) {
|
|
147
|
+
const metadata = await adlandAPI.getLinkMetadata({ url });
|
|
148
|
+
return {
|
|
149
|
+
title: metadata.title,
|
|
150
|
+
description: metadata.description,
|
|
151
|
+
image: metadata.image
|
|
152
|
+
};
|
|
118
153
|
}
|
|
119
154
|
});
|
|
120
155
|
var miniappAd = defineAd({
|
|
@@ -124,7 +159,8 @@ var miniappAd = defineAd({
|
|
|
124
159
|
}),
|
|
125
160
|
metadata: z.object({
|
|
126
161
|
icon: z.string().optional(),
|
|
127
|
-
title: z.string().optional()
|
|
162
|
+
title: z.string().optional(),
|
|
163
|
+
description: z.string().optional()
|
|
128
164
|
}),
|
|
129
165
|
async verify({ url }) {
|
|
130
166
|
const errorMessage = "Miniapp domain verification failed";
|
|
@@ -138,6 +174,15 @@ var miniappAd = defineAd({
|
|
|
138
174
|
if (!res.verified) {
|
|
139
175
|
throw new Error(errorMessage);
|
|
140
176
|
}
|
|
177
|
+
},
|
|
178
|
+
async getMetadata({ url }) {
|
|
179
|
+
const res = await adlandAPI.getMiniappMetadata({ url });
|
|
180
|
+
console.log("getMetadata:res", res);
|
|
181
|
+
return {
|
|
182
|
+
icon: res.icon,
|
|
183
|
+
title: res.title,
|
|
184
|
+
description: res.description
|
|
185
|
+
};
|
|
141
186
|
}
|
|
142
187
|
});
|
|
143
188
|
|
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 } as {\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 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(url: string) {\n return fetch(url).then((res) => res.json());\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 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});\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","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\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});\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","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 }),\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});\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","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAdData, CastAdMetadata } from \"./ads/cast\";\nimport type { LinkAdData, LinkAdMetadata } from \"./ads/link\";\nimport type { MiniAppAdData, MiniAppAdMetadata } from \"./ads/miniapp\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData =\n | {\n type: \"cast\";\n data: CastAdData;\n metadata?: CastAdMetadata;\n }\n | {\n type: \"link\";\n data: LinkAdData;\n metadata?: LinkAdMetadata;\n }\n | {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata?: MiniAppAdMetadata;\n };\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({\n url,\n }: {\n url: string;\n }): Promise<{ title: string; icon: string; description: string }> {\n return this.get<{ title: string; icon: string; description: string }>(\n `${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`,\n );\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 }),\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 };\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"]}
|