@robosystems/report-components 0.7.0 → 0.8.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/README.md CHANGED
@@ -47,7 +47,7 @@ export function Report() {
47
47
  ## Support
48
48
 
49
49
  - [Issues](https://github.com/RoboFinSystems/robosystems-report-components/issues)
50
- - [Wiki](https://github.com/RoboFinSystems/robosystems/wiki)
50
+ - [Documentation](https://robosystems.ai/docs/technical)
51
51
  - [Projects](https://github.com/orgs/RoboFinSystems/projects)
52
52
  - [Discussions](https://github.com/orgs/RoboFinSystems/discussions)
53
53
 
@@ -68,6 +68,7 @@ interface TaviFactValue {
68
68
  interface TaviFact extends TaviNamed {
69
69
  factDimensions?: Record<string, unknown>;
70
70
  factValues?: TaviFactValue[];
71
+ properties?: TaviProperty[];
71
72
  }
72
73
  interface TaviModel {
73
74
  name?: string;
@@ -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;
@@ -48,6 +49,7 @@ function itemTypeOf(dataType) {
48
49
  case "percent":
49
50
  return { itemType: "percent", numericKind: "percent" };
50
51
  case "pure":
52
+ case "pureType":
51
53
  return { itemType: "pure", numericKind: "pure" };
52
54
  case "sharesType":
53
55
  case "shares":
@@ -57,9 +59,26 @@ function itemTypeOf(dataType) {
57
59
  case "long":
58
60
  case "nonNegativeInteger":
59
61
  return { itemType: "integer", numericKind: "integer" };
62
+ // Plain decimals, and the measured quantities xbrlkit's emitter writes
63
+ // (xbrlr:area … volume): numbers in a unit, never text.
60
64
  case "decimal":
61
65
  case "float":
62
66
  case "double":
67
+ case "area":
68
+ case "energy":
69
+ case "flow":
70
+ case "force":
71
+ case "frequency":
72
+ case "length":
73
+ case "mass":
74
+ case "memory":
75
+ case "planeAngle":
76
+ case "power":
77
+ case "pressure":
78
+ case "speed":
79
+ case "temperature":
80
+ case "voltage":
81
+ case "volume":
63
82
  return { itemType: "decimal" };
64
83
  case "textBlock":
65
84
  return { itemType: "textBlock" };
@@ -86,6 +105,10 @@ function periodOf(literal) {
86
105
  const endDate = inclusiveDate(second);
87
106
  return { id: literal, type: "duration", instant: null, startDate, endDate, end: endDate };
88
107
  }
108
+ function morePrecise(a, b) {
109
+ const rank = (d) => d === null ? -Infinity : d === "INF" ? Infinity : Number.isNaN(Number(d)) ? -Infinity : Number(d);
110
+ return rank(a) > rank(b);
111
+ }
89
112
  function datePart(value) {
90
113
  return value.slice(0, 10);
91
114
  }
@@ -188,6 +211,7 @@ function parseTavi(doc) {
188
211
  const calcAssociations = [];
189
212
  const presentedIn = /* @__PURE__ */ new Map();
190
213
  const presentationOfGroup = /* @__PURE__ */ new Map();
214
+ const presentationsOfGroup = /* @__PURE__ */ new Map();
191
215
  const sectionMeta = (groupName) => {
192
216
  const group = groupName ? groups.get(groupName) : void 0;
193
217
  const definition = groupName ? labelOf(groupName) : null;
@@ -208,6 +232,8 @@ function parseTavi(doc) {
208
232
  const groupName = groupOf.get(n.name);
209
233
  const meta = sectionMeta(groupName);
210
234
  if (groupName && !presentationOfGroup.has(groupName)) presentationOfGroup.set(groupName, n.name);
235
+ if (groupName)
236
+ presentationsOfGroup.set(groupName, [...presentationsOfGroup.get(groupName) ?? [], n.name]);
211
237
  structures.push({
212
238
  id: n.name,
213
239
  blockType: "",
@@ -265,6 +291,7 @@ function parseTavi(doc) {
265
291
  }
266
292
  const periods = {};
267
293
  const out = [];
294
+ const seen = /* @__PURE__ */ new Map();
268
295
  let registrantName = null;
269
296
  for (const f of facts) {
270
297
  const dims = f.factDimensions ?? {};
@@ -297,7 +324,22 @@ function parseTavi(doc) {
297
324
  typedValue
298
325
  });
299
326
  }
300
- const factSets = presentedIn.get(element) ?? [];
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) ?? [];
329
+ const identity = [
330
+ element,
331
+ periodLiteral,
332
+ unit ?? "",
333
+ entity2 ?? "",
334
+ dimensions.map((d) => `${d.axis}=${d.member ?? d.typedValue ?? ""}`).join("&"),
335
+ value ?? textValue ?? ""
336
+ ].join("|");
337
+ const earlier = seen.get(identity);
338
+ if (earlier !== void 0) {
339
+ if (morePrecise(decimals, out[earlier].decimals)) out[earlier].decimals = decimals;
340
+ continue;
341
+ }
342
+ seen.set(identity, out.length);
301
343
  out.push({
302
344
  id: f.name,
303
345
  element,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/tavi.ts","../../src/adapters/detect.ts"],"names":["entity"],"mappings":";;;;AA4HA,IAAM,kBAAA,GAAqB,2BAAA;AAC3B,IAAM,YAAA,GAAe,mBAAA;AACrB,IAAM,WAAA,GAAc,qBAAA;AACpB,IAAM,WAAA,GAAc,iBAAA;AAEpB,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,cAAA,GAAiB,YAAA;AACvB,IAAM,eAAA,GAAkB,0BAAA;AAGjB,SAAS,eAAe,GAAA,EAAmC;AAChE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,IAAI,CAAC,CAAA,CAAE,SAAA,IAAa,OAAO,CAAA,CAAE,SAAA,KAAc,UAAU,OAAO,KAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAc,YAAA;AAC7B,EAAA,OACG,OAAO,SAAS,QAAA,IAAY,kBAAA,CAAmB,KAAK,IAAI,CAAA,IACzD,CAAA,CAAE,SAAA,CAAU,SAAA,KAAc,aAAA;AAE9B;AAIA,SAAS,aAAA,CAAc,OAAmC,IAAA,EAAuB;AAC/E,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,IAAI,CAAA,EAAG,KAAA;AAClD;AAEA,SAAS,SAAS,GAAA,EAA6B;AAC7C,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU,OAAO,OAAO,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,IAAA;AACjE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAChD,IAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,GAAO,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,OAAO,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA;AACvC;AAQA,SAAS,WAAW,QAAA,EAGlB;AACA,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,EAAA,MAAM,KAAA,GAAQ,UAAU,QAAQ,CAAA;AAChC,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,UAAA,EAAW;AAAA,IACzD,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,UAAA,EAAW;AAAA,IACzD,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,SAAA,EAAU;AAAA,IACvD,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAO;AAAA,IACjD,KAAK,YAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,QAAA,EAAS;AAAA,IACrD,KAAK,SAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,oBAAA;AACH,MAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,SAAA,EAAU;AAAA,IACvD,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAAA,IAC/B,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,IACjC,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAAA,IAC/B,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,IAC5B,KAAK,QAAA;AAAA,IACL,KAAK,kBAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,UAAU,QAAA,EAAS;AAAA,IAC9B;AACE,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA;AAE/B;AAQA,SAAS,SAAS,OAAA,EAA6B;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AACzC,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,OAAA,EAAQ;AAAA,EAC/F;AACA,EAAA,MAAM,SAAA,GAAY,SAAS,KAAK,CAAA;AAChC,EAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AACpC,EAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,SAAS,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,GAAA,EAAK,OAAA,EAAQ;AAC1F;AAEA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC1B;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,OAAO,IAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA;AACxC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,IAAA;AAC5B,EAAA,OAAO,IAAI,KAAK,CAAA,GAAI,KAAQ,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACzD;AAKO,SAAS,UAAU,GAAA,EAAwC;AAChE,EAAA,MAAM,OAAQ,OAAO,GAAA,KAAQ,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,GAAA;AAC1D,EAAA,MAAM,KAAA,GAAmB,IAAA,CAAK,SAAA,IAAa,EAAC;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,EAAc,UAAA,IAAc,EAAC;AAGrD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AACpD,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,IAAU,EAAC,EAAG;AAClC,IAAA,IAAI,CAAC,EAAE,SAAA,IAAa,CAAC,EAAE,SAAA,IAAa,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU;AACjE,IAAA,IAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAI;AACjB,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,KAAK,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,IAAA,GAAO,cAAA,KACpC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AACjC,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAyB;AAC7C,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA;AAC7B,IAAA,OAAO,QAAA,GAAW,eAAA,CAAgB,QAAQ,CAAA,GAAI,SAAS,IAAI,CAAA;AAAA,EAC7D,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,cAAA,IAAkB,EAAC;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,WAAW,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,cAAc,CAAA;AACnC,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,OAAO,YAAY,QAAA,IAAY,SAAA,CAAU,IAAI,CAAA,KAAM,QAAA,EAAU;AAC3F,MAAA,cAAA,CAAe,IAAI,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,MAAM,WAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG;AACpC,IAAA,MAAM,YAAA,GAAe,aAAA,CAAc,CAAA,CAAE,UAAA,EAAY,eAAe,CAAA;AAChE,IAAA,MAAM,OAAA,GACJ,YAAA,KAAiB,OAAA,IAAW,YAAA,KAAiB,WAAW,YAAA,GAAe,IAAA;AACzE,IAAA,MAAM,UAAA,GACJ,EAAE,UAAA,KAAe,SAAA,IAAa,EAAE,UAAA,KAAe,UAAA,GAAa,EAAE,UAAA,GAAa,IAAA;AAC7E,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA;AACnC,IAAA,MAAM,WAAW,CAAC,KAAA,CAAM,eAAe,cAAA,CAAe,GAAA,CAAI,EAAE,IAAI,CAAA;AAChE,IAAA,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,GAAI;AAAA,MACjB,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,KAAA,EAAO,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAAA,MAC1B,OAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,MAAM,WAAA,KAAgB,UAAA;AAAA,MAChC,QAAA,EAAU,QAAA,GAAW,QAAA,GAAW,KAAA,CAAM,QAAA;AAAA,MACtC,WAAA,EAAa,QAAA,GAAW,QAAA,GAAW,KAAA,CAAM;AAAA,KAC3C;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,IACvB,GAAI,KAAA,CAAM,UAAA,IAAc,EAAC;AAAA,IACzB,GAAI,KAAA,CAAM,aAAA,IAAiB,EAAC;AAAA,IAC5B,GAAI,KAAA,CAAM,OAAA,IAAW;AAAC,GACxB;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,CAAA,CAAE,IAAA,IAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,GAAI;AAAA,MACjB,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,KAAA,EAAO,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAAA,MAC1B,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AACA,EAAA,MAAM,eAAe,IAAI,GAAA;AAAA,IAAA,CACtB,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,GACzE;AAGA,EAAA,MAAM,QAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG;AACjC,IAAA,IAAI,CAAC,EAAE,IAAA,EAAM;AACb,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,2BAAA,GAA8B,CAAC,KAAK,CAAA,CAAE,IAAA;AACxD,IAAA,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI;AAAA,MACd,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,OAAA;AAAA,MACA,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GACvB,QAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAC1C,UAAU,OAAO;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,IAAU,IAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACxD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,aAAA,IAAiB,EAAC,UAAW,GAAA,CAAI,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA;AAClF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC1C,EAAA,CAAC,KAAA,CAAM,MAAA,IAAU,EAAC,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAA;AAEjE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,MAAM,oBAAwC,EAAC;AAC/C,EAAA,MAAM,mBAAsC,EAAC;AAC7C,EAAA,MAAM,mBAAsC,EAAC;AAE7C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAE9C,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAoB;AAEpD,EAAA,MAAM,WAAA,GAAc,CAAC,SAAA,KAAkC;AACrD,IAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA;AAClD,IAAA,MAAM,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA;AACpD,IAAA,MAAM,MAAA,GAAS,mBAAmB,UAAU,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAO,QAAA,IAAY,IAAA;AACnC,IAAA,MAAM,QAAA,GAAW,UAAU,QAAA,CAAS,OAAO,IAAI,SAAA,GAAY,QAAA,CAAS,SAAS,CAAA,GAAI,SAAA;AACjF,IAAA,MAAM,WAAW,UAAA,GAAa,eAAA,CAAgB,KAAK,UAAU,CAAA,GAAI,CAAC,CAAA,GAAI,MAAA;AACtE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,KAAA,EAAO,OAAO,KAAA,IAAS,QAAA;AAAA,MACvB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAA,EAAO,QAAA,GACH,MAAA,CAAO,QAAQ,CAAA,GACf,YACG,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,IAAK,MAAA,GAC9B;AAAA,KACR;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,yBAAyB,YAAA,EAAc;AAC7C,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,YAAY,SAAS,CAAA;AAClC,IAAA,IAAI,SAAA,IAAa,CAAC,mBAAA,CAAoB,GAAA,CAAI,SAAS,GAAG,mBAAA,CAAoB,GAAA,CAAI,SAAA,EAAW,CAAA,CAAE,IAAI,CAAA;AAC/F,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,SAAA,EAAW,EAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,eAAe,IAAA,CAAK,KAAA;AAAA,MACpB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,MACrB,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,SAAA,EAAW,EAAA;AAAA,MACX,SAAS,CAAA,CAAE,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,CAAA,CAAE;AAAA,KAChB,CAAA;AACD,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG;AACrC,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,EAAE,MAAA,EAAQ;AAC5B,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,WAAA,GAAc,CAAC,CAAA,CAAE,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC/E,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,aAAA,IAChC,CAAC,KAAK,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,CAAA,CAAE,WAAW,WAAA,EAAa;AAC9B,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,CAAA,CAAE,UAAA,EAAY,qBAAqB,CAAA;AACnE,MAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,IAAA;AAClE,MAAA,MAAM,aAAA,GACJ,iBAAiB,aAAA,KAAkB,cAAA,GAAiB,QAAQ,CAAA,CAAE,MAAA,EAAQ,aAAa,CAAA,GAAI,IAAA;AACzF,MAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,QACpB,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,MAAA;AAAA,QACT,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA;AAAA,QAC5B,MAAM,IAAA,CAAK,OAAA;AAAA,QACX,WAAW,CAAA,CAAE,IAAA;AAAA,QACb,cAAA,EAAgB,aAAA,GAAgB,eAAA,CAAgB,aAAa,CAAA,GAAI,IAAA;AAAA,QACjE,kBAAA,EAAoB;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,yBAAyB,WAAA,EAAa;AAC5C,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,MAAM,SAAA,GAAA,CAAa,SAAA,IAAa,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,KAAM,IAAA;AACvE,IAAA,MAAM,UAAU,SAAA,GAAa,MAAA,CAAO,IAAI,SAAS,CAAA,EAAG,YAAY,IAAA,GAAQ,IAAA;AACxE,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,aAAA,IAAiB,EAAC,EAAG;AACrC,MAAA,IAAI,CAAC,EAAE,MAAA,IAAU,CAAC,EAAE,MAAA,IAAU,CAAA,CAAE,WAAW,WAAA,EAAa;AACxD,MAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,QACpB,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,MAAA;AAAA,QACT,QAAQ,QAAA,CAAS,aAAA,CAAc,EAAE,UAAA,EAAY,aAAa,CAAC,CAAA,IAAK,CAAA;AAAA,QAChE,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAA;AAAA,QACN;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,cAAA,IAAkB,EAAC;AAClC,IAAA,MAAM,OAAA,GAAU,KAAK,cAAc,CAAA;AACnC,IAAA,MAAM,aAAA,GAAgB,KAAK,aAAa,CAAA;AACxC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAO,kBAAkB,QAAA,EAAU;AACtE,IAAA,IAAI,CAAC,QAAQ,aAAa,CAAA,UAAW,aAAa,CAAA,GAAI,SAAS,aAAa,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,WAAW,MAAM,QAAA,GAAY,IAAA,CAAK,WAAW,CAAA,GAAe,IAAA;AACrF,IAAA,MAAMA,OAAAA,GAAS,OAAO,IAAA,CAAK,aAAa,MAAM,QAAA,GAAY,IAAA,CAAK,aAAa,CAAA,GAAe,IAAA;AAC3F,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,GAAa,CAAC,CAAA;AAC9B,IAAA,MAAM,MAAM,KAAA,EAAO,KAAA;AACnB,IAAA,MAAM,OAAA,GACJ,SAAS,OAAO,CAAA,EAAG,gBAAgB,MAAA,IAAa,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,KAAa,SAAA;AAClF,IAAA,MAAM,QAAQ,OAAA,IAAW,OAAO,QAAQ,QAAA,GAAW,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA;AACnE,IAAA,MAAM,SAAA,GAAY,UAAU,IAAA,IAAQ,GAAA,KAAQ,UAAa,GAAA,KAAQ,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AACtF,IAAA,IAAI,OAAA,KAAY,eAAA,IAAmB,SAAA,IAAa,CAAC,gBAAgB,cAAA,GAAiB,SAAA;AAClF,IAAA,MAAM,cAAc,KAAA,EAAO,QAAA;AAC3B,IAAA,MAAM,QAAA,GACJ,OAAO,WAAA,KAAgB,QAAA,GACnB,MAAA,CAAO,WAAW,CAAA,GAClB,OAAO,WAAA,KAAgB,QAAA,GACrB,WAAA,GACA,IAAA;AAER,IAAA,MAAM,aAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,IAAK,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAC5F,MAAA,MAAM,UAAA,GAAa,WAAY,MAAA,GAAoB,IAAA;AACnD,MAAA,MAAM,UAAA,GAAa,WACf,IAAA,GACA,MAAA,KAAW,QAAQ,MAAA,KAAW,MAAA,GAC5B,IAAA,GACA,MAAA,CAAO,MAAM,CAAA;AACnB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,WAAW,QAAA,CAAS,IAAI,CAAA,EAAG,KAAA,IAAS,SAAS,IAAI,CAAA;AAAA,QACjD,WAAA,EAAa,aACR,QAAA,CAAS,UAAU,GAAG,KAAA,IAAS,QAAA,CAAS,UAAU,CAAA,GAClD,UAAA,IAAc,EAAA;AAAA,QACnB,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,KAAK,EAAC;AAC9C,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAI,CAAA,CAAE,IAAA;AAAA,MACN,OAAA;AAAA,MACA,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA;AAAA,MACA,MAAA,EAAAA,OAAAA;AAAA,MACA,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AAAA,MACxB,UAAU,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,QAAQ,CAAA,GAAI,MAAA;AAAA,MAC5C,KAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MACb,QAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,MAAA,GAAS,UAAA,GAAa;AAAA,KAC9C,CAAA;AAAA,EACH;AAKA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,GAAW,CAAC,GAAG,IAAA,IAAQ,IAAA;AAChD,EAAA,MAAM,WAAA,GAAc,UAAA,GAAa,OAAA,CAAQ,UAAU,CAAA,GAAI,IAAA;AACvD,EAAA,MAAM,SAA4B,UAAA,GAC9B;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,cAAA,IAAkB,WAAA,IAAe,QAAA,CAAS,UAAU,CAAA;AAAA,IAC1D,WAAW,cAAA,IAAkB,WAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX,GACA,IAAA;AACJ,EAAA,MAAM,SAAA,GAAY,WAAW,GAAA,IAAO,IAAA;AACpC,EAAA,MAAM,QAAA,GAAW,SAAA,GACZ,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,IAAA,GACjD,MAAM,IAAA,IAAQ,IAAA;AAEnB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA,EAAO,GAAA;AAAA,IACP,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,eAAA,CAAgB,GAAA,EAAsB,MAAA,GAAS,WAAA,EAA4B;AACzF,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAA,EAAM,YAAY,SAAA,CAAU,GAAG;AAAA,GACjC;AACF;;;ACxhBO,SAAS,mBAAmB,GAAA,EAAmC;AACpE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AAC5C,EAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG,OAAO,MAAA;AAChC,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,IAAI,cAAc,CAAA,IAAK,QAAA,IAAY,CAAA,IAAK,KAAA,IAAS,GAAG,OAAO,OAAA;AAC3D,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,oBACpB,GAAA,EAC6D;AAC7D,EAAA,MAAM,OAAQ,OAAO,GAAA,KAAQ,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,GAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AACtC,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,EAAE,QAAQ,MAAA,EAAQ,SAAA,CAAU,IAAI,CAAA,EAAE;AAChE,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,EAAE,QAAQ,MAAA,EAAQ,MAAM,WAAA,CAAY,IAAI,CAAA,EAAE;AACzE,EAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAC9F","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 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 case 'decimal':\n case 'float':\n case 'double':\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\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 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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosystems/report-components",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Source-agnostic React components for rendering XBRL-grade financial statements",
5
5
  "license": "MIT",
6
6
  "author": "RFS LLC",