@crawl-me-maybe/schema 0.2.0 → 0.2.1
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/dist/index.js +330 -1
- package/dist/index.js.map +10 -4
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -1,3 +1,265 @@
|
|
|
1
|
+
// src/builders/fragments.ts
|
|
2
|
+
function normalizeId(name) {
|
|
3
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
4
|
+
}
|
|
5
|
+
function createSchemaId({
|
|
6
|
+
kind,
|
|
7
|
+
name,
|
|
8
|
+
baseUrl = "",
|
|
9
|
+
explicitId
|
|
10
|
+
}) {
|
|
11
|
+
if (explicitId) {
|
|
12
|
+
return explicitId.startsWith("http") ? explicitId : `${baseUrl}${explicitId}`;
|
|
13
|
+
}
|
|
14
|
+
return `${baseUrl}#${kind}-${normalizeId(name)}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/identity-ref.ts
|
|
18
|
+
var IDENTITY_REF_ID = "@identity";
|
|
19
|
+
var identityRef = { "@id": IDENTITY_REF_ID };
|
|
20
|
+
|
|
21
|
+
// src/utils/image.ts
|
|
22
|
+
function buildImageObject(input) {
|
|
23
|
+
if (!input) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (typeof input === "string") {
|
|
27
|
+
return {
|
|
28
|
+
"@type": "ImageObject",
|
|
29
|
+
url: input,
|
|
30
|
+
contentUrl: input
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const { url, ...rest } = input;
|
|
34
|
+
return {
|
|
35
|
+
"@type": "ImageObject",
|
|
36
|
+
url,
|
|
37
|
+
contentUrl: url,
|
|
38
|
+
...rest
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/build.ts
|
|
43
|
+
var TYPE_PRIORITY = [
|
|
44
|
+
"Organization",
|
|
45
|
+
"Person",
|
|
46
|
+
"LocalBusiness",
|
|
47
|
+
"WebSite",
|
|
48
|
+
"WebPage",
|
|
49
|
+
"ProfilePage",
|
|
50
|
+
"QAPage",
|
|
51
|
+
"BreadcrumbList",
|
|
52
|
+
"Article",
|
|
53
|
+
"Course",
|
|
54
|
+
"Dataset",
|
|
55
|
+
"DiscussionForumPosting",
|
|
56
|
+
"JobPosting",
|
|
57
|
+
"Movie",
|
|
58
|
+
"Product",
|
|
59
|
+
"Recipe",
|
|
60
|
+
"SoftwareApplication",
|
|
61
|
+
"VacationRental",
|
|
62
|
+
"VideoObject",
|
|
63
|
+
"Event",
|
|
64
|
+
"ItemList",
|
|
65
|
+
"Question",
|
|
66
|
+
"Answer",
|
|
67
|
+
"Review",
|
|
68
|
+
"Comment",
|
|
69
|
+
"AggregateRating"
|
|
70
|
+
];
|
|
71
|
+
var typeWeight = new Map(TYPE_PRIORITY.map((type, index) => [type, index]));
|
|
72
|
+
var hasObjectShape = (value) => {
|
|
73
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
74
|
+
};
|
|
75
|
+
var hasType = (value) => {
|
|
76
|
+
return typeof value["@type"] === "string";
|
|
77
|
+
};
|
|
78
|
+
var hasId = (value) => {
|
|
79
|
+
return typeof value["@id"] === "string" && value["@id"].length > 0;
|
|
80
|
+
};
|
|
81
|
+
var isEmptyValue = (value) => {
|
|
82
|
+
if (value === null || value === undefined)
|
|
83
|
+
return true;
|
|
84
|
+
if (typeof value === "string")
|
|
85
|
+
return value.trim().length === 0;
|
|
86
|
+
if (Array.isArray(value))
|
|
87
|
+
return value.length === 0;
|
|
88
|
+
if (hasObjectShape(value)) {
|
|
89
|
+
return Object.keys(value).every((key) => key === "@type" || key === "@context");
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
};
|
|
93
|
+
var ensureContext = (node) => {
|
|
94
|
+
if (hasType(node) && node["@context"] === undefined) {
|
|
95
|
+
return {
|
|
96
|
+
"@context": "https://schema.org",
|
|
97
|
+
...node
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return node;
|
|
101
|
+
};
|
|
102
|
+
var assembleNodes = (nodes, identityId) => {
|
|
103
|
+
const collected = [];
|
|
104
|
+
const seenIds = new Set;
|
|
105
|
+
const processingIds = new Set;
|
|
106
|
+
let orderCounter = 0;
|
|
107
|
+
const addNode = (node) => {
|
|
108
|
+
const normalized = ensureContext(node);
|
|
109
|
+
if (hasId(normalized)) {
|
|
110
|
+
if (seenIds.has(normalized["@id"]))
|
|
111
|
+
return;
|
|
112
|
+
seenIds.add(normalized["@id"]);
|
|
113
|
+
}
|
|
114
|
+
collected.push({
|
|
115
|
+
node: normalized,
|
|
116
|
+
order: orderCounter++
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
const processValue = (value, isRoot = false) => {
|
|
120
|
+
if (Array.isArray(value)) {
|
|
121
|
+
return value.map((item) => processValue(item, false)).filter((item) => !isEmptyValue(item));
|
|
122
|
+
}
|
|
123
|
+
if (!hasObjectShape(value))
|
|
124
|
+
return value;
|
|
125
|
+
if (value["@id"] === IDENTITY_REF_ID) {
|
|
126
|
+
return { "@id": identityId };
|
|
127
|
+
}
|
|
128
|
+
if (!isRoot && hasType(value) && hasId(value)) {
|
|
129
|
+
registerEntity(value);
|
|
130
|
+
return { "@id": value["@id"] };
|
|
131
|
+
}
|
|
132
|
+
const output = {};
|
|
133
|
+
for (const [key, child] of Object.entries(value)) {
|
|
134
|
+
if (!isRoot && key === "@context")
|
|
135
|
+
continue;
|
|
136
|
+
const processed = processValue(child, false);
|
|
137
|
+
if (isEmptyValue(processed))
|
|
138
|
+
continue;
|
|
139
|
+
output[key] = processed;
|
|
140
|
+
}
|
|
141
|
+
return output;
|
|
142
|
+
};
|
|
143
|
+
const registerEntity = (entity) => {
|
|
144
|
+
const id = entity["@id"];
|
|
145
|
+
if (seenIds.has(id) || processingIds.has(id))
|
|
146
|
+
return;
|
|
147
|
+
processingIds.add(id);
|
|
148
|
+
const processedEntity = processValue(entity, true);
|
|
149
|
+
if (hasObjectShape(processedEntity)) {
|
|
150
|
+
addNode(processedEntity);
|
|
151
|
+
}
|
|
152
|
+
processingIds.delete(id);
|
|
153
|
+
};
|
|
154
|
+
for (const node of nodes) {
|
|
155
|
+
if (!node)
|
|
156
|
+
continue;
|
|
157
|
+
const processed = processValue(node, true);
|
|
158
|
+
if (!hasObjectShape(processed))
|
|
159
|
+
continue;
|
|
160
|
+
addNode(processed);
|
|
161
|
+
}
|
|
162
|
+
const ranked = collected.sort((a, b) => {
|
|
163
|
+
const aType = hasType(a.node) ? a.node["@type"] : "";
|
|
164
|
+
const bType = hasType(b.node) ? b.node["@type"] : "";
|
|
165
|
+
const aWeight = typeWeight.get(aType) ?? Number.MAX_SAFE_INTEGER;
|
|
166
|
+
const bWeight = typeWeight.get(bType) ?? Number.MAX_SAFE_INTEGER;
|
|
167
|
+
if (aWeight !== bWeight)
|
|
168
|
+
return aWeight - bWeight;
|
|
169
|
+
return a.order - b.order;
|
|
170
|
+
});
|
|
171
|
+
return ranked.map(({ node }) => JSON.stringify(node));
|
|
172
|
+
};
|
|
173
|
+
var buildIdentityNodes = (identity, siteUrl, idBase) => {
|
|
174
|
+
switch (identity.type) {
|
|
175
|
+
case "person": {
|
|
176
|
+
const id = createSchemaId({
|
|
177
|
+
kind: "person",
|
|
178
|
+
name: identity.name,
|
|
179
|
+
baseUrl: idBase
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
node: {
|
|
183
|
+
"@type": "Person",
|
|
184
|
+
"@id": id,
|
|
185
|
+
name: identity.name,
|
|
186
|
+
description: identity.description,
|
|
187
|
+
image: buildImageObject(identity.image),
|
|
188
|
+
sameAs: identity.sameAs,
|
|
189
|
+
url: siteUrl
|
|
190
|
+
},
|
|
191
|
+
ref: { "@id": id }
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
case "organization": {
|
|
195
|
+
const id = createSchemaId({
|
|
196
|
+
kind: "organization",
|
|
197
|
+
name: identity.name,
|
|
198
|
+
baseUrl: idBase
|
|
199
|
+
});
|
|
200
|
+
return {
|
|
201
|
+
node: {
|
|
202
|
+
"@type": "Organization",
|
|
203
|
+
"@id": id,
|
|
204
|
+
name: identity.name,
|
|
205
|
+
description: identity.description,
|
|
206
|
+
logo: buildImageObject(identity.logo),
|
|
207
|
+
sameAs: identity.sameAs,
|
|
208
|
+
url: siteUrl
|
|
209
|
+
},
|
|
210
|
+
ref: { "@id": id }
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
case "localBusiness": {
|
|
214
|
+
const id = createSchemaId({
|
|
215
|
+
kind: "local-business",
|
|
216
|
+
name: identity.name,
|
|
217
|
+
baseUrl: idBase
|
|
218
|
+
});
|
|
219
|
+
return {
|
|
220
|
+
node: {
|
|
221
|
+
"@type": "LocalBusiness",
|
|
222
|
+
"@id": id,
|
|
223
|
+
name: identity.name,
|
|
224
|
+
description: identity.description,
|
|
225
|
+
logo: buildImageObject(identity.logo),
|
|
226
|
+
telephone: identity.phone,
|
|
227
|
+
email: identity.email,
|
|
228
|
+
address: identity.address,
|
|
229
|
+
openingHoursSpecification: identity.openingHours,
|
|
230
|
+
sameAs: identity.sameAs,
|
|
231
|
+
url: siteUrl
|
|
232
|
+
},
|
|
233
|
+
ref: { "@id": id }
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
var buildSchemaMarkup = (input) => {
|
|
239
|
+
const idBase = input.siteUrl.replace(/\/+$/, "");
|
|
240
|
+
const { node: identityNode, ref: identityNodeRef } = buildIdentityNodes(input.identity, input.siteUrl, idBase);
|
|
241
|
+
const websiteId = `${idBase}#website`;
|
|
242
|
+
const websiteNode = {
|
|
243
|
+
"@type": "WebSite",
|
|
244
|
+
"@id": websiteId,
|
|
245
|
+
name: input.siteName,
|
|
246
|
+
url: input.siteUrl,
|
|
247
|
+
description: input.siteDescription,
|
|
248
|
+
publisher: identityNodeRef
|
|
249
|
+
};
|
|
250
|
+
const webpageNode = {
|
|
251
|
+
"@type": "WebPage",
|
|
252
|
+
"@id": `${input.pageUrl}#webpage`,
|
|
253
|
+
url: input.pageUrl,
|
|
254
|
+
name: input.pageTitle,
|
|
255
|
+
description: input.pageDescription,
|
|
256
|
+
inLanguage: input.inLanguage,
|
|
257
|
+
isPartOf: { "@id": websiteId },
|
|
258
|
+
breadcrumb: input.breadcrumb,
|
|
259
|
+
mainEntity: input.mainEntity
|
|
260
|
+
};
|
|
261
|
+
return assembleNodes([identityNode, websiteNode, webpageNode], identityNodeRef["@id"]);
|
|
262
|
+
};
|
|
1
263
|
// src/define-builder.ts
|
|
2
264
|
function defineBuilder(type) {
|
|
3
265
|
return (input) => ({
|
|
@@ -188,6 +450,73 @@ var buildWebPage = defineBuilder("WebPage");
|
|
|
188
450
|
|
|
189
451
|
// src/builders/website.ts
|
|
190
452
|
var buildWebSite = defineBuilder("WebSite");
|
|
453
|
+
// src/utils/datetime.ts
|
|
454
|
+
var DATE_DESIGNATORS = [
|
|
455
|
+
["years", "Y"],
|
|
456
|
+
["months", "M"],
|
|
457
|
+
["weeks", "W"],
|
|
458
|
+
["days", "D"]
|
|
459
|
+
];
|
|
460
|
+
var TIME_DESIGNATORS = [
|
|
461
|
+
["hours", "H"],
|
|
462
|
+
["minutes", "M"],
|
|
463
|
+
["seconds", "S"]
|
|
464
|
+
];
|
|
465
|
+
var formatParts = (parts, designators) => designators.map(([key, designator]) => {
|
|
466
|
+
const value = parts[key];
|
|
467
|
+
return value ? `${value}${designator}` : "";
|
|
468
|
+
}).join("");
|
|
469
|
+
function toIsoDuration(parts) {
|
|
470
|
+
for (const [key, value] of Object.entries(parts)) {
|
|
471
|
+
if (value === undefined)
|
|
472
|
+
continue;
|
|
473
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
474
|
+
throw new Error(`toIsoDuration: "${key}" must be a non-negative finite number, got ${value}`);
|
|
475
|
+
}
|
|
476
|
+
if (key !== "seconds" && !Number.isInteger(value)) {
|
|
477
|
+
throw new Error(`toIsoDuration: only "seconds" may be fractional, got ${key}: ${value}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (parts.weeks && Object.entries(parts).some(([key, value]) => key !== "weeks" && value)) {
|
|
481
|
+
throw new Error('toIsoDuration: "weeks" cannot be combined with other parts');
|
|
482
|
+
}
|
|
483
|
+
const datePart = formatParts(parts, DATE_DESIGNATORS);
|
|
484
|
+
const timePart = formatParts(parts, TIME_DESIGNATORS);
|
|
485
|
+
if (!datePart && !timePart)
|
|
486
|
+
return "PT0S";
|
|
487
|
+
return `P${datePart}${timePart ? `T${timePart}` : ""}`;
|
|
488
|
+
}
|
|
489
|
+
var ISO_DATE_PATTERN = /^(\d{4}-\d{2}-\d{2})(?:(T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)(Z|[+-]\d{2}:?\d{2})?)?$/;
|
|
490
|
+
function toIsoDate(value) {
|
|
491
|
+
if (value instanceof Date) {
|
|
492
|
+
if (Number.isNaN(value.getTime())) {
|
|
493
|
+
throw new Error("toIsoDate: received an invalid Date");
|
|
494
|
+
}
|
|
495
|
+
return value.toISOString();
|
|
496
|
+
}
|
|
497
|
+
const trimmed = value.trim();
|
|
498
|
+
const match = ISO_DATE_PATTERN.exec(trimmed);
|
|
499
|
+
if (!match || Number.isNaN(Date.parse(`${match[1]}T00:00:00Z`))) {
|
|
500
|
+
throw new Error(`toIsoDate: "${value}" is not an ISO 8601 date`);
|
|
501
|
+
}
|
|
502
|
+
const [, date, time = "", offset = ""] = match;
|
|
503
|
+
const normalizedOffset = offset.length === 5 ? `${offset.slice(0, 3)}:${offset.slice(3)}` : offset;
|
|
504
|
+
return `${date}${time}${normalizedOffset}`;
|
|
505
|
+
}
|
|
506
|
+
// src/utils/url.ts
|
|
507
|
+
var SCHEME_PATTERN = /^[a-z][a-z\d+.-]*:/i;
|
|
508
|
+
function toAbsoluteUrl(value, siteUrl) {
|
|
509
|
+
const trimmed = value?.trim();
|
|
510
|
+
if (!trimmed)
|
|
511
|
+
return;
|
|
512
|
+
if (SCHEME_PATTERN.test(trimmed))
|
|
513
|
+
return trimmed;
|
|
514
|
+
if (trimmed.startsWith("//")) {
|
|
515
|
+
const protocol = SCHEME_PATTERN.exec(siteUrl)?.[0] ?? "https:";
|
|
516
|
+
return `${protocol}${trimmed}`;
|
|
517
|
+
}
|
|
518
|
+
return `${siteUrl.replace(/\/+$/, "")}/${trimmed.replace(/^\/+/, "")}`;
|
|
519
|
+
}
|
|
191
520
|
export {
|
|
192
521
|
buildAboutPage,
|
|
193
522
|
buildAggregateOffer,
|
|
@@ -240,5 +569,5 @@ export {
|
|
|
240
569
|
toIsoDuration
|
|
241
570
|
};
|
|
242
571
|
|
|
243
|
-
//# debugId=
|
|
572
|
+
//# debugId=91D355419575781164756E2164756E21
|
|
244
573
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/define-builder.ts", "../src/builders/about-page.ts", "../src/builders/aggregate-offer.ts", "../src/builders/aggregate-rating.ts", "../src/builders/answer.ts", "../src/builders/article.ts", "../src/builders/brand.ts", "../src/builders/internal/slug-to-title.ts", "../src/builders/breadcrumb-list.ts", "../src/builders/comment.ts", "../src/builders/contact-page.ts", "../src/builders/course.ts", "../src/builders/course-instance.ts", "../src/builders/dataset.ts", "../src/builders/discussion-forum-posting.ts", "../src/builders/event.ts", "../src/builders/faq.ts", "../src/builders/geo-coordinates.ts", "../src/builders/how-to-step.ts", "../src/builders/item-list.ts", "../src/builders/job-posting.ts", "../src/builders/local-business.ts", "../src/builders/merchant-return-policy.ts", "../src/builders/monetary-amount.ts", "../src/builders/movie.ts", "../src/builders/nutrition-information.ts", "../src/builders/offer.ts", "../src/builders/offer-shipping-details.ts", "../src/builders/organization.ts", "../src/builders/person.ts", "../src/builders/place.ts", "../src/builders/postal-address.ts", "../src/builders/product.ts", "../src/builders/profile-page.ts", "../src/builders/qa-page.ts", "../src/builders/quantitative-value.ts", "../src/builders/question.ts", "../src/builders/recipe.ts", "../src/builders/review.ts", "../src/builders/schedule.ts", "../src/builders/software-application.ts", "../src/builders/vacation-rental.ts", "../src/builders/video-object.ts", "../src/builders/webpage.ts", "../src/builders/website.ts"],
|
|
3
|
+
"sources": ["../src/builders/fragments.ts", "../src/identity-ref.ts", "../src/utils/image.ts", "../src/build.ts", "../src/define-builder.ts", "../src/builders/about-page.ts", "../src/builders/aggregate-offer.ts", "../src/builders/aggregate-rating.ts", "../src/builders/answer.ts", "../src/builders/article.ts", "../src/builders/brand.ts", "../src/builders/internal/slug-to-title.ts", "../src/builders/breadcrumb-list.ts", "../src/builders/comment.ts", "../src/builders/contact-page.ts", "../src/builders/course.ts", "../src/builders/course-instance.ts", "../src/builders/dataset.ts", "../src/builders/discussion-forum-posting.ts", "../src/builders/event.ts", "../src/builders/faq.ts", "../src/builders/geo-coordinates.ts", "../src/builders/how-to-step.ts", "../src/builders/item-list.ts", "../src/builders/job-posting.ts", "../src/builders/local-business.ts", "../src/builders/merchant-return-policy.ts", "../src/builders/monetary-amount.ts", "../src/builders/movie.ts", "../src/builders/nutrition-information.ts", "../src/builders/offer.ts", "../src/builders/offer-shipping-details.ts", "../src/builders/organization.ts", "../src/builders/person.ts", "../src/builders/place.ts", "../src/builders/postal-address.ts", "../src/builders/product.ts", "../src/builders/profile-page.ts", "../src/builders/qa-page.ts", "../src/builders/quantitative-value.ts", "../src/builders/question.ts", "../src/builders/recipe.ts", "../src/builders/review.ts", "../src/builders/schedule.ts", "../src/builders/software-application.ts", "../src/builders/vacation-rental.ts", "../src/builders/video-object.ts", "../src/builders/webpage.ts", "../src/builders/website.ts", "../src/utils/datetime.ts", "../src/utils/url.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
+
"type IdReference = { \"@id\": string };\n\ntype SchemaIdOptions = {\n\tkind: string;\n\tname: string;\n\tbaseUrl?: string;\n\texplicitId?: string;\n};\n\nexport function normalizeId(name: string): string {\n\treturn name\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nexport function createSchemaId({\n\tkind,\n\tname,\n\tbaseUrl = \"\",\n\texplicitId,\n}: SchemaIdOptions): string {\n\tif (explicitId) {\n\t\treturn explicitId.startsWith(\"http\")\n\t\t\t? explicitId\n\t\t\t: `${baseUrl}${explicitId}`;\n\t}\n\n\treturn `${baseUrl}#${kind}-${normalizeId(name)}`;\n}\n\nexport function asIdReference(id: string): IdReference {\n\treturn { \"@id\": id };\n}\n",
|
|
6
|
+
"export const IDENTITY_REF_ID = \"@identity\";\n\nexport const identityRef = { \"@id\": IDENTITY_REF_ID } as const;\n",
|
|
7
|
+
"import type {\n\tIdReference,\n\tImageObjectLeaf,\n\tOrganization,\n\tPerson,\n} from \"schema-dts\";\n\ntype ImageObjectInput = {\n\turl: string;\n\twidth?: number;\n\theight?: number;\n\tcaption?: string;\n\tcreditText?: string;\n\tcopyrightNotice?: string;\n\tlicense?: string;\n\tacquireLicensePage?: string;\n\tcreator?: Person | Organization | IdReference;\n};\n\nexport type ImageInput = string | ImageObjectInput;\n\nexport function buildImageObject(\n\tinput?: ImageInput,\n): ImageObjectLeaf | undefined {\n\tif (!input) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof input === \"string\") {\n\t\treturn {\n\t\t\t\"@type\": \"ImageObject\",\n\t\t\turl: input,\n\t\t\tcontentUrl: input,\n\t\t};\n\t}\n\n\tconst { url, ...rest } = input;\n\n\t// schema-dts types width/height as Distance strings, but numeric pixel values are valid JSON-LD.\n\treturn {\n\t\t\"@type\": \"ImageObject\",\n\t\turl,\n\t\tcontentUrl: url,\n\t\t...rest,\n\t} as ImageObjectLeaf;\n}\n",
|
|
8
|
+
"import type {\n\tBreadcrumbList,\n\tOpeningHoursSpecification,\n\tPostalAddress,\n\tThing,\n\tWithContext,\n} from \"schema-dts\";\nimport { createSchemaId } from \"./builders/fragments\";\nimport { IDENTITY_REF_ID } from \"./identity-ref\";\nimport { buildImageObject, type ImageInput } from \"./utils/image\";\n\ntype SchemaNode = Record<string, unknown>;\n\nexport type BuildSchemaMarkupInput = {\n\tidentity: Identity;\n\tsiteUrl: string;\n\tsiteName: string;\n\tsiteDescription?: string;\n\tpageUrl: string;\n\tpageTitle: string;\n\tpageDescription?: string;\n\t/** BCP 47 language tag for the page content, e.g. `\"fr\"` or `\"fr-CA\"`. */\n\tinLanguage?: string;\n\tbreadcrumb?: WithContext<BreadcrumbList>;\n\tmainEntity?: Thing | SchemaNode;\n};\n\nexport type PersonIdentity = {\n\ttype: \"person\";\n\tname: string;\n\tdescription?: string;\n\timage?: ImageInput;\n\tsameAs?: string[];\n};\n\nexport type OrganizationIdentity = {\n\ttype: \"organization\";\n\tname: string;\n\tdescription?: string;\n\tlogo?: ImageInput;\n\tsameAs?: string[];\n};\n\nexport type LocalBusinessIdentity = {\n\ttype: \"localBusiness\";\n\tname: string;\n\tdescription?: string;\n\tlogo?: ImageInput;\n\tphone?: string;\n\temail?: string;\n\taddress?: PostalAddress;\n\topeningHours?: OpeningHoursSpecification[];\n\tsameAs?: string[];\n};\n\nexport type Identity =\n\t| PersonIdentity\n\t| OrganizationIdentity\n\t| LocalBusinessIdentity;\n\nconst TYPE_PRIORITY = [\n\t\"Organization\",\n\t\"Person\",\n\t\"LocalBusiness\",\n\t\"WebSite\",\n\t\"WebPage\",\n\t\"ProfilePage\",\n\t\"QAPage\",\n\t\"BreadcrumbList\",\n\t\"Article\",\n\t\"Course\",\n\t\"Dataset\",\n\t\"DiscussionForumPosting\",\n\t\"JobPosting\",\n\t\"Movie\",\n\t\"Product\",\n\t\"Recipe\",\n\t\"SoftwareApplication\",\n\t\"VacationRental\",\n\t\"VideoObject\",\n\t\"Event\",\n\t\"ItemList\",\n\t\"Question\",\n\t\"Answer\",\n\t\"Review\",\n\t\"Comment\",\n\t\"AggregateRating\",\n] as const;\n\nconst typeWeight = new Map<string, number>(\n\tTYPE_PRIORITY.map((type, index) => [type, index]),\n);\n\nconst hasObjectShape = (value: unknown): value is SchemaNode => {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst hasType = (\n\tvalue: SchemaNode,\n): value is SchemaNode & { \"@type\": string } => {\n\treturn typeof value[\"@type\"] === \"string\";\n};\n\nconst hasId = (value: SchemaNode): value is SchemaNode & { \"@id\": string } => {\n\treturn typeof value[\"@id\"] === \"string\" && value[\"@id\"].length > 0;\n};\n\nconst isEmptyValue = (value: unknown): boolean => {\n\tif (value === null || value === undefined) return true;\n\tif (typeof value === \"string\") return value.trim().length === 0;\n\tif (Array.isArray(value)) return value.length === 0;\n\tif (hasObjectShape(value)) {\n\t\treturn Object.keys(value).every(\n\t\t\t(key) => key === \"@type\" || key === \"@context\",\n\t\t);\n\t}\n\treturn false;\n};\n\nconst ensureContext = (node: SchemaNode): SchemaNode => {\n\tif (hasType(node) && node[\"@context\"] === undefined) {\n\t\treturn {\n\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t...node,\n\t\t};\n\t}\n\n\treturn node;\n};\n\ntype RankedNode = {\n\tnode: SchemaNode;\n\torder: number;\n};\n\nconst assembleNodes = (\n\tnodes: Array<Thing | SchemaNode | undefined>,\n\tidentityId: string,\n): string[] => {\n\tconst collected: RankedNode[] = [];\n\tconst seenIds = new Set<string>();\n\tconst processingIds = new Set<string>();\n\tlet orderCounter = 0;\n\n\tconst addNode = (node: SchemaNode) => {\n\t\tconst normalized = ensureContext(node);\n\t\tif (hasId(normalized)) {\n\t\t\tif (seenIds.has(normalized[\"@id\"])) return;\n\t\t\tseenIds.add(normalized[\"@id\"]);\n\t\t}\n\n\t\tcollected.push({\n\t\t\tnode: normalized,\n\t\t\torder: orderCounter++,\n\t\t});\n\t};\n\n\tconst processValue = (value: unknown, isRoot = false): unknown => {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.map((item) => processValue(item, false))\n\t\t\t\t.filter((item) => !isEmptyValue(item));\n\t\t}\n\n\t\tif (!hasObjectShape(value)) return value;\n\n\t\tif (value[\"@id\"] === IDENTITY_REF_ID) {\n\t\t\treturn { \"@id\": identityId };\n\t\t}\n\n\t\tif (!isRoot && hasType(value) && hasId(value)) {\n\t\t\tregisterEntity(value);\n\t\t\treturn { \"@id\": value[\"@id\"] };\n\t\t}\n\n\t\tconst output: SchemaNode = {};\n\t\tfor (const [key, child] of Object.entries(value)) {\n\t\t\tif (!isRoot && key === \"@context\") continue;\n\t\t\tconst processed = processValue(child, false);\n\t\t\tif (isEmptyValue(processed)) continue;\n\t\t\toutput[key] = processed;\n\t\t}\n\t\treturn output;\n\t};\n\n\tconst registerEntity = (entity: SchemaNode & { \"@id\": string }) => {\n\t\tconst id = entity[\"@id\"];\n\t\tif (seenIds.has(id) || processingIds.has(id)) return;\n\n\t\tprocessingIds.add(id);\n\t\tconst processedEntity = processValue(entity, true);\n\t\tif (hasObjectShape(processedEntity)) {\n\t\t\taddNode(processedEntity);\n\t\t}\n\t\tprocessingIds.delete(id);\n\t};\n\n\tfor (const node of nodes) {\n\t\tif (!node) continue;\n\t\tconst processed = processValue(node, true);\n\t\tif (!hasObjectShape(processed)) continue;\n\t\taddNode(processed);\n\t}\n\n\tconst ranked = collected.sort((a, b) => {\n\t\tconst aType = hasType(a.node) ? a.node[\"@type\"] : \"\";\n\t\tconst bType = hasType(b.node) ? b.node[\"@type\"] : \"\";\n\t\tconst aWeight = typeWeight.get(aType) ?? Number.MAX_SAFE_INTEGER;\n\t\tconst bWeight = typeWeight.get(bType) ?? Number.MAX_SAFE_INTEGER;\n\n\t\tif (aWeight !== bWeight) return aWeight - bWeight;\n\t\treturn a.order - b.order;\n\t});\n\n\treturn ranked.map(({ node }) => JSON.stringify(node));\n};\n\nconst buildIdentityNodes = (\n\tidentity: Identity,\n\tsiteUrl: string,\n\tidBase: string,\n): { node: SchemaNode; ref: { \"@id\": string } } => {\n\tswitch (identity.type) {\n\t\tcase \"person\": {\n\t\t\tconst id = createSchemaId({\n\t\t\t\tkind: \"person\",\n\t\t\t\tname: identity.name,\n\t\t\t\tbaseUrl: idBase,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tnode: {\n\t\t\t\t\t\"@type\": \"Person\",\n\t\t\t\t\t\"@id\": id,\n\t\t\t\t\tname: identity.name,\n\t\t\t\t\tdescription: identity.description,\n\t\t\t\t\timage: buildImageObject(identity.image),\n\t\t\t\t\tsameAs: identity.sameAs,\n\t\t\t\t\turl: siteUrl,\n\t\t\t\t},\n\t\t\t\tref: { \"@id\": id },\n\t\t\t};\n\t\t}\n\t\tcase \"organization\": {\n\t\t\tconst id = createSchemaId({\n\t\t\t\tkind: \"organization\",\n\t\t\t\tname: identity.name,\n\t\t\t\tbaseUrl: idBase,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tnode: {\n\t\t\t\t\t\"@type\": \"Organization\",\n\t\t\t\t\t\"@id\": id,\n\t\t\t\t\tname: identity.name,\n\t\t\t\t\tdescription: identity.description,\n\t\t\t\t\tlogo: buildImageObject(identity.logo),\n\t\t\t\t\tsameAs: identity.sameAs,\n\t\t\t\t\turl: siteUrl,\n\t\t\t\t},\n\t\t\t\tref: { \"@id\": id },\n\t\t\t};\n\t\t}\n\t\tcase \"localBusiness\": {\n\t\t\tconst id = createSchemaId({\n\t\t\t\tkind: \"local-business\",\n\t\t\t\tname: identity.name,\n\t\t\t\tbaseUrl: idBase,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tnode: {\n\t\t\t\t\t\"@type\": \"LocalBusiness\",\n\t\t\t\t\t\"@id\": id,\n\t\t\t\t\tname: identity.name,\n\t\t\t\t\tdescription: identity.description,\n\t\t\t\t\tlogo: buildImageObject(identity.logo),\n\t\t\t\t\ttelephone: identity.phone,\n\t\t\t\t\temail: identity.email,\n\t\t\t\t\taddress: identity.address,\n\t\t\t\t\topeningHoursSpecification: identity.openingHours,\n\t\t\t\t\tsameAs: identity.sameAs,\n\t\t\t\t\turl: siteUrl,\n\t\t\t\t},\n\t\t\t\tref: { \"@id\": id },\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport const buildSchemaMarkup = (input: BuildSchemaMarkupInput): string[] => {\n\tconst idBase = input.siteUrl.replace(/\\/+$/, \"\");\n\tconst { node: identityNode, ref: identityNodeRef } = buildIdentityNodes(\n\t\tinput.identity,\n\t\tinput.siteUrl,\n\t\tidBase,\n\t);\n\tconst websiteId = `${idBase}#website`;\n\n\tconst websiteNode: SchemaNode = {\n\t\t\"@type\": \"WebSite\",\n\t\t\"@id\": websiteId,\n\t\tname: input.siteName,\n\t\turl: input.siteUrl,\n\t\tdescription: input.siteDescription,\n\t\tpublisher: identityNodeRef,\n\t};\n\n\tconst webpageNode: SchemaNode = {\n\t\t\"@type\": \"WebPage\",\n\t\t\"@id\": `${input.pageUrl}#webpage`,\n\t\turl: input.pageUrl,\n\t\tname: input.pageTitle,\n\t\tdescription: input.pageDescription,\n\t\tinLanguage: input.inLanguage,\n\t\tisPartOf: { \"@id\": websiteId },\n\t\tbreadcrumb: input.breadcrumb,\n\t\tmainEntity: input.mainEntity,\n\t};\n\n\treturn assembleNodes(\n\t\t[identityNode, websiteNode, webpageNode],\n\t\tidentityNodeRef[\"@id\"],\n\t);\n};\n",
|
|
5
9
|
"import type { Thing, WithContext } from \"schema-dts\";\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type BuilderInput<T extends Thing> = Simplify<\n\tOmit<T, \"@type\" | \"@context\">\n>;\n\nexport type SchemaBuilder<T extends Thing> = (\n\tinput: BuilderInput<T>,\n) => WithContext<T>;\n\nexport function defineBuilder<T extends Thing>(type: string): SchemaBuilder<T> {\n\treturn (input: BuilderInput<T>) =>\n\t\t({\n\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\"@type\": type,\n\t\t\t...input,\n\t\t}) as unknown as WithContext<T>;\n}\n",
|
|
6
10
|
"import type { AboutPage } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildAboutPage: SchemaBuilder<AboutPage> =\n\tdefineBuilder<AboutPage>(\"AboutPage\");\n",
|
|
7
11
|
"import type { AggregateOffer } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildAggregateOffer: SchemaBuilder<AggregateOffer> =\n\tdefineBuilder<AggregateOffer>(\"AggregateOffer\");\n",
|
|
@@ -46,9 +50,11 @@
|
|
|
46
50
|
"import type { VacationRental } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildVacationRental: SchemaBuilder<VacationRental> =\n\tdefineBuilder<VacationRental>(\"VacationRental\");\n",
|
|
47
51
|
"import type { VideoObject } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildVideoObject: SchemaBuilder<VideoObject> =\n\tdefineBuilder<VideoObject>(\"VideoObject\");\n",
|
|
48
52
|
"import type { WebPage } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildWebPage: SchemaBuilder<WebPage> =\n\tdefineBuilder<WebPage>(\"WebPage\");\n",
|
|
49
|
-
"import type { WebSite } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildWebSite: SchemaBuilder<WebSite> =\n\tdefineBuilder<WebSite>(\"WebSite\");\n"
|
|
53
|
+
"import type { WebSite } from \"schema-dts\";\nimport { defineBuilder, type SchemaBuilder } from \"../define-builder\";\n\nexport const buildWebSite: SchemaBuilder<WebSite> =\n\tdefineBuilder<WebSite>(\"WebSite\");\n",
|
|
54
|
+
"export type DurationParts = {\n\tyears?: number;\n\tmonths?: number;\n\tweeks?: number;\n\tdays?: number;\n\thours?: number;\n\tminutes?: number;\n\tseconds?: number;\n};\n\nconst DATE_DESIGNATORS = [\n\t[\"years\", \"Y\"],\n\t[\"months\", \"M\"],\n\t[\"weeks\", \"W\"],\n\t[\"days\", \"D\"],\n] as const;\n\nconst TIME_DESIGNATORS = [\n\t[\"hours\", \"H\"],\n\t[\"minutes\", \"M\"],\n\t[\"seconds\", \"S\"],\n] as const;\n\nconst formatParts = (\n\tparts: DurationParts,\n\tdesignators: ReadonlyArray<readonly [keyof DurationParts, string]>,\n): string =>\n\tdesignators\n\t\t.map(([key, designator]) => {\n\t\t\tconst value = parts[key];\n\t\t\treturn value ? `${value}${designator}` : \"\";\n\t\t})\n\t\t.join(\"\");\n\nexport function toIsoDuration(parts: DurationParts): string {\n\tfor (const [key, value] of Object.entries(parts)) {\n\t\tif (value === undefined) continue;\n\t\tif (!Number.isFinite(value) || value < 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`toIsoDuration: \"${key}\" must be a non-negative finite number, got ${value}`,\n\t\t\t);\n\t\t}\n\t\tif (key !== \"seconds\" && !Number.isInteger(value)) {\n\t\t\tthrow new Error(\n\t\t\t\t`toIsoDuration: only \"seconds\" may be fractional, got ${key}: ${value}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// ISO 8601-1 does not allow weeks to be combined with other parts.\n\tif (\n\t\tparts.weeks &&\n\t\tObject.entries(parts).some(([key, value]) => key !== \"weeks\" && value)\n\t) {\n\t\tthrow new Error(\n\t\t\t'toIsoDuration: \"weeks\" cannot be combined with other parts',\n\t\t);\n\t}\n\n\tconst datePart = formatParts(parts, DATE_DESIGNATORS);\n\tconst timePart = formatParts(parts, TIME_DESIGNATORS);\n\n\tif (!datePart && !timePart) return \"PT0S\";\n\treturn `P${datePart}${timePart ? `T${timePart}` : \"\"}`;\n}\n\nconst ISO_DATE_PATTERN =\n\t/^(\\d{4}-\\d{2}-\\d{2})(?:(T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\nexport function toIsoDate(value: Date | string): string {\n\tif (value instanceof Date) {\n\t\tif (Number.isNaN(value.getTime())) {\n\t\t\tthrow new Error(\"toIsoDate: received an invalid Date\");\n\t\t}\n\t\treturn value.toISOString();\n\t}\n\n\tconst trimmed = value.trim();\n\tconst match = ISO_DATE_PATTERN.exec(trimmed);\n\tif (!match || Number.isNaN(Date.parse(`${match[1]}T00:00:00Z`))) {\n\t\tthrow new Error(`toIsoDate: \"${value}\" is not an ISO 8601 date`);\n\t}\n\n\tconst [, date, time = \"\", offset = \"\"] = match;\n\tconst normalizedOffset =\n\t\toffset.length === 5 ? `${offset.slice(0, 3)}:${offset.slice(3)}` : offset;\n\n\treturn `${date}${time}${normalizedOffset}`;\n}\n",
|
|
55
|
+
"const SCHEME_PATTERN = /^[a-z][a-z\\d+.-]*:/i;\n\nexport function toAbsoluteUrl(\n\tvalue: string | null | undefined,\n\tsiteUrl: string,\n): string | undefined {\n\tconst trimmed = value?.trim();\n\tif (!trimmed) return undefined;\n\n\tif (SCHEME_PATTERN.test(trimmed)) return trimmed;\n\n\tif (trimmed.startsWith(\"//\")) {\n\t\tconst protocol = SCHEME_PATTERN.exec(siteUrl)?.[0] ?? \"https:\";\n\t\treturn `${protocol}${trimmed}`;\n\t}\n\n\treturn `${siteUrl.replace(/\\/+$/, \"\")}/${trimmed.replace(/^\\/+/, \"\")}`;\n}\n"
|
|
50
56
|
],
|
|
51
|
-
"mappings": ";
|
|
52
|
-
"debugId": "
|
|
57
|
+
"mappings": ";AASO,SAAS,WAAW,CAAC,MAAsB;AAAA,EACjD,OAAO,KACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AAAA;AAGhB,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,GAC2B;AAAA,EAC3B,IAAI,YAAY;AAAA,IACf,OAAO,WAAW,WAAW,MAAM,IAChC,aACA,GAAG,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,GAAG,WAAW,QAAQ,YAAY,IAAI;AAAA;;;AC5BvC,IAAM,kBAAkB;AAExB,IAAM,cAAc,EAAE,OAAO,gBAAgB;;;ACmB7C,SAAS,gBAAgB,CAC/B,OAC8B;AAAA,EAC9B,IAAI,CAAC,OAAO;AAAA,IACX;AAAA,EACD;AAAA,EAEA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC9B,OAAO;AAAA,MACN,SAAS;AAAA,MACT,KAAK;AAAA,MACL,YAAY;AAAA,IACb;AAAA,EACD;AAAA,EAEA,QAAQ,QAAQ,SAAS;AAAA,EAGzB,OAAO;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,OACT;AAAA,EACJ;AAAA;;;ACgBD,IAAM,gBAAgB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAM,aAAa,IAAI,IACtB,cAAc,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,KAAK,CAAC,CACjD;AAEA,IAAM,iBAAiB,CAAC,UAAwC;AAAA,EAC/D,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;AAG3E,IAAM,UAAU,CACf,UAC+C;AAAA,EAC/C,OAAO,OAAO,MAAM,aAAa;AAAA;AAGlC,IAAM,QAAQ,CAAC,UAA+D;AAAA,EAC7E,OAAO,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,SAAS;AAAA;AAGlE,IAAM,eAAe,CAAC,UAA4B;AAAA,EACjD,IAAI,UAAU,QAAQ,UAAU;AAAA,IAAW,OAAO;AAAA,EAClD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,MAAM,KAAK,EAAE,WAAW;AAAA,EAC9D,IAAI,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO,MAAM,WAAW;AAAA,EAClD,IAAI,eAAe,KAAK,GAAG;AAAA,IAC1B,OAAO,OAAO,KAAK,KAAK,EAAE,MACzB,CAAC,QAAQ,QAAQ,WAAW,QAAQ,UACrC;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,IAAM,gBAAgB,CAAC,SAAiC;AAAA,EACvD,IAAI,QAAQ,IAAI,KAAK,KAAK,gBAAgB,WAAW;AAAA,IACpD,OAAO;AAAA,MACN,YAAY;AAAA,SACT;AAAA,IACJ;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAQR,IAAM,gBAAgB,CACrB,OACA,eACc;AAAA,EACd,MAAM,YAA0B,CAAC;AAAA,EACjC,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,gBAAgB,IAAI;AAAA,EAC1B,IAAI,eAAe;AAAA,EAEnB,MAAM,UAAU,CAAC,SAAqB;AAAA,IACrC,MAAM,aAAa,cAAc,IAAI;AAAA,IACrC,IAAI,MAAM,UAAU,GAAG;AAAA,MACtB,IAAI,QAAQ,IAAI,WAAW,MAAM;AAAA,QAAG;AAAA,MACpC,QAAQ,IAAI,WAAW,MAAM;AAAA,IAC9B;AAAA,IAEA,UAAU,KAAK;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,IACR,CAAC;AAAA;AAAA,EAGF,MAAM,eAAe,CAAC,OAAgB,SAAS,UAAmB;AAAA,IACjE,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MACzB,OAAO,MACL,IAAI,CAAC,SAAS,aAAa,MAAM,KAAK,CAAC,EACvC,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC;AAAA,IACvC;AAAA,IAEA,IAAI,CAAC,eAAe,KAAK;AAAA,MAAG,OAAO;AAAA,IAEnC,IAAI,MAAM,WAAW,iBAAiB;AAAA,MACrC,OAAO,EAAE,OAAO,WAAW;AAAA,IAC5B;AAAA,IAEA,IAAI,CAAC,UAAU,QAAQ,KAAK,KAAK,MAAM,KAAK,GAAG;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,OAAO,EAAE,OAAO,MAAM,OAAO;AAAA,IAC9B;AAAA,IAEA,MAAM,SAAqB,CAAC;AAAA,IAC5B,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,MACjD,IAAI,CAAC,UAAU,QAAQ;AAAA,QAAY;AAAA,MACnC,MAAM,YAAY,aAAa,OAAO,KAAK;AAAA,MAC3C,IAAI,aAAa,SAAS;AAAA,QAAG;AAAA,MAC7B,OAAO,OAAO;AAAA,IACf;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,MAAM,iBAAiB,CAAC,WAA2C;AAAA,IAClE,MAAM,KAAK,OAAO;AAAA,IAClB,IAAI,QAAQ,IAAI,EAAE,KAAK,cAAc,IAAI,EAAE;AAAA,MAAG;AAAA,IAE9C,cAAc,IAAI,EAAE;AAAA,IACpB,MAAM,kBAAkB,aAAa,QAAQ,IAAI;AAAA,IACjD,IAAI,eAAe,eAAe,GAAG;AAAA,MACpC,QAAQ,eAAe;AAAA,IACxB;AAAA,IACA,cAAc,OAAO,EAAE;AAAA;AAAA,EAGxB,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,MAAM,YAAY,aAAa,MAAM,IAAI;AAAA,IACzC,IAAI,CAAC,eAAe,SAAS;AAAA,MAAG;AAAA,IAChC,QAAQ,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,UAAU,KAAK,CAAC,GAAG,MAAM;AAAA,IACvC,MAAM,QAAQ,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,WAAW;AAAA,IAClD,MAAM,QAAQ,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,WAAW;AAAA,IAClD,MAAM,UAAU,WAAW,IAAI,KAAK,KAAK,OAAO;AAAA,IAChD,MAAM,UAAU,WAAW,IAAI,KAAK,KAAK,OAAO;AAAA,IAEhD,IAAI,YAAY;AAAA,MAAS,OAAO,UAAU;AAAA,IAC1C,OAAO,EAAE,QAAQ,EAAE;AAAA,GACnB;AAAA,EAED,OAAO,OAAO,IAAI,GAAG,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA;AAGrD,IAAM,qBAAqB,CAC1B,UACA,SACA,WACkD;AAAA,EAClD,QAAQ,SAAS;AAAA,SACX,UAAU;AAAA,MACd,MAAM,KAAK,eAAe;AAAA,QACzB,MAAM;AAAA,QACN,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,MACV,CAAC;AAAA,MACD,OAAO;AAAA,QACN,MAAM;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM,SAAS;AAAA,UACf,aAAa,SAAS;AAAA,UACtB,OAAO,iBAAiB,SAAS,KAAK;AAAA,UACtC,QAAQ,SAAS;AAAA,UACjB,KAAK;AAAA,QACN;AAAA,QACA,KAAK,EAAE,OAAO,GAAG;AAAA,MAClB;AAAA,IACD;AAAA,SACK,gBAAgB;AAAA,MACpB,MAAM,KAAK,eAAe;AAAA,QACzB,MAAM;AAAA,QACN,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,MACV,CAAC;AAAA,MACD,OAAO;AAAA,QACN,MAAM;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM,SAAS;AAAA,UACf,aAAa,SAAS;AAAA,UACtB,MAAM,iBAAiB,SAAS,IAAI;AAAA,UACpC,QAAQ,SAAS;AAAA,UACjB,KAAK;AAAA,QACN;AAAA,QACA,KAAK,EAAE,OAAO,GAAG;AAAA,MAClB;AAAA,IACD;AAAA,SACK,iBAAiB;AAAA,MACrB,MAAM,KAAK,eAAe;AAAA,QACzB,MAAM;AAAA,QACN,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,MACV,CAAC;AAAA,MACD,OAAO;AAAA,QACN,MAAM;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM,SAAS;AAAA,UACf,aAAa,SAAS;AAAA,UACtB,MAAM,iBAAiB,SAAS,IAAI;AAAA,UACpC,WAAW,SAAS;AAAA,UACpB,OAAO,SAAS;AAAA,UAChB,SAAS,SAAS;AAAA,UAClB,2BAA2B,SAAS;AAAA,UACpC,QAAQ,SAAS;AAAA,UACjB,KAAK;AAAA,QACN;AAAA,QACA,KAAK,EAAE,OAAO,GAAG;AAAA,MAClB;AAAA,IACD;AAAA;AAAA;AAIK,IAAM,oBAAoB,CAAC,UAA4C;AAAA,EAC7E,MAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC/C,QAAQ,MAAM,cAAc,KAAK,oBAAoB,mBACpD,MAAM,UACN,MAAM,SACN,MACD;AAAA,EACA,MAAM,YAAY,GAAG;AAAA,EAErB,MAAM,cAA0B;AAAA,IAC/B,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,aAAa,MAAM;AAAA,IACnB,WAAW;AAAA,EACZ;AAAA,EAEA,MAAM,cAA0B;AAAA,IAC/B,SAAS;AAAA,IACT,OAAO,GAAG,MAAM;AAAA,IAChB,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,YAAY,MAAM;AAAA,IAClB,UAAU,EAAE,OAAO,UAAU;AAAA,IAC7B,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,EACnB;AAAA,EAEA,OAAO,cACN,CAAC,cAAc,aAAa,WAAW,GACvC,gBAAgB,MACjB;AAAA;;ACpTM,SAAS,aAA8B,CAAC,MAAgC;AAAA,EAC9E,OAAO,CAAC,WACN;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,OACN;AAAA,EACJ;AAAA;;;ACfK,IAAM,iBACZ,cAAyB,WAAW;;;ACD9B,IAAM,sBACZ,cAA8B,gBAAgB;;;ACDxC,IAAM,uBACZ,cAA+B,iBAAiB;;;ACD1C,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,aAAmC,cAAqB,OAAO;;;ACHrE,SAAS,WAAW,CAAC,SAAyB;AAAA,EACpD,MAAM,UAAU,mBAAmB,WAAW,EAAE;AAAA,EAChD,MAAM,aAAa,QAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,EAE5E,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,OAAO,WAAW,QAAQ,SAAS,CAAC,SAAS,KAAK,YAAY,CAAC;AAAA;;;ACQhE,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC5C,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,cAAc,KAAK,MAAM,GAAG,EAAE;AAAA,EACpC,MAAM,eAAe,YAAY,MAAM,GAAG,EAAE;AAAA,EAC5C,MAAM,WAAW,aAAa,WAAW,GAAG,IACzC,eACA,IAAI;AAAA,EACP,OAAO,SAAS,QAAQ,QAAQ,EAAE,KAAK;AAAA;AAGxC,SAAS,wBAAwB,CAAC,UAAyC;AAAA,EAC1E,MAAM,aAAa,cAAc,QAAQ;AAAA,EACzC,MAAM,WAAW,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EAErD,IAAI,SAAS,UAAU;AAAA,IAAG,OAAO,CAAC;AAAA,EAElC,OAAO,SAAS,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,WAAW;AAAA,IACrD,OAAO,YAAY,OAAO;AAAA,IAC1B,KAAK,IAAI,SAAS,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,EAC/C,EAAE;AAAA;AAGH,SAAS,WAAW,CAAC,OAA0C;AAAA,EAC9D,OAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,IAClC,SAAS;AAAA,IACT,UAAU,QAAQ;AAAA,IAClB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,EACZ,EAAE;AAAA;AAGI,SAAS,yBAAyB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,GAC+D;AAAA,EAC/D,MAAM,cAAc,OAAO,SACxB,QACA,yBAAyB,QAAQ;AAAA,EACpC,MAAM,aAAa;AAAA,IAClB,GAAG;AAAA,IACH;AAAA,MACC,OAAO;AAAA,MACP,KAAK,cAAc,QAAQ;AAAA,IAC5B;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,YAAY,UAAU;AAAA,EACxC;AAAA;;;AC9DM,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,mBACZ,cAA2B,aAAa;;;ACDlC,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,sBACZ,cAA8B,gBAAgB;;;ACDxC,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,8BACZ,cAAsC,wBAAwB;;;ACDxD,IAAM,aAAmC,cAAqB,OAAO;;;ACArE,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,sBACZ,cAA8B,gBAAgB;;;ACDxC,IAAM,iBACZ,cAAyB,WAAW;;;ACD9B,IAAM,gBACZ,cAAwB,UAAU;;;ACD5B,IAAM,kBACZ,cAA0B,YAAY;;;ACDhC,IAAM,qBACZ,cAA6B,eAAe;;;ACDtC,IAAM,4BACZ,cAAoC,sBAAsB;;;ACDpD,IAAM,sBACZ,cAA8B,gBAAgB;;;ACDxC,IAAM,aAAmC,cAAqB,OAAO;;;ACArE,IAAM,4BACZ,cAAoC,sBAAsB;;;ACDpD,IAAM,aAAmC,cAAqB,OAAO;;;ACArE,IAAM,4BACZ,cAAoC,sBAAsB;;;ACDpD,IAAM,oBACZ,cAA4B,cAAc;;;ACDpC,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,aAAmC,cAAqB,OAAO;;;ACArE,IAAM,qBACZ,cAA6B,eAAe;;;ACDtC,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,mBACZ,cAA2B,aAAa;;;ACDlC,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,yBACZ,cAAiC,mBAAmB;;;ACD9C,IAAM,gBACZ,cAAwB,UAAU;;;ACD5B,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,cACZ,cAAsB,QAAQ;;;ACDxB,IAAM,gBACZ,cAAwB,UAAU;;;ACD5B,IAAM,2BACZ,cAAmC,qBAAqB;;;ACDlD,IAAM,sBACZ,cAA8B,gBAAgB;;;ACDxC,IAAM,mBACZ,cAA2B,aAAa;;;ACDlC,IAAM,eACZ,cAAuB,SAAS;;;ACD1B,IAAM,eACZ,cAAuB,SAAS;;ACMjC,IAAM,mBAAmB;AAAA,EACxB,CAAC,SAAS,GAAG;AAAA,EACb,CAAC,UAAU,GAAG;AAAA,EACd,CAAC,SAAS,GAAG;AAAA,EACb,CAAC,QAAQ,GAAG;AACb;AAEA,IAAM,mBAAmB;AAAA,EACxB,CAAC,SAAS,GAAG;AAAA,EACb,CAAC,WAAW,GAAG;AAAA,EACf,CAAC,WAAW,GAAG;AAChB;AAEA,IAAM,cAAc,CACnB,OACA,gBAEA,YACE,IAAI,EAAE,KAAK,gBAAgB;AAAA,EAC3B,MAAM,QAAQ,MAAM;AAAA,EACpB,OAAO,QAAQ,GAAG,QAAQ,eAAe;AAAA,CACzC,EACA,KAAK,EAAE;AAEH,SAAS,aAAa,CAAC,OAA8B;AAAA,EAC3D,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,IACjD,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAAA,MACzC,MAAM,IAAI,MACT,mBAAmB,kDAAkD,OACtE;AAAA,IACD;AAAA,IACA,IAAI,QAAQ,aAAa,CAAC,OAAO,UAAU,KAAK,GAAG;AAAA,MAClD,MAAM,IAAI,MACT,wDAAwD,QAAQ,OACjE;AAAA,IACD;AAAA,EACD;AAAA,EAGA,IACC,MAAM,SACN,OAAO,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,WAAW,QAAQ,WAAW,KAAK,GACpE;AAAA,IACD,MAAM,IAAI,MACT,4DACD;AAAA,EACD;AAAA,EAEA,MAAM,WAAW,YAAY,OAAO,gBAAgB;AAAA,EACpD,MAAM,WAAW,YAAY,OAAO,gBAAgB;AAAA,EAEpD,IAAI,CAAC,YAAY,CAAC;AAAA,IAAU,OAAO;AAAA,EACnC,OAAO,IAAI,WAAW,WAAW,IAAI,aAAa;AAAA;AAGnD,IAAM,mBACL;AAEM,SAAS,SAAS,CAAC,OAA8B;AAAA,EACvD,IAAI,iBAAiB,MAAM;AAAA,IAC1B,IAAI,OAAO,MAAM,MAAM,QAAQ,CAAC,GAAG;AAAA,MAClC,MAAM,IAAI,MAAM,qCAAqC;AAAA,IACtD;AAAA,IACA,OAAO,MAAM,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,MAAM,QAAQ,iBAAiB,KAAK,OAAO;AAAA,EAC3C,IAAI,CAAC,SAAS,OAAO,MAAM,KAAK,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG;AAAA,IAChE,MAAM,IAAI,MAAM,eAAe,gCAAgC;AAAA,EAChE;AAAA,EAEA,SAAS,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EACzC,MAAM,mBACL,OAAO,WAAW,IAAI,GAAG,OAAO,MAAM,GAAG,CAAC,KAAK,OAAO,MAAM,CAAC,MAAM;AAAA,EAEpE,OAAO,GAAG,OAAO,OAAO;AAAA;;ACvFzB,IAAM,iBAAiB;AAEhB,SAAS,aAAa,CAC5B,OACA,SACqB;AAAA,EACrB,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAS;AAAA,EAEd,IAAI,eAAe,KAAK,OAAO;AAAA,IAAG,OAAO;AAAA,EAEzC,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,IAC7B,MAAM,WAAW,eAAe,KAAK,OAAO,IAAI,MAAM;AAAA,IACtD,OAAO,GAAG,WAAW;AAAA,EACtB;AAAA,EAEA,OAAO,GAAG,QAAQ,QAAQ,QAAQ,EAAE,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA;",
|
|
58
|
+
"debugId": "91D355419575781164756E2164756E21",
|
|
53
59
|
"names": []
|
|
54
60
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crawl-me-maybe/schema",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"sideEffects":
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"sideEffects": [
|
|
5
|
+
"./src/index.ts"
|
|
6
|
+
],
|
|
5
7
|
"type": "module",
|
|
6
8
|
"author": "Nathan Nye <nathan@nye.dev> (https://nye.dev)",
|
|
7
9
|
"license": "MIT",
|
|
@@ -22,7 +24,7 @@
|
|
|
22
24
|
"scripts": {
|
|
23
25
|
"lint": "biome check .",
|
|
24
26
|
"fix": "biome check --write .",
|
|
25
|
-
"build": "rm -rf dist && bun build src/index.ts --outdir dist --format esm --sourcemap --external schema-dts && tsc -p tsconfig.json --declaration --emitDeclarationOnly --declarationDir dist --rootDir src",
|
|
27
|
+
"build": "rm -rf dist && bun build src/index.ts --outdir dist --format esm --sourcemap --external schema-dts && node ../../scripts/check-exports.mjs dist/index.js && tsc -p tsconfig.json --declaration --emitDeclarationOnly --declarationDir dist --rootDir src",
|
|
26
28
|
"prepublishOnly": "bun run build"
|
|
27
29
|
},
|
|
28
30
|
"dependencies": {
|