@brandlab-digital/site-core 3.1.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.
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"business.d.ts","sourceRoot":"","sources":["../src/business.ts"],"names":[],"mappings":"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"}
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', (areas) => {
279
- assertUniqueIds(areas, 'location.serviceAreas.value');
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', (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', (urls) => {
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
- if (business.location.addressVisibility === 'not-applicable' &&
341
- business.location.address.status === 'verified') {
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 (business.location.addressVisibility === 'public' &&
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 (business.location.model === 'service-area' &&
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 (business.location.model === 'physical-location' &&
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 ((business.location.model === 'service-area' || business.location.model === 'hybrid') &&
357
- (business.location.serviceAreas.status !== 'verified' ||
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
- return business;
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
- export function deriveBusinessFacts(business) {
367
- defineBrandlabBusiness(business);
368
- const canonicalUrl = new URL(business.canonicalUrl.value).origin;
369
- const phone = verifiedValue(business.contact.phone);
370
- const address = verifiedValue(business.location.address);
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: business.identity.tradingName.value,
373
- ...(business.identity.legalName.status === 'verified'
374
- ? { legalName: business.identity.legalName.value }
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
- ...(business.contact.email.status === 'verified'
391
- ? { email: business.contact.email.value.trim().toLowerCase() }
424
+ ...(values.contact?.email !== undefined
425
+ ? { email: values.contact.email.trim().toLowerCase() }
392
426
  : {}),
393
- ...(business.location.addressVisibility === 'public' && address
427
+ ...(values.location.addressVisibility === 'public' && address
394
428
  ? { publicAddress: address }
395
429
  : {}),
396
- serviceAreas: verifiedValue(business.location.serviceAreas) ?? [],
397
- openingHours: verifiedValue(business.openingHours) ?? [],
398
- ...(business.registration.abn.status === 'verified'
399
- ? { abn: normalizeAbn(business.registration.abn.value) }
430
+ serviceAreas: values.location.serviceAreas ?? [],
431
+ openingHours: values.openingHours ?? [],
432
+ ...(values.registration?.abn !== undefined
433
+ ? { abn: normalizeAbn(values.registration.abn) }
400
434
  : {}),
401
- licences: verifiedValue(business.registration.licences) ?? [],
402
- ...(business.externalEntities.googlePlaceId.status === 'verified'
403
- ? { googlePlaceId: business.externalEntities.googlePlaceId.value }
435
+ licences: values.registration?.licences ?? [],
436
+ ...(values.externalEntities?.googlePlaceId !== undefined
437
+ ? { googlePlaceId: values.externalEntities.googlePlaceId }
404
438
  : {}),
405
- sameAs: verifiedValue(business.externalEntities.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
@@ -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"]}
@@ -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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"geography.d.ts","sourceRoot":"","sources":["../src/geography.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,gBAAgB,CAAA;AAEvB;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,iBA2iN7B,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,iBA2nCnC,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"}
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"}