@brandlab-digital/site-core 3.2.0 → 3.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/business.d.ts +40 -0
- package/dist/business.d.ts.map +1 -1
- package/dist/business.js +175 -79
- package/dist/business.js.map +1 -1
- package/dist/geography.d.ts +2 -0
- package/dist/geography.d.ts.map +1 -1
- package/dist/geography.js +0 -18
- package/dist/geography.js.map +1 -1
- package/dist/site.d.ts +11 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +24 -15
- package/dist/site.js.map +1 -1
- package/package.json +1 -1
package/dist/business.d.ts
CHANGED
|
@@ -122,5 +122,45 @@ export declare function unknownFact<T>(): BrandlabFact<T>;
|
|
|
122
122
|
export declare function notApplicableFact<T>(reason: string): BrandlabFact<T>;
|
|
123
123
|
export declare function resolveVerifiedFactForSurface<T>(fact: BrandlabFact<T>, surface: BrandlabEvidenceSurface, asOf?: Date): T | undefined;
|
|
124
124
|
export declare function defineBrandlabBusiness<const T extends BrandlabBusiness>(business: T): T;
|
|
125
|
+
/**
|
|
126
|
+
* The business facts as a site displays them: the verified values without their
|
|
127
|
+
* evidence (unknown and not-applicable facts are absent). Client components read
|
|
128
|
+
* these from `src/data/business.ts`; the evidence stays in the server-only
|
|
129
|
+
* `src/data/businessEvidence.ts`, which declares the facts over these values with
|
|
130
|
+
* `defineBrandlabBusiness` (3.2.1).
|
|
131
|
+
*/
|
|
132
|
+
export interface BrandlabBusinessFactValues {
|
|
133
|
+
identity: {
|
|
134
|
+
tradingName: string;
|
|
135
|
+
legalName?: string;
|
|
136
|
+
};
|
|
137
|
+
canonicalUrl: string;
|
|
138
|
+
contact?: {
|
|
139
|
+
phone?: BrandlabPhoneNumber;
|
|
140
|
+
email?: string;
|
|
141
|
+
};
|
|
142
|
+
location: {
|
|
143
|
+
model: BrandlabBusiness['location']['model'];
|
|
144
|
+
addressVisibility: BrandlabBusiness['location']['addressVisibility'];
|
|
145
|
+
address?: BrandlabPostalAddress;
|
|
146
|
+
serviceAreas?: readonly BrandlabServiceArea[];
|
|
147
|
+
};
|
|
148
|
+
openingHours?: readonly BrandlabOpeningHours[];
|
|
149
|
+
registration?: {
|
|
150
|
+
abn?: string;
|
|
151
|
+
licences?: readonly BrandlabLicence[];
|
|
152
|
+
};
|
|
153
|
+
externalEntities?: {
|
|
154
|
+
googlePlaceId?: string;
|
|
155
|
+
sameAs?: readonly string[];
|
|
156
|
+
};
|
|
157
|
+
}
|
|
125
158
|
export declare function deriveBusinessFacts(business: BrandlabBusiness): BrandlabDerivedBusinessFacts;
|
|
159
|
+
/**
|
|
160
|
+
* What `deriveBusinessFacts` gives, from the display values alone (3.2.1), for
|
|
161
|
+
* the client-safe modules that derive links and labels from the facts. The values
|
|
162
|
+
* are checked as `defineBrandlabBusiness` checks the facts; proof references carry
|
|
163
|
+
* evidence, so they are never part of the display values (`proof` is empty).
|
|
164
|
+
*/
|
|
165
|
+
export declare function deriveBusinessDisplayFacts(values: BrandlabBusinessFactValues): BrandlabDerivedBusinessFacts;
|
|
126
166
|
//# sourceMappingURL=business.d.ts.map
|
package/dist/business.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"business.d.ts","sourceRoot":"","sources":["../src/business.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAAA;AAEzE,eAAO,MAAM,8BAA8B,sMAUjC,CAAA;AAEV,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD,eAAO,MAAM,0BAA0B,gGAQ7B,CAAA;AAEV,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,0BAA0B,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,SAAS,uBAAuB,EAAE,CAAA;CACpD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,iBAAiB,CAAA;CAC5B;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IACtB,YAAY,CAAC,CAAC,CAAC,GACf;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD,MAAM,WAAW,mBAAmB;IAClC,8FAA8F;IAC9F,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;CACzD;AAED,MAAM,MAAM,uBAAuB,GAC/B,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAA;AAEZ,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,uBAAuB,EAAE,CAAA;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,eAAe,GAAG,SAAS,GAAG,iBAAiB,CAAA;IAC5E,QAAQ,EAAE,iBAAiB,CAAA;CAC5B;AAmBD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG;YAAE,MAAM,EAAE,UAAU,CAAA;SAAE,CAAA;QAC1D,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;KAChC,CAAA;IACD,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE,CAAA;IAC3D,OAAO,EAAE;QACP,KAAK,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAA;QACxC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;KAC5B,CAAA;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,cAAc,GAAG,mBAAmB,GAAG,QAAQ,CAAA;QACtD,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAA;QACzD,OAAO,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAA;QAC5C,YAAY,EAAE,YAAY,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAA;KAC3D,CAAA;IACD,YAAY,EAAE,YAAY,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAA;IAC3D,YAAY,EAAE;QACZ,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;QACzB,QAAQ,EAAE,YAAY,CAAC,SAAS,eAAe,EAAE,CAAC,CAAA;KACnD,CAAA;IACD,gBAAgB,EAAE;QAChB,aAAa,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;QACnC,MAAM,EAAE,YAAY,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;KACxC,CAAA;IACD,qFAAqF;IACrF,KAAK,CAAC,EAAE,YAAY,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAAA;CACxD;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,mBAAmB,GAAG;QAC5B,MAAM,EAAE,MAAM,CAAA;QACd;;;WAGG;QACH,aAAa,EAAE,OAAO,CAAA;QACtB,sHAAsH;QACtH,OAAO,EAAE,MAAM,CAAA;QACf,oHAAoH;QACpH,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,YAAY,EAAE,SAAS,mBAAmB,EAAE,CAAA;IAC5C,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAA;CACzC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,GAC1B,YAAY,CAAC,CAAC,CAAC,CAMjB;AAED,wBAAgB,WAAW,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAEhD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAEpE;AAED,wBAAgB,6BAA6B,CAAC,CAAC,EAC7C,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,OAAO,EAAE,uBAAuB,EAChC,IAAI,GAAE,IAAiB,GACtB,CAAC,GAAG,SAAS,CAUf;AA6PD,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,CAAC,SAAS,gBAAgB,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"business.d.ts","sourceRoot":"","sources":["../src/business.ts"],"names":[],"mappings":"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"}
|
package/dist/business.js
CHANGED
|
@@ -275,56 +275,12 @@ export function defineBrandlabBusiness(business) {
|
|
|
275
275
|
assertFact(business.contact.phone, 'contact.phone', assertPhone);
|
|
276
276
|
assertFact(business.contact.email, 'contact.email', assertEmail);
|
|
277
277
|
assertFact(business.location.address, 'location.address', assertAddress);
|
|
278
|
-
assertFact(business.location.serviceAreas, 'location.serviceAreas',
|
|
279
|
-
|
|
280
|
-
areas.forEach((area, index) => {
|
|
281
|
-
assertExactKeys(area, ['id', 'name', 'kind'], `location.serviceAreas.value[${index}]`);
|
|
282
|
-
assertText(area.name, `location.serviceAreas.value[${index}].name`);
|
|
283
|
-
if (area.name.trim() !== area.name || area.name.length > 160) {
|
|
284
|
-
throw new Error(`location.serviceAreas.value[${index}].name must be bounded canonical text.`);
|
|
285
|
-
}
|
|
286
|
-
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(area.id)) {
|
|
287
|
-
throw new Error(`location.serviceAreas.value[${index}].id must be lowercase kebab-case.`);
|
|
288
|
-
}
|
|
289
|
-
if (!['city', 'region', 'suburb', 'state', 'country'].includes(area.kind)) {
|
|
290
|
-
throw new Error(`location.serviceAreas.value[${index}].kind is invalid.`);
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
});
|
|
294
|
-
assertFact(business.openingHours, 'openingHours', (hours) => {
|
|
295
|
-
const allDays = [];
|
|
296
|
-
hours.forEach((period, index) => {
|
|
297
|
-
assertExactKeys(period, ['days', 'opens', 'closes'], `openingHours.value[${index}]`);
|
|
298
|
-
if (period.days.length === 0) {
|
|
299
|
-
throw new Error(`openingHours.value[${index}].days cannot be empty.`);
|
|
300
|
-
}
|
|
301
|
-
assertUniqueStrings(period.days, `openingHours.value[${index}].days`);
|
|
302
|
-
if (period.days.some((day) => !BRANDLAB_OPENING_HOURS_DAYS.has(day))) {
|
|
303
|
-
throw new Error(`openingHours.value[${index}].days contains an invalid day.`);
|
|
304
|
-
}
|
|
305
|
-
allDays.push(...period.days);
|
|
306
|
-
assertTime(period.opens, `openingHours.value[${index}].opens`);
|
|
307
|
-
assertTime(period.closes, `openingHours.value[${index}].closes`);
|
|
308
|
-
});
|
|
309
|
-
assertUniqueStrings(allDays, 'openingHours.value.days');
|
|
310
|
-
});
|
|
278
|
+
assertFact(business.location.serviceAreas, 'location.serviceAreas', assertServiceAreas);
|
|
279
|
+
assertFact(business.openingHours, 'openingHours', assertOpeningHours);
|
|
311
280
|
assertFact(business.registration.abn, 'registration.abn', assertAbn);
|
|
312
|
-
assertFact(business.registration.licences, 'registration.licences',
|
|
313
|
-
assertUniqueStrings(licences.map((licence) => licence.identifier), 'registration.licences.value.identifiers');
|
|
314
|
-
licences.forEach((licence, index) => {
|
|
315
|
-
assertExactKeys(licence, ['name', 'identifier', 'jurisdiction'], `registration.licences.value[${index}]`);
|
|
316
|
-
assertText(licence.name, `registration.licences.value[${index}].name`);
|
|
317
|
-
assertText(licence.identifier, `registration.licences.value[${index}].identifier`);
|
|
318
|
-
if (licence.jurisdiction !== undefined) {
|
|
319
|
-
assertText(licence.jurisdiction, `registration.licences.value[${index}].jurisdiction`, 120);
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
});
|
|
281
|
+
assertFact(business.registration.licences, 'registration.licences', assertLicences);
|
|
323
282
|
assertFact(business.externalEntities.googlePlaceId, 'externalEntities.googlePlaceId');
|
|
324
|
-
assertFact(business.externalEntities.sameAs, 'externalEntities.sameAs',
|
|
325
|
-
assertUniqueStrings(urls, 'externalEntities.sameAs.value');
|
|
326
|
-
urls.forEach((url, index) => assertAbsoluteHttpsUrl(url, `externalEntities.sameAs.value[${index}]`));
|
|
327
|
-
});
|
|
283
|
+
assertFact(business.externalEntities.sameAs, 'externalEntities.sameAs', assertSameAs);
|
|
328
284
|
if (business.proof) {
|
|
329
285
|
assertFact(business.proof, 'proof', (proof) => {
|
|
330
286
|
assertUniqueIds(proof, 'proof.value');
|
|
@@ -337,41 +293,119 @@ export function defineBrandlabBusiness(business) {
|
|
|
337
293
|
});
|
|
338
294
|
});
|
|
339
295
|
}
|
|
340
|
-
|
|
341
|
-
business.location.
|
|
296
|
+
assertLocationModel({
|
|
297
|
+
model: business.location.model,
|
|
298
|
+
addressVisibility: business.location.addressVisibility,
|
|
299
|
+
address: verifiedValue(business.location.address),
|
|
300
|
+
serviceAreas: verifiedValue(business.location.serviceAreas),
|
|
301
|
+
});
|
|
302
|
+
return business;
|
|
303
|
+
}
|
|
304
|
+
function assertLocationModel(location) {
|
|
305
|
+
if (location.addressVisibility === 'not-applicable' && location.address) {
|
|
342
306
|
throw new Error('A verified address cannot use addressVisibility "not-applicable".');
|
|
343
307
|
}
|
|
344
|
-
if (
|
|
345
|
-
business.location.address.status !== 'verified') {
|
|
308
|
+
if (location.addressVisibility === 'public' && !location.address) {
|
|
346
309
|
throw new Error('A public address must have verified address facts.');
|
|
347
310
|
}
|
|
348
|
-
if (
|
|
349
|
-
business.location.addressVisibility === 'public') {
|
|
311
|
+
if (location.model === 'service-area' && location.addressVisibility === 'public') {
|
|
350
312
|
throw new Error('A service-area business cannot expose a public address.');
|
|
351
313
|
}
|
|
352
|
-
if (
|
|
353
|
-
business.location.addressVisibility !== 'public') {
|
|
314
|
+
if (location.model === 'physical-location' && location.addressVisibility !== 'public') {
|
|
354
315
|
throw new Error('A physical-location business must expose its verified public address.');
|
|
355
316
|
}
|
|
356
|
-
if ((
|
|
357
|
-
(
|
|
358
|
-
business.location.serviceAreas.value.length === 0)) {
|
|
317
|
+
if ((location.model === 'service-area' || location.model === 'hybrid') &&
|
|
318
|
+
(!location.serviceAreas || location.serviceAreas.length === 0)) {
|
|
359
319
|
throw new Error('Service-area and hybrid businesses require verified service areas.');
|
|
360
320
|
}
|
|
361
|
-
|
|
321
|
+
}
|
|
322
|
+
function assertServiceAreas(areas) {
|
|
323
|
+
assertUniqueIds(areas, 'location.serviceAreas.value');
|
|
324
|
+
areas.forEach((area, index) => {
|
|
325
|
+
assertExactKeys(area, ['id', 'name', 'kind'], `location.serviceAreas.value[${index}]`);
|
|
326
|
+
assertText(area.name, `location.serviceAreas.value[${index}].name`);
|
|
327
|
+
if (area.name.trim() !== area.name || area.name.length > 160) {
|
|
328
|
+
throw new Error(`location.serviceAreas.value[${index}].name must be bounded canonical text.`);
|
|
329
|
+
}
|
|
330
|
+
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(area.id)) {
|
|
331
|
+
throw new Error(`location.serviceAreas.value[${index}].id must be lowercase kebab-case.`);
|
|
332
|
+
}
|
|
333
|
+
if (!['city', 'region', 'suburb', 'state', 'country'].includes(area.kind)) {
|
|
334
|
+
throw new Error(`location.serviceAreas.value[${index}].kind is invalid.`);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
function assertOpeningHours(hours) {
|
|
339
|
+
const allDays = [];
|
|
340
|
+
hours.forEach((period, index) => {
|
|
341
|
+
assertExactKeys(period, ['days', 'opens', 'closes'], `openingHours.value[${index}]`);
|
|
342
|
+
if (period.days.length === 0) {
|
|
343
|
+
throw new Error(`openingHours.value[${index}].days cannot be empty.`);
|
|
344
|
+
}
|
|
345
|
+
assertUniqueStrings(period.days, `openingHours.value[${index}].days`);
|
|
346
|
+
if (period.days.some((day) => !BRANDLAB_OPENING_HOURS_DAYS.has(day))) {
|
|
347
|
+
throw new Error(`openingHours.value[${index}].days contains an invalid day.`);
|
|
348
|
+
}
|
|
349
|
+
allDays.push(...period.days);
|
|
350
|
+
assertTime(period.opens, `openingHours.value[${index}].opens`);
|
|
351
|
+
assertTime(period.closes, `openingHours.value[${index}].closes`);
|
|
352
|
+
});
|
|
353
|
+
assertUniqueStrings(allDays, 'openingHours.value.days');
|
|
354
|
+
}
|
|
355
|
+
function assertLicences(licences) {
|
|
356
|
+
assertUniqueStrings(licences.map((licence) => licence.identifier), 'registration.licences.value.identifiers');
|
|
357
|
+
licences.forEach((licence, index) => {
|
|
358
|
+
assertExactKeys(licence, ['name', 'identifier', 'jurisdiction'], `registration.licences.value[${index}]`);
|
|
359
|
+
assertText(licence.name, `registration.licences.value[${index}].name`);
|
|
360
|
+
assertText(licence.identifier, `registration.licences.value[${index}].identifier`);
|
|
361
|
+
if (licence.jurisdiction !== undefined) {
|
|
362
|
+
assertText(licence.jurisdiction, `registration.licences.value[${index}].jurisdiction`, 120);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
function assertSameAs(urls) {
|
|
367
|
+
assertUniqueStrings(urls, 'externalEntities.sameAs.value');
|
|
368
|
+
urls.forEach((url, index) => assertAbsoluteHttpsUrl(url, `externalEntities.sameAs.value[${index}]`));
|
|
362
369
|
}
|
|
363
370
|
function verifiedValue(fact) {
|
|
364
371
|
return fact.status === 'verified' ? fact.value : undefined;
|
|
365
372
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
373
|
+
function factValues(business) {
|
|
374
|
+
return {
|
|
375
|
+
identity: {
|
|
376
|
+
tradingName: business.identity.tradingName.value,
|
|
377
|
+
...(verifiedValue(business.identity.legalName) !== undefined ? { legalName: verifiedValue(business.identity.legalName) } : {}),
|
|
378
|
+
},
|
|
379
|
+
canonicalUrl: business.canonicalUrl.value,
|
|
380
|
+
contact: {
|
|
381
|
+
...(verifiedValue(business.contact.phone) ? { phone: verifiedValue(business.contact.phone) } : {}),
|
|
382
|
+
...(verifiedValue(business.contact.email) !== undefined ? { email: verifiedValue(business.contact.email) } : {}),
|
|
383
|
+
},
|
|
384
|
+
location: {
|
|
385
|
+
model: business.location.model,
|
|
386
|
+
addressVisibility: business.location.addressVisibility,
|
|
387
|
+
...(verifiedValue(business.location.address) ? { address: verifiedValue(business.location.address) } : {}),
|
|
388
|
+
...(verifiedValue(business.location.serviceAreas) ? { serviceAreas: verifiedValue(business.location.serviceAreas) } : {}),
|
|
389
|
+
},
|
|
390
|
+
...(verifiedValue(business.openingHours) ? { openingHours: verifiedValue(business.openingHours) } : {}),
|
|
391
|
+
registration: {
|
|
392
|
+
...(verifiedValue(business.registration.abn) !== undefined ? { abn: verifiedValue(business.registration.abn) } : {}),
|
|
393
|
+
...(verifiedValue(business.registration.licences) ? { licences: verifiedValue(business.registration.licences) } : {}),
|
|
394
|
+
},
|
|
395
|
+
externalEntities: {
|
|
396
|
+
...(verifiedValue(business.externalEntities.googlePlaceId) !== undefined ? { googlePlaceId: verifiedValue(business.externalEntities.googlePlaceId) } : {}),
|
|
397
|
+
...(verifiedValue(business.externalEntities.sameAs) ? { sameAs: verifiedValue(business.externalEntities.sameAs) } : {}),
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
function deriveFromValues(values) {
|
|
402
|
+
const canonicalUrl = new URL(values.canonicalUrl).origin;
|
|
403
|
+
const phone = values.contact?.phone;
|
|
404
|
+
const address = values.location.address;
|
|
371
405
|
return {
|
|
372
|
-
tradingName:
|
|
373
|
-
...(
|
|
374
|
-
? { legalName:
|
|
406
|
+
tradingName: values.identity.tradingName,
|
|
407
|
+
...(values.identity.legalName !== undefined
|
|
408
|
+
? { legalName: values.identity.legalName }
|
|
375
409
|
: {}),
|
|
376
410
|
canonicalUrl,
|
|
377
411
|
canonicalDomain: new URL(canonicalUrl).hostname,
|
|
@@ -387,23 +421,85 @@ export function deriveBusinessFacts(business) {
|
|
|
387
421
|
},
|
|
388
422
|
}
|
|
389
423
|
: {}),
|
|
390
|
-
...(
|
|
391
|
-
? { email:
|
|
424
|
+
...(values.contact?.email !== undefined
|
|
425
|
+
? { email: values.contact.email.trim().toLowerCase() }
|
|
392
426
|
: {}),
|
|
393
|
-
...(
|
|
427
|
+
...(values.location.addressVisibility === 'public' && address
|
|
394
428
|
? { publicAddress: address }
|
|
395
429
|
: {}),
|
|
396
|
-
serviceAreas:
|
|
397
|
-
openingHours:
|
|
398
|
-
...(
|
|
399
|
-
? { abn: normalizeAbn(
|
|
430
|
+
serviceAreas: values.location.serviceAreas ?? [],
|
|
431
|
+
openingHours: values.openingHours ?? [],
|
|
432
|
+
...(values.registration?.abn !== undefined
|
|
433
|
+
? { abn: normalizeAbn(values.registration.abn) }
|
|
400
434
|
: {}),
|
|
401
|
-
licences:
|
|
402
|
-
...(
|
|
403
|
-
? { googlePlaceId:
|
|
435
|
+
licences: values.registration?.licences ?? [],
|
|
436
|
+
...(values.externalEntities?.googlePlaceId !== undefined
|
|
437
|
+
? { googlePlaceId: values.externalEntities.googlePlaceId }
|
|
404
438
|
: {}),
|
|
405
|
-
sameAs:
|
|
439
|
+
sameAs: values.externalEntities?.sameAs ?? [],
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
export function deriveBusinessFacts(business) {
|
|
443
|
+
defineBrandlabBusiness(business);
|
|
444
|
+
return {
|
|
445
|
+
...deriveFromValues(factValues(business)),
|
|
406
446
|
proof: business.proof ? verifiedValue(business.proof) ?? [] : [],
|
|
407
447
|
};
|
|
408
448
|
}
|
|
449
|
+
/**
|
|
450
|
+
* What `deriveBusinessFacts` gives, from the display values alone (3.2.1), for
|
|
451
|
+
* the client-safe modules that derive links and labels from the facts. The values
|
|
452
|
+
* are checked as `defineBrandlabBusiness` checks the facts; proof references carry
|
|
453
|
+
* evidence, so they are never part of the display values (`proof` is empty).
|
|
454
|
+
*/
|
|
455
|
+
export function deriveBusinessDisplayFacts(values) {
|
|
456
|
+
assertBusinessFactValues(values);
|
|
457
|
+
return { ...deriveFromValues(values), proof: [] };
|
|
458
|
+
}
|
|
459
|
+
function assertBusinessFactValues(values) {
|
|
460
|
+
if (!values || typeof values !== 'object')
|
|
461
|
+
throw new Error('The business fact values must be an object.');
|
|
462
|
+
assertExactKeys(values, ['identity', 'canonicalUrl', 'contact', 'location', 'openingHours', 'registration', 'externalEntities'], 'business values');
|
|
463
|
+
assertExactKeys(values.identity, ['tradingName', 'legalName'], 'identity');
|
|
464
|
+
assertText(values.identity.tradingName, 'identity.tradingName.value');
|
|
465
|
+
if (values.identity.legalName !== undefined)
|
|
466
|
+
assertText(values.identity.legalName, 'identity.legalName.value');
|
|
467
|
+
assertText(values.canonicalUrl, 'canonicalUrl.value');
|
|
468
|
+
assertAbsoluteHttpsUrl(values.canonicalUrl, 'canonicalUrl.value', true);
|
|
469
|
+
if (values.contact !== undefined) {
|
|
470
|
+
assertExactKeys(values.contact, ['phone', 'email'], 'contact');
|
|
471
|
+
if (values.contact.phone !== undefined)
|
|
472
|
+
assertPhone(values.contact.phone);
|
|
473
|
+
if (values.contact.email !== undefined)
|
|
474
|
+
assertEmail(values.contact.email);
|
|
475
|
+
}
|
|
476
|
+
assertExactKeys(values.location, ['model', 'addressVisibility', 'address', 'serviceAreas'], 'location');
|
|
477
|
+
if (!['service-area', 'physical-location', 'hybrid'].includes(values.location.model)) {
|
|
478
|
+
throw new Error('location.model is invalid.');
|
|
479
|
+
}
|
|
480
|
+
if (!['public', 'hidden', 'not-applicable'].includes(values.location.addressVisibility)) {
|
|
481
|
+
throw new Error('location.addressVisibility is invalid.');
|
|
482
|
+
}
|
|
483
|
+
if (values.location.address !== undefined)
|
|
484
|
+
assertAddress(values.location.address);
|
|
485
|
+
if (values.location.serviceAreas !== undefined)
|
|
486
|
+
assertServiceAreas(values.location.serviceAreas);
|
|
487
|
+
if (values.openingHours !== undefined)
|
|
488
|
+
assertOpeningHours(values.openingHours);
|
|
489
|
+
if (values.registration !== undefined) {
|
|
490
|
+
assertExactKeys(values.registration, ['abn', 'licences'], 'registration');
|
|
491
|
+
if (values.registration.abn !== undefined)
|
|
492
|
+
assertAbn(values.registration.abn);
|
|
493
|
+
if (values.registration.licences !== undefined)
|
|
494
|
+
assertLicences(values.registration.licences);
|
|
495
|
+
}
|
|
496
|
+
if (values.externalEntities !== undefined) {
|
|
497
|
+
assertExactKeys(values.externalEntities, ['googlePlaceId', 'sameAs'], 'externalEntities');
|
|
498
|
+
if (values.externalEntities.googlePlaceId !== undefined)
|
|
499
|
+
assertText(values.externalEntities.googlePlaceId, 'externalEntities.googlePlaceId.value');
|
|
500
|
+
if (values.externalEntities.sameAs !== undefined)
|
|
501
|
+
assertSameAs(values.externalEntities.sameAs);
|
|
502
|
+
}
|
|
503
|
+
assertLocationModel(values.location);
|
|
504
|
+
}
|
|
409
505
|
//# sourceMappingURL=business.js.map
|
package/dist/business.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"business.js","sourceRoot":"","sources":["../src/business.ts"],"names":[],"mappings":"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","sourcesContent":["export type VerificationState = 'verified' | 'unknown' | 'not-applicable'\n\nexport const BRANDLAB_EVIDENCE_SOURCE_KINDS = [\n 'official-registry',\n 'google-business-profile',\n 'client-document',\n 'client-confirmation',\n 'first-party-record',\n 'public-authority',\n 'asset-rights',\n 'other-independent',\n 'synthetic-test',\n] as const\n\nexport type BrandlabEvidenceSourceKind =\n (typeof BRANDLAB_EVIDENCE_SOURCE_KINDS)[number]\n\nexport const BRANDLAB_EVIDENCE_SURFACES = [\n 'website-copy',\n 'metadata',\n 'schema',\n 'reviews',\n 'projects',\n 'images',\n 'operations',\n] as const\n\nexport type BrandlabEvidenceSurface =\n (typeof BRANDLAB_EVIDENCE_SURFACES)[number]\n\nexport interface EvidenceReference {\n sourceKind: BrandlabEvidenceSourceKind\n reference: string\n verifiedAt: string\n expiresAt?: string\n allowedSurfaces: readonly BrandlabEvidenceSurface[]\n}\n\nexport interface VerifiedFact<T> {\n status: 'verified'\n value: T\n evidence: EvidenceReference\n}\n\nexport type BrandlabFact<T> =\n | VerifiedFact<T>\n | { status: 'unknown' }\n | { status: 'not-applicable'; reason: string }\n\nexport interface BrandlabPhoneNumber {\n /** As the business shows it, for example \"02 9000 1234\", \"0412 345 678\" or \"1300 329 600\". */\n display: string\n /**\n * E.164 form: \"+61290001234\". A 13, 1300 or 1800 number keeps its national\n * digits after +61 (\"+611300329600\", \"+61131234\").\n */\n e164: string\n}\n\nexport interface BrandlabPostalAddress {\n streetAddress: string\n addressLocality: string\n addressRegion: string\n postalCode: string\n addressCountry: string\n}\n\nexport interface BrandlabServiceArea {\n id: string\n name: string\n kind: 'city' | 'region' | 'suburb' | 'state' | 'country'\n}\n\nexport type BrandlabOpeningHoursDay =\n | 'Monday'\n | 'Tuesday'\n | 'Wednesday'\n | 'Thursday'\n | 'Friday'\n | 'Saturday'\n | 'Sunday'\n\nexport interface BrandlabOpeningHours {\n days: readonly BrandlabOpeningHoursDay[]\n opens: string\n closes: string\n}\n\nexport interface BrandlabLicence {\n name: string\n identifier: string\n jurisdiction?: string\n}\n\nexport interface BrandlabProofReference {\n id: string\n kind: 'project' | 'review' | 'accreditation' | 'licence' | 'external-source'\n evidence: EvidenceReference\n}\n\nconst BRANDLAB_PROOF_KINDS = new Set<BrandlabProofReference['kind']>([\n 'project',\n 'review',\n 'accreditation',\n 'licence',\n 'external-source',\n])\nconst BRANDLAB_OPENING_HOURS_DAYS = new Set<BrandlabOpeningHoursDay>([\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n])\n\nexport interface BrandlabBusiness {\n identity: {\n tradingName: BrandlabFact<string> & { status: 'verified' }\n legalName: BrandlabFact<string>\n }\n canonicalUrl: BrandlabFact<string> & { status: 'verified' }\n contact: {\n phone: BrandlabFact<BrandlabPhoneNumber>\n email: BrandlabFact<string>\n }\n location: {\n model: 'service-area' | 'physical-location' | 'hybrid'\n addressVisibility: 'public' | 'hidden' | 'not-applicable'\n address: BrandlabFact<BrandlabPostalAddress>\n serviceAreas: BrandlabFact<readonly BrandlabServiceArea[]>\n }\n openingHours: BrandlabFact<readonly BrandlabOpeningHours[]>\n registration: {\n abn: BrandlabFact<string>\n licences: BrandlabFact<readonly BrandlabLicence[]>\n }\n externalEntities: {\n googlePlaceId: BrandlabFact<string>\n sameAs: BrandlabFact<readonly string[]>\n }\n /** Optional structured proof references for projects that use them operationally. */\n proof?: BrandlabFact<readonly BrandlabProofReference[]>\n}\n\nexport interface BrandlabDerivedBusinessFacts {\n tradingName: string\n legalName?: string\n canonicalUrl: string\n canonicalDomain: string\n phone?: BrandlabPhoneNumber & {\n digits: string\n /**\n * An Australian 13, 1300 or 1800 number: callable only within Australia\n * and only as dialled nationally.\n */\n nonGeographic: boolean\n /** `tel:+61…` for landline and mobile numbers; the national digits (`tel:1300329600`) for a non-geographic number. */\n telHref: string\n /** Schema.org `telephone`: E.164 for landline and mobile numbers, the displayed number for a non-geographic one. */\n schemaTelephone: string\n }\n email?: string\n publicAddress?: BrandlabPostalAddress\n serviceAreas: readonly BrandlabServiceArea[]\n openingHours: readonly BrandlabOpeningHours[]\n abn?: string\n licences: readonly BrandlabLicence[]\n googlePlaceId?: string\n sameAs: readonly string[]\n proof: readonly BrandlabProofReference[]\n}\n\nexport function verifiedFact<T>(\n value: T,\n evidence: EvidenceReference,\n): VerifiedFact<T> {\n return {\n status: 'verified',\n value,\n evidence,\n }\n}\n\nexport function unknownFact<T>(): BrandlabFact<T> {\n return { status: 'unknown' }\n}\n\nexport function notApplicableFact<T>(reason: string): BrandlabFact<T> {\n return { status: 'not-applicable', reason }\n}\n\nexport function resolveVerifiedFactForSurface<T>(\n fact: BrandlabFact<T>,\n surface: BrandlabEvidenceSurface,\n asOf: Date = new Date(),\n): T | undefined {\n if (fact.status !== 'verified') return undefined\n if (!fact.evidence.allowedSurfaces.includes(surface)) return undefined\n if (\n fact.evidence.expiresAt &&\n Date.parse(fact.evidence.expiresAt) < asOf.getTime()\n ) {\n return undefined\n }\n return fact.value\n}\n\nfunction assertText(value: unknown, field: string, maximum = 500) {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n value.trim() !== value ||\n value.length > maximum ||\n /[\\u0000-\\u001f\\u007f]/.test(value)\n ) {\n throw new Error(`${field} must be bounded, trimmed text.`)\n }\n}\n\nfunction assertDate(value: string | undefined, field: string) {\n if (\n value !== undefined &&\n (!/^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z)?$/.test(value) ||\n Number.isNaN(Date.parse(value)))\n ) {\n throw new Error(`${field} must be a valid ISO date or UTC timestamp.`)\n }\n}\n\nconst BRANDLAB_EVIDENCE_SOURCE_KIND_SET = new Set<BrandlabEvidenceSourceKind>(\n BRANDLAB_EVIDENCE_SOURCE_KINDS,\n)\nconst BRANDLAB_EVIDENCE_SURFACE_SET = new Set<BrandlabEvidenceSurface>(\n BRANDLAB_EVIDENCE_SURFACES,\n)\nconst CIRCULAR_EVIDENCE_PREFIX =\n /^(?:existing-production-config|repository-config|source-code):/i\n\nfunction assertEvidenceReference(\n evidence: EvidenceReference,\n field: string,\n) {\n assertExactKeys(\n evidence,\n ['sourceKind', 'reference', 'verifiedAt', 'expiresAt', 'allowedSurfaces'],\n field,\n )\n if (!BRANDLAB_EVIDENCE_SOURCE_KIND_SET.has(evidence.sourceKind)) {\n throw new Error(`${field}.sourceKind is invalid.`)\n }\n assertText(evidence.reference, `${field}.reference`)\n if (CIRCULAR_EVIDENCE_PREFIX.test(evidence.reference)) {\n throw new Error(\n `${field}.reference cannot cite repository configuration as independent verification.`,\n )\n }\n assertDate(evidence.verifiedAt, `${field}.verifiedAt`)\n assertDate(evidence.expiresAt, `${field}.expiresAt`)\n if (\n evidence.expiresAt &&\n Date.parse(evidence.expiresAt) < Date.parse(evidence.verifiedAt)\n ) {\n throw new Error(`${field}.expiresAt cannot precede verifiedAt.`)\n }\n if (\n !Array.isArray(evidence.allowedSurfaces) ||\n evidence.allowedSurfaces.length === 0\n ) {\n throw new Error(`${field}.allowedSurfaces cannot be empty.`)\n }\n assertUniqueStrings(evidence.allowedSurfaces, `${field}.allowedSurfaces`)\n if (\n evidence.allowedSurfaces.some(\n (surface) => !BRANDLAB_EVIDENCE_SURFACE_SET.has(surface),\n )\n ) {\n throw new Error(`${field}.allowedSurfaces contains an invalid surface.`)\n }\n}\n\nfunction assertExactKeys(\n value: unknown,\n allowed: readonly string[],\n field: string,\n) {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n ) {\n throw new Error(`${field} must be a plain object.`)\n }\n const unknown = Object.keys(value).find((key) => !allowed.includes(key))\n if (unknown) throw new Error(`${field}.${unknown} is not a supported business fact key.`)\n}\n\nfunction assertFact<T>(fact: BrandlabFact<T>, field: string, validate?: (value: T) => void) {\n if (!fact || typeof fact !== 'object' || Array.isArray(fact)) {\n throw new Error(`${field} must be a typed Brandlab fact.`)\n }\n const record = fact as BrandlabFact<T> & Record<string, unknown>\n if (record.status === 'verified') {\n const verified = record as Extract<BrandlabFact<T>, { status: 'verified' }> &\n Record<string, unknown>\n if (!Object.prototype.hasOwnProperty.call(verified, 'value') || verified.value === undefined) {\n throw new Error(`${field}.value is required for a verified fact.`)\n }\n assertExactKeys(verified, ['status', 'value', 'evidence'], field)\n assertEvidenceReference(verified.evidence, `${field}.evidence`)\n if (typeof verified.value === 'string') assertText(verified.value, `${field}.value`)\n validate?.(verified.value)\n } else if (record.status === 'unknown') {\n if (Object.prototype.hasOwnProperty.call(record, 'value')) {\n throw new Error(`${field} cannot carry a value while its status is unknown.`)\n }\n assertExactKeys(record, ['status'], field)\n } else if (record.status === 'not-applicable') {\n if (Object.prototype.hasOwnProperty.call(record, 'value')) {\n throw new Error(`${field} cannot carry a value while it is not applicable.`)\n }\n assertExactKeys(record, ['status', 'reason'], field)\n assertText(record.reason, `${field}.reason`)\n } else {\n throw new Error(`${field}.status must be verified, unknown or not-applicable.`)\n }\n}\n\nfunction assertAbsoluteHttpsUrl(value: string, field: string, requireOrigin = false) {\n let url: URL\n try {\n url = new URL(value)\n } catch {\n throw new Error(`${field} must be an absolute HTTPS URL.`)\n }\n\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n (requireOrigin && (url.pathname !== '/' || url.search || url.hash))\n ) {\n throw new Error(`${field} must be an absolute HTTPS URL.`)\n }\n}\n\nfunction assertUniqueStrings(values: readonly string[], field: string) {\n const duplicate = values.find((value, index) => values.indexOf(value) !== index)\n if (duplicate) throw new Error(`${field} contains duplicate value \"${duplicate}\".`)\n}\n\nfunction assertTime(value: string, field: string) {\n if (!/^(?:[01]\\d|2[0-3]):[0-5]\\d$/.test(value)) {\n throw new Error(`${field} must use a valid 24-hour HH:MM time.`)\n }\n}\n\nfunction assertAddress(address: BrandlabPostalAddress) {\n assertExactKeys(\n address,\n [\n 'streetAddress',\n 'addressLocality',\n 'addressRegion',\n 'postalCode',\n 'addressCountry',\n ],\n 'location.address.value',\n )\n Object.entries(address).forEach(([field, value]) =>\n assertText(value, `location.address.value.${field}`, 200),\n )\n if (address.addressCountry !== 'AU') {\n throw new Error('location.address.value.addressCountry must be \"AU\".')\n }\n if (!/^[A-Z]{2,3}$/.test(address.addressRegion)) {\n throw new Error('location.address.value.addressRegion must be an uppercase Australian region.')\n }\n if (!/^\\d{4}$/.test(address.postalCode)) {\n throw new Error('location.address.value.postalCode must be a four-digit Australian postcode.')\n }\n}\n\n/** Landline and mobile numbers: +61 then a 2, 3, 4, 7 or 8 area or mobile prefix. */\nconst AUSTRALIAN_GEOGRAPHIC_E164 = /^\\+61[23478]\\d{8}$/\n/** Non-geographic numbers: 13 xx xx, 1300 xxx xxx and 1800 xxx xxx. */\nconst AUSTRALIAN_NON_GEOGRAPHIC_E164 = /^\\+61(?:1[38]00\\d{6}|13(?!00)\\d{4})$/\n\nfunction isNonGeographicPhone(e164: string) {\n return AUSTRALIAN_NON_GEOGRAPHIC_E164.test(e164)\n}\n\nfunction assertPhone(phone: BrandlabPhoneNumber) {\n assertExactKeys(phone, ['display', 'e164'], 'contact.phone.value')\n assertText(phone.display, 'contact.phone.value.display')\n if (\n phone.display.trim() !== phone.display ||\n phone.display.length > 32 ||\n !/^[+()\\d\\s.-]+$/.test(phone.display)\n ) {\n throw new Error('contact.phone.value.display must be a bounded Australian phone number.')\n }\n const nonGeographic = isNonGeographicPhone(phone.e164)\n if (!nonGeographic && !AUSTRALIAN_GEOGRAPHIC_E164.test(phone.e164)) {\n throw new Error(\n 'contact.phone.value.e164 must be a valid Australian E.164 number: a landline or mobile, or a 13, 1300 or 1800 number.',\n )\n }\n const national = phone.e164.slice(3)\n const displayDigits = phone.display.replace(/\\D/g, '')\n // A landline or mobile shows its trunk 0 or +61; a non-geographic number is shown as dialled.\n const sameNumber = displayDigits === `61${national}` ||\n displayDigits === (nonGeographic ? national : `0${national}`)\n if (!sameNumber) {\n throw new Error('contact.phone.value.display must identify the same number as e164.')\n }\n}\n\nfunction assertEmail(email: string) {\n if (\n email.length > 254 ||\n email.trim() !== email ||\n /[\\u0000-\\u001f\\u007f]/.test(email) ||\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)\n ) {\n throw new Error('contact.email.value must be a valid email address.')\n }\n}\n\nfunction normalizeAbn(value: string) {\n return value.replace(/\\s/g, '')\n}\n\nfunction assertAbn(value: string) {\n const digits = normalizeAbn(value)\n if (!/^\\d{11}$/.test(digits) || !/^\\d{2}(?: \\d{3}){3}$|^\\d{11}$/.test(value)) {\n throw new Error('registration.abn.value must be an 11-digit Australian Business Number.')\n }\n const weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n const numbers = [...digits].map(Number)\n numbers[0] = numbers[0]! - 1\n const checksum = numbers.reduce(\n (sum, digit, index) => sum + digit * weights[index]!,\n 0,\n )\n if (checksum % 89 !== 0) {\n throw new Error('registration.abn.value has an invalid ABN checksum.')\n }\n}\n\nfunction assertUniqueIds(records: readonly { id: string }[], field: string) {\n records.forEach((record, index) => assertText(record.id, `${field}[${index}].id`))\n const duplicate = records.find((record, index) =>\n records.slice(0, index).some((candidate) => candidate.id === record.id),\n )\n if (duplicate) throw new Error(`${field} contains duplicate ID \"${duplicate.id}\".`)\n}\n\nexport function defineBrandlabBusiness<const T extends BrandlabBusiness>(business: T): T {\n assertExactKeys(\n business,\n [\n 'identity',\n 'canonicalUrl',\n 'contact',\n 'location',\n 'openingHours',\n 'registration',\n 'externalEntities',\n 'proof',\n ],\n 'business',\n )\n assertExactKeys(business.identity, ['tradingName', 'legalName'], 'identity')\n assertExactKeys(business.contact, ['phone', 'email'], 'contact')\n assertExactKeys(\n business.location,\n ['model', 'addressVisibility', 'address', 'serviceAreas'],\n 'location',\n )\n assertExactKeys(business.registration, ['abn', 'licences'], 'registration')\n assertExactKeys(\n business.externalEntities,\n ['googlePlaceId', 'sameAs'],\n 'externalEntities',\n )\n if (!['service-area', 'physical-location', 'hybrid'].includes(business.location.model)) {\n throw new Error('location.model is invalid.')\n }\n if (!['public', 'hidden', 'not-applicable'].includes(business.location.addressVisibility)) {\n throw new Error('location.addressVisibility is invalid.')\n }\n assertFact(business.identity.tradingName, 'identity.tradingName')\n assertFact(business.identity.legalName, 'identity.legalName')\n assertFact(business.canonicalUrl, 'canonicalUrl', (value) =>\n assertAbsoluteHttpsUrl(value, 'canonicalUrl.value', true),\n )\n assertFact(business.contact.phone, 'contact.phone', assertPhone)\n assertFact(business.contact.email, 'contact.email', assertEmail)\n assertFact(business.location.address, 'location.address', assertAddress)\n assertFact(business.location.serviceAreas, 'location.serviceAreas', (areas) => {\n assertUniqueIds(areas, 'location.serviceAreas.value')\n areas.forEach((area, index) => {\n assertExactKeys(\n area,\n ['id', 'name', 'kind'],\n `location.serviceAreas.value[${index}]`,\n )\n assertText(area.name, `location.serviceAreas.value[${index}].name`)\n if (area.name.trim() !== area.name || area.name.length > 160) {\n throw new Error(`location.serviceAreas.value[${index}].name must be bounded canonical text.`)\n }\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(area.id)) {\n throw new Error(`location.serviceAreas.value[${index}].id must be lowercase kebab-case.`)\n }\n if (!['city', 'region', 'suburb', 'state', 'country'].includes(area.kind)) {\n throw new Error(`location.serviceAreas.value[${index}].kind is invalid.`)\n }\n })\n })\n assertFact(business.openingHours, 'openingHours', (hours) => {\n const allDays: BrandlabOpeningHoursDay[] = []\n hours.forEach((period, index) => {\n assertExactKeys(\n period,\n ['days', 'opens', 'closes'],\n `openingHours.value[${index}]`,\n )\n if (period.days.length === 0) {\n throw new Error(`openingHours.value[${index}].days cannot be empty.`)\n }\n assertUniqueStrings(period.days, `openingHours.value[${index}].days`)\n if (period.days.some((day) => !BRANDLAB_OPENING_HOURS_DAYS.has(day))) {\n throw new Error(`openingHours.value[${index}].days contains an invalid day.`)\n }\n allDays.push(...period.days)\n assertTime(period.opens, `openingHours.value[${index}].opens`)\n assertTime(period.closes, `openingHours.value[${index}].closes`)\n })\n assertUniqueStrings(allDays, 'openingHours.value.days')\n })\n assertFact(business.registration.abn, 'registration.abn', assertAbn)\n assertFact(business.registration.licences, 'registration.licences', (licences) => {\n assertUniqueStrings(\n licences.map((licence) => licence.identifier),\n 'registration.licences.value.identifiers',\n )\n licences.forEach((licence, index) => {\n assertExactKeys(\n licence,\n ['name', 'identifier', 'jurisdiction'],\n `registration.licences.value[${index}]`,\n )\n assertText(licence.name, `registration.licences.value[${index}].name`)\n assertText(licence.identifier, `registration.licences.value[${index}].identifier`)\n if (licence.jurisdiction !== undefined) {\n assertText(\n licence.jurisdiction,\n `registration.licences.value[${index}].jurisdiction`,\n 120,\n )\n }\n })\n })\n assertFact(business.externalEntities.googlePlaceId, 'externalEntities.googlePlaceId')\n assertFact(business.externalEntities.sameAs, 'externalEntities.sameAs', (urls) => {\n assertUniqueStrings(urls, 'externalEntities.sameAs.value')\n urls.forEach((url, index) =>\n assertAbsoluteHttpsUrl(url, `externalEntities.sameAs.value[${index}]`),\n )\n })\n if (business.proof) {\n assertFact(business.proof, 'proof', (proof) => {\n assertUniqueIds(proof, 'proof.value')\n proof.forEach((item, index) => {\n assertExactKeys(\n item,\n ['id', 'kind', 'evidence'],\n `proof.value[${index}]`,\n )\n if (!BRANDLAB_PROOF_KINDS.has(item.kind)) {\n throw new Error(`proof.value[${index}].kind is invalid.`)\n }\n assertEvidenceReference(\n item.evidence,\n `proof.value[${index}].evidence`,\n )\n })\n })\n }\n\n if (\n business.location.addressVisibility === 'not-applicable' &&\n business.location.address.status === 'verified'\n ) {\n throw new Error('A verified address cannot use addressVisibility \"not-applicable\".')\n }\n\n if (\n business.location.addressVisibility === 'public' &&\n business.location.address.status !== 'verified'\n ) {\n throw new Error('A public address must have verified address facts.')\n }\n\n if (\n business.location.model === 'service-area' &&\n business.location.addressVisibility === 'public'\n ) {\n throw new Error('A service-area business cannot expose a public address.')\n }\n\n if (\n business.location.model === 'physical-location' &&\n business.location.addressVisibility !== 'public'\n ) {\n throw new Error('A physical-location business must expose its verified public address.')\n }\n\n if (\n (business.location.model === 'service-area' || business.location.model === 'hybrid') &&\n (business.location.serviceAreas.status !== 'verified' ||\n business.location.serviceAreas.value.length === 0)\n ) {\n throw new Error('Service-area and hybrid businesses require verified service areas.')\n }\n\n return business\n}\n\nfunction verifiedValue<T>(fact: BrandlabFact<T>): T | undefined {\n return fact.status === 'verified' ? fact.value : undefined\n}\n\nexport function deriveBusinessFacts(business: BrandlabBusiness): BrandlabDerivedBusinessFacts {\n defineBrandlabBusiness(business)\n const canonicalUrl = new URL(business.canonicalUrl.value).origin\n const phone = verifiedValue(business.contact.phone)\n const address = verifiedValue(business.location.address)\n\n return {\n tradingName: business.identity.tradingName.value,\n ...(business.identity.legalName.status === 'verified'\n ? { legalName: business.identity.legalName.value }\n : {}),\n canonicalUrl,\n canonicalDomain: new URL(canonicalUrl).hostname,\n ...(phone\n ? {\n phone: {\n ...phone,\n digits: phone.e164.replace(/\\D/g, ''),\n nonGeographic: isNonGeographicPhone(phone.e164),\n // 13, 1300 and 1800 numbers cannot be dialled in international form.\n telHref: isNonGeographicPhone(phone.e164) ? `tel:${phone.e164.slice(3)}` : `tel:${phone.e164}`,\n schemaTelephone: isNonGeographicPhone(phone.e164) ? phone.display : phone.e164,\n },\n }\n : {}),\n ...(business.contact.email.status === 'verified'\n ? { email: business.contact.email.value.trim().toLowerCase() }\n : {}),\n ...(business.location.addressVisibility === 'public' && address\n ? { publicAddress: address }\n : {}),\n serviceAreas: verifiedValue(business.location.serviceAreas) ?? [],\n openingHours: verifiedValue(business.openingHours) ?? [],\n ...(business.registration.abn.status === 'verified'\n ? { abn: normalizeAbn(business.registration.abn.value) }\n : {}),\n licences: verifiedValue(business.registration.licences) ?? [],\n ...(business.externalEntities.googlePlaceId.status === 'verified'\n ? { googlePlaceId: business.externalEntities.googlePlaceId.value }\n : {}),\n sameAs: verifiedValue(business.externalEntities.sameAs) ?? [],\n proof: business.proof ? verifiedValue(business.proof) ?? [] : [],\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"business.js","sourceRoot":"","sources":["../src/business.ts"],"names":[],"mappings":"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","sourcesContent":["export type VerificationState = 'verified' | 'unknown' | 'not-applicable'\n\nexport const BRANDLAB_EVIDENCE_SOURCE_KINDS = [\n 'official-registry',\n 'google-business-profile',\n 'client-document',\n 'client-confirmation',\n 'first-party-record',\n 'public-authority',\n 'asset-rights',\n 'other-independent',\n 'synthetic-test',\n] as const\n\nexport type BrandlabEvidenceSourceKind =\n (typeof BRANDLAB_EVIDENCE_SOURCE_KINDS)[number]\n\nexport const BRANDLAB_EVIDENCE_SURFACES = [\n 'website-copy',\n 'metadata',\n 'schema',\n 'reviews',\n 'projects',\n 'images',\n 'operations',\n] as const\n\nexport type BrandlabEvidenceSurface =\n (typeof BRANDLAB_EVIDENCE_SURFACES)[number]\n\nexport interface EvidenceReference {\n sourceKind: BrandlabEvidenceSourceKind\n reference: string\n verifiedAt: string\n expiresAt?: string\n allowedSurfaces: readonly BrandlabEvidenceSurface[]\n}\n\nexport interface VerifiedFact<T> {\n status: 'verified'\n value: T\n evidence: EvidenceReference\n}\n\nexport type BrandlabFact<T> =\n | VerifiedFact<T>\n | { status: 'unknown' }\n | { status: 'not-applicable'; reason: string }\n\nexport interface BrandlabPhoneNumber {\n /** As the business shows it, for example \"02 9000 1234\", \"0412 345 678\" or \"1300 329 600\". */\n display: string\n /**\n * E.164 form: \"+61290001234\". A 13, 1300 or 1800 number keeps its national\n * digits after +61 (\"+611300329600\", \"+61131234\").\n */\n e164: string\n}\n\nexport interface BrandlabPostalAddress {\n streetAddress: string\n addressLocality: string\n addressRegion: string\n postalCode: string\n addressCountry: string\n}\n\nexport interface BrandlabServiceArea {\n id: string\n name: string\n kind: 'city' | 'region' | 'suburb' | 'state' | 'country'\n}\n\nexport type BrandlabOpeningHoursDay =\n | 'Monday'\n | 'Tuesday'\n | 'Wednesday'\n | 'Thursday'\n | 'Friday'\n | 'Saturday'\n | 'Sunday'\n\nexport interface BrandlabOpeningHours {\n days: readonly BrandlabOpeningHoursDay[]\n opens: string\n closes: string\n}\n\nexport interface BrandlabLicence {\n name: string\n identifier: string\n jurisdiction?: string\n}\n\nexport interface BrandlabProofReference {\n id: string\n kind: 'project' | 'review' | 'accreditation' | 'licence' | 'external-source'\n evidence: EvidenceReference\n}\n\nconst BRANDLAB_PROOF_KINDS = new Set<BrandlabProofReference['kind']>([\n 'project',\n 'review',\n 'accreditation',\n 'licence',\n 'external-source',\n])\nconst BRANDLAB_OPENING_HOURS_DAYS = new Set<BrandlabOpeningHoursDay>([\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n])\n\nexport interface BrandlabBusiness {\n identity: {\n tradingName: BrandlabFact<string> & { status: 'verified' }\n legalName: BrandlabFact<string>\n }\n canonicalUrl: BrandlabFact<string> & { status: 'verified' }\n contact: {\n phone: BrandlabFact<BrandlabPhoneNumber>\n email: BrandlabFact<string>\n }\n location: {\n model: 'service-area' | 'physical-location' | 'hybrid'\n addressVisibility: 'public' | 'hidden' | 'not-applicable'\n address: BrandlabFact<BrandlabPostalAddress>\n serviceAreas: BrandlabFact<readonly BrandlabServiceArea[]>\n }\n openingHours: BrandlabFact<readonly BrandlabOpeningHours[]>\n registration: {\n abn: BrandlabFact<string>\n licences: BrandlabFact<readonly BrandlabLicence[]>\n }\n externalEntities: {\n googlePlaceId: BrandlabFact<string>\n sameAs: BrandlabFact<readonly string[]>\n }\n /** Optional structured proof references for projects that use them operationally. */\n proof?: BrandlabFact<readonly BrandlabProofReference[]>\n}\n\nexport interface BrandlabDerivedBusinessFacts {\n tradingName: string\n legalName?: string\n canonicalUrl: string\n canonicalDomain: string\n phone?: BrandlabPhoneNumber & {\n digits: string\n /**\n * An Australian 13, 1300 or 1800 number: callable only within Australia\n * and only as dialled nationally.\n */\n nonGeographic: boolean\n /** `tel:+61…` for landline and mobile numbers; the national digits (`tel:1300329600`) for a non-geographic number. */\n telHref: string\n /** Schema.org `telephone`: E.164 for landline and mobile numbers, the displayed number for a non-geographic one. */\n schemaTelephone: string\n }\n email?: string\n publicAddress?: BrandlabPostalAddress\n serviceAreas: readonly BrandlabServiceArea[]\n openingHours: readonly BrandlabOpeningHours[]\n abn?: string\n licences: readonly BrandlabLicence[]\n googlePlaceId?: string\n sameAs: readonly string[]\n proof: readonly BrandlabProofReference[]\n}\n\nexport function verifiedFact<T>(\n value: T,\n evidence: EvidenceReference,\n): VerifiedFact<T> {\n return {\n status: 'verified',\n value,\n evidence,\n }\n}\n\nexport function unknownFact<T>(): BrandlabFact<T> {\n return { status: 'unknown' }\n}\n\nexport function notApplicableFact<T>(reason: string): BrandlabFact<T> {\n return { status: 'not-applicable', reason }\n}\n\nexport function resolveVerifiedFactForSurface<T>(\n fact: BrandlabFact<T>,\n surface: BrandlabEvidenceSurface,\n asOf: Date = new Date(),\n): T | undefined {\n if (fact.status !== 'verified') return undefined\n if (!fact.evidence.allowedSurfaces.includes(surface)) return undefined\n if (\n fact.evidence.expiresAt &&\n Date.parse(fact.evidence.expiresAt) < asOf.getTime()\n ) {\n return undefined\n }\n return fact.value\n}\n\nfunction assertText(value: unknown, field: string, maximum = 500) {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n value.trim() !== value ||\n value.length > maximum ||\n /[\\u0000-\\u001f\\u007f]/.test(value)\n ) {\n throw new Error(`${field} must be bounded, trimmed text.`)\n }\n}\n\nfunction assertDate(value: string | undefined, field: string) {\n if (\n value !== undefined &&\n (!/^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z)?$/.test(value) ||\n Number.isNaN(Date.parse(value)))\n ) {\n throw new Error(`${field} must be a valid ISO date or UTC timestamp.`)\n }\n}\n\nconst BRANDLAB_EVIDENCE_SOURCE_KIND_SET = new Set<BrandlabEvidenceSourceKind>(\n BRANDLAB_EVIDENCE_SOURCE_KINDS,\n)\nconst BRANDLAB_EVIDENCE_SURFACE_SET = new Set<BrandlabEvidenceSurface>(\n BRANDLAB_EVIDENCE_SURFACES,\n)\nconst CIRCULAR_EVIDENCE_PREFIX =\n /^(?:existing-production-config|repository-config|source-code):/i\n\nfunction assertEvidenceReference(\n evidence: EvidenceReference,\n field: string,\n) {\n assertExactKeys(\n evidence,\n ['sourceKind', 'reference', 'verifiedAt', 'expiresAt', 'allowedSurfaces'],\n field,\n )\n if (!BRANDLAB_EVIDENCE_SOURCE_KIND_SET.has(evidence.sourceKind)) {\n throw new Error(`${field}.sourceKind is invalid.`)\n }\n assertText(evidence.reference, `${field}.reference`)\n if (CIRCULAR_EVIDENCE_PREFIX.test(evidence.reference)) {\n throw new Error(\n `${field}.reference cannot cite repository configuration as independent verification.`,\n )\n }\n assertDate(evidence.verifiedAt, `${field}.verifiedAt`)\n assertDate(evidence.expiresAt, `${field}.expiresAt`)\n if (\n evidence.expiresAt &&\n Date.parse(evidence.expiresAt) < Date.parse(evidence.verifiedAt)\n ) {\n throw new Error(`${field}.expiresAt cannot precede verifiedAt.`)\n }\n if (\n !Array.isArray(evidence.allowedSurfaces) ||\n evidence.allowedSurfaces.length === 0\n ) {\n throw new Error(`${field}.allowedSurfaces cannot be empty.`)\n }\n assertUniqueStrings(evidence.allowedSurfaces, `${field}.allowedSurfaces`)\n if (\n evidence.allowedSurfaces.some(\n (surface) => !BRANDLAB_EVIDENCE_SURFACE_SET.has(surface),\n )\n ) {\n throw new Error(`${field}.allowedSurfaces contains an invalid surface.`)\n }\n}\n\nfunction assertExactKeys(\n value: unknown,\n allowed: readonly string[],\n field: string,\n) {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n ) {\n throw new Error(`${field} must be a plain object.`)\n }\n const unknown = Object.keys(value).find((key) => !allowed.includes(key))\n if (unknown) throw new Error(`${field}.${unknown} is not a supported business fact key.`)\n}\n\nfunction assertFact<T>(fact: BrandlabFact<T>, field: string, validate?: (value: T) => void) {\n if (!fact || typeof fact !== 'object' || Array.isArray(fact)) {\n throw new Error(`${field} must be a typed Brandlab fact.`)\n }\n const record = fact as BrandlabFact<T> & Record<string, unknown>\n if (record.status === 'verified') {\n const verified = record as Extract<BrandlabFact<T>, { status: 'verified' }> &\n Record<string, unknown>\n if (!Object.prototype.hasOwnProperty.call(verified, 'value') || verified.value === undefined) {\n throw new Error(`${field}.value is required for a verified fact.`)\n }\n assertExactKeys(verified, ['status', 'value', 'evidence'], field)\n assertEvidenceReference(verified.evidence, `${field}.evidence`)\n if (typeof verified.value === 'string') assertText(verified.value, `${field}.value`)\n validate?.(verified.value)\n } else if (record.status === 'unknown') {\n if (Object.prototype.hasOwnProperty.call(record, 'value')) {\n throw new Error(`${field} cannot carry a value while its status is unknown.`)\n }\n assertExactKeys(record, ['status'], field)\n } else if (record.status === 'not-applicable') {\n if (Object.prototype.hasOwnProperty.call(record, 'value')) {\n throw new Error(`${field} cannot carry a value while it is not applicable.`)\n }\n assertExactKeys(record, ['status', 'reason'], field)\n assertText(record.reason, `${field}.reason`)\n } else {\n throw new Error(`${field}.status must be verified, unknown or not-applicable.`)\n }\n}\n\nfunction assertAbsoluteHttpsUrl(value: string, field: string, requireOrigin = false) {\n let url: URL\n try {\n url = new URL(value)\n } catch {\n throw new Error(`${field} must be an absolute HTTPS URL.`)\n }\n\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n (requireOrigin && (url.pathname !== '/' || url.search || url.hash))\n ) {\n throw new Error(`${field} must be an absolute HTTPS URL.`)\n }\n}\n\nfunction assertUniqueStrings(values: readonly string[], field: string) {\n const duplicate = values.find((value, index) => values.indexOf(value) !== index)\n if (duplicate) throw new Error(`${field} contains duplicate value \"${duplicate}\".`)\n}\n\nfunction assertTime(value: string, field: string) {\n if (!/^(?:[01]\\d|2[0-3]):[0-5]\\d$/.test(value)) {\n throw new Error(`${field} must use a valid 24-hour HH:MM time.`)\n }\n}\n\nfunction assertAddress(address: BrandlabPostalAddress) {\n assertExactKeys(\n address,\n [\n 'streetAddress',\n 'addressLocality',\n 'addressRegion',\n 'postalCode',\n 'addressCountry',\n ],\n 'location.address.value',\n )\n Object.entries(address).forEach(([field, value]) =>\n assertText(value, `location.address.value.${field}`, 200),\n )\n if (address.addressCountry !== 'AU') {\n throw new Error('location.address.value.addressCountry must be \"AU\".')\n }\n if (!/^[A-Z]{2,3}$/.test(address.addressRegion)) {\n throw new Error('location.address.value.addressRegion must be an uppercase Australian region.')\n }\n if (!/^\\d{4}$/.test(address.postalCode)) {\n throw new Error('location.address.value.postalCode must be a four-digit Australian postcode.')\n }\n}\n\n/** Landline and mobile numbers: +61 then a 2, 3, 4, 7 or 8 area or mobile prefix. */\nconst AUSTRALIAN_GEOGRAPHIC_E164 = /^\\+61[23478]\\d{8}$/\n/** Non-geographic numbers: 13 xx xx, 1300 xxx xxx and 1800 xxx xxx. */\nconst AUSTRALIAN_NON_GEOGRAPHIC_E164 = /^\\+61(?:1[38]00\\d{6}|13(?!00)\\d{4})$/\n\nfunction isNonGeographicPhone(e164: string) {\n return AUSTRALIAN_NON_GEOGRAPHIC_E164.test(e164)\n}\n\nfunction assertPhone(phone: BrandlabPhoneNumber) {\n assertExactKeys(phone, ['display', 'e164'], 'contact.phone.value')\n assertText(phone.display, 'contact.phone.value.display')\n if (\n phone.display.trim() !== phone.display ||\n phone.display.length > 32 ||\n !/^[+()\\d\\s.-]+$/.test(phone.display)\n ) {\n throw new Error('contact.phone.value.display must be a bounded Australian phone number.')\n }\n const nonGeographic = isNonGeographicPhone(phone.e164)\n if (!nonGeographic && !AUSTRALIAN_GEOGRAPHIC_E164.test(phone.e164)) {\n throw new Error(\n 'contact.phone.value.e164 must be a valid Australian E.164 number: a landline or mobile, or a 13, 1300 or 1800 number.',\n )\n }\n const national = phone.e164.slice(3)\n const displayDigits = phone.display.replace(/\\D/g, '')\n // A landline or mobile shows its trunk 0 or +61; a non-geographic number is shown as dialled.\n const sameNumber = displayDigits === `61${national}` ||\n displayDigits === (nonGeographic ? national : `0${national}`)\n if (!sameNumber) {\n throw new Error('contact.phone.value.display must identify the same number as e164.')\n }\n}\n\nfunction assertEmail(email: string) {\n if (\n email.length > 254 ||\n email.trim() !== email ||\n /[\\u0000-\\u001f\\u007f]/.test(email) ||\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)\n ) {\n throw new Error('contact.email.value must be a valid email address.')\n }\n}\n\nfunction normalizeAbn(value: string) {\n return value.replace(/\\s/g, '')\n}\n\nfunction assertAbn(value: string) {\n const digits = normalizeAbn(value)\n if (!/^\\d{11}$/.test(digits) || !/^\\d{2}(?: \\d{3}){3}$|^\\d{11}$/.test(value)) {\n throw new Error('registration.abn.value must be an 11-digit Australian Business Number.')\n }\n const weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n const numbers = [...digits].map(Number)\n numbers[0] = numbers[0]! - 1\n const checksum = numbers.reduce(\n (sum, digit, index) => sum + digit * weights[index]!,\n 0,\n )\n if (checksum % 89 !== 0) {\n throw new Error('registration.abn.value has an invalid ABN checksum.')\n }\n}\n\nfunction assertUniqueIds(records: readonly { id: string }[], field: string) {\n records.forEach((record, index) => assertText(record.id, `${field}[${index}].id`))\n const duplicate = records.find((record, index) =>\n records.slice(0, index).some((candidate) => candidate.id === record.id),\n )\n if (duplicate) throw new Error(`${field} contains duplicate ID \"${duplicate.id}\".`)\n}\n\nexport function defineBrandlabBusiness<const T extends BrandlabBusiness>(business: T): T {\n assertExactKeys(\n business,\n [\n 'identity',\n 'canonicalUrl',\n 'contact',\n 'location',\n 'openingHours',\n 'registration',\n 'externalEntities',\n 'proof',\n ],\n 'business',\n )\n assertExactKeys(business.identity, ['tradingName', 'legalName'], 'identity')\n assertExactKeys(business.contact, ['phone', 'email'], 'contact')\n assertExactKeys(\n business.location,\n ['model', 'addressVisibility', 'address', 'serviceAreas'],\n 'location',\n )\n assertExactKeys(business.registration, ['abn', 'licences'], 'registration')\n assertExactKeys(\n business.externalEntities,\n ['googlePlaceId', 'sameAs'],\n 'externalEntities',\n )\n if (!['service-area', 'physical-location', 'hybrid'].includes(business.location.model)) {\n throw new Error('location.model is invalid.')\n }\n if (!['public', 'hidden', 'not-applicable'].includes(business.location.addressVisibility)) {\n throw new Error('location.addressVisibility is invalid.')\n }\n assertFact(business.identity.tradingName, 'identity.tradingName')\n assertFact(business.identity.legalName, 'identity.legalName')\n assertFact(business.canonicalUrl, 'canonicalUrl', (value) =>\n assertAbsoluteHttpsUrl(value, 'canonicalUrl.value', true),\n )\n assertFact(business.contact.phone, 'contact.phone', assertPhone)\n assertFact(business.contact.email, 'contact.email', assertEmail)\n assertFact(business.location.address, 'location.address', assertAddress)\n assertFact(business.location.serviceAreas, 'location.serviceAreas', assertServiceAreas)\n assertFact(business.openingHours, 'openingHours', assertOpeningHours)\n assertFact(business.registration.abn, 'registration.abn', assertAbn)\n assertFact(business.registration.licences, 'registration.licences', assertLicences)\n assertFact(business.externalEntities.googlePlaceId, 'externalEntities.googlePlaceId')\n assertFact(business.externalEntities.sameAs, 'externalEntities.sameAs', assertSameAs)\n if (business.proof) {\n assertFact(business.proof, 'proof', (proof) => {\n assertUniqueIds(proof, 'proof.value')\n proof.forEach((item, index) => {\n assertExactKeys(\n item,\n ['id', 'kind', 'evidence'],\n `proof.value[${index}]`,\n )\n if (!BRANDLAB_PROOF_KINDS.has(item.kind)) {\n throw new Error(`proof.value[${index}].kind is invalid.`)\n }\n assertEvidenceReference(\n item.evidence,\n `proof.value[${index}].evidence`,\n )\n })\n })\n }\n\n assertLocationModel({\n model: business.location.model,\n addressVisibility: business.location.addressVisibility,\n address: verifiedValue(business.location.address),\n serviceAreas: verifiedValue(business.location.serviceAreas),\n })\n\n return business\n}\n\nfunction assertLocationModel(location: BrandlabBusinessFactValues['location']) {\n if (location.addressVisibility === 'not-applicable' && location.address) {\n throw new Error('A verified address cannot use addressVisibility \"not-applicable\".')\n }\n if (location.addressVisibility === 'public' && !location.address) {\n throw new Error('A public address must have verified address facts.')\n }\n if (location.model === 'service-area' && location.addressVisibility === 'public') {\n throw new Error('A service-area business cannot expose a public address.')\n }\n if (location.model === 'physical-location' && location.addressVisibility !== 'public') {\n throw new Error('A physical-location business must expose its verified public address.')\n }\n if (\n (location.model === 'service-area' || location.model === 'hybrid') &&\n (!location.serviceAreas || location.serviceAreas.length === 0)\n ) {\n throw new Error('Service-area and hybrid businesses require verified service areas.')\n }\n}\n\nfunction assertServiceAreas(areas: readonly BrandlabServiceArea[]) {\n assertUniqueIds(areas, 'location.serviceAreas.value')\n areas.forEach((area, index) => {\n assertExactKeys(\n area,\n ['id', 'name', 'kind'],\n `location.serviceAreas.value[${index}]`,\n )\n assertText(area.name, `location.serviceAreas.value[${index}].name`)\n if (area.name.trim() !== area.name || area.name.length > 160) {\n throw new Error(`location.serviceAreas.value[${index}].name must be bounded canonical text.`)\n }\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(area.id)) {\n throw new Error(`location.serviceAreas.value[${index}].id must be lowercase kebab-case.`)\n }\n if (!['city', 'region', 'suburb', 'state', 'country'].includes(area.kind)) {\n throw new Error(`location.serviceAreas.value[${index}].kind is invalid.`)\n }\n })\n}\n\nfunction assertOpeningHours(hours: readonly BrandlabOpeningHours[]) {\n const allDays: BrandlabOpeningHoursDay[] = []\n hours.forEach((period, index) => {\n assertExactKeys(\n period,\n ['days', 'opens', 'closes'],\n `openingHours.value[${index}]`,\n )\n if (period.days.length === 0) {\n throw new Error(`openingHours.value[${index}].days cannot be empty.`)\n }\n assertUniqueStrings(period.days, `openingHours.value[${index}].days`)\n if (period.days.some((day) => !BRANDLAB_OPENING_HOURS_DAYS.has(day))) {\n throw new Error(`openingHours.value[${index}].days contains an invalid day.`)\n }\n allDays.push(...period.days)\n assertTime(period.opens, `openingHours.value[${index}].opens`)\n assertTime(period.closes, `openingHours.value[${index}].closes`)\n })\n assertUniqueStrings(allDays, 'openingHours.value.days')\n}\n\nfunction assertLicences(licences: readonly BrandlabLicence[]) {\n assertUniqueStrings(\n licences.map((licence) => licence.identifier),\n 'registration.licences.value.identifiers',\n )\n licences.forEach((licence, index) => {\n assertExactKeys(\n licence,\n ['name', 'identifier', 'jurisdiction'],\n `registration.licences.value[${index}]`,\n )\n assertText(licence.name, `registration.licences.value[${index}].name`)\n assertText(licence.identifier, `registration.licences.value[${index}].identifier`)\n if (licence.jurisdiction !== undefined) {\n assertText(\n licence.jurisdiction,\n `registration.licences.value[${index}].jurisdiction`,\n 120,\n )\n }\n })\n}\n\nfunction assertSameAs(urls: readonly string[]) {\n assertUniqueStrings(urls, 'externalEntities.sameAs.value')\n urls.forEach((url, index) =>\n assertAbsoluteHttpsUrl(url, `externalEntities.sameAs.value[${index}]`),\n )\n}\n\nfunction verifiedValue<T>(fact: BrandlabFact<T>): T | undefined {\n return fact.status === 'verified' ? fact.value : undefined\n}\n\n/**\n * The business facts as a site displays them: the verified values without their\n * evidence (unknown and not-applicable facts are absent). Client components read\n * these from `src/data/business.ts`; the evidence stays in the server-only\n * `src/data/businessEvidence.ts`, which declares the facts over these values with\n * `defineBrandlabBusiness` (3.2.1).\n */\nexport interface BrandlabBusinessFactValues {\n identity: { tradingName: string; legalName?: string }\n canonicalUrl: string\n contact?: { phone?: BrandlabPhoneNumber; email?: string }\n location: {\n model: BrandlabBusiness['location']['model']\n addressVisibility: BrandlabBusiness['location']['addressVisibility']\n address?: BrandlabPostalAddress\n serviceAreas?: readonly BrandlabServiceArea[]\n }\n openingHours?: readonly BrandlabOpeningHours[]\n registration?: { abn?: string; licences?: readonly BrandlabLicence[] }\n externalEntities?: { googlePlaceId?: string; sameAs?: readonly string[] }\n}\n\nfunction factValues(business: BrandlabBusiness): BrandlabBusinessFactValues {\n return {\n identity: {\n tradingName: business.identity.tradingName.value,\n ...(verifiedValue(business.identity.legalName) !== undefined ? { legalName: verifiedValue(business.identity.legalName)! } : {}),\n },\n canonicalUrl: business.canonicalUrl.value,\n contact: {\n ...(verifiedValue(business.contact.phone) ? { phone: verifiedValue(business.contact.phone)! } : {}),\n ...(verifiedValue(business.contact.email) !== undefined ? { email: verifiedValue(business.contact.email)! } : {}),\n },\n location: {\n model: business.location.model,\n addressVisibility: business.location.addressVisibility,\n ...(verifiedValue(business.location.address) ? { address: verifiedValue(business.location.address)! } : {}),\n ...(verifiedValue(business.location.serviceAreas) ? { serviceAreas: verifiedValue(business.location.serviceAreas)! } : {}),\n },\n ...(verifiedValue(business.openingHours) ? { openingHours: verifiedValue(business.openingHours)! } : {}),\n registration: {\n ...(verifiedValue(business.registration.abn) !== undefined ? { abn: verifiedValue(business.registration.abn)! } : {}),\n ...(verifiedValue(business.registration.licences) ? { licences: verifiedValue(business.registration.licences)! } : {}),\n },\n externalEntities: {\n ...(verifiedValue(business.externalEntities.googlePlaceId) !== undefined ? { googlePlaceId: verifiedValue(business.externalEntities.googlePlaceId)! } : {}),\n ...(verifiedValue(business.externalEntities.sameAs) ? { sameAs: verifiedValue(business.externalEntities.sameAs)! } : {}),\n },\n }\n}\n\nfunction deriveFromValues(values: BrandlabBusinessFactValues): Omit<BrandlabDerivedBusinessFacts, 'proof'> {\n const canonicalUrl = new URL(values.canonicalUrl).origin\n const phone = values.contact?.phone\n const address = values.location.address\n\n return {\n tradingName: values.identity.tradingName,\n ...(values.identity.legalName !== undefined\n ? { legalName: values.identity.legalName }\n : {}),\n canonicalUrl,\n canonicalDomain: new URL(canonicalUrl).hostname,\n ...(phone\n ? {\n phone: {\n ...phone,\n digits: phone.e164.replace(/\\D/g, ''),\n nonGeographic: isNonGeographicPhone(phone.e164),\n // 13, 1300 and 1800 numbers cannot be dialled in international form.\n telHref: isNonGeographicPhone(phone.e164) ? `tel:${phone.e164.slice(3)}` : `tel:${phone.e164}`,\n schemaTelephone: isNonGeographicPhone(phone.e164) ? phone.display : phone.e164,\n },\n }\n : {}),\n ...(values.contact?.email !== undefined\n ? { email: values.contact.email.trim().toLowerCase() }\n : {}),\n ...(values.location.addressVisibility === 'public' && address\n ? { publicAddress: address }\n : {}),\n serviceAreas: values.location.serviceAreas ?? [],\n openingHours: values.openingHours ?? [],\n ...(values.registration?.abn !== undefined\n ? { abn: normalizeAbn(values.registration.abn) }\n : {}),\n licences: values.registration?.licences ?? [],\n ...(values.externalEntities?.googlePlaceId !== undefined\n ? { googlePlaceId: values.externalEntities.googlePlaceId }\n : {}),\n sameAs: values.externalEntities?.sameAs ?? [],\n }\n}\n\nexport function deriveBusinessFacts(business: BrandlabBusiness): BrandlabDerivedBusinessFacts {\n defineBrandlabBusiness(business)\n return {\n ...deriveFromValues(factValues(business)),\n proof: business.proof ? verifiedValue(business.proof) ?? [] : [],\n }\n}\n\n/**\n * What `deriveBusinessFacts` gives, from the display values alone (3.2.1), for\n * the client-safe modules that derive links and labels from the facts. The values\n * are checked as `defineBrandlabBusiness` checks the facts; proof references carry\n * evidence, so they are never part of the display values (`proof` is empty).\n */\nexport function deriveBusinessDisplayFacts(values: BrandlabBusinessFactValues): BrandlabDerivedBusinessFacts {\n assertBusinessFactValues(values)\n return { ...deriveFromValues(values), proof: [] }\n}\n\nfunction assertBusinessFactValues(values: BrandlabBusinessFactValues) {\n if (!values || typeof values !== 'object') throw new Error('The business fact values must be an object.')\n assertExactKeys(values, ['identity', 'canonicalUrl', 'contact', 'location', 'openingHours', 'registration', 'externalEntities'], 'business values')\n assertExactKeys(values.identity, ['tradingName', 'legalName'], 'identity')\n assertText(values.identity.tradingName, 'identity.tradingName.value')\n if (values.identity.legalName !== undefined) assertText(values.identity.legalName, 'identity.legalName.value')\n assertText(values.canonicalUrl, 'canonicalUrl.value')\n assertAbsoluteHttpsUrl(values.canonicalUrl, 'canonicalUrl.value', true)\n if (values.contact !== undefined) {\n assertExactKeys(values.contact, ['phone', 'email'], 'contact')\n if (values.contact.phone !== undefined) assertPhone(values.contact.phone)\n if (values.contact.email !== undefined) assertEmail(values.contact.email)\n }\n assertExactKeys(values.location, ['model', 'addressVisibility', 'address', 'serviceAreas'], 'location')\n if (!['service-area', 'physical-location', 'hybrid'].includes(values.location.model)) {\n throw new Error('location.model is invalid.')\n }\n if (!['public', 'hidden', 'not-applicable'].includes(values.location.addressVisibility)) {\n throw new Error('location.addressVisibility is invalid.')\n }\n if (values.location.address !== undefined) assertAddress(values.location.address)\n if (values.location.serviceAreas !== undefined) assertServiceAreas(values.location.serviceAreas)\n if (values.openingHours !== undefined) assertOpeningHours(values.openingHours)\n if (values.registration !== undefined) {\n assertExactKeys(values.registration, ['abn', 'licences'], 'registration')\n if (values.registration.abn !== undefined) assertAbn(values.registration.abn)\n if (values.registration.licences !== undefined) assertLicences(values.registration.licences)\n }\n if (values.externalEntities !== undefined) {\n assertExactKeys(values.externalEntities, ['googlePlaceId', 'sameAs'], 'externalEntities')\n if (values.externalEntities.googlePlaceId !== undefined) assertText(values.externalEntities.googlePlaceId, 'externalEntities.googlePlaceId.value')\n if (values.externalEntities.sameAs !== undefined) assertSameAs(values.externalEntities.sameAs)\n }\n assertLocationModel(values.location)\n}\n"]}
|
package/dist/geography.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Edit the JSON registries, then run npm run generate:geography.
|
|
7
7
|
* Registry membership supplies geography facts; it never approves a route.
|
|
8
|
+
* Each registry's provenance (sources) and stewardship notes stay in its JSON
|
|
9
|
+
* file; they are not part of this module, which reaches browser bundles.
|
|
8
10
|
*/
|
|
9
11
|
import type { GeographyRegistry, RegistryOfficialLocality, WebsiteLocationPolicy } from './locations.js';
|
|
10
12
|
/**
|
package/dist/geography.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geography.d.ts","sourceRoot":"","sources":["../src/geography.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"geography.d.ts","sourceRoot":"","sources":["../src/geography.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,gBAAgB,CAAA;AAEvB;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,iBA8hN7B,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,EAAE,qBAgKzC,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,uCAAuC,sqBA4C1C,CAAA;AAMV,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,2CAEhC,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,EAAE,SAAS,wBAAwB,EAG1B,CAAA;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAsnCnC,CAAA;AAED,6FAA6F;AAC7F,eAAO,MAAM,iCAAiC,EAAE,qBA2D/C,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,6CAA6C,gXAyBhD,CAAA;AAMV,mGAAmG;AACnG,eAAO,MAAM,0BAA0B,2CAEtC,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,8BAA8B,EAAE,SAAS,wBAAwB,EAGhC,CAAA"}
|