@robosystems/report-components 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/adapters/index.d.ts
CHANGED
package/dist/adapters/index.js
CHANGED
|
@@ -15,6 +15,7 @@ var CORE_ASPECTS = /* @__PURE__ */ new Set([
|
|
|
15
15
|
]);
|
|
16
16
|
var STANDARD_LABEL = "xbrl:label";
|
|
17
17
|
var REGISTRANT_NAME = "dei:EntityRegistrantName";
|
|
18
|
+
var SECTIONS_PROPERTY = "rs:groups";
|
|
18
19
|
function isTaviDocument(doc) {
|
|
19
20
|
if (!doc || typeof doc !== "object") return false;
|
|
20
21
|
const d = doc;
|
|
@@ -210,6 +211,7 @@ function parseTavi(doc) {
|
|
|
210
211
|
const calcAssociations = [];
|
|
211
212
|
const presentedIn = /* @__PURE__ */ new Map();
|
|
212
213
|
const presentationOfGroup = /* @__PURE__ */ new Map();
|
|
214
|
+
const presentationsOfGroup = /* @__PURE__ */ new Map();
|
|
213
215
|
const sectionMeta = (groupName) => {
|
|
214
216
|
const group = groupName ? groups.get(groupName) : void 0;
|
|
215
217
|
const definition = groupName ? labelOf(groupName) : null;
|
|
@@ -230,6 +232,8 @@ function parseTavi(doc) {
|
|
|
230
232
|
const groupName = groupOf.get(n.name);
|
|
231
233
|
const meta = sectionMeta(groupName);
|
|
232
234
|
if (groupName && !presentationOfGroup.has(groupName)) presentationOfGroup.set(groupName, n.name);
|
|
235
|
+
if (groupName)
|
|
236
|
+
presentationsOfGroup.set(groupName, [...presentationsOfGroup.get(groupName) ?? [], n.name]);
|
|
233
237
|
structures.push({
|
|
234
238
|
id: n.name,
|
|
235
239
|
blockType: "",
|
|
@@ -320,7 +324,8 @@ function parseTavi(doc) {
|
|
|
320
324
|
typedValue
|
|
321
325
|
});
|
|
322
326
|
}
|
|
323
|
-
const
|
|
327
|
+
const stated = propertyValue(f.properties, SECTIONS_PROPERTY);
|
|
328
|
+
const factSets = typeof stated === "string" ? stated.split(/\s+/).filter(Boolean).flatMap((group) => presentationsOfGroup.get(group) ?? []) : presentedIn.get(element) ?? [];
|
|
324
329
|
const identity = [
|
|
325
330
|
element,
|
|
326
331
|
periodLiteral,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/tavi.ts","../../src/adapters/detect.ts"],"names":["entity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The `tavi.json` adapter — offline, no backend, no auth.\n *\n * A filing as a **Project Tavi compiled model** (XBRL International, PWD\n * 2026-09-01): one JSON object model carrying the taxonomy objects and the\n * report objects together, fully resolved. It is the second of xbrlkit's JSON\n * projections beside the holon, and the two carry the same facts, so a report\n * renders identically from either. Unlike the holon there is no RDF step: the\n * model is walked directly, which is also why this adapter is synchronous.\n *\n * The one thing Tavi has that the normalized model must be *given* is the\n * section partition. A holon carries Information Blocks and fact sets; a Tavi\n * carries presentation networks under groups (the extended link roles). Each\n * presentation network becomes a section whose fact set is the network itself,\n * and a fact belongs to every network that presents its concept — the same\n * rule the SEC adapter applies per structure. The pivot's dimensional scope\n * then keeps a segment breakdown out of the face statement.\n *\n * Periods are normalized to the holon's human-facing dates: Tavi writes ISO\n * intervals of exclusive-end dateTimes (`2025-01-01T00:00:00` is the close of\n * 2024-12-31), older emitters wrote inclusive dates; both land as the same\n * `PeriodInfo`.\n */\nimport { humanize, stripRoleSuffix } from '../constants'\nimport type {\n BalanceType,\n CalcAssociation,\n DimensionQualifier,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n NumericKind,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\nimport { parseStructureName } from '../sections'\nimport type { ReportAdapter } from './types'\n\n// ── The document, as far as this adapter reads it ───────────────────────────\n\ninterface TaviProperty {\n property: string\n value?: unknown\n}\ninterface TaviNamed {\n name: string\n}\ninterface TaviConcept extends TaviNamed {\n dataType?: string | null\n periodType?: string | null\n properties?: TaviProperty[]\n}\ninterface TaviDimension extends TaviNamed {\n domainClass?: string | null\n}\ninterface TaviUnit extends TaviNamed {\n dataType?: string\n compositeUnitRepresentation?: string[]\n}\ninterface TaviLabel {\n forObject: string\n labelType: string\n value: string\n language?: string\n}\ninterface TaviRelationship {\n source: string\n target: string\n order?: number\n properties?: TaviProperty[]\n}\ninterface TaviNetwork extends TaviNamed {\n relationshipTypeName?: string\n relationships?: TaviRelationship[]\n roots?: string[]\n}\ninterface TaviGroup extends TaviNamed {\n groupURI?: string\n}\ninterface TaviGroupContent {\n groupName: string\n forObject: string\n}\ninterface TaviFactValue {\n value?: unknown\n decimals?: unknown\n}\ninterface TaviFact extends TaviNamed {\n factDimensions?: Record<string, unknown>\n factValues?: TaviFactValue[]\n}\ninterface TaviModel {\n name?: string\n modelType?: string\n properties?: TaviProperty[]\n entities?: TaviNamed[]\n units?: TaviUnit[]\n concepts?: TaviConcept[]\n headings?: TaviNamed[]\n dimensions?: TaviDimension[]\n domainClasses?: TaviNamed[]\n members?: TaviNamed[]\n labels?: TaviLabel[]\n networks?: TaviNetwork[]\n groups?: TaviGroup[]\n groupContents?: TaviGroupContent[]\n facts?: TaviFact[]\n}\n\n/** A Tavi document: the envelope and the model. */\nexport interface TaviDocument {\n documentInfo?: {\n documentType?: string\n namespaces?: Record<string, string>\n description?: string\n }\n xbrlModel?: TaviModel\n}\n\nconst TAVI_DOCUMENT_TYPE = /xbrl\\.org\\/(PWD|20\\d\\d)\\//\nconst PRESENTATION = 'xbrl:parent-child'\nconst CALCULATION = 'xbrl:summation-item'\nconst ROOT_SOURCE = 'xbrl:rootSource'\n/** The fact aspects that are not taxonomy dimensions. */\nconst CORE_ASPECTS = new Set([\n 'xbrl:concept',\n 'xbrl:period',\n 'xbrl:entity',\n 'xbrl:unit',\n 'xbrl:language',\n])\nconst STANDARD_LABEL = 'xbrl:label'\nconst REGISTRANT_NAME = 'dei:EntityRegistrantName'\n\n/** Whether a parsed document is a Tavi model (a `documentInfo.documentType` under xbrl.org, or an `xbrlModel` report). */\nexport function isTaviDocument(doc: unknown): doc is TaviDocument {\n if (!doc || typeof doc !== 'object') return false\n const d = doc as TaviDocument\n if (!d.xbrlModel || typeof d.xbrlModel !== 'object') return false\n const type = d.documentInfo?.documentType\n return (\n (typeof type === 'string' && TAVI_DOCUMENT_TYPE.test(type)) ||\n d.xbrlModel.modelType === 'xbrl:report'\n )\n}\n\n// ── Small readers ───────────────────────────────────────────────────────────\n\nfunction propertyValue(props: TaviProperty[] | undefined, name: string): unknown {\n return props?.find((p) => p.property === name)?.value\n}\n\nfunction toNumber(raw: unknown): number | null {\n if (typeof raw === 'number') return Number.isFinite(raw) ? raw : null\n if (typeof raw === 'string' && raw.trim() !== '') {\n const n = Number(raw)\n return Number.isNaN(n) ? null : n\n }\n return null\n}\n\nfunction localName(qname: string): string {\n const i = qname.indexOf(':')\n return i >= 0 ? qname.slice(i + 1) : qname\n}\n\n/**\n * A Tavi datatype → the holon's `rs:itemType` vocabulary and the numeric kind\n * that drives formatting. Share counts have no built-in Tavi type (the\n * emitter records them as a gap), so they are recognized from the unit their\n * facts carry instead — see `sharesConcepts`.\n */\nfunction itemTypeOf(dataType: string | null | undefined): {\n itemType?: string\n numericKind?: NumericKind\n} {\n if (!dataType) return {}\n const local = localName(dataType)\n switch (local) {\n case 'monetary':\n return { itemType: 'monetary', numericKind: 'monetary' }\n case 'perShare':\n return { itemType: 'perShare', numericKind: 'perShare' }\n case 'percent':\n return { itemType: 'percent', numericKind: 'percent' }\n case 'pure':\n case 'pureType':\n return { itemType: 'pure', numericKind: 'pure' }\n case 'sharesType':\n case 'shares':\n return { itemType: 'shares', numericKind: 'shares' }\n case 'integer':\n case 'int':\n case 'long':\n case 'nonNegativeInteger':\n return { itemType: 'integer', numericKind: 'integer' }\n // Plain decimals, and the measured quantities xbrlkit's emitter writes\n // (xbrlr:area … volume): numbers in a unit, never text.\n case 'decimal':\n case 'float':\n case 'double':\n case 'area':\n case 'energy':\n case 'flow':\n case 'force':\n case 'frequency':\n case 'length':\n case 'mass':\n case 'memory':\n case 'planeAngle':\n case 'power':\n case 'pressure':\n case 'speed':\n case 'temperature':\n case 'voltage':\n case 'volume':\n return { itemType: 'decimal' }\n case 'textBlock':\n return { itemType: 'textBlock' }\n case 'boolean':\n return { itemType: 'boolean' }\n case 'date':\n case 'dateTime':\n return { itemType: 'date' }\n case 'string':\n case 'normalizedString':\n case 'token':\n return { itemType: 'string' }\n default:\n return { itemType: local }\n }\n}\n\n/**\n * A Tavi period literal as the holon's human-facing dates. An interval is\n * `start/end`; an instant is one value. A dateTime is exclusive (Tavi's\n * `xbrlr:periodString` form): the day before is the date meant. A bare date\n * (older emitters) is inclusive already.\n */\nfunction periodOf(literal: string): PeriodInfo {\n const [first, second] = literal.split('/')\n if (second === undefined) {\n const instant = inclusiveDate(first)\n return { id: literal, type: 'instant', instant, startDate: null, endDate: null, end: instant }\n }\n const startDate = datePart(first)\n const endDate = inclusiveDate(second)\n return { id: literal, type: 'duration', instant: null, startDate, endDate, end: endDate }\n}\n\n/** Whether `a` states a value more precisely than `b` (`INF` is exact). */\nfunction morePrecise(a: string | null, b: string | null): boolean {\n const rank = (d: string | null): number =>\n d === null\n ? -Infinity\n : d === 'INF'\n ? Infinity\n : Number.isNaN(Number(d))\n ? -Infinity\n : Number(d)\n return rank(a) > rank(b)\n}\n\nfunction datePart(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction inclusiveDate(value: string): string {\n const date = datePart(value)\n if (!/T/.test(value)) return date\n const t = Date.parse(`${date}T00:00:00Z`)\n if (Number.isNaN(t)) return date\n return new Date(t - 86400000).toISOString().slice(0, 10)\n}\n\n// ── The parse ───────────────────────────────────────────────────────────────\n\n/** Parse a `tavi.json` document (string or parsed object) into the model. */\nexport function parseTavi(doc: string | object): NormalizedReport {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as TaviDocument\n const model: TaviModel = json.xbrlModel ?? {}\n const namespaces = json.documentInfo?.namespaces ?? {}\n\n // ── Labels: object → label type → text (the first of each type wins) ──\n const labels = new Map<string, Map<string, string>>()\n for (const l of model.labels ?? []) {\n if (!l.forObject || !l.labelType || typeof l.value !== 'string') continue\n let byType = labels.get(l.forObject)\n if (!byType) {\n byType = new Map()\n labels.set(l.forObject, byType)\n }\n if (!byType.has(l.labelType)) byType.set(l.labelType, l.value)\n }\n const labelOf = (name: string, type = STANDARD_LABEL): string | null =>\n labels.get(name)?.get(type) ?? null\n const displayLabel = (name: string): string => {\n const standard = labelOf(name)\n return standard ? stripRoleSuffix(standard) : humanize(name)\n }\n\n // ── Facts, first pass: the units concepts are measured in ──\n const facts = model.facts ?? []\n const sharesConcepts = new Set<string>()\n for (const f of facts) {\n const dims = f.factDimensions ?? {}\n const unit = dims['xbrl:unit']\n const concept = dims['xbrl:concept']\n if (typeof unit === 'string' && typeof concept === 'string' && localName(unit) === 'shares') {\n sharesConcepts.add(concept)\n }\n }\n\n // ── Elements: concepts, then the structural objects ──\n const elements: Record<string, ElementInfo> = {}\n for (const c of model.concepts ?? []) {\n const balanceValue = propertyValue(c.properties, 'xbrla:balance')\n const balance: BalanceType | null =\n balanceValue === 'debit' || balanceValue === 'credit' ? balanceValue : null\n const periodType: PeriodType | null =\n c.periodType === 'instant' || c.periodType === 'duration' ? c.periodType : null\n const typed = itemTypeOf(c.dataType)\n const asShares = !typed.numericKind && sharesConcepts.has(c.name)\n elements[c.name] = {\n id: c.name,\n qname: c.name,\n label: displayLabel(c.name),\n balance,\n periodType,\n abstract: false,\n monetary: typed.numericKind === 'monetary',\n itemType: asShares ? 'shares' : typed.itemType,\n numericKind: asShares ? 'shares' : typed.numericKind,\n }\n }\n const structural = [\n ...(model.headings ?? []),\n ...(model.dimensions ?? []),\n ...(model.domainClasses ?? []),\n ...(model.members ?? []),\n ]\n for (const s of structural) {\n if (!s.name || elements[s.name]) continue\n elements[s.name] = {\n id: s.name,\n qname: s.name,\n label: displayLabel(s.name),\n balance: null,\n periodType: null,\n abstract: true,\n monetary: false,\n }\n }\n const explicitAxes = new Set(\n (model.dimensions ?? []).filter((d) => d.domainClass).map((d) => d.name)\n )\n\n // ── Units ──\n const units: Record<string, UnitInfo> = {}\n for (const u of model.units ?? []) {\n if (!u.name) continue\n const measure = u.compositeUnitRepresentation?.[0] ?? u.name\n units[u.name] = {\n id: u.name,\n measure,\n label: measure.includes('/')\n ? measure.split('/').map(localName).join('/')\n : localName(measure),\n }\n }\n\n // ── Sections: one per presentation network, titled by its group's definition ──\n const groups = new Map<string, TaviGroup>()\n for (const g of model.groups ?? []) groups.set(g.name, g)\n const groupOf = new Map<string, string>()\n for (const gc of model.groupContents ?? []) groupOf.set(gc.forObject, gc.groupName)\n const groupIndex = new Map<string, number>()\n ;(model.groups ?? []).forEach((g, i) => groupIndex.set(g.name, i))\n\n const networks = model.networks ?? []\n const structures: StructureInfo[] = []\n const informationBlocks: InformationBlock[] = []\n const presAssociations: PresAssociation[] = []\n const calcAssociations: CalcAssociation[] = []\n /** concept → the presentation networks that present it */\n const presentedIn = new Map<string, string[]>()\n /** group → its first presentation network (the structure a calc network attaches to) */\n const presentationOfGroup = new Map<string, string>()\n\n const sectionMeta = (groupName: string | undefined) => {\n const group = groupName ? groups.get(groupName) : undefined\n const definition = groupName ? labelOf(groupName) : null\n const parsed = parseStructureName(definition)\n const roleUri = group?.groupURI ?? null\n const fallback = roleUri ? humanize(roleUri) : groupName ? humanize(groupName) : 'Section'\n const sortCode = definition ? /^\\s*(\\d+)\\s*-/.exec(definition)?.[1] : undefined\n return {\n roleUri,\n definition: parsed.definition,\n title: parsed.title ?? fallback,\n kind: parsed.kind,\n order: sortCode\n ? Number(sortCode)\n : groupName\n ? (groupIndex.get(groupName) ?? undefined)\n : undefined,\n }\n }\n\n for (const n of networks) {\n if (n.relationshipTypeName !== PRESENTATION) continue\n const groupName = groupOf.get(n.name)\n const meta = sectionMeta(groupName)\n if (groupName && !presentationOfGroup.has(groupName)) presentationOfGroup.set(groupName, n.name)\n structures.push({\n id: n.name,\n blockType: '',\n roleUri: meta.roleUri,\n structureName: meta.title,\n definition: meta.definition,\n kind: meta.kind,\n order: meta.order,\n })\n informationBlocks.push({\n id: n.name,\n blockType: '',\n factSet: n.name,\n label: meta.title,\n structureId: n.name,\n })\n for (const r of n.relationships ?? []) {\n if (!r.source || !r.target) continue\n for (const node of r.source === ROOT_SOURCE ? [r.target] : [r.source, r.target]) {\n const list = presentedIn.get(node)\n if (!list) presentedIn.set(node, [n.name])\n else if (!list.includes(n.name)) list.push(n.name)\n }\n if (r.source === ROOT_SOURCE) continue\n const preferred = propertyValue(r.properties, 'xbrl:preferredLabel')\n const preferredType = typeof preferred === 'string' ? preferred : null\n const preferredText =\n preferredType && preferredType !== STANDARD_LABEL ? labelOf(r.target, preferredType) : null\n presAssociations.push({\n parent: r.source,\n child: r.target,\n order: toNumber(r.order) ?? 0,\n role: meta.roleUri,\n structure: n.name,\n preferredLabel: preferredText ? stripRoleSuffix(preferredText) : null,\n preferredLabelRole: preferredType,\n })\n }\n }\n for (const n of networks) {\n if (n.relationshipTypeName !== CALCULATION) continue\n const groupName = groupOf.get(n.name)\n const structure = (groupName && presentationOfGroup.get(groupName)) ?? null\n const roleUri = groupName ? (groups.get(groupName)?.groupURI ?? null) : null\n for (const r of n.relationships ?? []) {\n if (!r.source || !r.target || r.source === ROOT_SOURCE) continue\n calcAssociations.push({\n parent: r.source,\n child: r.target,\n weight: toNumber(propertyValue(r.properties, 'xbrl:weight')) ?? 1,\n order: toNumber(r.order) ?? 0,\n role: roleUri,\n structure,\n })\n }\n }\n\n // ── Facts ──\n const periods: Record<string, PeriodInfo> = {}\n const out: Fact[] = []\n // A filing may tag one fact at several places in its document; TAVI keeps\n // every occurrence, the holon keeps one. Collapse them here so a period's\n // density (and every cell) counts a fact once, keeping the most precise.\n const seen = new Map<string, number>()\n let registrantName: string | null = null\n for (const f of facts) {\n const dims = f.factDimensions ?? {}\n const element = dims['xbrl:concept']\n const periodLiteral = dims['xbrl:period']\n if (typeof element !== 'string' || typeof periodLiteral !== 'string') continue\n if (!periods[periodLiteral]) periods[periodLiteral] = periodOf(periodLiteral)\n const unit = typeof dims['xbrl:unit'] === 'string' ? (dims['xbrl:unit'] as string) : null\n const entity = typeof dims['xbrl:entity'] === 'string' ? (dims['xbrl:entity'] as string) : null\n const first = f.factValues?.[0]\n const raw = first?.value\n const numeric =\n elements[element]?.numericKind !== undefined || elements[element]?.itemType === 'decimal'\n const value = numeric || typeof raw === 'number' ? toNumber(raw) : null\n const textValue = value === null && raw !== undefined && raw !== null ? String(raw) : null\n if (element === REGISTRANT_NAME && textValue && !registrantName) registrantName = textValue\n const decimalsRaw = first?.decimals\n const decimals =\n typeof decimalsRaw === 'number'\n ? String(decimalsRaw)\n : typeof decimalsRaw === 'string'\n ? decimalsRaw\n : null\n\n const dimensions: DimensionQualifier[] = []\n for (const [axis, member] of Object.entries(dims)) {\n if (CORE_ASPECTS.has(axis)) continue\n const explicit = explicitAxes.has(axis) && typeof member === 'string' && member.includes(':')\n const memberName = explicit ? (member as string) : null\n const typedValue = explicit\n ? null\n : member === null || member === undefined\n ? null\n : String(member)\n dimensions.push({\n axis,\n member: memberName,\n axisLabel: elements[axis]?.label ?? humanize(axis),\n memberLabel: memberName\n ? (elements[memberName]?.label ?? humanize(memberName))\n : (typedValue ?? ''),\n explicit,\n typedValue,\n })\n }\n const factSets = presentedIn.get(element) ?? []\n const identity = [\n element,\n periodLiteral,\n unit ?? '',\n entity ?? '',\n dimensions.map((d) => `${d.axis}=${d.member ?? d.typedValue ?? ''}`).join('&'),\n value ?? textValue ?? '',\n ].join('|')\n const earlier = seen.get(identity)\n if (earlier !== undefined) {\n if (morePrecise(decimals, out[earlier].decimals)) out[earlier].decimals = decimals\n continue\n }\n seen.set(identity, out.length)\n out.push({\n id: f.name,\n element,\n period: periodLiteral,\n unit,\n entity,\n factSet: factSets[0] ?? null,\n factSets: factSets.length ? [...factSets] : undefined,\n value,\n textValue,\n contentType: null,\n decimals,\n dimensions: dimensions.length ? dimensions : undefined,\n })\n }\n\n // ── Entity, report identity ──\n // A filing names its registrant in a dei fact; a model with no dei facts (a\n // ledger's own report) carries the name as a label on the entity object.\n const entityName = model.entities?.[0]?.name ?? null\n const entityLabel = entityName ? labelOf(entityName) : null\n const entity: EntityInfo | null = entityName\n ? {\n id: entityName,\n name: registrantName ?? entityLabel ?? humanize(entityName),\n legalName: registrantName ?? entityLabel,\n country: null,\n }\n : null\n const reportIri = namespaces.rpt ?? null\n const reportId = reportIri\n ? (reportIri.replace(/\\/$/, '').split('/').pop() ?? null)\n : (model.name ?? null)\n\n return {\n reportId,\n reportIri,\n entity,\n informationBlocks,\n structures,\n facts: out,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n\n/** A `ReportAdapter` over an in-memory `tavi.json` document. */\nexport function taviFileAdapter(doc: string | object, source = 'tavi.json'): ReportAdapter {\n return {\n source,\n load: async () => parseTavi(doc),\n }\n}\n","/**\n * One door for both of xbrlkit's JSON projections. A holon is dataset-form\n * JSON-LD (a `@context` and named graphs); a Tavi model announces itself in\n * `documentInfo.documentType`. Callers that take \"a report file\" — a dropped\n * file, a URL — sniff here and never need to know which they were handed.\n */\nimport type { NormalizedReport } from '../model'\nimport { parseJsonld } from './jsonld'\nimport { isTaviDocument, parseTavi } from './tavi'\n\nexport type ReportFormat = 'holon' | 'tavi'\n\n/** The format of a parsed report document, or null when it is neither. */\nexport function detectReportFormat(doc: unknown): ReportFormat | null {\n if (!doc || typeof doc !== 'object') return null\n if (isTaviDocument(doc)) return 'tavi'\n const d = doc as Record<string, unknown>\n if ('@context' in d || '@graph' in d || '@id' in d) return 'holon'\n return null\n}\n\n/** Parse a report document (string or object) whichever JSON projection it is. */\nexport async function parseReportDocument(\n doc: string | object\n): Promise<{ format: ReportFormat; report: NormalizedReport }> {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as object\n const format = detectReportFormat(json)\n if (format === 'tavi') return { format, report: parseTavi(json) }\n if (format === 'holon') return { format, report: await parseJsonld(json) }\n throw new Error('Not a report document: expected a holon (JSON-LD) or a Tavi compiled model')\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/tavi.ts","../../src/adapters/detect.ts"],"names":["entity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The `tavi.json` adapter — offline, no backend, no auth.\n *\n * A filing as a **Project Tavi compiled model** (XBRL International, PWD\n * 2026-09-01): one JSON object model carrying the taxonomy objects and the\n * report objects together, fully resolved. It is the second of xbrlkit's JSON\n * projections beside the holon, and the two carry the same facts, so a report\n * renders identically from either. Unlike the holon there is no RDF step: the\n * model is walked directly, which is also why this adapter is synchronous.\n *\n * The one thing Tavi has that the normalized model must be *given* is the\n * section partition. A holon carries Information Blocks and fact sets; a Tavi\n * carries presentation networks under groups (the extended link roles). Each\n * presentation network becomes a section whose fact set is the network itself,\n * and a fact belongs to every network that presents its concept — the same\n * rule the SEC adapter applies per structure. The pivot's dimensional scope\n * then keeps a segment breakdown out of the face statement.\n *\n * Periods are normalized to the holon's human-facing dates: Tavi writes ISO\n * intervals of exclusive-end dateTimes (`2025-01-01T00:00:00` is the close of\n * 2024-12-31), older emitters wrote inclusive dates; both land as the same\n * `PeriodInfo`.\n */\nimport { humanize, stripRoleSuffix } from '../constants'\nimport type {\n BalanceType,\n CalcAssociation,\n DimensionQualifier,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n NumericKind,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\nimport { parseStructureName } from '../sections'\nimport type { ReportAdapter } from './types'\n\n// ── The document, as far as this adapter reads it ───────────────────────────\n\ninterface TaviProperty {\n property: string\n value?: unknown\n}\ninterface TaviNamed {\n name: string\n}\ninterface TaviConcept extends TaviNamed {\n dataType?: string | null\n periodType?: string | null\n properties?: TaviProperty[]\n}\ninterface TaviDimension extends TaviNamed {\n domainClass?: string | null\n}\ninterface TaviUnit extends TaviNamed {\n dataType?: string\n compositeUnitRepresentation?: string[]\n}\ninterface TaviLabel {\n forObject: string\n labelType: string\n value: string\n language?: string\n}\ninterface TaviRelationship {\n source: string\n target: string\n order?: number\n properties?: TaviProperty[]\n}\ninterface TaviNetwork extends TaviNamed {\n relationshipTypeName?: string\n relationships?: TaviRelationship[]\n roots?: string[]\n}\ninterface TaviGroup extends TaviNamed {\n groupURI?: string\n}\ninterface TaviGroupContent {\n groupName: string\n forObject: string\n}\ninterface TaviFactValue {\n value?: unknown\n decimals?: unknown\n}\ninterface TaviFact extends TaviNamed {\n factDimensions?: Record<string, unknown>\n factValues?: TaviFactValue[]\n properties?: TaviProperty[]\n}\ninterface TaviModel {\n name?: string\n modelType?: string\n properties?: TaviProperty[]\n entities?: TaviNamed[]\n units?: TaviUnit[]\n concepts?: TaviConcept[]\n headings?: TaviNamed[]\n dimensions?: TaviDimension[]\n domainClasses?: TaviNamed[]\n members?: TaviNamed[]\n labels?: TaviLabel[]\n networks?: TaviNetwork[]\n groups?: TaviGroup[]\n groupContents?: TaviGroupContent[]\n facts?: TaviFact[]\n}\n\n/** A Tavi document: the envelope and the model. */\nexport interface TaviDocument {\n documentInfo?: {\n documentType?: string\n namespaces?: Record<string, string>\n description?: string\n }\n xbrlModel?: TaviModel\n}\n\nconst TAVI_DOCUMENT_TYPE = /xbrl\\.org\\/(PWD|20\\d\\d)\\//\nconst PRESENTATION = 'xbrl:parent-child'\nconst CALCULATION = 'xbrl:summation-item'\nconst ROOT_SOURCE = 'xbrl:rootSource'\n/** The fact aspects that are not taxonomy dimensions. */\nconst CORE_ASPECTS = new Set([\n 'xbrl:concept',\n 'xbrl:period',\n 'xbrl:entity',\n 'xbrl:unit',\n 'xbrl:language',\n])\nconst STANDARD_LABEL = 'xbrl:label'\nconst REGISTRANT_NAME = 'dei:EntityRegistrantName'\n/**\n * The groups (report sections) a fact belongs to, space-separated. The draft's\n * group contents name networks and cubes but not facts, so xbrlkit states each\n * fact's sections in this declared property; without it they are inferred.\n */\nconst SECTIONS_PROPERTY = 'rs:groups'\n\n/** Whether a parsed document is a Tavi model (a `documentInfo.documentType` under xbrl.org, or an `xbrlModel` report). */\nexport function isTaviDocument(doc: unknown): doc is TaviDocument {\n if (!doc || typeof doc !== 'object') return false\n const d = doc as TaviDocument\n if (!d.xbrlModel || typeof d.xbrlModel !== 'object') return false\n const type = d.documentInfo?.documentType\n return (\n (typeof type === 'string' && TAVI_DOCUMENT_TYPE.test(type)) ||\n d.xbrlModel.modelType === 'xbrl:report'\n )\n}\n\n// ── Small readers ───────────────────────────────────────────────────────────\n\nfunction propertyValue(props: TaviProperty[] | undefined, name: string): unknown {\n return props?.find((p) => p.property === name)?.value\n}\n\nfunction toNumber(raw: unknown): number | null {\n if (typeof raw === 'number') return Number.isFinite(raw) ? raw : null\n if (typeof raw === 'string' && raw.trim() !== '') {\n const n = Number(raw)\n return Number.isNaN(n) ? null : n\n }\n return null\n}\n\nfunction localName(qname: string): string {\n const i = qname.indexOf(':')\n return i >= 0 ? qname.slice(i + 1) : qname\n}\n\n/**\n * A Tavi datatype → the holon's `rs:itemType` vocabulary and the numeric kind\n * that drives formatting. Share counts have no built-in Tavi type (the\n * emitter records them as a gap), so they are recognized from the unit their\n * facts carry instead — see `sharesConcepts`.\n */\nfunction itemTypeOf(dataType: string | null | undefined): {\n itemType?: string\n numericKind?: NumericKind\n} {\n if (!dataType) return {}\n const local = localName(dataType)\n switch (local) {\n case 'monetary':\n return { itemType: 'monetary', numericKind: 'monetary' }\n case 'perShare':\n return { itemType: 'perShare', numericKind: 'perShare' }\n case 'percent':\n return { itemType: 'percent', numericKind: 'percent' }\n case 'pure':\n case 'pureType':\n return { itemType: 'pure', numericKind: 'pure' }\n case 'sharesType':\n case 'shares':\n return { itemType: 'shares', numericKind: 'shares' }\n case 'integer':\n case 'int':\n case 'long':\n case 'nonNegativeInteger':\n return { itemType: 'integer', numericKind: 'integer' }\n // Plain decimals, and the measured quantities xbrlkit's emitter writes\n // (xbrlr:area … volume): numbers in a unit, never text.\n case 'decimal':\n case 'float':\n case 'double':\n case 'area':\n case 'energy':\n case 'flow':\n case 'force':\n case 'frequency':\n case 'length':\n case 'mass':\n case 'memory':\n case 'planeAngle':\n case 'power':\n case 'pressure':\n case 'speed':\n case 'temperature':\n case 'voltage':\n case 'volume':\n return { itemType: 'decimal' }\n case 'textBlock':\n return { itemType: 'textBlock' }\n case 'boolean':\n return { itemType: 'boolean' }\n case 'date':\n case 'dateTime':\n return { itemType: 'date' }\n case 'string':\n case 'normalizedString':\n case 'token':\n return { itemType: 'string' }\n default:\n return { itemType: local }\n }\n}\n\n/**\n * A Tavi period literal as the holon's human-facing dates. An interval is\n * `start/end`; an instant is one value. A dateTime is exclusive (Tavi's\n * `xbrlr:periodString` form): the day before is the date meant. A bare date\n * (older emitters) is inclusive already.\n */\nfunction periodOf(literal: string): PeriodInfo {\n const [first, second] = literal.split('/')\n if (second === undefined) {\n const instant = inclusiveDate(first)\n return { id: literal, type: 'instant', instant, startDate: null, endDate: null, end: instant }\n }\n const startDate = datePart(first)\n const endDate = inclusiveDate(second)\n return { id: literal, type: 'duration', instant: null, startDate, endDate, end: endDate }\n}\n\n/** Whether `a` states a value more precisely than `b` (`INF` is exact). */\nfunction morePrecise(a: string | null, b: string | null): boolean {\n const rank = (d: string | null): number =>\n d === null\n ? -Infinity\n : d === 'INF'\n ? Infinity\n : Number.isNaN(Number(d))\n ? -Infinity\n : Number(d)\n return rank(a) > rank(b)\n}\n\nfunction datePart(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction inclusiveDate(value: string): string {\n const date = datePart(value)\n if (!/T/.test(value)) return date\n const t = Date.parse(`${date}T00:00:00Z`)\n if (Number.isNaN(t)) return date\n return new Date(t - 86400000).toISOString().slice(0, 10)\n}\n\n// ── The parse ───────────────────────────────────────────────────────────────\n\n/** Parse a `tavi.json` document (string or parsed object) into the model. */\nexport function parseTavi(doc: string | object): NormalizedReport {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as TaviDocument\n const model: TaviModel = json.xbrlModel ?? {}\n const namespaces = json.documentInfo?.namespaces ?? {}\n\n // ── Labels: object → label type → text (the first of each type wins) ──\n const labels = new Map<string, Map<string, string>>()\n for (const l of model.labels ?? []) {\n if (!l.forObject || !l.labelType || typeof l.value !== 'string') continue\n let byType = labels.get(l.forObject)\n if (!byType) {\n byType = new Map()\n labels.set(l.forObject, byType)\n }\n if (!byType.has(l.labelType)) byType.set(l.labelType, l.value)\n }\n const labelOf = (name: string, type = STANDARD_LABEL): string | null =>\n labels.get(name)?.get(type) ?? null\n const displayLabel = (name: string): string => {\n const standard = labelOf(name)\n return standard ? stripRoleSuffix(standard) : humanize(name)\n }\n\n // ── Facts, first pass: the units concepts are measured in ──\n const facts = model.facts ?? []\n const sharesConcepts = new Set<string>()\n for (const f of facts) {\n const dims = f.factDimensions ?? {}\n const unit = dims['xbrl:unit']\n const concept = dims['xbrl:concept']\n if (typeof unit === 'string' && typeof concept === 'string' && localName(unit) === 'shares') {\n sharesConcepts.add(concept)\n }\n }\n\n // ── Elements: concepts, then the structural objects ──\n const elements: Record<string, ElementInfo> = {}\n for (const c of model.concepts ?? []) {\n const balanceValue = propertyValue(c.properties, 'xbrla:balance')\n const balance: BalanceType | null =\n balanceValue === 'debit' || balanceValue === 'credit' ? balanceValue : null\n const periodType: PeriodType | null =\n c.periodType === 'instant' || c.periodType === 'duration' ? c.periodType : null\n const typed = itemTypeOf(c.dataType)\n const asShares = !typed.numericKind && sharesConcepts.has(c.name)\n elements[c.name] = {\n id: c.name,\n qname: c.name,\n label: displayLabel(c.name),\n balance,\n periodType,\n abstract: false,\n monetary: typed.numericKind === 'monetary',\n itemType: asShares ? 'shares' : typed.itemType,\n numericKind: asShares ? 'shares' : typed.numericKind,\n }\n }\n const structural = [\n ...(model.headings ?? []),\n ...(model.dimensions ?? []),\n ...(model.domainClasses ?? []),\n ...(model.members ?? []),\n ]\n for (const s of structural) {\n if (!s.name || elements[s.name]) continue\n elements[s.name] = {\n id: s.name,\n qname: s.name,\n label: displayLabel(s.name),\n balance: null,\n periodType: null,\n abstract: true,\n monetary: false,\n }\n }\n const explicitAxes = new Set(\n (model.dimensions ?? []).filter((d) => d.domainClass).map((d) => d.name)\n )\n\n // ── Units ──\n const units: Record<string, UnitInfo> = {}\n for (const u of model.units ?? []) {\n if (!u.name) continue\n const measure = u.compositeUnitRepresentation?.[0] ?? u.name\n units[u.name] = {\n id: u.name,\n measure,\n label: measure.includes('/')\n ? measure.split('/').map(localName).join('/')\n : localName(measure),\n }\n }\n\n // ── Sections: one per presentation network, titled by its group's definition ──\n const groups = new Map<string, TaviGroup>()\n for (const g of model.groups ?? []) groups.set(g.name, g)\n const groupOf = new Map<string, string>()\n for (const gc of model.groupContents ?? []) groupOf.set(gc.forObject, gc.groupName)\n const groupIndex = new Map<string, number>()\n ;(model.groups ?? []).forEach((g, i) => groupIndex.set(g.name, i))\n\n const networks = model.networks ?? []\n const structures: StructureInfo[] = []\n const informationBlocks: InformationBlock[] = []\n const presAssociations: PresAssociation[] = []\n const calcAssociations: CalcAssociation[] = []\n /** concept → the presentation networks that present it */\n const presentedIn = new Map<string, string[]>()\n /** group → its first presentation network (the structure a calc network attaches to) */\n const presentationOfGroup = new Map<string, string>()\n /** group → every presentation network in it (the sections a stated group names) */\n const presentationsOfGroup = new Map<string, string[]>()\n\n const sectionMeta = (groupName: string | undefined) => {\n const group = groupName ? groups.get(groupName) : undefined\n const definition = groupName ? labelOf(groupName) : null\n const parsed = parseStructureName(definition)\n const roleUri = group?.groupURI ?? null\n const fallback = roleUri ? humanize(roleUri) : groupName ? humanize(groupName) : 'Section'\n const sortCode = definition ? /^\\s*(\\d+)\\s*-/.exec(definition)?.[1] : undefined\n return {\n roleUri,\n definition: parsed.definition,\n title: parsed.title ?? fallback,\n kind: parsed.kind,\n order: sortCode\n ? Number(sortCode)\n : groupName\n ? (groupIndex.get(groupName) ?? undefined)\n : undefined,\n }\n }\n\n for (const n of networks) {\n if (n.relationshipTypeName !== PRESENTATION) continue\n const groupName = groupOf.get(n.name)\n const meta = sectionMeta(groupName)\n if (groupName && !presentationOfGroup.has(groupName)) presentationOfGroup.set(groupName, n.name)\n if (groupName)\n presentationsOfGroup.set(groupName, [...(presentationsOfGroup.get(groupName) ?? []), n.name])\n structures.push({\n id: n.name,\n blockType: '',\n roleUri: meta.roleUri,\n structureName: meta.title,\n definition: meta.definition,\n kind: meta.kind,\n order: meta.order,\n })\n informationBlocks.push({\n id: n.name,\n blockType: '',\n factSet: n.name,\n label: meta.title,\n structureId: n.name,\n })\n for (const r of n.relationships ?? []) {\n if (!r.source || !r.target) continue\n for (const node of r.source === ROOT_SOURCE ? [r.target] : [r.source, r.target]) {\n const list = presentedIn.get(node)\n if (!list) presentedIn.set(node, [n.name])\n else if (!list.includes(n.name)) list.push(n.name)\n }\n if (r.source === ROOT_SOURCE) continue\n const preferred = propertyValue(r.properties, 'xbrl:preferredLabel')\n const preferredType = typeof preferred === 'string' ? preferred : null\n const preferredText =\n preferredType && preferredType !== STANDARD_LABEL ? labelOf(r.target, preferredType) : null\n presAssociations.push({\n parent: r.source,\n child: r.target,\n order: toNumber(r.order) ?? 0,\n role: meta.roleUri,\n structure: n.name,\n preferredLabel: preferredText ? stripRoleSuffix(preferredText) : null,\n preferredLabelRole: preferredType,\n })\n }\n }\n for (const n of networks) {\n if (n.relationshipTypeName !== CALCULATION) continue\n const groupName = groupOf.get(n.name)\n const structure = (groupName && presentationOfGroup.get(groupName)) ?? null\n const roleUri = groupName ? (groups.get(groupName)?.groupURI ?? null) : null\n for (const r of n.relationships ?? []) {\n if (!r.source || !r.target || r.source === ROOT_SOURCE) continue\n calcAssociations.push({\n parent: r.source,\n child: r.target,\n weight: toNumber(propertyValue(r.properties, 'xbrl:weight')) ?? 1,\n order: toNumber(r.order) ?? 0,\n role: roleUri,\n structure,\n })\n }\n }\n\n // ── Facts ──\n const periods: Record<string, PeriodInfo> = {}\n const out: Fact[] = []\n // A filing may tag one fact at several places in its document; TAVI keeps\n // every occurrence, the holon keeps one. Collapse them here so a period's\n // density (and every cell) counts a fact once, keeping the most precise.\n const seen = new Map<string, number>()\n let registrantName: string | null = null\n for (const f of facts) {\n const dims = f.factDimensions ?? {}\n const element = dims['xbrl:concept']\n const periodLiteral = dims['xbrl:period']\n if (typeof element !== 'string' || typeof periodLiteral !== 'string') continue\n if (!periods[periodLiteral]) periods[periodLiteral] = periodOf(periodLiteral)\n const unit = typeof dims['xbrl:unit'] === 'string' ? (dims['xbrl:unit'] as string) : null\n const entity = typeof dims['xbrl:entity'] === 'string' ? (dims['xbrl:entity'] as string) : null\n const first = f.factValues?.[0]\n const raw = first?.value\n const numeric =\n elements[element]?.numericKind !== undefined || elements[element]?.itemType === 'decimal'\n const value = numeric || typeof raw === 'number' ? toNumber(raw) : null\n const textValue = value === null && raw !== undefined && raw !== null ? String(raw) : null\n if (element === REGISTRANT_NAME && textValue && !registrantName) registrantName = textValue\n const decimalsRaw = first?.decimals\n const decimals =\n typeof decimalsRaw === 'number'\n ? String(decimalsRaw)\n : typeof decimalsRaw === 'string'\n ? decimalsRaw\n : null\n\n const dimensions: DimensionQualifier[] = []\n for (const [axis, member] of Object.entries(dims)) {\n if (CORE_ASPECTS.has(axis)) continue\n const explicit = explicitAxes.has(axis) && typeof member === 'string' && member.includes(':')\n const memberName = explicit ? (member as string) : null\n const typedValue = explicit\n ? null\n : member === null || member === undefined\n ? null\n : String(member)\n dimensions.push({\n axis,\n member: memberName,\n axisLabel: elements[axis]?.label ?? humanize(axis),\n memberLabel: memberName\n ? (elements[memberName]?.label ?? humanize(memberName))\n : (typedValue ?? ''),\n explicit,\n typedValue,\n })\n }\n const stated = propertyValue(f.properties, SECTIONS_PROPERTY)\n const factSets =\n typeof stated === 'string'\n ? stated\n .split(/\\s+/)\n .filter(Boolean)\n .flatMap((group) => presentationsOfGroup.get(group) ?? [])\n : (presentedIn.get(element) ?? [])\n const identity = [\n element,\n periodLiteral,\n unit ?? '',\n entity ?? '',\n dimensions.map((d) => `${d.axis}=${d.member ?? d.typedValue ?? ''}`).join('&'),\n value ?? textValue ?? '',\n ].join('|')\n const earlier = seen.get(identity)\n if (earlier !== undefined) {\n if (morePrecise(decimals, out[earlier].decimals)) out[earlier].decimals = decimals\n continue\n }\n seen.set(identity, out.length)\n out.push({\n id: f.name,\n element,\n period: periodLiteral,\n unit,\n entity,\n factSet: factSets[0] ?? null,\n factSets: factSets.length ? [...factSets] : undefined,\n value,\n textValue,\n contentType: null,\n decimals,\n dimensions: dimensions.length ? dimensions : undefined,\n })\n }\n\n // ── Entity, report identity ──\n // A filing names its registrant in a dei fact; a model with no dei facts (a\n // ledger's own report) carries the name as a label on the entity object.\n const entityName = model.entities?.[0]?.name ?? null\n const entityLabel = entityName ? labelOf(entityName) : null\n const entity: EntityInfo | null = entityName\n ? {\n id: entityName,\n name: registrantName ?? entityLabel ?? humanize(entityName),\n legalName: registrantName ?? entityLabel,\n country: null,\n }\n : null\n const reportIri = namespaces.rpt ?? null\n const reportId = reportIri\n ? (reportIri.replace(/\\/$/, '').split('/').pop() ?? null)\n : (model.name ?? null)\n\n return {\n reportId,\n reportIri,\n entity,\n informationBlocks,\n structures,\n facts: out,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n\n/** A `ReportAdapter` over an in-memory `tavi.json` document. */\nexport function taviFileAdapter(doc: string | object, source = 'tavi.json'): ReportAdapter {\n return {\n source,\n load: async () => parseTavi(doc),\n }\n}\n","/**\n * One door for both of xbrlkit's JSON projections. A holon is dataset-form\n * JSON-LD (a `@context` and named graphs); a Tavi model announces itself in\n * `documentInfo.documentType`. Callers that take \"a report file\" — a dropped\n * file, a URL — sniff here and never need to know which they were handed.\n */\nimport type { NormalizedReport } from '../model'\nimport { parseJsonld } from './jsonld'\nimport { isTaviDocument, parseTavi } from './tavi'\n\nexport type ReportFormat = 'holon' | 'tavi'\n\n/** The format of a parsed report document, or null when it is neither. */\nexport function detectReportFormat(doc: unknown): ReportFormat | null {\n if (!doc || typeof doc !== 'object') return null\n if (isTaviDocument(doc)) return 'tavi'\n const d = doc as Record<string, unknown>\n if ('@context' in d || '@graph' in d || '@id' in d) return 'holon'\n return null\n}\n\n/** Parse a report document (string or object) whichever JSON projection it is. */\nexport async function parseReportDocument(\n doc: string | object\n): Promise<{ format: ReportFormat; report: NormalizedReport }> {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as object\n const format = detectReportFormat(json)\n if (format === 'tavi') return { format, report: parseTavi(json) }\n if (format === 'holon') return { format, report: await parseJsonld(json) }\n throw new Error('Not a report document: expected a holon (JSON-LD) or a Tavi compiled model')\n}\n"]}
|