@adland/data 0.4.0 → 0.5.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 +51 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +51 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -71,7 +71,14 @@ var DataModel = class {
|
|
|
71
71
|
*/
|
|
72
72
|
async prepare(input) {
|
|
73
73
|
const parsed = await this.validate(input);
|
|
74
|
-
|
|
74
|
+
try {
|
|
75
|
+
await this.verify(parsed);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof Error) {
|
|
78
|
+
throw new Error(error.message);
|
|
79
|
+
}
|
|
80
|
+
throw new Error(`Verification failed for ${this.schema.description}`);
|
|
81
|
+
}
|
|
75
82
|
return parsed;
|
|
76
83
|
}
|
|
77
84
|
/**
|
|
@@ -115,16 +122,48 @@ var LinkAdModel = class extends AdModel {
|
|
|
115
122
|
super(linkAdSchema);
|
|
116
123
|
}
|
|
117
124
|
async verify(data) {
|
|
125
|
+
const errorMessage = "Invalid link";
|
|
126
|
+
if (!data.data.url.startsWith("http")) {
|
|
127
|
+
throw new Error(errorMessage);
|
|
128
|
+
}
|
|
118
129
|
}
|
|
119
130
|
};
|
|
120
131
|
|
|
132
|
+
// src/constants.ts
|
|
133
|
+
var adlandApiUrl = process.env.NODE_ENV === "development" ? "http://localhost:3069" : "https://api.adland.space";
|
|
134
|
+
|
|
121
135
|
// src/models/CastAdModel.ts
|
|
122
136
|
var CastAdModel = class extends AdModel {
|
|
123
137
|
type = "cast";
|
|
124
138
|
constructor() {
|
|
125
139
|
super(castAdSchema);
|
|
126
140
|
}
|
|
127
|
-
async verify(data) {
|
|
141
|
+
async verify({ data: { hash } }) {
|
|
142
|
+
if (!this.isValidFormat(hash)) {
|
|
143
|
+
throw new Error("Invalid cast hash: must be a valid farcaster cast hash");
|
|
144
|
+
}
|
|
145
|
+
const errorMessage = "Cast hash verification failed";
|
|
146
|
+
const res = await fetch(`${adlandApiUrl}/verify/cast`, {
|
|
147
|
+
method: "POST",
|
|
148
|
+
headers: {
|
|
149
|
+
"Content-Type": "application/json"
|
|
150
|
+
},
|
|
151
|
+
body: JSON.stringify({ hash })
|
|
152
|
+
}).then((res2) => res2.json()).catch((err) => {
|
|
153
|
+
throw new Error(errorMessage);
|
|
154
|
+
});
|
|
155
|
+
console.log("res", res);
|
|
156
|
+
if (!res.verified) {
|
|
157
|
+
throw new Error(errorMessage);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46
|
|
162
|
+
* @param hash
|
|
163
|
+
* @returns
|
|
164
|
+
*/
|
|
165
|
+
isValidFormat(hash) {
|
|
166
|
+
return /^0x[0-9a-fA-F]{40}$/.test(hash);
|
|
128
167
|
}
|
|
129
168
|
};
|
|
130
169
|
|
|
@@ -135,6 +174,16 @@ var MiniAppAdModel = class extends AdModel {
|
|
|
135
174
|
super(miniappAdSchema);
|
|
136
175
|
}
|
|
137
176
|
async verify(data) {
|
|
177
|
+
const errorMessage = "Miniapp domain verification failed";
|
|
178
|
+
const res = await fetch(`${adlandApiUrl}/verify/miniapp`, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
body: JSON.stringify({ domain: data.data.url.split("//")[1] })
|
|
181
|
+
}).then((res2) => res2.json()).catch((err) => {
|
|
182
|
+
throw new Error(errorMessage);
|
|
183
|
+
});
|
|
184
|
+
if (!res.verified) {
|
|
185
|
+
throw new Error(errorMessage);
|
|
186
|
+
}
|
|
138
187
|
}
|
|
139
188
|
};
|
|
140
189
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/index.ts","../src/types/models.ts","../src/models/AdModel.ts","../src/models/LinkAdModel.ts","../src/models/CastAdModel.ts","../src/models/MiniAppAdModel.ts","../src/models/index.ts","../src/types/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Link ad data schema - basic link\n */\nconst linkAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Cast ad data schema - link to a Farcaster cast\n */\nconst castAdDataSchema = z.object({\n hash: z.string().nonoptional(\"Hash is required\"),\n});\n\n/**\n * MiniApp ad data schema - link to a Farcaster mini app\n */\nconst miniappAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Link ad schema - basic link\n */\nexport const linkAdSchema = z.object({\n type: z.literal(\"link\"),\n data: linkAdDataSchema,\n});\n\n/**\n * Cast ad schema - link to a Farcaster cast\n */\nexport const castAdSchema = z.object({\n type: z.literal(\"cast\"),\n data: castAdDataSchema,\n});\n\n/**\n * MiniApp ad schema - link to a Farcaster mini app\n */\nexport const miniappAdSchema = z.object({\n type: z.literal(\"miniapp\"),\n data: miniappAdDataSchema,\n});\n\n/**\n * Union schema for all ad types\n */\nexport const adDataSchema = z.discriminatedUnion(\"type\", [\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n]);\n\n/**\n * All ad schemas as an object\n */\nexport const adSchemas = {\n link: linkAdSchema,\n cast: castAdSchema,\n miniapp: miniappAdSchema,\n} as const;\n\n/**\n * Get schema for a specific ad type\n */\nexport function getAdSchema(type: keyof typeof adSchemas) {\n return adSchemas[type];\n}\n\n/**\n * Get all ad schemas\n */\nexport function getAllAdSchemas() {\n return adSchemas;\n}\n\n/**\n * Validate ad data\n */\nexport function validateAdData(data: unknown): {\n success: boolean;\n data?: z.infer<typeof adDataSchema>;\n error?: z.ZodError;\n} {\n const result = adDataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n","import { z } from \"zod\";\n\n/**\n * Base class for data models with schema validation and verification\n */\nexport abstract class DataModel<S extends z.ZodTypeAny> {\n readonly schema: S;\n\n constructor(schema: S) {\n this.schema = schema;\n }\n\n /**\n * Validate input against Zod schema\n */\n async validate(input: unknown): Promise<z.infer<S>> {\n return this.schema.parseAsync(input);\n }\n\n /**\n * Custom async checks (override in subclasses)\n * Throw an error if verification fails\n */\n async verify(_data: z.infer<S>): Promise<void> {\n // default: no extra checks\n }\n\n /**\n * Full pipeline: validate → verify\n */\n async prepare(input: unknown): Promise<z.infer<S>> {\n const parsed = await this.validate(input);\n await this.verify(parsed);\n return parsed;\n }\n\n /**\n * Safe validation that returns result instead of throwing\n */\n async safeValidate(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: z.ZodError;\n }> {\n const result = await this.schema.safeParseAsync(input);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Safe prepare that returns result instead of throwing\n */\n async safePrepare(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: string | z.ZodError;\n }> {\n const validation = await this.safeValidate(input);\n if (!validation.success) {\n return validation;\n }\n\n try {\n await this.verify(validation.data!);\n return { success: true, data: validation.data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n}\n","import { z } from \"zod\";\nimport { DataModel } from \"../types/models\";\nimport type { LinkAd, CastAd, MiniAppAd, AdData } from \"../types\";\n\n/**\n * Base ad model class\n */\nexport abstract class AdModel<\n T extends LinkAd | CastAd | MiniAppAd,\n> extends DataModel<z.ZodType<T, any, any>> {\n abstract readonly type: T[\"type\"];\n}\n","import { AdModel } from \"./AdModel\";\nimport { linkAdSchema } from \"../schemas\";\nimport type { LinkAd } from \"../types\";\n\n/**\n * Link Ad Model\n */\nexport class LinkAdModel extends AdModel<LinkAd> {\n readonly type = \"link\" as const;\n\n constructor() {\n super(linkAdSchema);\n }\n\n async verify(data: LinkAd): Promise<void> {\n // Override to add custom verification\n // Example: check if URL is accessible\n // const response = await fetch(data.data.url, { method: \"HEAD\" });\n // if (!response.ok) throw new Error(\"URL is not accessible\");\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { castAdSchema } from \"../schemas\";\nimport type { CastAd } from \"../types\";\n\n/**\n * Cast Ad Model\n */\nexport class CastAdModel extends AdModel<CastAd> {\n readonly type = \"cast\" as const;\n\n constructor() {\n super(castAdSchema);\n }\n\n async verify(data: CastAd): Promise<void> {\n // Override to add custom verification\n // Example: verify it's a valid Warpcast URL\n // if (!data.data.url.includes(\"warpcast.com\")) {\n // throw new Error(\"Must be a valid Farcaster cast URL\");\n // }\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { miniappAdSchema } from \"../schemas\";\nimport type { MiniAppAd } from \"../types\";\n\n/**\n * MiniApp Ad Model\n */\nexport class MiniAppAdModel extends AdModel<MiniAppAd> {\n readonly type = \"miniapp\" as const;\n\n constructor() {\n super(miniappAdSchema);\n }\n\n async verify(data: MiniAppAd): Promise<void> {\n // Override to add custom verification\n // Example: verify URL is actually a miniapp\n // const response = await fetch(data.data.url);\n // const html = await response.text();\n // if (!html.includes('property=\"fc:frame\"')) {\n // throw new Error(\"URL does not contain Farcaster frame metadata\");\n // }\n }\n}\n","import { LinkAdModel } from \"./LinkAdModel\";\nimport { CastAdModel } from \"./CastAdModel\";\nimport { MiniAppAdModel } from \"./MiniAppAdModel\";\n\n/**\n * Registry of all ad models\n */\nexport const adModels = {\n link: new LinkAdModel(),\n cast: new CastAdModel(),\n miniapp: new MiniAppAdModel(),\n} as const;\n\n/**\n * Get ad model for a specific type\n */\nexport function getAdModel<T extends \"link\" | \"cast\" | \"miniapp\">(\n type: T,\n): T extends \"link\"\n ? LinkAdModel\n : T extends \"cast\"\n ? CastAdModel\n : T extends \"miniapp\"\n ? MiniAppAdModel\n : never {\n return adModels[type] as any;\n}\n\nexport { DataModel } from \"../types/models\";\nexport { AdModel } from \"./AdModel\";\nexport { LinkAdModel } from \"./LinkAdModel\";\nexport { CastAdModel } from \"./CastAdModel\";\nexport { MiniAppAdModel } from \"./MiniAppAdModel\";\n","import { z } from \"zod\";\nimport {\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n adDataSchema,\n} from \"../schemas\";\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Base ad type\n */\nexport type AdType = (typeof adTypes)[number];\n\n/**\n * Link ad type - basic link\n */\nexport type LinkAd = z.infer<typeof linkAdSchema>;\n\n/**\n * Cast ad type - link to a Farcaster cast\n */\nexport type CastAd = z.infer<typeof castAdSchema>;\n\n/**\n * MiniApp ad type - link to a Farcaster mini app\n */\nexport type MiniAppAd = z.infer<typeof miniappAdSchema>;\n\n/**\n * Union type of all ad types\n */\nexport type AdData = z.infer<typeof adDataSchema>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas/index.ts","../src/types/models.ts","../src/models/AdModel.ts","../src/models/LinkAdModel.ts","../src/constants.ts","../src/models/CastAdModel.ts","../src/models/MiniAppAdModel.ts","../src/models/index.ts","../src/types/index.ts"],"names":["z","res"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Link ad data schema - basic link\n */\nconst linkAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Cast ad data schema - link to a Farcaster cast\n */\nconst castAdDataSchema = z.object({\n hash: z.string().nonoptional(\"Hash is required\"),\n});\n\n/**\n * MiniApp ad data schema - link to a Farcaster mini app\n */\nconst miniappAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Link ad schema - basic link\n */\nexport const linkAdSchema = z.object({\n type: z.literal(\"link\"),\n data: linkAdDataSchema,\n});\n\n/**\n * Cast ad schema - link to a Farcaster cast\n */\nexport const castAdSchema = z.object({\n type: z.literal(\"cast\"),\n data: castAdDataSchema,\n});\n\n/**\n * MiniApp ad schema - link to a Farcaster mini app\n */\nexport const miniappAdSchema = z.object({\n type: z.literal(\"miniapp\"),\n data: miniappAdDataSchema,\n});\n\n/**\n * Union schema for all ad types\n */\nexport const adDataSchema = z.discriminatedUnion(\"type\", [\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n]);\n\n/**\n * All ad schemas as an object\n */\nexport const adSchemas = {\n link: linkAdSchema,\n cast: castAdSchema,\n miniapp: miniappAdSchema,\n} as const;\n\n/**\n * Get schema for a specific ad type\n */\nexport function getAdSchema(type: keyof typeof adSchemas) {\n return adSchemas[type];\n}\n\n/**\n * Get all ad schemas\n */\nexport function getAllAdSchemas() {\n return adSchemas;\n}\n\n/**\n * Validate ad data\n */\nexport function validateAdData(data: unknown): {\n success: boolean;\n data?: z.infer<typeof adDataSchema>;\n error?: z.ZodError;\n} {\n const result = adDataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n","import { z } from \"zod\";\n\n/**\n * Base class for data models with schema validation and verification\n */\nexport abstract class DataModel<S extends z.ZodTypeAny> {\n readonly schema: S;\n\n constructor(schema: S) {\n this.schema = schema;\n }\n\n /**\n * Validate input against Zod schema\n */\n async validate(input: unknown): Promise<z.infer<S>> {\n return this.schema.parseAsync(input);\n }\n\n /**\n * Custom async checks (override in subclasses)\n * Throw an error if verification fails\n */\n async verify(_data: z.infer<S>): Promise<void> {\n // default: no extra checks\n }\n\n /**\n * Full pipeline: validate → verify\n */\n async prepare(input: unknown): Promise<z.infer<S>> {\n const parsed = await this.validate(input);\n try {\n await this.verify(parsed);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(error.message);\n }\n throw new Error(`Verification failed for ${this.schema.description}`);\n }\n return parsed;\n }\n\n /**\n * Safe validation that returns result instead of throwing\n */\n async safeValidate(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: z.ZodError;\n }> {\n const result = await this.schema.safeParseAsync(input);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Safe prepare that returns result instead of throwing\n */\n async safePrepare(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: string | z.ZodError;\n }> {\n const validation = await this.safeValidate(input);\n if (!validation.success) {\n return validation;\n }\n\n try {\n await this.verify(validation.data!);\n return { success: true, data: validation.data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n}\n","import { z } from \"zod\";\nimport { DataModel } from \"../types/models\";\nimport type { LinkAd, CastAd, MiniAppAd } from \"../types\";\n\n/**\n * Base ad model class\n */\nexport abstract class AdModel<\n T extends LinkAd | CastAd | MiniAppAd,\n> extends DataModel<z.ZodType<T, any, any>> {\n abstract readonly type: T[\"type\"];\n}\n","import { AdModel } from \"./AdModel\";\nimport { linkAdSchema } from \"../schemas\";\nimport type { LinkAd } from \"../types\";\n\n/**\n * Link Ad Model\n */\nexport class LinkAdModel extends AdModel<LinkAd> {\n readonly type = \"link\" as const;\n\n constructor() {\n super(linkAdSchema);\n }\n\n async verify(data: LinkAd): Promise<void> {\n const errorMessage = \"Invalid link\";\n if (!data.data.url.startsWith(\"http\")) {\n throw new Error(errorMessage);\n }\n }\n}\n","export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n","import { AdModel } from \"./AdModel\";\nimport { castAdSchema } from \"../schemas\";\nimport type { CastAd } from \"../types\";\nimport { adlandApiUrl } from \"../constants\";\n\n/**\n * Cast Ad Model\n */\nexport class CastAdModel extends AdModel<CastAd> {\n readonly type = \"cast\" as const;\n\n constructor() {\n super(castAdSchema);\n }\n\n async verify({ data: { hash } }: CastAd): Promise<void> {\n if (!this.isValidFormat(hash)) {\n throw new Error(\"Invalid cast hash: must be a valid farcaster cast hash\");\n }\n\n const errorMessage = \"Cast hash verification failed\";\n\n const res = (await fetch(`${adlandApiUrl}/verify/cast`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ hash }),\n })\n .then((res) => res.json())\n .catch((err) => {\n throw new Error(errorMessage);\n })) as { verified: boolean };\n\n console.log(\"res\", res);\n\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46\n * @param hash\n * @returns\n */\n private isValidFormat(hash: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(hash);\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { miniappAdSchema } from \"../schemas\";\nimport type { MiniAppAd } from \"../types\";\nimport { adlandApiUrl } from \"../constants\";\n\n/**\n * MiniApp Ad Model\n */\nexport class MiniAppAdModel extends AdModel<MiniAppAd> {\n readonly type = \"miniapp\" as const;\n\n constructor() {\n super(miniappAdSchema);\n }\n\n async verify(data: MiniAppAd): Promise<void> {\n const errorMessage = \"Miniapp domain verification failed\";\n const res = (await fetch(`${adlandApiUrl}/verify/miniapp`, {\n method: \"POST\",\n body: JSON.stringify({ domain: data.data.url.split(\"//\")[1] }),\n })\n .then((res) => res.json())\n .catch((err) => {\n throw new Error(errorMessage);\n })) as { verified: boolean };\n\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n }\n}\n","import { LinkAdModel } from \"./LinkAdModel\";\nimport { CastAdModel } from \"./CastAdModel\";\nimport { MiniAppAdModel } from \"./MiniAppAdModel\";\n\n/**\n * Registry of all ad models\n */\nexport const adModels = {\n link: new LinkAdModel(),\n cast: new CastAdModel(),\n miniapp: new MiniAppAdModel(),\n} as const;\n\n/**\n * Get ad model for a specific type\n */\nexport function getAdModel<T extends \"link\" | \"cast\" | \"miniapp\">(\n type: T,\n): T extends \"link\"\n ? LinkAdModel\n : T extends \"cast\"\n ? CastAdModel\n : T extends \"miniapp\"\n ? MiniAppAdModel\n : never {\n return adModels[type] as any;\n}\n\nexport { DataModel } from \"../types/models\";\nexport { AdModel } from \"./AdModel\";\nexport { LinkAdModel } from \"./LinkAdModel\";\nexport { CastAdModel } from \"./CastAdModel\";\nexport { MiniAppAdModel } from \"./MiniAppAdModel\";\n","import { z } from \"zod\";\nimport {\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n adDataSchema,\n} from \"../schemas\";\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Base ad type\n */\nexport type AdType = (typeof adTypes)[number];\n\n/**\n * Link ad type - basic link\n */\nexport type LinkAd = z.infer<typeof linkAdSchema>;\n\n/**\n * Cast ad type - link to a Farcaster cast\n */\nexport type CastAd = z.infer<typeof castAdSchema>;\n\n/**\n * MiniApp ad type - link to a Farcaster mini app\n */\nexport type MiniAppAd = z.infer<typeof miniappAdSchema>;\n\n/**\n * Union type of all ad types\n */\nexport type AdData = z.infer<typeof adDataSchema>;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -201,7 +201,13 @@ declare class LinkAdModel extends AdModel<LinkAd> {
|
|
|
201
201
|
declare class CastAdModel extends AdModel<CastAd> {
|
|
202
202
|
readonly type: "cast";
|
|
203
203
|
constructor();
|
|
204
|
-
verify(data: CastAd): Promise<void>;
|
|
204
|
+
verify({ data: { hash } }: CastAd): Promise<void>;
|
|
205
|
+
/**
|
|
206
|
+
* Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46
|
|
207
|
+
* @param hash
|
|
208
|
+
* @returns
|
|
209
|
+
*/
|
|
210
|
+
private isValidFormat;
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -201,7 +201,13 @@ declare class LinkAdModel extends AdModel<LinkAd> {
|
|
|
201
201
|
declare class CastAdModel extends AdModel<CastAd> {
|
|
202
202
|
readonly type: "cast";
|
|
203
203
|
constructor();
|
|
204
|
-
verify(data: CastAd): Promise<void>;
|
|
204
|
+
verify({ data: { hash } }: CastAd): Promise<void>;
|
|
205
|
+
/**
|
|
206
|
+
* Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46
|
|
207
|
+
* @param hash
|
|
208
|
+
* @returns
|
|
209
|
+
*/
|
|
210
|
+
private isValidFormat;
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
/**
|
package/dist/index.js
CHANGED
|
@@ -69,7 +69,14 @@ var DataModel = class {
|
|
|
69
69
|
*/
|
|
70
70
|
async prepare(input) {
|
|
71
71
|
const parsed = await this.validate(input);
|
|
72
|
-
|
|
72
|
+
try {
|
|
73
|
+
await this.verify(parsed);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if (error instanceof Error) {
|
|
76
|
+
throw new Error(error.message);
|
|
77
|
+
}
|
|
78
|
+
throw new Error(`Verification failed for ${this.schema.description}`);
|
|
79
|
+
}
|
|
73
80
|
return parsed;
|
|
74
81
|
}
|
|
75
82
|
/**
|
|
@@ -113,16 +120,48 @@ var LinkAdModel = class extends AdModel {
|
|
|
113
120
|
super(linkAdSchema);
|
|
114
121
|
}
|
|
115
122
|
async verify(data) {
|
|
123
|
+
const errorMessage = "Invalid link";
|
|
124
|
+
if (!data.data.url.startsWith("http")) {
|
|
125
|
+
throw new Error(errorMessage);
|
|
126
|
+
}
|
|
116
127
|
}
|
|
117
128
|
};
|
|
118
129
|
|
|
130
|
+
// src/constants.ts
|
|
131
|
+
var adlandApiUrl = process.env.NODE_ENV === "development" ? "http://localhost:3069" : "https://api.adland.space";
|
|
132
|
+
|
|
119
133
|
// src/models/CastAdModel.ts
|
|
120
134
|
var CastAdModel = class extends AdModel {
|
|
121
135
|
type = "cast";
|
|
122
136
|
constructor() {
|
|
123
137
|
super(castAdSchema);
|
|
124
138
|
}
|
|
125
|
-
async verify(data) {
|
|
139
|
+
async verify({ data: { hash } }) {
|
|
140
|
+
if (!this.isValidFormat(hash)) {
|
|
141
|
+
throw new Error("Invalid cast hash: must be a valid farcaster cast hash");
|
|
142
|
+
}
|
|
143
|
+
const errorMessage = "Cast hash verification failed";
|
|
144
|
+
const res = await fetch(`${adlandApiUrl}/verify/cast`, {
|
|
145
|
+
method: "POST",
|
|
146
|
+
headers: {
|
|
147
|
+
"Content-Type": "application/json"
|
|
148
|
+
},
|
|
149
|
+
body: JSON.stringify({ hash })
|
|
150
|
+
}).then((res2) => res2.json()).catch((err) => {
|
|
151
|
+
throw new Error(errorMessage);
|
|
152
|
+
});
|
|
153
|
+
console.log("res", res);
|
|
154
|
+
if (!res.verified) {
|
|
155
|
+
throw new Error(errorMessage);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46
|
|
160
|
+
* @param hash
|
|
161
|
+
* @returns
|
|
162
|
+
*/
|
|
163
|
+
isValidFormat(hash) {
|
|
164
|
+
return /^0x[0-9a-fA-F]{40}$/.test(hash);
|
|
126
165
|
}
|
|
127
166
|
};
|
|
128
167
|
|
|
@@ -133,6 +172,16 @@ var MiniAppAdModel = class extends AdModel {
|
|
|
133
172
|
super(miniappAdSchema);
|
|
134
173
|
}
|
|
135
174
|
async verify(data) {
|
|
175
|
+
const errorMessage = "Miniapp domain verification failed";
|
|
176
|
+
const res = await fetch(`${adlandApiUrl}/verify/miniapp`, {
|
|
177
|
+
method: "POST",
|
|
178
|
+
body: JSON.stringify({ domain: data.data.url.split("//")[1] })
|
|
179
|
+
}).then((res2) => res2.json()).catch((err) => {
|
|
180
|
+
throw new Error(errorMessage);
|
|
181
|
+
});
|
|
182
|
+
if (!res.verified) {
|
|
183
|
+
throw new Error(errorMessage);
|
|
184
|
+
}
|
|
136
185
|
}
|
|
137
186
|
};
|
|
138
187
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/index.ts","../src/types/models.ts","../src/models/AdModel.ts","../src/models/LinkAdModel.ts","../src/models/CastAdModel.ts","../src/models/MiniAppAdModel.ts","../src/models/index.ts","../src/types/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Link ad data schema - basic link\n */\nconst linkAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Cast ad data schema - link to a Farcaster cast\n */\nconst castAdDataSchema = z.object({\n hash: z.string().nonoptional(\"Hash is required\"),\n});\n\n/**\n * MiniApp ad data schema - link to a Farcaster mini app\n */\nconst miniappAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Link ad schema - basic link\n */\nexport const linkAdSchema = z.object({\n type: z.literal(\"link\"),\n data: linkAdDataSchema,\n});\n\n/**\n * Cast ad schema - link to a Farcaster cast\n */\nexport const castAdSchema = z.object({\n type: z.literal(\"cast\"),\n data: castAdDataSchema,\n});\n\n/**\n * MiniApp ad schema - link to a Farcaster mini app\n */\nexport const miniappAdSchema = z.object({\n type: z.literal(\"miniapp\"),\n data: miniappAdDataSchema,\n});\n\n/**\n * Union schema for all ad types\n */\nexport const adDataSchema = z.discriminatedUnion(\"type\", [\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n]);\n\n/**\n * All ad schemas as an object\n */\nexport const adSchemas = {\n link: linkAdSchema,\n cast: castAdSchema,\n miniapp: miniappAdSchema,\n} as const;\n\n/**\n * Get schema for a specific ad type\n */\nexport function getAdSchema(type: keyof typeof adSchemas) {\n return adSchemas[type];\n}\n\n/**\n * Get all ad schemas\n */\nexport function getAllAdSchemas() {\n return adSchemas;\n}\n\n/**\n * Validate ad data\n */\nexport function validateAdData(data: unknown): {\n success: boolean;\n data?: z.infer<typeof adDataSchema>;\n error?: z.ZodError;\n} {\n const result = adDataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n","import { z } from \"zod\";\n\n/**\n * Base class for data models with schema validation and verification\n */\nexport abstract class DataModel<S extends z.ZodTypeAny> {\n readonly schema: S;\n\n constructor(schema: S) {\n this.schema = schema;\n }\n\n /**\n * Validate input against Zod schema\n */\n async validate(input: unknown): Promise<z.infer<S>> {\n return this.schema.parseAsync(input);\n }\n\n /**\n * Custom async checks (override in subclasses)\n * Throw an error if verification fails\n */\n async verify(_data: z.infer<S>): Promise<void> {\n // default: no extra checks\n }\n\n /**\n * Full pipeline: validate → verify\n */\n async prepare(input: unknown): Promise<z.infer<S>> {\n const parsed = await this.validate(input);\n await this.verify(parsed);\n return parsed;\n }\n\n /**\n * Safe validation that returns result instead of throwing\n */\n async safeValidate(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: z.ZodError;\n }> {\n const result = await this.schema.safeParseAsync(input);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Safe prepare that returns result instead of throwing\n */\n async safePrepare(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: string | z.ZodError;\n }> {\n const validation = await this.safeValidate(input);\n if (!validation.success) {\n return validation;\n }\n\n try {\n await this.verify(validation.data!);\n return { success: true, data: validation.data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n}\n","import { z } from \"zod\";\nimport { DataModel } from \"../types/models\";\nimport type { LinkAd, CastAd, MiniAppAd, AdData } from \"../types\";\n\n/**\n * Base ad model class\n */\nexport abstract class AdModel<\n T extends LinkAd | CastAd | MiniAppAd,\n> extends DataModel<z.ZodType<T, any, any>> {\n abstract readonly type: T[\"type\"];\n}\n","import { AdModel } from \"./AdModel\";\nimport { linkAdSchema } from \"../schemas\";\nimport type { LinkAd } from \"../types\";\n\n/**\n * Link Ad Model\n */\nexport class LinkAdModel extends AdModel<LinkAd> {\n readonly type = \"link\" as const;\n\n constructor() {\n super(linkAdSchema);\n }\n\n async verify(data: LinkAd): Promise<void> {\n // Override to add custom verification\n // Example: check if URL is accessible\n // const response = await fetch(data.data.url, { method: \"HEAD\" });\n // if (!response.ok) throw new Error(\"URL is not accessible\");\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { castAdSchema } from \"../schemas\";\nimport type { CastAd } from \"../types\";\n\n/**\n * Cast Ad Model\n */\nexport class CastAdModel extends AdModel<CastAd> {\n readonly type = \"cast\" as const;\n\n constructor() {\n super(castAdSchema);\n }\n\n async verify(data: CastAd): Promise<void> {\n // Override to add custom verification\n // Example: verify it's a valid Warpcast URL\n // if (!data.data.url.includes(\"warpcast.com\")) {\n // throw new Error(\"Must be a valid Farcaster cast URL\");\n // }\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { miniappAdSchema } from \"../schemas\";\nimport type { MiniAppAd } from \"../types\";\n\n/**\n * MiniApp Ad Model\n */\nexport class MiniAppAdModel extends AdModel<MiniAppAd> {\n readonly type = \"miniapp\" as const;\n\n constructor() {\n super(miniappAdSchema);\n }\n\n async verify(data: MiniAppAd): Promise<void> {\n // Override to add custom verification\n // Example: verify URL is actually a miniapp\n // const response = await fetch(data.data.url);\n // const html = await response.text();\n // if (!html.includes('property=\"fc:frame\"')) {\n // throw new Error(\"URL does not contain Farcaster frame metadata\");\n // }\n }\n}\n","import { LinkAdModel } from \"./LinkAdModel\";\nimport { CastAdModel } from \"./CastAdModel\";\nimport { MiniAppAdModel } from \"./MiniAppAdModel\";\n\n/**\n * Registry of all ad models\n */\nexport const adModels = {\n link: new LinkAdModel(),\n cast: new CastAdModel(),\n miniapp: new MiniAppAdModel(),\n} as const;\n\n/**\n * Get ad model for a specific type\n */\nexport function getAdModel<T extends \"link\" | \"cast\" | \"miniapp\">(\n type: T,\n): T extends \"link\"\n ? LinkAdModel\n : T extends \"cast\"\n ? CastAdModel\n : T extends \"miniapp\"\n ? MiniAppAdModel\n : never {\n return adModels[type] as any;\n}\n\nexport { DataModel } from \"../types/models\";\nexport { AdModel } from \"./AdModel\";\nexport { LinkAdModel } from \"./LinkAdModel\";\nexport { CastAdModel } from \"./CastAdModel\";\nexport { MiniAppAdModel } from \"./MiniAppAdModel\";\n","import { z } from \"zod\";\nimport {\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n adDataSchema,\n} from \"../schemas\";\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Base ad type\n */\nexport type AdType = (typeof adTypes)[number];\n\n/**\n * Link ad type - basic link\n */\nexport type LinkAd = z.infer<typeof linkAdSchema>;\n\n/**\n * Cast ad type - link to a Farcaster cast\n */\nexport type CastAd = z.infer<typeof castAdSchema>;\n\n/**\n * MiniApp ad type - link to a Farcaster mini app\n */\nexport type MiniAppAd = z.infer<typeof miniappAdSchema>;\n\n/**\n * Union type of all ad types\n */\nexport type AdData = z.infer<typeof adDataSchema>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas/index.ts","../src/types/models.ts","../src/models/AdModel.ts","../src/models/LinkAdModel.ts","../src/constants.ts","../src/models/CastAdModel.ts","../src/models/MiniAppAdModel.ts","../src/models/index.ts","../src/types/index.ts"],"names":["res"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Link ad data schema - basic link\n */\nconst linkAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Cast ad data schema - link to a Farcaster cast\n */\nconst castAdDataSchema = z.object({\n hash: z.string().nonoptional(\"Hash is required\"),\n});\n\n/**\n * MiniApp ad data schema - link to a Farcaster mini app\n */\nconst miniappAdDataSchema = z.object({\n url: z.string().nonoptional(\"URL is required\"),\n});\n\n/**\n * Link ad schema - basic link\n */\nexport const linkAdSchema = z.object({\n type: z.literal(\"link\"),\n data: linkAdDataSchema,\n});\n\n/**\n * Cast ad schema - link to a Farcaster cast\n */\nexport const castAdSchema = z.object({\n type: z.literal(\"cast\"),\n data: castAdDataSchema,\n});\n\n/**\n * MiniApp ad schema - link to a Farcaster mini app\n */\nexport const miniappAdSchema = z.object({\n type: z.literal(\"miniapp\"),\n data: miniappAdDataSchema,\n});\n\n/**\n * Union schema for all ad types\n */\nexport const adDataSchema = z.discriminatedUnion(\"type\", [\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n]);\n\n/**\n * All ad schemas as an object\n */\nexport const adSchemas = {\n link: linkAdSchema,\n cast: castAdSchema,\n miniapp: miniappAdSchema,\n} as const;\n\n/**\n * Get schema for a specific ad type\n */\nexport function getAdSchema(type: keyof typeof adSchemas) {\n return adSchemas[type];\n}\n\n/**\n * Get all ad schemas\n */\nexport function getAllAdSchemas() {\n return adSchemas;\n}\n\n/**\n * Validate ad data\n */\nexport function validateAdData(data: unknown): {\n success: boolean;\n data?: z.infer<typeof adDataSchema>;\n error?: z.ZodError;\n} {\n const result = adDataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n","import { z } from \"zod\";\n\n/**\n * Base class for data models with schema validation and verification\n */\nexport abstract class DataModel<S extends z.ZodTypeAny> {\n readonly schema: S;\n\n constructor(schema: S) {\n this.schema = schema;\n }\n\n /**\n * Validate input against Zod schema\n */\n async validate(input: unknown): Promise<z.infer<S>> {\n return this.schema.parseAsync(input);\n }\n\n /**\n * Custom async checks (override in subclasses)\n * Throw an error if verification fails\n */\n async verify(_data: z.infer<S>): Promise<void> {\n // default: no extra checks\n }\n\n /**\n * Full pipeline: validate → verify\n */\n async prepare(input: unknown): Promise<z.infer<S>> {\n const parsed = await this.validate(input);\n try {\n await this.verify(parsed);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(error.message);\n }\n throw new Error(`Verification failed for ${this.schema.description}`);\n }\n return parsed;\n }\n\n /**\n * Safe validation that returns result instead of throwing\n */\n async safeValidate(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: z.ZodError;\n }> {\n const result = await this.schema.safeParseAsync(input);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n }\n\n /**\n * Safe prepare that returns result instead of throwing\n */\n async safePrepare(input: unknown): Promise<{\n success: boolean;\n data?: z.infer<S>;\n error?: string | z.ZodError;\n }> {\n const validation = await this.safeValidate(input);\n if (!validation.success) {\n return validation;\n }\n\n try {\n await this.verify(validation.data!);\n return { success: true, data: validation.data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n}\n","import { z } from \"zod\";\nimport { DataModel } from \"../types/models\";\nimport type { LinkAd, CastAd, MiniAppAd } from \"../types\";\n\n/**\n * Base ad model class\n */\nexport abstract class AdModel<\n T extends LinkAd | CastAd | MiniAppAd,\n> extends DataModel<z.ZodType<T, any, any>> {\n abstract readonly type: T[\"type\"];\n}\n","import { AdModel } from \"./AdModel\";\nimport { linkAdSchema } from \"../schemas\";\nimport type { LinkAd } from \"../types\";\n\n/**\n * Link Ad Model\n */\nexport class LinkAdModel extends AdModel<LinkAd> {\n readonly type = \"link\" as const;\n\n constructor() {\n super(linkAdSchema);\n }\n\n async verify(data: LinkAd): Promise<void> {\n const errorMessage = \"Invalid link\";\n if (!data.data.url.startsWith(\"http\")) {\n throw new Error(errorMessage);\n }\n }\n}\n","export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.adland.space\";\n","import { AdModel } from \"./AdModel\";\nimport { castAdSchema } from \"../schemas\";\nimport type { CastAd } from \"../types\";\nimport { adlandApiUrl } from \"../constants\";\n\n/**\n * Cast Ad Model\n */\nexport class CastAdModel extends AdModel<CastAd> {\n readonly type = \"cast\" as const;\n\n constructor() {\n super(castAdSchema);\n }\n\n async verify({ data: { hash } }: CastAd): Promise<void> {\n if (!this.isValidFormat(hash)) {\n throw new Error(\"Invalid cast hash: must be a valid farcaster cast hash\");\n }\n\n const errorMessage = \"Cast hash verification failed\";\n\n const res = (await fetch(`${adlandApiUrl}/verify/cast`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ hash }),\n })\n .then((res) => res.json())\n .catch((err) => {\n throw new Error(errorMessage);\n })) as { verified: boolean };\n\n console.log(\"res\", res);\n\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Example: 0x9610d4a81c793ed6b8f4c44497f9b5f86f052f46\n * @param hash\n * @returns\n */\n private isValidFormat(hash: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(hash);\n }\n}\n","import { AdModel } from \"./AdModel\";\nimport { miniappAdSchema } from \"../schemas\";\nimport type { MiniAppAd } from \"../types\";\nimport { adlandApiUrl } from \"../constants\";\n\n/**\n * MiniApp Ad Model\n */\nexport class MiniAppAdModel extends AdModel<MiniAppAd> {\n readonly type = \"miniapp\" as const;\n\n constructor() {\n super(miniappAdSchema);\n }\n\n async verify(data: MiniAppAd): Promise<void> {\n const errorMessage = \"Miniapp domain verification failed\";\n const res = (await fetch(`${adlandApiUrl}/verify/miniapp`, {\n method: \"POST\",\n body: JSON.stringify({ domain: data.data.url.split(\"//\")[1] }),\n })\n .then((res) => res.json())\n .catch((err) => {\n throw new Error(errorMessage);\n })) as { verified: boolean };\n\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n }\n}\n","import { LinkAdModel } from \"./LinkAdModel\";\nimport { CastAdModel } from \"./CastAdModel\";\nimport { MiniAppAdModel } from \"./MiniAppAdModel\";\n\n/**\n * Registry of all ad models\n */\nexport const adModels = {\n link: new LinkAdModel(),\n cast: new CastAdModel(),\n miniapp: new MiniAppAdModel(),\n} as const;\n\n/**\n * Get ad model for a specific type\n */\nexport function getAdModel<T extends \"link\" | \"cast\" | \"miniapp\">(\n type: T,\n): T extends \"link\"\n ? LinkAdModel\n : T extends \"cast\"\n ? CastAdModel\n : T extends \"miniapp\"\n ? MiniAppAdModel\n : never {\n return adModels[type] as any;\n}\n\nexport { DataModel } from \"../types/models\";\nexport { AdModel } from \"./AdModel\";\nexport { LinkAdModel } from \"./LinkAdModel\";\nexport { CastAdModel } from \"./CastAdModel\";\nexport { MiniAppAdModel } from \"./MiniAppAdModel\";\n","import { z } from \"zod\";\nimport {\n linkAdSchema,\n castAdSchema,\n miniappAdSchema,\n adDataSchema,\n} from \"../schemas\";\n\nexport const adTypes = [\"link\", \"cast\", \"miniapp\"] as const;\n\n/**\n * Base ad type\n */\nexport type AdType = (typeof adTypes)[number];\n\n/**\n * Link ad type - basic link\n */\nexport type LinkAd = z.infer<typeof linkAdSchema>;\n\n/**\n * Cast ad type - link to a Farcaster cast\n */\nexport type CastAd = z.infer<typeof castAdSchema>;\n\n/**\n * MiniApp ad type - link to a Farcaster mini app\n */\nexport type MiniAppAd = z.infer<typeof miniappAdSchema>;\n\n/**\n * Union type of all ad types\n */\nexport type AdData = z.infer<typeof adDataSchema>;\n"]}
|