@brandlab-digital/site-core 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.d.ts +9 -2
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +3 -2
- package/dist/analytics.js.map +1 -1
- 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/google-reviews.d.ts +3 -1
- package/dist/google-reviews.d.ts.map +1 -1
- package/dist/google-reviews.js +1 -0
- package/dist/google-reviews.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.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"}
|
package/dist/geography.js
CHANGED
|
@@ -7,19 +7,6 @@
|
|
|
7
7
|
export const sydneyGeography = {
|
|
8
8
|
"version": "1.5.0",
|
|
9
9
|
"generated": "2026-07-10",
|
|
10
|
-
"sources": [
|
|
11
|
-
"sydney-tree-services locations catalog (benchmark, 2026-02-19)",
|
|
12
|
-
"sydney-tree-services councils.ts council names",
|
|
13
|
-
"affordable-dans suburbPostcodes.ts (Australia Post-derived)",
|
|
14
|
-
"johns-tree-services registry.ts (gazetted policy, lower/upper north shore membership)",
|
|
15
|
-
"NSW GNB hosted place-name FeatureServer exact-name fallback (audit 2026-07-06)",
|
|
16
|
-
"Brandlab Mangools tracked-keyword export for June 2026 and live Sydney trade SERP naming review (2026-07-10)",
|
|
17
|
-
"Brandlab operator-approved public-region and internal-coverage-group model (2026-07-10)",
|
|
18
|
-
"NSW Spatial Services Suburb and LGA Percentage Area workbook (data currency 2026-02-19), reconciled against the live GDA2020 Suburb and LocalGovernmentArea layers through 2026-07-10",
|
|
19
|
-
"NSW Government 33-LGA Greater Sydney scope (Greening our City Grant Guidelines 2025), checked against the 2026 Greater Sydney Infrastructure Opportunities Plan",
|
|
20
|
-
"NSW Address Policy and User Manual 2024 address-locality definition, applied through the Brandlab website-location classification policy (2026-07-10)"
|
|
21
|
-
],
|
|
22
|
-
"notes": "Canonical Brandlab Sydney geography. Projects subset this registry; they never invent regions. Aliases map legacy region/council slugs to canonical slugs and must be resolved with an entity kind. The normal suburbs collection contains only the 791 postcode-backed website candidates; 15 official null-postcode records are retained separately in nonSuburbLocalities with defaultWebsiteEligibility false. Candidate status never approves a page. | v1.1.0 (2026-07-05): Northern Beaches subRegions promoted from project districts (suburbSlugs-based); boundary suburbs bound by LGA tiebreaker; split localities carry sharedCouncilSlugs. Council-combo grouping (e.g. Hunters Hill + Lane Cove within Lower North Shore) is registry-native via suburb councilSlug and needs no subRegion entries. | v1.2.0 (2026-07-06): Official-first audit removed non-suburb records Berowra Creek, Dobroyd Point, and Kings Cross from suburbs and preserved them as legacy aliases; corrected sampled NSW Spatial Services council bindings for 20 suburb records. | v1.3.0 (2026-07-10): accepted the Sydney SEO taxonomy after official NSW subregion and search-demand review; added seoName and alternateNames; removed Forest Grove after the official layer identified it as the postcode 2795 locality outside Sydney; documented entity-aware alias resolution. | v1.4.0 (2026-07-10): separated public page-bearing regions and suburbs from internal-only coverageGroups; folded the former Parramatta region into Western Sydney; renamed the public Ryde region to Ryde Area; added Western and South West Sydney coverage partitions that never create website content or URLs; removed the ten Northern Beaches subRegions so Northern Beaches remains one undivided public area. | v1.5.0 (2026-07-10): completed the registry to the NSW Government 33-LGA Greater Sydney scope; added Blue Mountains City and Wollondilly Shire; added every in-scope active gazetted suburb/locality; reconciled primary and material shared council membership by official LGA area; populated all Australia Post-matched postcodes available in the live NSW Spatial Services Suburb layer; moved every official null-postcode record into the classified nonSuburbLocalities collection; and formalised deterministic Brandlab region and website-location assignments.",
|
|
23
10
|
"regions": [
|
|
24
11
|
{
|
|
25
12
|
"slug": "eastern-suburbs",
|
|
@@ -6929,11 +6916,6 @@ export const sydneyOfficialLocalities = [
|
|
|
6929
6916
|
export const centralCoastGeography = {
|
|
6930
6917
|
"version": "2.1.0",
|
|
6931
6918
|
"generated": "2026-07-30",
|
|
6932
|
-
"sources": [
|
|
6933
|
-
"NSW Spatial Services, Suburb and LGA Percentage Area (data currency 2026-02-19)",
|
|
6934
|
-
"NSW Spatial Services, NSW Administrative Boundaries Theme - GDA2020 Suburb layer (checked 2026-07-30)"
|
|
6935
|
-
],
|
|
6936
|
-
"notes": "Canonical Central Coast geography facts and postcode-backed location candidates. The shared registry contains stable official geography only. Projects choose their own served subset, routes, navigation, copy and indexability.",
|
|
6937
6919
|
"regions": [
|
|
6938
6920
|
{
|
|
6939
6921
|
"slug": "central-coast",
|