@adland/data 0.5.0 → 0.6.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 +7 -0
- package/dist/index.cjs +153 -177
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +603 -192
- package/dist/index.d.ts +603 -192
- package/dist/index.js +145 -165
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,105 +1,44 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
-
// src/
|
|
4
|
-
var linkAdDataSchema = z.object({
|
|
5
|
-
url: z.string().nonoptional("URL is required")
|
|
6
|
-
});
|
|
7
|
-
var castAdDataSchema = z.object({
|
|
8
|
-
hash: z.string().nonoptional("Hash is required")
|
|
9
|
-
});
|
|
10
|
-
var miniappAdDataSchema = z.object({
|
|
11
|
-
url: z.string().nonoptional("URL is required")
|
|
12
|
-
});
|
|
13
|
-
var linkAdSchema = z.object({
|
|
14
|
-
type: z.literal("link"),
|
|
15
|
-
data: linkAdDataSchema
|
|
16
|
-
});
|
|
17
|
-
var castAdSchema = z.object({
|
|
18
|
-
type: z.literal("cast"),
|
|
19
|
-
data: castAdDataSchema
|
|
20
|
-
});
|
|
21
|
-
var miniappAdSchema = z.object({
|
|
22
|
-
type: z.literal("miniapp"),
|
|
23
|
-
data: miniappAdDataSchema
|
|
24
|
-
});
|
|
25
|
-
var adDataSchema = z.discriminatedUnion("type", [
|
|
26
|
-
linkAdSchema,
|
|
27
|
-
castAdSchema,
|
|
28
|
-
miniappAdSchema
|
|
29
|
-
]);
|
|
30
|
-
var adSchemas = {
|
|
31
|
-
link: linkAdSchema,
|
|
32
|
-
cast: castAdSchema,
|
|
33
|
-
miniapp: miniappAdSchema
|
|
34
|
-
};
|
|
35
|
-
function getAdSchema(type) {
|
|
36
|
-
return adSchemas[type];
|
|
37
|
-
}
|
|
38
|
-
function getAllAdSchemas() {
|
|
39
|
-
return adSchemas;
|
|
40
|
-
}
|
|
41
|
-
function validateAdData(data) {
|
|
42
|
-
const result = adDataSchema.safeParse(data);
|
|
43
|
-
if (result.success) {
|
|
44
|
-
return { success: true, data: result.data };
|
|
45
|
-
}
|
|
46
|
-
return { success: false, error: result.error };
|
|
47
|
-
}
|
|
3
|
+
// src/ads/cast.ts
|
|
48
4
|
|
|
49
|
-
// src/
|
|
50
|
-
var
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
5
|
+
// src/constants.ts
|
|
6
|
+
var adlandApiUrl = process.env.NODE_ENV === "development" ? "http://localhost:3069" : "https://api.adland.space";
|
|
7
|
+
|
|
8
|
+
// src/core/ad-definition.ts
|
|
9
|
+
function defineAd(def) {
|
|
10
|
+
return {
|
|
11
|
+
...def,
|
|
12
|
+
process: (input) => processAd(def, input),
|
|
13
|
+
safeProcess: (input) => safeProcessAd(def, input)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async function processAd(ad, input) {
|
|
17
|
+
{
|
|
18
|
+
console.log("processAd:input", input);
|
|
60
19
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*/
|
|
65
|
-
async verify(_data) {
|
|
20
|
+
const data = ad.data.parse(input);
|
|
21
|
+
{
|
|
22
|
+
console.log("processAd:data", data);
|
|
66
23
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
*/
|
|
70
|
-
async prepare(input) {
|
|
71
|
-
const parsed = await this.validate(input);
|
|
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
|
-
}
|
|
80
|
-
return parsed;
|
|
24
|
+
if (ad.verify) {
|
|
25
|
+
await ad.verify(input);
|
|
81
26
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
27
|
+
const metadata = ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : void 0;
|
|
28
|
+
return { data, metadata };
|
|
29
|
+
}
|
|
30
|
+
async function safeProcessAd(ad, input) {
|
|
31
|
+
const parseResult = ad.data.safeParse(input);
|
|
32
|
+
if (!parseResult.success) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: parseResult.error
|
|
36
|
+
};
|
|
91
37
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
*/
|
|
95
|
-
async safePrepare(input) {
|
|
96
|
-
const validation = await this.safeValidate(input);
|
|
97
|
-
if (!validation.success) {
|
|
98
|
-
return validation;
|
|
99
|
-
}
|
|
38
|
+
const data = parseResult.data;
|
|
39
|
+
if (ad.verify) {
|
|
100
40
|
try {
|
|
101
|
-
await
|
|
102
|
-
return { success: true, data: validation.data };
|
|
41
|
+
await ad.verify(data);
|
|
103
42
|
} catch (error) {
|
|
104
43
|
return {
|
|
105
44
|
success: false,
|
|
@@ -107,97 +46,138 @@ var DataModel = class {
|
|
|
107
46
|
};
|
|
108
47
|
}
|
|
109
48
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
49
|
+
const metadata = ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : void 0;
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
data,
|
|
53
|
+
metadata
|
|
54
|
+
};
|
|
55
|
+
}
|
|
115
56
|
|
|
116
|
-
// src/
|
|
117
|
-
var
|
|
118
|
-
type = "link";
|
|
57
|
+
// src/services/adland.api.ts
|
|
58
|
+
var AdlandAPI = class {
|
|
119
59
|
constructor() {
|
|
120
|
-
super(linkAdSchema);
|
|
121
60
|
}
|
|
122
|
-
async
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
61
|
+
async verifyCast({ hash }) {
|
|
62
|
+
return this.post(`${adlandApiUrl}/verify/cast`, {
|
|
63
|
+
hash
|
|
64
|
+
});
|
|
127
65
|
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
// src/models/CastAdModel.ts
|
|
134
|
-
var CastAdModel = class extends AdModel {
|
|
135
|
-
type = "cast";
|
|
136
|
-
constructor() {
|
|
137
|
-
super(castAdSchema);
|
|
66
|
+
async verifyMiniapp({ domain }) {
|
|
67
|
+
return this.post(`${adlandApiUrl}/verify/miniapp`, {
|
|
68
|
+
domain
|
|
69
|
+
});
|
|
138
70
|
}
|
|
139
|
-
async
|
|
140
|
-
|
|
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`, {
|
|
71
|
+
async post(url, body) {
|
|
72
|
+
return fetch(url, {
|
|
145
73
|
method: "POST",
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
}
|
|
74
|
+
body: JSON.stringify(body)
|
|
75
|
+
}).then((res) => res.json());
|
|
157
76
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
* @param hash
|
|
161
|
-
* @returns
|
|
162
|
-
*/
|
|
163
|
-
isValidFormat(hash) {
|
|
164
|
-
return /^0x[0-9a-fA-F]{40}$/.test(hash);
|
|
77
|
+
async get(url) {
|
|
78
|
+
return fetch(url).then((res) => res.json());
|
|
165
79
|
}
|
|
166
80
|
};
|
|
81
|
+
var adlandAPI = new AdlandAPI();
|
|
167
82
|
|
|
168
|
-
// src/
|
|
169
|
-
var
|
|
170
|
-
type
|
|
171
|
-
|
|
172
|
-
|
|
83
|
+
// src/ads/cast.ts
|
|
84
|
+
var castAd = defineAd({
|
|
85
|
+
type: "cast",
|
|
86
|
+
data: z.object({
|
|
87
|
+
hash: z.string().nonempty("Hash is required")
|
|
88
|
+
}),
|
|
89
|
+
metadata: z.object({
|
|
90
|
+
username: z.string().optional(),
|
|
91
|
+
text: z.string().optional(),
|
|
92
|
+
timestamp: z.number().optional()
|
|
93
|
+
}),
|
|
94
|
+
async verify({ hash }) {
|
|
95
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {
|
|
96
|
+
throw new Error("Invalid Farcaster cast hash");
|
|
97
|
+
}
|
|
98
|
+
const res = await adlandAPI.verifyCast({ hash });
|
|
99
|
+
if (!res.verified) {
|
|
100
|
+
throw new Error("Cast hash verification failed");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
var linkAd = defineAd({
|
|
105
|
+
type: "link",
|
|
106
|
+
data: z.object({
|
|
107
|
+
url: z.string().nonempty("URL is required")
|
|
108
|
+
}),
|
|
109
|
+
metadata: z.object({
|
|
110
|
+
title: z.string().optional(),
|
|
111
|
+
description: z.string().optional(),
|
|
112
|
+
image: z.string().optional()
|
|
113
|
+
}),
|
|
114
|
+
async verify({ url }) {
|
|
115
|
+
if (!url.startsWith("http")) {
|
|
116
|
+
throw new Error("Invalid link");
|
|
117
|
+
}
|
|
173
118
|
}
|
|
174
|
-
|
|
119
|
+
});
|
|
120
|
+
var miniappAd = defineAd({
|
|
121
|
+
type: "miniapp",
|
|
122
|
+
data: z.object({
|
|
123
|
+
url: z.string().nonempty("URL is required")
|
|
124
|
+
}),
|
|
125
|
+
metadata: z.object({
|
|
126
|
+
icon: z.string().optional(),
|
|
127
|
+
title: z.string().optional()
|
|
128
|
+
}),
|
|
129
|
+
async verify({ url }) {
|
|
175
130
|
const errorMessage = "Miniapp domain verification failed";
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}).then((res2) => res2.json()).catch((err) => {
|
|
131
|
+
const domain = url.split("//")[1];
|
|
132
|
+
console.log("verifyMiniapp:domain", domain);
|
|
133
|
+
if (!domain) {
|
|
180
134
|
throw new Error(errorMessage);
|
|
181
|
-
}
|
|
135
|
+
}
|
|
136
|
+
const res = await adlandAPI.verifyMiniapp({ domain });
|
|
137
|
+
console.log("verifyMiniapp:res", res);
|
|
182
138
|
if (!res.verified) {
|
|
183
139
|
throw new Error(errorMessage);
|
|
184
140
|
}
|
|
185
141
|
}
|
|
186
|
-
};
|
|
142
|
+
});
|
|
187
143
|
|
|
188
|
-
// src/
|
|
189
|
-
var
|
|
190
|
-
link:
|
|
191
|
-
cast:
|
|
192
|
-
miniapp:
|
|
144
|
+
// src/index.ts
|
|
145
|
+
var ads = {
|
|
146
|
+
link: linkAd,
|
|
147
|
+
cast: castAd,
|
|
148
|
+
miniapp: miniappAd
|
|
193
149
|
};
|
|
194
|
-
function getAdModel(type) {
|
|
195
|
-
return adModels[type];
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// src/types/index.ts
|
|
199
150
|
var adTypes = ["link", "cast", "miniapp"];
|
|
151
|
+
function getAd(type) {
|
|
152
|
+
return ads[type];
|
|
153
|
+
}
|
|
154
|
+
function validateAdData(data) {
|
|
155
|
+
const dataType = data.type;
|
|
156
|
+
if (!dataType || !adTypes.includes(dataType)) {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
error: "Data does not match any known ad type"
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const ad = getAd(data.type);
|
|
163
|
+
const result = ad.data.safeParse(data.data);
|
|
164
|
+
if (!result.success) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
error: result.error
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
success: true,
|
|
172
|
+
data: {
|
|
173
|
+
type: dataType,
|
|
174
|
+
data: result.data
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
var adDefinitions = ads;
|
|
179
|
+
var adModels = ads;
|
|
200
180
|
|
|
201
|
-
export {
|
|
181
|
+
export { adDefinitions, adModels, adTypes, ads, castAd, defineAd, getAd, linkAd, miniappAd, processAd, safeProcessAd, validateAdData };
|
|
202
182
|
//# sourceMappingURL=index.js.map
|
|
203
183
|
//# sourceMappingURL=index.js.map
|
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/constants.ts","../src/models/CastAdModel.ts","../src/models/MiniAppAdModel.ts","../src/models/index.ts","../src/types/index.ts"],"names":["res"],"mappings":";;;AAKA,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,YAAY,iBAAiB;AAC/C,CAAC,CAAA;AAKD,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,YAAY,kBAAkB;AACjD,CAAC,CAAA;AAKD,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EACnC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,YAAY,iBAAiB;AAC/C,CAAC,CAAA;AAKM,IAAM,YAAA,GAAe,EAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM;AACR,CAAC;AAKM,IAAM,YAAA,GAAe,EAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM;AACR,CAAC;AAKM,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAM;AACR,CAAC;AAKM,IAAM,YAAA,GAAe,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACvD,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,SAAA,GAAY;AAAA,EACvB,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS;AACX;AAKO,SAAS,YAAY,IAAA,EAA8B;AACxD,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAKO,SAAS,eAAA,GAAkB;AAChC,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,eAAe,IAAA,EAI7B;AACA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,CAAU,IAAI,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAC/C;;;ACvFO,IAAe,YAAf,MAAiD;AAAA,EAC7C,MAAA;AAAA,EAET,YAAY,MAAA,EAAW;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAAqC;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,KAAA,EAAkC;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,KAAA,EAAqC;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAAA,MAC/B;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAIhB;AACD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,KAAK,CAAA;AACrD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC5C;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAA,EAIf;AACD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAK,CAAA;AAClC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,WAAW,IAAA,EAAK;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AACF;;;AC1EO,IAAe,OAAA,GAAf,cAEG,SAAA,CAAkC;AAE5C;;;ACJO,IAAM,WAAA,GAAN,cAA0B,OAAA,CAAgB;AAAA,EACtC,IAAA,GAAO,MAAA;AAAA,EAEhB,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,YAAY,CAAA;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,IAAA,EAA6B;AACxC,IAAA,MAAM,YAAA,GAAe,cAAA;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AACF;;;ACpBO,IAAM,YAAA,GACX,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,gBACrB,uBAAA,GACA,0BAAA;;;ACKC,IAAM,WAAA,GAAN,cAA0B,OAAA,CAAgB;AAAA,EACtC,IAAA,GAAO,MAAA;AAAA,EAEhB,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,YAAY,CAAA;AAAA,EACpB;AAAA,EAEA,MAAM,MAAA,CAAO,EAAE,MAAM,EAAE,IAAA,IAAO,EAA0B;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,YAAA,GAAe,+BAAA;AAErB,IAAA,MAAM,GAAA,GAAO,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,YAAA,CAAA,EAAgB;AAAA,MACtD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,KAC9B,CAAA,CACE,IAAA,CAAK,CAACA,IAAAA,KAAQA,IAAAA,CAAI,IAAA,EAAM,CAAA,CACxB,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B,CAAC,CAAA;AAEH,IAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,CAAA;AAEtB,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAc,IAAA,EAAuB;AAC3C,IAAA,OAAO,qBAAA,CAAsB,KAAK,IAAI,CAAA;AAAA,EACxC;AACF;;;ACzCO,IAAM,cAAA,GAAN,cAA6B,OAAA,CAAmB;AAAA,EAC5C,IAAA,GAAO,SAAA;AAAA,EAEhB,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,eAAe,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,YAAA,GAAe,oCAAA;AACrB,IAAA,MAAM,GAAA,GAAO,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,eAAA,CAAA,EAAmB;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,GAAG;AAAA,KAC9D,CAAA,CACE,IAAA,CAAK,CAACA,IAAAA,KAAQA,IAAAA,CAAI,IAAA,EAAM,CAAA,CACxB,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B,CAAC,CAAA;AAEH,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AACF;;;ACvBO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAA,EAAM,IAAI,WAAA,EAAY;AAAA,EACtB,IAAA,EAAM,IAAI,WAAA,EAAY;AAAA,EACtB,OAAA,EAAS,IAAI,cAAA;AACf;AAKO,SAAS,WACd,IAAA,EAOY;AACZ,EAAA,OAAO,SAAS,IAAI,CAAA;AACtB;;;AClBO,IAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS","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"]}
|
|
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\";\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"]}
|