@graphty/graph-io 0.3.28 → 0.3.30

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.
Files changed (142) hide show
  1. package/dist/chunks/{choose-DrXtu_96.js → choose-BfOLq6OX.js} +2 -2
  2. package/dist/chunks/{choose-DrXtu_96.js.map → choose-BfOLq6OX.js.map} +1 -1
  3. package/dist/chunks/{constants-ikG85dT8.js → constants-M8Qsjz1C.js} +2 -2
  4. package/dist/chunks/{constants-ikG85dT8.js.map → constants-M8Qsjz1C.js.map} +1 -1
  5. package/dist/chunks/{escape-D1HPTUrP.js → escape-UMMpQZqs.js} +2 -2
  6. package/dist/chunks/{escape-D1HPTUrP.js.map → escape-UMMpQZqs.js.map} +1 -1
  7. package/dist/chunks/{export-CHd4tQE2.js → export-Dq4U8Ubq.js} +165 -148
  8. package/dist/chunks/{export-CHd4tQE2.js.map → export-Dq4U8Ubq.js.map} +1 -1
  9. package/dist/chunks/{exporter-DhtW6FxK.js → exporter-BUosqV0K.js} +34 -34
  10. package/dist/chunks/exporter-BUosqV0K.js.map +1 -0
  11. package/dist/chunks/{exporter-D23CKNqF.js → exporter-Bd_VZ9ph.js} +9 -10
  12. package/dist/chunks/exporter-Bd_VZ9ph.js.map +1 -0
  13. package/dist/chunks/{exporter-DfWTgrti.js → exporter-COgVm-ff.js} +8 -7
  14. package/dist/chunks/{exporter-DfWTgrti.js.map → exporter-COgVm-ff.js.map} +1 -1
  15. package/dist/chunks/{exporter-Cl021ZIE.js → exporter-DEk_XLLs.js} +4 -4
  16. package/dist/chunks/{exporter-Cl021ZIE.js.map → exporter-DEk_XLLs.js.map} +1 -1
  17. package/dist/chunks/{importer-BZB7iP9r.js → importer-AQ3KpNHz.js} +11 -20
  18. package/dist/chunks/importer-AQ3KpNHz.js.map +1 -0
  19. package/dist/chunks/{importer-BVRE--Un.js → importer-BsZa2Phx.js} +5 -5
  20. package/dist/chunks/importer-BsZa2Phx.js.map +1 -0
  21. package/dist/chunks/{importer-DpEW5zeG.js → importer-CV8au8gH.js} +4 -4
  22. package/dist/chunks/{importer-DpEW5zeG.js.map → importer-CV8au8gH.js.map} +1 -1
  23. package/dist/chunks/{importer-BSALvkui.js → importer-Cj4-lXlv.js} +10 -9
  24. package/dist/chunks/importer-Cj4-lXlv.js.map +1 -0
  25. package/dist/chunks/{importer-B2W_58pz.js → importer-DQsgmhxc.js} +5 -5
  26. package/dist/chunks/{importer-B2W_58pz.js.map → importer-DQsgmhxc.js.map} +1 -1
  27. package/dist/chunks/{importer-CIAzt-wo.js → importer-Dkn79TjB.js} +6 -6
  28. package/dist/chunks/importer-Dkn79TjB.js.map +1 -0
  29. package/dist/chunks/{importer-z_FL4VMb.js → importer-DwSZvMDq.js} +10 -19
  30. package/dist/chunks/importer-DwSZvMDq.js.map +1 -0
  31. package/dist/chunks/{json-elements-BAmNBZok.js → json-elements-CreeKoaH.js} +12 -16
  32. package/dist/chunks/{json-elements-BAmNBZok.js.map → json-elements-CreeKoaH.js.map} +1 -1
  33. package/dist/chunks/{ontology-export-Bab4eUA8.js → ontology-export-C5Xd3W-7.js} +2 -2
  34. package/dist/chunks/{ontology-export-Bab4eUA8.js.map → ontology-export-C5Xd3W-7.js.map} +1 -1
  35. package/dist/chunks/{records-CdlvL4RO.js → records-BwaH_2ll.js} +2 -2
  36. package/dist/chunks/{records-CdlvL4RO.js.map → records-BwaH_2ll.js.map} +1 -1
  37. package/dist/chunks/{text-DzXjAiTl.js → text-4HHe6YH3.js} +2 -2
  38. package/dist/chunks/{text-DzXjAiTl.js.map → text-4HHe6YH3.js.map} +1 -1
  39. package/dist/csv.js +22 -15
  40. package/dist/csv.js.map +1 -1
  41. package/dist/cx.js +1 -1
  42. package/dist/cx2.js +2 -2
  43. package/dist/cys.js +1 -1
  44. package/dist/dot.js +1 -1
  45. package/dist/gexf.js +9 -8
  46. package/dist/gexf.js.map +1 -1
  47. package/dist/gml.js +3 -3
  48. package/dist/graph-io.js +69 -69
  49. package/dist/graphml.js +2 -2
  50. package/dist/json.js +1 -1
  51. package/dist/neo4j.js +3 -3
  52. package/dist/obo.js +1 -1
  53. package/dist/pajek.js +1 -1
  54. package/dist/src/common/export.d.ts +6 -0
  55. package/dist/src/common/export.d.ts.map +1 -1
  56. package/dist/src/common/export.js +62 -28
  57. package/dist/src/common/export.js.map +1 -1
  58. package/dist/src/common/format.d.ts +0 -8
  59. package/dist/src/common/format.d.ts.map +1 -1
  60. package/dist/src/common/format.js +0 -10
  61. package/dist/src/common/format.js.map +1 -1
  62. package/dist/src/common/json-elements.d.ts +1 -9
  63. package/dist/src/common/json-elements.d.ts.map +1 -1
  64. package/dist/src/common/json-elements.js +2 -12
  65. package/dist/src/common/json-elements.js.map +1 -1
  66. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  67. package/dist/src/formats/csv/exporter.js +18 -7
  68. package/dist/src/formats/csv/exporter.js.map +1 -1
  69. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  70. package/dist/src/formats/cx/importer.js +3 -3
  71. package/dist/src/formats/cx/importer.js.map +1 -1
  72. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  73. package/dist/src/formats/cx2/importer.js +3 -3
  74. package/dist/src/formats/cx2/importer.js.map +1 -1
  75. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  76. package/dist/src/formats/cys/exporter.js +4 -3
  77. package/dist/src/formats/cys/exporter.js.map +1 -1
  78. package/dist/src/formats/dot/exporter.js +1 -1
  79. package/dist/src/formats/dot/importer.d.ts +2 -2
  80. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  81. package/dist/src/formats/dot/importer.js +7 -11
  82. package/dist/src/formats/dot/importer.js.map +1 -1
  83. package/dist/src/formats/gexf/exporter.d.ts +2 -2
  84. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  85. package/dist/src/formats/gexf/exporter.js +7 -5
  86. package/dist/src/formats/gexf/exporter.js.map +1 -1
  87. package/dist/src/formats/gexf/schema.js +1 -1
  88. package/dist/src/formats/json/exporter.js +1 -1
  89. package/dist/src/formats/json/importer.d.ts.map +1 -1
  90. package/dist/src/formats/json/importer.js +4 -6
  91. package/dist/src/formats/json/importer.js.map +1 -1
  92. package/dist/src/formats/obo/syntax.d.ts +4 -0
  93. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  94. package/dist/src/formats/obo/syntax.js +35 -31
  95. package/dist/src/formats/obo/syntax.js.map +1 -1
  96. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  97. package/dist/src/formats/pajek/exporter.js +5 -4
  98. package/dist/src/formats/pajek/exporter.js.map +1 -1
  99. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  100. package/dist/src/formats/pajek/importer.js +3 -7
  101. package/dist/src/formats/pajek/importer.js.map +1 -1
  102. package/dist/src/formats/pajek/syntax.d.ts +1 -1
  103. package/dist/src/formats/pajek/syntax.js +1 -1
  104. package/dist/src/formats/xgmml/constants.d.ts +1 -1
  105. package/dist/src/formats/xgmml/constants.js +1 -1
  106. package/dist/src/formats/xgmml/emit.js +1 -1
  107. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  108. package/dist/src/formats/xgmml/exporter.js +4 -3
  109. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  110. package/dist/src/types.d.ts +6 -0
  111. package/dist/src/types.d.ts.map +1 -1
  112. package/dist/src/types.js.map +1 -1
  113. package/dist/xgmml.js +2 -2
  114. package/package.json +1 -1
  115. package/src/common/export.ts +105 -62
  116. package/src/common/format.ts +0 -11
  117. package/src/common/json-elements.ts +2 -13
  118. package/src/formats/csv/exporter.ts +19 -15
  119. package/src/formats/cx/importer.ts +2 -3
  120. package/src/formats/cx2/importer.ts +2 -3
  121. package/src/formats/cys/exporter.ts +4 -3
  122. package/src/formats/dot/exporter.ts +1 -1
  123. package/src/formats/dot/importer.ts +7 -17
  124. package/src/formats/gexf/exporter.ts +7 -5
  125. package/src/formats/gexf/schema.ts +1 -1
  126. package/src/formats/json/exporter.ts +1 -1
  127. package/src/formats/json/importer.ts +4 -7
  128. package/src/formats/obo/syntax.ts +35 -31
  129. package/src/formats/pajek/exporter.ts +5 -4
  130. package/src/formats/pajek/importer.ts +3 -13
  131. package/src/formats/pajek/syntax.ts +1 -1
  132. package/src/formats/xgmml/constants.ts +1 -1
  133. package/src/formats/xgmml/emit.ts +1 -1
  134. package/src/formats/xgmml/exporter.ts +4 -3
  135. package/src/types.ts +6 -0
  136. package/dist/chunks/exporter-D23CKNqF.js.map +0 -1
  137. package/dist/chunks/exporter-DhtW6FxK.js.map +0 -1
  138. package/dist/chunks/importer-BSALvkui.js.map +0 -1
  139. package/dist/chunks/importer-BVRE--Un.js.map +0 -1
  140. package/dist/chunks/importer-BZB7iP9r.js.map +0 -1
  141. package/dist/chunks/importer-CIAzt-wo.js.map +0 -1
  142. package/dist/chunks/importer-z_FL4VMb.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-Dkn79TjB.js","sources":["../../src/formats/cx/exporter.ts","../../src/formats/cx/importer.ts"],"sourcesContent":["/**\n * The CX version 1 exporter (design/graph-io/cytoscape-and-obo/design.md section 1.2): writes a\n * snapshot as the NDEx form of a CX document -- one network with at most one view, no\n * `cySubNetworks` -- which NDEx, ndex2 and Cytoscape's CX import all read.\n *\n * Aspects, in the order Cytoscape and NDEx write them: `numberVerification`, the pre-`metaData`\n * (element counts, `idCounter` on nodes, edges, citations and supports), `nodes` (`n` the label,\n * `r` the `represents` column), `edges` (`i` the `interaction` column), `nodeAttributes`,\n * `edgeAttributes` and `networkAttributes` (values as JSON strings, the spec's form), `cyTableColumn`\n * (so a column no element fills is still declared), `cartesianLayout` (y negated back to screen\n * coordinates), `cyGroups` from the parent / parents column, `cyVisualProperties` from the\n * `cx.bypass` columns, the provenance aspects a CX import created, the style rules and unknown\n * aspects a CX import kept, and `status`.\n *\n * What CX cannot hold is announced by check() before anything is written: every edge is directed\n * (W_CX_UNDIRECTED_AS_DIRECTED, W_MUTUAL_EXPANDED), node ids are integers (E_ID_CHARSET unless\n * `sanitizeIds: \"mangle\"`, which keeps the original in the `graphty:originalId` attribute the\n * importer restores), nested values are written as JSON text (W_CX_JSON_AS_STRING), and the generic\n * notes of checkCapabilities(). NaN and the infinities are written as \"NaN\" / \"Infinity\" in double\n * attributes, which read back as they were.\n */\n\nimport { type Column, GraphFormatError, type GraphSnapshot, type NodeId } from \"@graphty/graph-format\";\n\nimport { childrenCsr } from \"../../children.js\";\nimport {\n aspectBlock,\n type CxNoteFn,\n declaredType,\n directionNotes,\n nextNodeId,\n noteList,\n planEdgeIds,\n planNodeIds,\n stringify,\n type WrittenIds,\n} from \"../../common/cx-export.js\";\nimport { type PairFolding, pairFolding } from \"../../common/direction.js\";\nimport { capabilities, checkCapabilities, LOSS } from \"../../common/export.js\";\nimport { isRecord, POSITION_COLUMN } from \"../../common/json-elements.js\";\nimport { type ResolvedExportOptions, resolveExportOptions } from \"../../common/options.js\";\nimport { plural } from \"../../common/plural.js\";\nimport { type ExplicitWeights, explicitWeights } from \"../../common/weights.js\";\nimport { encodeChunks, joinText } from \"../../common/writer.js\";\nimport { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from \"../../types.js\";\nimport { ORIGINAL_ID_ATTRIBUTE } from \"../cx2/importer.js\";\n\n/** The format name. */\nconst CX_FORMAT = \"cx\";\n\n/**\n * The options of the CX exporter: the common export options; it has none of its own.\n * @category Built-in formats\n */\nexport type CxExportOptions = CommonExportOptions;\n\n/**\n * The loss notes the CX exporter's check() returns, by name. A key is the code without its\n * severity and format prefixes.\n * @category Built-in formats\n */\nexport const CX_LOSS = Object.freeze({\n /**\n * Every edge is written as directed, so an undirected graph, or the undirected edges of a mixed graph, read back\n * as directed.\n */\n UNDIRECTED_AS_DIRECTED: \"W_CX_UNDIRECTED_AS_DIRECTED\",\n /** A nested (json) column is written as a string attribute holding its JSON text. */\n JSON_AS_STRING: \"W_CX_JSON_AS_STRING\",\n /** A mutual pair is written as two directed edges without its mark. */\n MUTUAL_EXPANDED: LOSS.MUTUAL_EXPANDED,\n /**\n * An attribute named `weight` without the weight role reads back as the edge weight, or is not written when the\n * graph has weights of its own.\n */\n WEIGHT_KEY_CLASH: LOSS.WEIGHT_KEY_CLASH,\n /** A start / end / timestamp column: CX has no time. */\n TEMPORAL_DROPPED: LOSS.TEMPORAL,\n /** An attribute with a role the format has no place for is written as a plain attribute; the role is lost. */\n ROLE_DROPPED: LOSS.ROLE,\n /**\n * An attribute without a role is written where the format keeps a role (for example, a `name` column as the label), and\n * reads back with that role.\n */\n ROLE_ASSUMED: LOSS.ROLE_ASSUMED,\n /**\n * An attribute type CX stores as another (a 32-bit float as double, an unsigned integer as long, a byte as\n * integer, a dictionary as string); it reads back with that type.\n */\n DTYPE_UNSUPPORTED: LOSS.DTYPE,\n /** A multi-component column (a second view's `position@2`, a vector) is written as a list of doubles. */\n COMPONENTS_FLATTENED: LOSS.COMPONENTS,\n /** A declared default: CX has none. */\n DEFAULT_DROPPED: LOSS.DEFAULT,\n /** Declared options: CX has no enumerations. */\n OPTIONS_DROPPED: LOSS.OPTIONS,\n /**\n * Node ids the format cannot write, under `sanitizeIds: \"error\"`; the save fails with E_INVALID_ID. Pass\n * `sanitizeIds: \"mangle\"` to rewrite them.\n */\n ID_CHARSET: LOSS.ID_CHARSET,\n /** Node ids that are not integers under sanitizeIds \"mangle\": renumbered, originals kept. */\n ID_MANGLED: LOSS.ID_MANGLED,\n /** Edges without a usable integer id get generated ids. */\n EDGE_IDS_GENERATED: LOSS.EDGE_IDS_GENERATED,\n /**\n * An attribute with a role (for example, the label) is written where the format keeps that role, and reads back under the\n * name the format's importer gives it.\n */\n COLUMN_NAME_CHANGED: LOSS.COLUMN_NAME_CHANGED,\n /** An extension table other than the `cx:citations` / `cx:supports` tables a CX import creates. */\n EXTENSION_TABLE_DROPPED: LOSS.EXTENSION_TABLE,\n /** A position, stacking order or weight that is NaN or infinite: CX spells no such number there. */\n NONFINITE_AS_NULL: LOSS.NONFINITE_AS_NULL,\n /** Visual columns (color, size, shape, thickness roles): CX keeps style as visual properties, not roles. */\n VIZ_DROPPED: LOSS.VIZ,\n});\n\n/**\n * What CX version 1 keeps: directed multigraphs with self-loops, integer node ids, required\n * integer edge ids, typed string / double / integer / boolean attributes and lists of them, network\n * attributes, the position role (one view), and containment as `cyGroups`. f32, u32, u8 and dict\n * columns are written as the nearest declared type and read back as it.\n * @category Built-in formats\n */\nexport const CX_CAPABILITIES: ExportCapabilities = capabilities({\n mixedDirection: false,\n multiEdges: true,\n selfLoops: true,\n edgeIds: \"required\",\n idCharset: \"integer\",\n dtypes: [\"string\", \"f64\", \"i32\", \"bool\"],\n components: false,\n lists: true,\n json: false,\n defaults: false,\n options: false,\n hierarchy: true,\n temporal: \"none\",\n graphAttributes: true,\n positions: true,\n viz: false,\n});\n\n/** The roles CX has a slot for, and the column names its importer gives them. */\nconst SLOT_ROLES: ReadonlySet<string> = new Set([\"label\", \"position\", \"id\"]);\nconst ROLE_NAMES: Readonly<Record<string, string>> = Object.freeze({\n label: \"name\",\n position: POSITION_COLUMN,\n id: \"id\",\n parent: \"parent\",\n});\n\n/** Roles whose columns are never written as attributes. */\nconst SKIPPED_ROLES: ReadonlySet<string> = new Set([\n \"directed\",\n \"pair\",\n \"mutual\",\n \"weight\",\n \"timeText\",\n \"originalId\",\n \"parent\",\n \"parents\",\n \"start\",\n \"end\",\n \"timestamp\",\n \"timestamps\",\n \"spells\",\n \"open\",\n \"spellsOpen\",\n \"position\",\n \"color\",\n \"size\",\n \"shape\",\n \"thickness\",\n \"id\",\n]);\n\n/** The origin namespace of the per-element visual property columns of a CX import. */\nconst BYPASS_NAMESPACE = \"cx.bypass\";\n\n/** The extension tables a CX import creates from the citations and supports aspects. */\nconst PROVENANCE_TABLES: Readonly<Record<string, string>> = Object.freeze({\n \"cx:citations\": \"citations\",\n \"cx:supports\": \"supports\",\n});\n\n/**\n * Kept aspects never written back: they describe the collection, views and SUIDs of the file the\n * snapshot came from, or are written by the exporter itself.\n */\nconst NEVER_WRITTEN: ReadonlySet<string> = new Set([\n \"nodes\",\n \"edges\",\n \"nodeAttributes\",\n \"edgeAttributes\",\n \"networkAttributes\",\n \"cartesianLayout\",\n \"cyGroups\",\n \"cyVisualProperties\",\n \"cyTableColumn\",\n \"cySubNetworks\",\n \"cyNetworkRelations\",\n \"cyViews\",\n \"CX Element ID\",\n \"citations\",\n \"supports\",\n \"nodeCitations\",\n \"edgeCitations\",\n \"nodeSupports\",\n \"edgeSupports\",\n \"functionTerms\",\n \"reifiedEdges\",\n \"numberVerification\",\n \"metaData\",\n \"status\",\n \"groups\",\n \"subnetwork\",\n]);\n\n/** The weight attribute name (the CX importer's weightFrom default). */\nconst WEIGHT_ATTRIBUTE = \"weight\";\n\n/** The dtypes a plain `weight` column may have to be written as the weight. */\nconst NUMERIC_DTYPES: ReadonlySet<string> = new Set([\"f32\", \"f64\", \"i32\", \"u32\", \"u8\"]);\n\n/** One attribute column as it will be written. */\ninterface AttributePlan {\n readonly column: Column;\n /** The attribute name written in n. */\n readonly name: string;\n /** The declared type text. */\n readonly d: string;\n}\n\n/** A core field (n, r, i) and the column it comes from. */\ninterface CorePlan {\n readonly key: \"n\" | \"r\" | \"i\";\n readonly column: Column;\n}\n\n/** The edge weights as written: explicit weights or a plain numeric `weight` column. */\ninterface WeightPlan {\n /**\n * The weight of an edge, or undefined when none is written.\n * @param e - the edge index\n * @returns the value\n */\n value(e: number): number | undefined;\n}\n\n/** Everything export() and check() need, computed once. */\ninterface Plan {\n readonly notes: LossNote[];\n readonly fatal: GraphFormatError | null;\n readonly ids: WrittenIds | null;\n readonly folding: PairFolding;\n readonly edgeIds: readonly number[];\n readonly weight: WeightPlan | null;\n readonly nodeCore: readonly CorePlan[];\n readonly edgeCore: readonly CorePlan[];\n readonly nodeAttrs: readonly AttributePlan[];\n readonly edgeAttrs: readonly AttributePlan[];\n readonly graphAttrs: readonly AttributePlan[];\n readonly position: Column | null;\n readonly positionZ: boolean;\n readonly z: Column | null;\n readonly bypass: {\n readonly node: readonly Column[];\n readonly edge: readonly Column[];\n readonly graph: readonly Column[];\n };\n readonly collapsed: Column | null;\n readonly links: readonly LinkPlan[];\n readonly functionTerm: Column | null;\n readonly reifiedEdge: Column | null;\n}\n\n/** A citations / supports list column and the aspect it is written to. */\ninterface LinkPlan {\n readonly aspect: string;\n readonly key: \"citations\" | \"supports\";\n readonly domain: \"node\" | \"edge\";\n readonly column: Column;\n}\n\n/**\n * Whether a column was created by the CX importer in an origin namespace.\n * @param column - the column\n * @param namespace - the namespace\n * @returns true when it was\n */\nfunction fromCx(column: Column, namespace: string): boolean {\n return column.meta.origin?.format === CX_FORMAT && column.meta.origin.namespace === namespace;\n}\n\n/**\n * Whether a column is a bypass column of a CX import.\n * @param column - the column\n * @returns true for the cx.bypass namespace\n */\nfunction isBypass(column: Column): boolean {\n return column.meta.origin?.namespace === BYPASS_NAMESPACE;\n}\n\n/**\n * Whether a column is the z (stacking order) column.\n * @param column - the column\n * @returns true for the column marked by a Cytoscape-family importer\n */\nfunction isZ(column: Column): boolean {\n return column.meta.extra.cytoscape === \"z\";\n}\n\n/**\n * Whether a column is a provenance list column (citations / supports) of a CX import.\n * @param column - the column\n * @returns true for one\n */\nfunction isLink(column: Column): boolean {\n return (\n fromCx(column, \"provenance\") &&\n column.meta.dtype === \"list\" &&\n (column.meta.name === \"citations\" || column.meta.name === \"supports\")\n );\n}\n\n/**\n * Whether a column holds a text the core fields (n, r, i) cannot hold as itself.\n * @param column - the column\n * @returns true for every dtype but string (dict and json have their own notes)\n */\nfunction coreNeedsText(column: Column): boolean {\n const { dtype } = column.meta;\n return dtype !== \"string\" && dtype !== \"dict\" && dtype !== \"json\";\n}\n\n/**\n * The notes of checkCapabilities(), adapted to CX: json columns are written as JSON text, the id\n * notes are counted by planNodeIds(), the provenance tables and columns a CX import made are\n * written back.\n * @param snapshot - the snapshot\n * @param common - the resolved common options\n * @param several - whether the parents column gives some node several parents\n * @param own - the functionTerm and reifiedEdge columns written as their own aspects\n * @param notes - the notes so far\n * @param note - records a note\n * @returns the error export() throws for mixed direction, or null\n */\nfunction genericNotes(\n snapshot: GraphSnapshot,\n common: ResolvedExportOptions,\n several: boolean,\n own: readonly (Column | null)[],\n notes: LossNote[],\n note: CxNoteFn,\n): GraphFormatError | null {\n let fatal: GraphFormatError | null = null;\n const edgeLabel = snapshot.edges.byRole(\"label\")?.meta.name;\n const ownNames = new Set(own.filter((c): c is Column => c !== null).map((c) => c.meta.name));\n for (const gen of checkCapabilities(snapshot, CX_CAPABILITIES, common, {\n roles: SLOT_ROLES,\n // a parents column reads back as parents only when some node has several parents\n roleNames: several ? { ...ROLE_NAMES, parents: \"parents\" } : ROLE_NAMES,\n })) {\n if (writtenOtherwise(gen, ownNames)) {\n continue;\n }\n if (gen.code === LOSS.JSON) {\n const which = gen.column === null ? \"a column\" : `column \"${gen.column}\"`;\n note(\n CX_LOSS.JSON_AS_STRING,\n `${which} holds nested values; written as a string attribute holding their JSON text`,\n gen.column,\n gen.count,\n );\n continue;\n }\n if (isEdgeLabelRename(gen, edgeLabel)) {\n // only nodes have a label slot (n); an edge label is a plain attribute\n note(\n LOSS.ROLE,\n `edge column \"${edgeLabel ?? \"\"}\" (label) is written as a plain attribute; CX edges have no label slot and the role is lost`,\n gen.column,\n gen.count,\n );\n continue;\n }\n if (gen.code === LOSS.MIXED_DIRECTION_ERROR && fatal === null) {\n fatal = new GraphFormatError(\"E_DIRECTED\", gen.message, { reason: \"mixed direction\" });\n }\n notes.push(gen);\n }\n if (edgeLabel === \"name\") {\n note(\n LOSS.ROLE,\n `edge column \"name\" (label) is written as a plain attribute; CX edges have no label slot and the role is lost`,\n \"name\",\n null,\n );\n }\n return fatal;\n}\n\n/**\n * Whether a generic note is about something CX writes another way: the functionTerm and\n * reifiedEdge columns (their own aspects), ids (counted by planNodeIds(), since CX also keeps\n * integer ids beyond 2^53, which the generic rule refuses) and the provenance tables.\n * @param gen - the generic note\n * @param ownNames - the names of the columns written as their own aspects\n * @returns true when the note does not apply\n */\nfunction writtenOtherwise(gen: LossNote, ownNames: ReadonlySet<string>): boolean {\n if (gen.column !== null && ownNames.has(gen.column) && (gen.code === LOSS.JSON || gen.code === LOSS.DTYPE)) {\n return true;\n }\n if (gen.code === LOSS.ID_CHARSET || gen.code === LOSS.ID_MANGLED) {\n return true;\n }\n return gen.code === LOSS.EXTENSION_TABLE && gen.column !== null && gen.column in PROVENANCE_TABLES;\n}\n\n/**\n * Whether a generic note is the rename of the edge label column.\n * @param gen - the generic note\n * @param edgeLabel - the edge label column's name, if any\n * @returns true when it is\n */\nfunction isEdgeLabelRename(gen: LossNote, edgeLabel: string | undefined): boolean {\n return gen.code === LOSS.COLUMN_NAME_CHANGED && gen.column === edgeLabel && gen.message.startsWith(\"edge column\");\n}\n\n/**\n * The node positions to write: the position column, the z column (when it fits the layout), whether\n * the position's third coordinate is written as z, and the count of non-finite values left out.\n * @param snapshot - the snapshot\n * @param note - records a note\n * @returns the position plan\n */\nfunction planPositions(\n snapshot: GraphSnapshot,\n note: CxNoteFn,\n): { position: Column | null; z: Column | null; positionZ: boolean; nonfinite: number } {\n const position = snapshot.nodes.byRole(\"position\");\n const zColumn = [...snapshot.nodes].find(isZ) ?? null;\n const z = zColumn !== null && zFitsLayout(zColumn, position) ? zColumn : null;\n if (position === null) {\n return { position, z, positionZ: false, nonfinite: 0 };\n }\n let nonfinite = nonFiniteCells(position, (v) => [v[0], v[1]]);\n const depth = nonFiniteCells(position, (v) => (v[2] === 0 ? [] : [Number.NaN]));\n const positionZ = zColumn === null && (position.meta.extra.sourceDims === 3 || depth > 0);\n if (positionZ) {\n nonfinite += nonFiniteCells(position, (v) => (Number.isFinite(v[0]) && Number.isFinite(v[1]) ? [v[2]] : []));\n note(\n LOSS.COMPONENTS,\n `node column \"${position.meta.name}\" (position) has a third coordinate; CX writes it as the layout's z, which reads back in the z column (a stacking order), not in the position`,\n position.meta.name,\n depth,\n );\n }\n return { position, z, positionZ, nonfinite };\n}\n\n/**\n * Note the graph columns that read back as the graph's name or description.\n * @param snapshot - the snapshot\n * @param note - records a note\n */\nfunction graphColumnNotes(snapshot: GraphSnapshot, note: CxNoteFn): void {\n for (const c of snapshot.graph) {\n const named = c.meta.name === \"name\" || c.meta.name === \"description\";\n if (!isBypass(c) && named && (c.dtype === \"string\" || c.dtype === \"dict\")) {\n note(\n LOSS.ROLE_ASSUMED,\n `graph column \"${c.meta.name}\" is written as the network attribute ${c.meta.name}, which reads back as the graph's ${c.meta.name}, not as a column`,\n c.meta.name,\n null,\n );\n }\n }\n}\n\n/**\n * Plan an export: the notes, the fatal condition and what is written.\n * @param snapshot - the snapshot\n * @param common - the resolved common options\n * @returns the plan\n */\nfunction plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {\n const { notes, note } = noteList();\n const functionTerm =\n [...snapshot.nodes].find((c) => fromCx(c, \"provenance\") && c.meta.name === \"functionTerm\") ?? null;\n const reifiedEdge = [...snapshot.nodes].find((c) => fromCx(c, \"reifiedEdges\") && c.dtype === \"u32\") ?? null;\n const children = childrenCsr(snapshot);\n const several = children.column?.meta.role === \"parents\" && severalParents(children.column);\n let fatal = genericNotes(snapshot, common, several, [functionTerm, reifiedEdge], notes, note);\n\n const folding = pairFolding(snapshot);\n directionNotes(snapshot, folding, common, CX_LOSS.UNDIRECTED_AS_DIRECTED, note);\n const planned = planNodeIds(snapshot, common, \"CX\", ORIGINAL_ID_ATTRIBUTE, note);\n const ids = planned instanceof GraphFormatError ? null : planned;\n if (planned instanceof GraphFormatError) {\n fatal ??= planned;\n }\n const edgeIds = planEdgeIds(snapshot, note);\n if (snapshot.nodes.has(ORIGINAL_ID_ATTRIBUTE)) {\n note(\n LOSS.ROLE_ASSUMED,\n `node column \"${ORIGINAL_ID_ATTRIBUTE}\" is the importer's record of mangled ids: it reads back as the node ids unless restoreMangledIds is false`,\n ORIGINAL_ID_ATTRIBUTE,\n null,\n );\n }\n\n // nodes: n, r, the z column, the groups' collapsed flags, provenance\n const positions = planPositions(snapshot, note);\n const { position, z, positionZ } = positions;\n let { nonfinite } = positions;\n const collapsed = [...snapshot.nodes].find((c) => fromCx(c, \"cyGroups\") && c.dtype === \"bool\") ?? null;\n const nodeCore = corePlans(snapshot, note);\n const edgeCore: CorePlan[] = [];\n const interaction = snapshot.edges.get(\"interaction\");\n if (interaction !== null && (interaction.meta.role === null || !SKIPPED_ROLES.has(interaction.meta.role))) {\n edgeCore.push({ key: \"i\", column: interaction });\n coreTextNote(interaction, \"edge\", note);\n }\n\n const coreColumns = new Set<Column>([...nodeCore, ...edgeCore].map((c) => c.column));\n const special = (c: Column): boolean =>\n coreColumns.has(c) ||\n isBypass(c) ||\n isLink(c) ||\n c === z ||\n c === collapsed ||\n c === functionTerm ||\n c === reifiedEdge ||\n (c.meta.role !== null && SKIPPED_ROLES.has(c.meta.role));\n\n const label = snapshot.nodes.byRole(\"label\");\n const renamedName = label !== null && label.meta.name !== \"name\" ? snapshot.nodes.get(\"name\") : null;\n if (renamedName !== null) {\n note(\n LOSS.COLUMN_NAME_CHANGED,\n `node column \"name\" is written as the attribute \"name#2\": the label column \"${label?.meta.name ?? \"\"}\" is written as n, which reads back as \"name\"`,\n \"name\",\n renamedName.length - renamedName.nullCount,\n );\n }\n const nodeAttrs = attributePlans(snapshot.nodes, special, (c) => (c === renamedName ? \"name#2\" : c.meta.name));\n\n const weight = planWeight(snapshot, folding, note);\n const plainWeight = snapshot.edges.get(WEIGHT_ATTRIBUTE);\n const edgeAttrs = attributePlans(\n snapshot.edges,\n (c) => special(c) || (c === plainWeight && c.meta.role === null),\n (c) => c.meta.name,\n );\n nonfinite += weight.nonfinite;\n\n graphColumnNotes(snapshot, note);\n const graphAttrs = attributePlans(snapshot.graph, isBypass, (c) => c.meta.name);\n\n if (children.column !== null && children.column.meta.role === \"parents\" && !several) {\n note(\n LOSS.COLUMN_NAME_CHANGED,\n `node column \"${children.column.meta.name}\" (parents) holds at most one parent per node; it reads back as the single-parent column \"parent\"`,\n children.column.meta.name,\n children.column.length - children.column.nullCount,\n );\n }\n\n if (nonfinite > 0) {\n note(\n LOSS.NONFINITE_AS_NULL,\n `${nonfinite} NaN or infinite position${plural(nonfinite)}, stacking orders or weights cannot be written in CX; they read back unset`,\n null,\n nonfinite,\n );\n }\n return {\n notes,\n fatal,\n ids,\n folding,\n edgeIds,\n weight: weight.plan,\n nodeCore,\n edgeCore,\n nodeAttrs,\n edgeAttrs,\n graphAttrs,\n position,\n positionZ,\n z,\n bypass: {\n node: [...snapshot.nodes].filter(isBypass),\n edge: [...snapshot.edges].filter(isBypass),\n graph: [...snapshot.graph].filter(isBypass),\n },\n collapsed,\n links: linkPlans(snapshot),\n functionTerm,\n reifiedEdge,\n };\n}\n\n/**\n * The node core fields: n from the label column (else a plain `name` column, which then reads back\n * as the label), r from a `represents` column.\n * @param snapshot - the snapshot\n * @param note - records a note\n * @returns the plans\n */\nfunction corePlans(snapshot: GraphSnapshot, note: CxNoteFn): CorePlan[] {\n const out: CorePlan[] = [];\n const label = snapshot.nodes.byRole(\"label\");\n const plainName = snapshot.nodes.get(\"name\");\n const n = label ?? (plainName !== null && plainName.meta.role === null ? plainName : null);\n if (n !== null) {\n out.push({ key: \"n\", column: n });\n coreTextNote(n, \"node\", note);\n if (n !== label) {\n note(\n LOSS.ROLE_ASSUMED,\n `node column \"name\" is written as n and reads back as the label`,\n \"name\",\n n.length - n.nullCount,\n );\n }\n }\n const represents = snapshot.nodes.get(\"represents\");\n if (\n represents !== null &&\n represents !== n &&\n (represents.meta.role === null || !SKIPPED_ROLES.has(represents.meta.role))\n ) {\n out.push({ key: \"r\", column: represents });\n coreTextNote(represents, \"node\", note);\n }\n return out;\n}\n\n/**\n * The note of a core field column that is not text: n, r and i are strings in CX.\n * @param column - the column\n * @param domain - node or edge\n * @param note - records a note\n */\nfunction coreTextNote(column: Column, domain: string, note: CxNoteFn): void {\n if (coreNeedsText(column)) {\n note(\n LOSS.DTYPE,\n `${domain} column \"${column.meta.name}\" is ${column.dtype}; CX writes it as text and it reads back as string`,\n column.meta.name,\n column.length - column.nullCount,\n );\n }\n}\n\n/**\n * The attribute plans of one table.\n * @param table - the table\n * @param skip - columns not written as attributes\n * @param rename - the written name of a column\n * @returns the plans\n */\nfunction attributePlans(\n table: Iterable<Column>,\n skip: (column: Column) => boolean,\n rename: (column: Column) => string,\n): AttributePlan[] {\n return [...table]\n .filter((c) => !skip(c))\n .map((column) => ({ column, name: rename(column), d: declaredType(column) }));\n}\n\n/**\n * The weights to write: the explicit weights, else a plain numeric `weight` column (which then\n * reads back as THE weight); a plain `weight` column that is not written is noted.\n * @param snapshot - the snapshot\n * @param folding - the pair folding\n * @param note - records a note\n * @returns the plan, or null for no weight attribute, and the count of non-finite weights skipped\n */\nfunction planWeight(\n snapshot: GraphSnapshot,\n folding: PairFolding,\n note: CxNoteFn,\n): { plan: WeightPlan | null; nonfinite: number } {\n const weights: ExplicitWeights = explicitWeights(snapshot);\n const plain = snapshot.edges.get(WEIGHT_ATTRIBUTE);\n const clash = plain !== null && plain.meta.role === null;\n let plan: WeightPlan | null = null;\n if (weights.weighted) {\n plan = { value: (e) => (weights.isExplicit(e) ? weights.value(e) : undefined) };\n if (clash) {\n note(\n LOSS.WEIGHT_KEY_CLASH,\n `edge column \"${WEIGHT_ATTRIBUTE}\" is not written: the explicit weights are written under that name`,\n WEIGHT_ATTRIBUTE,\n null,\n );\n }\n } else if (clash) {\n const numeric = NUMERIC_DTYPES.has(plain.dtype);\n note(\n LOSS.WEIGHT_KEY_CLASH,\n numeric\n ? `edge column \"${WEIGHT_ATTRIBUTE}\" is written as the weight attribute and reads back as the edge weight`\n : `edge column \"${WEIGHT_ATTRIBUTE}\" is ${plain.dtype}, and CX reads that attribute as the edge weight; it is not written`,\n WEIGHT_ATTRIBUTE,\n null,\n );\n if (numeric) {\n plan = { value: (e) => (plain.isSet(e) ? (plain.value(e) as number) : undefined) };\n }\n }\n return { plan, nonfinite: plan === null ? 0 : nanWeights(snapshot.edgeCount, plan, folding) };\n}\n\n/**\n * The written weights that are NaN, which is not a weight on re-import (the infinities are).\n * @param edgeCount - the number of edges\n * @param plan - the weight plan\n * @param folding - the pair folding\n * @returns the count\n */\nfunction nanWeights(edgeCount: number, plan: WeightPlan, folding: PairFolding): number {\n let nan = 0;\n for (let e = 0; e < edgeCount; e++) {\n const w = plan.value(e);\n if (!folding.folded(e) && w !== undefined && Number.isNaN(w)) {\n nan++;\n }\n }\n return nan;\n}\n\n/**\n * Whether the z column can go into cartesianLayout: every set z is finite and its node has a\n * finite position (a layout entry needs x and y). Otherwise it is written as an ordinary attribute.\n * @param z - the z column\n * @param position - the position column\n * @returns true when every z fits a layout entry\n */\nfunction zFitsLayout(z: Column, position: Column | null): boolean {\n for (let i = 0; i < z.length; i++) {\n if (!z.isSet(i)) {\n continue;\n }\n const value = z.value(i);\n const point = position?.isSet(i) === true ? (position.value(i) as ArrayLike<number>) : null;\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n point === null ||\n !Number.isFinite(point[0]) ||\n !Number.isFinite(point[1])\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Count the set cells of a multi-component column with a non-finite component among those picked.\n * @param column - the column\n * @param pick - the components that are written\n * @returns the count\n */\nfunction nonFiniteCells(column: Column, pick: (value: ArrayLike<number>) => number[]): number {\n let count = 0;\n for (let i = 0; i < column.length; i++) {\n if (column.isSet(i) && pick(column.value(i) as ArrayLike<number>).some((v) => !Number.isFinite(v))) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Whether a parents column gives some node more than one parent.\n * @param column - the parents list column\n * @returns true when one does\n */\nfunction severalParents(column: Column): boolean {\n for (let i = 0; i < column.length; i++) {\n if (column.isSet(i) && (column.value(i) as ArrayLike<unknown>).length > 1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The citations / supports list columns of a CX import and the aspects they go to.\n * @param snapshot - the snapshot\n * @returns the plans\n */\nfunction linkPlans(snapshot: GraphSnapshot): LinkPlan[] {\n const out: LinkPlan[] = [];\n for (const [domain, table] of [\n [\"node\", snapshot.nodes],\n [\"edge\", snapshot.edges],\n ] as const) {\n for (const column of table) {\n if (isLink(column)) {\n const key = column.meta.name as \"citations\" | \"supports\";\n out.push({ aspect: `${domain}${key === \"citations\" ? \"Citations\" : \"Supports\"}`, key, domain, column });\n }\n }\n }\n return out;\n}\n\n// ============================================================ writing\n\n/**\n * The text of a scalar the way Cytoscape writes CX values: numbers by their shortest decimal\n * (\"-0\", \"NaN\", \"Infinity\" included), booleans as \"true\" / \"false\".\n * @param value - the value\n * @returns the text\n */\nfunction scalarText(value: unknown): string {\n if (typeof value === \"number\") {\n return Object.is(value, -0) ? \"-0\" : String(value);\n }\n if (typeof value === \"string\") {\n return value;\n }\n return typeof value === \"boolean\" ? String(value) : JSON.stringify(value);\n}\n\n/**\n * The v of one cell: a JSON string, or an array of strings for a list type.\n * @param column - the column\n * @param d - its declared type\n * @param row - the row\n * @returns the value, or undefined for an unset cell\n */\nfunction cellValue(column: Column, d: string, row: number): unknown {\n if (!column.isSet(row)) {\n return undefined;\n }\n const value = column.value(row);\n if (column.meta.dtype === \"json\") {\n return JSON.stringify(value);\n }\n if (column.meta.dtype === \"list\" || column.meta.components > 1) {\n const items = Array.from(value as ArrayLike<unknown>);\n return d === \"string\" ? JSON.stringify(items) : items.map(scalarText);\n }\n return scalarText(value);\n}\n\n/**\n * The text a core field (n, r, i) holds for one row.\n * @param column - the column\n * @param row - the row\n * @returns the text, or undefined for an unset cell\n */\nfunction coreText(column: Column, row: number): string | undefined {\n if (!column.isSet(row)) {\n return undefined;\n }\n const value = column.value(row);\n if (column.meta.dtype === \"json\" || column.meta.dtype === \"list\" || column.meta.components > 1) {\n return JSON.stringify(column.meta.dtype === \"json\" ? value : Array.from(value as ArrayLike<unknown>));\n }\n return scalarText(value);\n}\n\n/** One aspect to write: its name, its elements (produced twice: once to count them) and its idCounter. */\ninterface Aspect {\n readonly name: string;\n readonly elements: () => Iterable<unknown>;\n readonly idCounter?: NodeId | undefined;\n}\n\n/**\n * The written edges: every logical edge but the folded halves of pairs.\n * @param snapshot - the snapshot\n * @param folding - the pair folding\n * @returns the edge indexes\n */\nfunction writtenEdges(snapshot: GraphSnapshot, folding: PairFolding): number[] {\n const out: number[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n if (!folding.folded(e)) {\n out.push(e);\n }\n }\n return out;\n}\n\n/**\n * Build every aspect of the document, in the order Cytoscape and NDEx write them.\n * @param snapshot - the snapshot\n * @param p - the plan\n * @param ids - the written node ids\n * @returns the aspects (those without elements included; the writer skips them)\n */\nfunction aspects(snapshot: GraphSnapshot, p: Plan, ids: WrittenIds): Aspect[] {\n const { src, dst } = snapshot.edgeList();\n const edges = writtenEdges(snapshot, p.folding);\n const nodeRange = (): number[] => Array.from({ length: snapshot.nodeCount }, (_, i) => i);\n const nodeCore = (key: \"n\" | \"r\"): Column | null => p.nodeCore.find((c) => c.key === key)?.column ?? null;\n const n = nodeCore(\"n\");\n const r = nodeCore(\"r\");\n const i = p.edgeCore[0]?.column ?? null;\n const kept =\n snapshot.meta.sourceFormat === CX_FORMAT && isRecord(snapshot.meta.extra.cx) ? snapshot.meta.extra.cx : {};\n\n const out: Aspect[] = [\n {\n name: \"nodes\",\n idCounter: nextNodeId(ids, snapshot.nodeCount),\n *elements() {\n for (let row = 0; row < snapshot.nodeCount; row++) {\n const element: Record<string, unknown> = { \"@id\": ids.idAt(row) };\n const name = n === null ? undefined : coreText(n, row);\n const represents = r === null ? undefined : coreText(r, row);\n if (name !== undefined) {\n element.n = name;\n }\n if (represents !== undefined) {\n element.r = represents;\n }\n yield element;\n }\n },\n },\n {\n name: \"edges\",\n idCounter: edges.reduce((max, e) => Math.max(max, p.edgeIds[e] + 1), 0),\n *elements() {\n for (const e of edges) {\n const element: Record<string, unknown> = {\n \"@id\": p.edgeIds[e],\n s: ids.idAt(src[e]),\n t: ids.idAt(dst[e]),\n };\n const interaction = i === null ? undefined : coreText(i, e);\n if (interaction !== undefined) {\n element.i = interaction;\n }\n yield element;\n }\n },\n },\n {\n name: \"nodeAttributes\",\n *elements() {\n for (const a of p.nodeAttrs) {\n for (let row = 0; row < snapshot.nodeCount; row++) {\n const v = cellValue(a.column, a.d, row);\n if (v !== undefined) {\n yield { po: ids.idAt(row), n: a.name, v, d: a.d };\n }\n }\n }\n for (let row = 0; row < snapshot.nodeCount; row++) {\n if (ids.isChanged(row)) {\n yield {\n po: ids.idAt(row),\n n: ORIGINAL_ID_ATTRIBUTE,\n v: String(ids.originalAt(row)),\n d: \"string\",\n };\n }\n }\n },\n },\n {\n name: \"edgeAttributes\",\n *elements() {\n for (const a of p.edgeAttrs) {\n for (const e of edges) {\n const v = cellValue(a.column, a.d, e);\n if (v !== undefined) {\n yield { po: p.edgeIds[e], n: a.name, v, d: a.d };\n }\n }\n }\n if (p.weight !== null) {\n for (const e of edges) {\n const w = p.weight.value(e);\n if (w !== undefined && !Number.isNaN(w)) {\n yield { po: p.edgeIds[e], n: WEIGHT_ATTRIBUTE, v: scalarText(w), d: \"double\" };\n }\n }\n }\n },\n },\n {\n name: \"networkAttributes\",\n *elements() {\n for (const a of p.graphAttrs) {\n const v = cellValue(a.column, a.d, 0);\n if (v !== undefined) {\n yield { n: a.name, v, d: a.d };\n }\n }\n const { meta } = snapshot;\n for (const [key, value] of [\n [\"name\", meta.name],\n [\"description\", meta.description],\n ] as const) {\n if (value !== null && !p.graphAttrs.some((a) => a.name === key)) {\n yield { n: key, v: value, d: \"string\" };\n }\n }\n },\n },\n { name: \"cyTableColumn\", elements: () => tableColumns(p, ids) },\n { name: \"cartesianLayout\", elements: () => layoutElements(p, ids, nodeRange()) },\n { name: \"cyGroups\", elements: () => groupElements(snapshot, p, ids, edges) },\n { name: \"cyVisualProperties\", elements: () => visualProperties(p, ids, nodeRange(), edges, kept) },\n ];\n out.push(...provenanceAspects(snapshot, p, ids, edges));\n for (const [name, value] of Object.entries(kept)) {\n if (!NEVER_WRITTEN.has(name) && Array.isArray(value)) {\n out.push({ name, elements: () => keptElements(value, kept.subnetwork, STYLE_ASPECTS.has(name)) });\n }\n }\n return out;\n}\n\n/**\n * The cyTableColumn entries: every written column with its type, so a column no element fills is\n * still declared on re-import.\n * @param p - the plan\n * @param ids - the written ids\n * @yields the entries\n */\nfunction* tableColumns(p: Plan, ids: WrittenIds): Generator<unknown, void, undefined> {\n for (const { key, column } of [...p.nodeCore, ...p.edgeCore]) {\n const n = { n: \"name\", r: \"represents\", i: \"interaction\" }[key];\n if (n !== undefined && column !== null) {\n yield { applies_to: key === \"i\" ? \"edge_table\" : \"node_table\", n, d: \"string\" };\n }\n }\n for (const a of p.nodeAttrs) {\n yield { applies_to: \"node_table\", n: a.name, d: a.d };\n }\n if (ids.changed > 0) {\n yield { applies_to: \"node_table\", n: ORIGINAL_ID_ATTRIBUTE, d: \"string\" };\n }\n for (const a of p.edgeAttrs) {\n yield { applies_to: \"edge_table\", n: a.name, d: a.d };\n }\n if (p.weight !== null) {\n yield { applies_to: \"edge_table\", n: WEIGHT_ATTRIBUTE, d: \"double\" };\n }\n for (const a of p.graphAttrs) {\n yield { applies_to: \"network_table\", n: a.name, d: a.d };\n }\n}\n\n/** Kept aspects whose view references are rewritten to the one view of the written file. */\nconst STYLE_ASPECTS: ReadonlySet<string> = new Set([\"tableVisualProperties\", \"cyTableVisualProperties\"]);\n\n/**\n * The elements of a kept aspect: those of the snapshot's own subnetwork (or unscoped), with the\n * scope dropped; style elements get their view references rewritten to view 0.\n * @param elements - the kept elements\n * @param subnetwork - the subnetwork the snapshot was read from, if any\n * @param style - whether the aspect is a style aspect\n * @yields the elements to write\n */\nfunction* keptElements(\n elements: readonly unknown[],\n subnetwork: unknown,\n style: boolean,\n): Generator<unknown, void, undefined> {\n for (const element of elements) {\n if (!isRecord(element)) {\n yield element;\n continue;\n }\n if (element.s !== undefined && element.s !== null && element.s !== subnetwork) {\n continue;\n }\n const { s: _scope, ...rest } = element;\n yield style ? rewriteView(rest) : rest;\n }\n}\n\n/**\n * A style element with its view and subnetwork references rewritten to 0, the written network.\n * @param element - the element\n * @returns the rewritten element\n */\nfunction rewriteView(element: Record<string, unknown>): Record<string, unknown> {\n const out = { ...element };\n if (\"view\" in out) {\n out.view = 0;\n }\n if (typeof out.applies_to === \"number\") {\n out.applies_to = 0;\n }\n return out;\n}\n\n/**\n * The cartesianLayout entries: x / y (y negated back to screen coordinates) and z.\n * @param p - the plan\n * @param ids - the written ids\n * @param rows - every node row\n * @yields the entries\n */\nfunction* layoutElements(p: Plan, ids: WrittenIds, rows: readonly number[]): Generator<unknown, void, undefined> {\n const { position } = p;\n if (position === null) {\n return;\n }\n for (const row of rows) {\n if (!position.isSet(row)) {\n continue;\n }\n const point = position.value(row) as ArrayLike<number>;\n if (!Number.isFinite(point[0]) || !Number.isFinite(point[1])) {\n continue;\n }\n const entry: Record<string, unknown> = { node: ids.idAt(row), x: point[0], y: point[1] === 0 ? 0 : -point[1] };\n if (p.z?.isSet(row) === true) {\n entry.z = p.z.value(row);\n } else if (p.positionZ && Number.isFinite(point[2])) {\n entry.z = point[2];\n }\n yield entry;\n }\n}\n\n/**\n * The cyGroups entries: one per node that has members (or a collapsed flag), its members, and the\n * edges with both ends (internal) or one end (external) among them.\n * @param snapshot - the snapshot\n * @param p - the plan\n * @param ids - the written ids\n * @param edges - the written edges\n * @yields the entries\n */\nfunction* groupElements(\n snapshot: GraphSnapshot,\n p: Plan,\n ids: WrittenIds,\n edges: readonly number[],\n): Generator<unknown, void, undefined> {\n const children = childrenCsr(snapshot);\n const groupsOf = new Map<number, number[]>();\n const groups: number[] = [];\n for (let g = 0; g < snapshot.nodeCount; g++) {\n const members = children.childrenOf(g);\n if (members.length > 0 || p.collapsed?.isSet(g) === true) {\n groups.push(g);\n }\n for (const c of members) {\n groupsOf.set(c, [...(groupsOf.get(c) ?? []), g]);\n }\n }\n if (groups.length === 0) {\n return;\n }\n const { internal, external } = groupEdges(snapshot, p, groupsOf, edges);\n const label = p.nodeCore.find((c) => c.key === \"n\")?.column ?? null;\n for (const g of groups) {\n const entry: Record<string, unknown> = { \"@id\": ids.idAt(g) };\n const name = label === null ? undefined : coreText(label, g);\n if (name !== undefined) {\n entry.n = name;\n }\n entry.nodes = Array.from(children.childrenOf(g), (c) => ids.idAt(c));\n entry.internal_edges = internal.get(g) ?? [];\n entry.external_edges = external.get(g) ?? [];\n if (p.collapsed?.isSet(g) === true) {\n entry.collapsed = p.collapsed.value(g);\n }\n yield entry;\n }\n}\n\n/**\n * The written edges of each group: internal (both ends among its members) and external (one end).\n * @param snapshot - the snapshot\n * @param p - the plan\n * @param groupsOf - the groups each member node is in\n * @param edges - the written edges\n * @returns the edge ids by group\n */\nfunction groupEdges(\n snapshot: GraphSnapshot,\n p: Plan,\n groupsOf: ReadonlyMap<number, number[]>,\n edges: readonly number[],\n): { internal: Map<number, number[]>; external: Map<number, number[]> } {\n const internal = new Map<number, number[]>();\n const external = new Map<number, number[]>();\n const add = (table: Map<number, number[]>, g: number, id: number): void => {\n table.set(g, [...(table.get(g) ?? []), id]);\n };\n const { src, dst } = snapshot.edgeList();\n for (const e of edges) {\n const ofSource = groupsOf.get(src[e]) ?? [];\n const ofTarget = groupsOf.get(dst[e]) ?? [];\n for (const g of ofSource) {\n add(ofTarget.includes(g) ? internal : external, g, p.edgeIds[e]);\n }\n for (const g of ofTarget.filter((t) => !ofSource.includes(t))) {\n add(external, g, p.edgeIds[e]);\n }\n }\n return { internal, external };\n}\n\n/**\n * The visual property values of one row: property -> value text.\n * @param columns - the bypass columns\n * @param row - the row\n * @returns the properties, or null when none is set\n */\nfunction bypassValues(columns: readonly Column[], row: number): Record<string, string> | null {\n let out: Record<string, string> | null = null;\n for (const column of columns) {\n if (column.isSet(row)) {\n // the visual property's own name: a column renamed for a clash with an attribute keeps it in origin.id\n const property = column.meta.origin?.id;\n out ??= {};\n out[typeof property === \"string\" && property.length > 0 ? property : column.meta.name] = scalarText(\n column.value(row),\n );\n }\n }\n return out;\n}\n\n/**\n * The cyVisualProperties entries: the network values, the style rules a CX import kept (its own\n * view's, rewritten to view 0) and the per-element values.\n * @param p - the plan\n * @param ids - the written ids\n * @param rows - every node row\n * @param edges - the written edges\n * @param kept - meta.extra.cx of a CX import, else empty\n * @yields the entries\n */\nfunction* visualProperties(\n p: Plan,\n ids: WrittenIds,\n rows: readonly number[],\n edges: readonly number[],\n kept: Record<string, unknown>,\n): Generator<unknown, void, undefined> {\n const network = bypassValues(p.bypass.graph, 0);\n if (network !== null) {\n yield { properties_of: \"network\", properties: network };\n }\n const view = ownView(kept);\n for (const entry of Array.isArray(kept.cyVisualProperties) ? (kept.cyVisualProperties as unknown[]) : []) {\n if (\n isRecord(entry) &&\n ![\"nodes\", \"edges\", \"network\"].includes(String(entry.properties_of)) &&\n (view === null || entry.view === undefined || entry.view === null || entry.view === view)\n ) {\n yield rewriteView(entry);\n }\n }\n for (const row of rows) {\n const properties = bypassValues(p.bypass.node, row);\n if (properties !== null) {\n yield { properties_of: \"nodes\", applies_to: ids.idAt(row), properties };\n }\n }\n for (const e of edges) {\n const properties = bypassValues(p.bypass.edge, e);\n if (properties !== null) {\n yield { properties_of: \"edges\", applies_to: p.edgeIds[e], properties };\n }\n }\n}\n\n/**\n * The view of the subnetwork a CX import read (the one its style rules belong to).\n * @param kept - meta.extra.cx\n * @returns the view id, or null when the file named none\n */\nfunction ownView(kept: Record<string, unknown>): unknown {\n const sub = kept.subnetwork;\n for (const r of Array.isArray(kept.cyNetworkRelations) ? (kept.cyNetworkRelations as unknown[]) : []) {\n if (isRecord(r) && r.r === \"view\" && (sub === undefined || r.p === sub)) {\n return r.c;\n }\n }\n for (const v of Array.isArray(kept.cyViews) ? (kept.cyViews as unknown[]) : []) {\n if (isRecord(v) && (sub === undefined || v.s === sub)) {\n return v[\"@id\"];\n }\n }\n return null;\n}\n\n/**\n * The provenance aspects a CX import turned into extension tables and columns, written back:\n * citations, supports, their node / edge links, functionTerms and reifiedEdges.\n * @param snapshot - the snapshot\n * @param p - the plan\n * @param ids - the written ids\n * @param edges - the written edges\n * @returns the aspects\n */\nfunction provenanceAspects(snapshot: GraphSnapshot, p: Plan, ids: WrittenIds, edges: readonly number[]): Aspect[] {\n const out: Aspect[] = [];\n for (const [table, aspect] of Object.entries(PROVENANCE_TABLES)) {\n const ext = snapshot.extensions.get(table);\n if (ext === undefined) {\n continue;\n }\n const idColumn = ext.get(\"id\");\n const fields = [...ext].filter((c) => c !== idColumn);\n let max = -1;\n for (let row = 0; row < ext.rowCount; row++) {\n if (idColumn?.isSet(row) === true) {\n max = Math.max(max, Number(idColumn.value(row)));\n }\n }\n out.push({\n name: aspect,\n idCounter: max + 1,\n *elements() {\n for (let row = 0; row < ext.rowCount; row++) {\n const element: Record<string, unknown> = {};\n if (idColumn?.isSet(row) === true) {\n element[\"@id\"] = idColumn.value(row);\n }\n for (const field of fields) {\n if (field.isSet(row)) {\n element[field.meta.name] = field.value(row);\n }\n }\n yield element;\n }\n },\n });\n }\n for (const link of p.links) {\n out.push({\n name: link.aspect,\n *elements() {\n const rows = link.domain === \"node\" ? Array.from({ length: snapshot.nodeCount }, (_, i) => i) : edges;\n for (const row of rows) {\n if (link.column.isSet(row)) {\n const po = link.domain === \"node\" ? ids.idAt(row) : p.edgeIds[row];\n yield { po: [po], [link.key]: Array.from(link.column.value(row) as ArrayLike<unknown>) };\n }\n }\n },\n });\n }\n const terms = p.functionTerm;\n if (terms !== null) {\n out.push({\n name: \"functionTerms\",\n *elements() {\n for (let row = 0; row < snapshot.nodeCount; row++) {\n const term = terms.isSet(row) ? terms.value(row) : null;\n if (isRecord(term)) {\n yield { po: ids.idAt(row), ...term };\n }\n }\n },\n });\n }\n const reified = p.reifiedEdge;\n if (reified !== null) {\n out.push({\n name: \"reifiedEdges\",\n *elements() {\n for (let row = 0; row < snapshot.nodeCount; row++) {\n const edge = reified.isSet(row) ? (reified.value(row) as number) : -1;\n if (edge >= 0 && edge < snapshot.edgeCount) {\n yield { node: ids.idAt(row), edge: p.edgeIds[edge] };\n }\n }\n },\n });\n }\n return out;\n}\n\n/**\n * Write the document as text parts.\n * @param snapshot - the snapshot\n * @param p - the plan\n * @yields the document's text\n * @returns nothing\n */\nfunction* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undefined> {\n if (p.fatal !== null) {\n throw p.fatal;\n }\n const { ids } = p;\n if (ids === null) {\n throw new GraphFormatError(\"E_INVALID_ID\", \"node ids cannot be written as CX integers\", { reason: \"charset\" });\n }\n const all = aspects(snapshot, p, ids);\n const written: { aspect: Aspect; count: number }[] = [];\n for (const aspect of all) {\n let count = 0;\n for (const _ of aspect.elements()) {\n count++;\n }\n if (count > 0 || aspect.name === \"nodes\") {\n written.push({ aspect, count });\n }\n }\n const metaData = written.map(({ aspect, count }) => ({\n name: aspect.name,\n version: \"1.0\",\n ...(aspect.idCounter === undefined ? {} : { idCounter: aspect.idCounter }),\n elementCount: count,\n consistencyGroup: 1,\n }));\n yield '[{\"numberVerification\":[{\"longNumber\":281474976710655}]},\\n';\n yield `{\"metaData\":${stringify(metaData)}},\\n`;\n for (const { aspect } of written) {\n yield* aspectBlock(aspect.name, mapIterable(aspect.elements(), stringify));\n }\n yield '{\"status\":[{\"error\":\"\",\"success\":true}]}]\\n';\n}\n\n/**\n * Map an iterable lazily.\n * @param items - the items\n * @param fn - the mapping\n * @yields the mapped items\n */\nfunction* mapIterable<T, U>(items: Iterable<T>, fn: (item: T) => U): Generator<U, void, undefined> {\n for (const item of items) {\n yield fn(item);\n }\n}\n\n/**\n * The CX version 1 exporter plugin.\n * @category Built-in formats\n */\nexport const cxExporter: GraphExporter<CxExportOptions> = Object.freeze({\n format: CX_FORMAT,\n options: Object.freeze([]),\n capabilities: CX_CAPABILITIES,\n\n /**\n * Pre-flight: what export() would lose, without writing anything.\n * @param snapshot - the snapshot\n * @param options - the common options\n * @returns the notes, empty when the export is exact\n */\n check(snapshot: GraphSnapshot, options?: CxExportOptions): readonly LossNote[] {\n return Object.freeze([...plan(snapshot, resolveExportOptions(options)).notes]);\n },\n\n /**\n * Write the document as UTF-8 chunks.\n * @param snapshot - the snapshot\n * @param options - the common options\n * @returns the chunks\n */\n export(snapshot: GraphSnapshot, options?: CxExportOptions): AsyncIterable<Uint8Array> {\n return encodeChunks(write(snapshot, plan(snapshot, resolveExportOptions(options))));\n },\n\n /**\n * Write the document as one string.\n * @param snapshot - the snapshot\n * @param options - the common options\n * @returns the document\n */\n exportToString(snapshot: GraphSnapshot, options?: CxExportOptions): Promise<string> {\n return joinText(write(snapshot, plan(snapshot, resolveExportOptions(options))));\n },\n});\n","/**\n * The CX version 1 importer (design/graph-io/cytoscape-and-obo/design.md section 1.2; the feature\n * and error inventory is research-cx.md): the JSON exchange format of NDEx and Cytoscape's CX\n * support. A CX document is an array of aspect fragments (`nodes`, `edges`, `nodeAttributes`,\n * `cartesianLayout`, `cySubNetworks`, `cyGroups`, `cyVisualProperties`, ...) that refer to each\n * other by integer ids, in any order.\n *\n * The document is read through the streaming scanner of common/json-elements.ts, so its text is\n * never held as one string; the parsed aspect elements are collected and each graph is built at the\n * end, because a reference may precede what it names.\n *\n * Mapping: every edge is directed; ids follow the CX id rule (design section 1.0.2); `n` is the\n * `name` column (the label), `r` is `represents`, `i` is `interaction`; attributes become columns\n * typed by their `d` (Cytoscape's value rule: \"\" and \"null\" are unset, \"NaN\" is NaN in a double); a\n * subnetwork's values are the unscoped ones and its own (`s`), its own winning. A collection (several\n * `cySubNetworks`) holds one graph per subnetwork: `importAll()` returns them, `import()` reads the\n * one `graphIndex` / `graphName` picks, `listGraphs()` lists them. Positions come from the\n * subnetwork's view, y flipped to y-up, `z` into the `z` column; `cyGroups` give `parent` (or\n * `parents`); per-element visual properties are one column per property (origin namespace\n * \"cx.bypass\") and style rules are kept verbatim in `meta.extra.cx` and not applied\n * (W_STYLES_NOT_IMPORTED, issue #706); provenance aspects become extension tables and list columns.\n */\n\nimport {\n type ColumnDecl,\n type ColumnHandle,\n type Dtype,\n type GraphMetaPatch,\n type GraphSink,\n INVALID_INDEX,\n type NodeId,\n type ScalarDtype,\n} from \"@graphty/graph-format\";\n\nimport { declareResolved, uniqueColumnName } from \"../../common/attributes.js\";\nimport {\n AMBIGUOUS_GRAPH_NAME_CODE,\n ASPECT_ORDER_CODE,\n BAD_ASPECT_BLOCK_CODE,\n BAD_VALUE_CODE,\n COLUMN_RENAMED_CODE,\n COUNT_MISMATCH_CODE,\n DANGLING_REFERENCE_CODE,\n DIRECTION_FORCED_CODE,\n DIRECTION_REFUSED_CODE,\n DUPLICATE_ATTRIBUTE_CODE,\n DUPLICATE_EDGE_ID_CODE,\n DUPLICATE_NODE_CODE,\n ELEMENT_ISSUE,\n EMPTY_INPUT_CODE,\n ENCODING_FALLBACK_CODE,\n GRAPH_NOT_FOUND_CODE,\n ID_MERGED_CODE,\n ID_TEXT_TYPE_CODE,\n INPUT_ISSUE,\n INVALID_ENCODING_CODE,\n INVALID_UTF8_CODE,\n JSON_NONSTANDARD_NUMBER_CODE,\n MISSING_ENDPOINT_CODE,\n MISSING_ID_CODE,\n MULTI_ASPECT_FRAGMENT_CODE,\n MULTIPLE_GRAPHS_CODE,\n NO_GRAPH_CODE,\n OPTION_IGNORED_CODE,\n PARENT_CYCLE_CODE,\n PRECISION_CODE,\n ROLE_TAKEN_CODE,\n SINGLE_OBJECT_ASPECT_CODE,\n SINK_OPTION_CODE,\n STATUS_FAILED_CODE,\n STATUS_WARNING_CODE,\n STYLES_NOT_IMPORTED_CODE,\n SYNTAX_CODE,\n TOO_LARGE_CODE,\n UNKNOWN_ATTR_TYPE_CODE,\n UNKNOWN_ELEMENT_CODE,\n UNKNOWN_ENCODING_CODE,\n UNKNOWN_PARENT_CODE,\n WIDENED_CODE,\n} from \"../../common/codes.js\";\nimport { DirectionResolver } from \"../../common/direction.js\";\nimport { IdCoercer } from \"../../common/ids.js\";\nimport { textChunks, throwIfAborted } from \"../../common/input.js\";\nimport {\n cxId,\n CxStructure,\n declareFresh,\n ExactInteger,\n flipY,\n headText,\n inexactLiteral,\n isRecord,\n JsonScanError,\n keptPrecision,\n plainJson,\n positionDecl,\n reportSharedBlock,\n reportTooDeep,\n scanAspects,\n zDecl,\n} from \"../../common/json-elements.js\";\nimport {\n chooseGraph,\n graphChosen,\n type ImportFormatDefaults,\n reportSinkOptions,\n reportUnusedOptions,\n type ResolvedImportOptions,\n resolveImportOptions,\n} from \"../../common/options.js\";\nimport { agree, plural } from \"../../common/plural.js\";\nimport { ImportReportBuilder } from \"../../common/report.js\";\nimport { weightFromValue } from \"../../common/weights.js\";\nimport {\n type CommonImportOptions,\n type GraphChoiceOptions,\n type GraphImporter,\n type GraphListing,\n type ImportInput,\n type ImportReport,\n} from \"../../types.js\";\nimport { ORIGINAL_ID_ATTRIBUTE, zAsOption } from \"../cx2/importer.js\";\n\n/** The format name. */\nconst CX_FORMAT = \"cx\";\n\n/** The origin namespace of the per-element visual property columns. */\nconst CX_BYPASS_NAMESPACE = \"cx.bypass\";\n\n/**\n * The format-specific options of the CX importer.\n * @category Built-in formats\n */\nexport interface CxImportOptions extends GraphChoiceOptions, CommonImportOptions {\n /**\n * Where Cytoscape's `z` value (a drawing order, not a depth) goes: \"column\" keeps it as a node\n * attribute named `z`; \"position\" makes it the third coordinate of the position.\n * @defaultValue \"column\"\n */\n zAs?: \"column\" | \"position\" | undefined;\n}\n\n/**\n * The issue codes the CX importer records, by name: the codes shared with\n * the other importers and the CX-specific ones. A key is the code without\n * its severity and format prefixes.\n * @category Built-in formats\n */\nexport const CX_ISSUE = Object.freeze({\n ...INPUT_ISSUE,\n ...ELEMENT_ISSUE,\n /** The input is empty. The import stops. */\n EMPTY_INPUT: EMPTY_INPUT_CODE,\n /** The text is not valid JSON. The import stops. */\n SYNTAX: SYNTAX_CODE,\n /** The input is not valid UTF-8. The import stops. */\n INVALID_UTF8: INVALID_UTF8_CODE,\n /**\n * Some bytes are not valid in the encoding that was chosen (by a byte order mark or the `encoding` option). The\n * import stops.\n */\n INVALID_ENCODING: INVALID_ENCODING_CODE,\n /** Bytes that are not UTF-8 were read as windows-1252. */\n ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,\n /** An encoding the platform cannot decode was ignored. */\n UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,\n /** The document is not a CX array, or it is CX2 (the message says so; read it as `cx2`). The import stops. */\n NOT_CX: \"E_CX_NOT_CX\",\n /** NumberVerification holds another value than 2^48 - 1, or comes twice. */\n NUMBER_VERIFICATION: \"W_CX_NUMBER_VERIFICATION\",\n /** An old Cytoscape aspect name (visualProperties, subNetworks, ...) read under its cy name. */\n OLD_ASPECT_NAME: \"W_CX_OLD_ASPECT_NAME\",\n /** A cyGroups group whose id is not a node: the group node is added. */\n GROUP_NODE_ADDED: \"W_CX_GROUP_NODE_ADDED\",\n /** Nodes or edges of the root network that no subnetwork holds: Cytoscape shows them in no network; not read. */\n ROOT_ONLY: \"W_CX_ROOT_ONLY\",\n /** The program that wrote the file marked it as failed, so it is incomplete. The import stops. */\n STATUS_FAILED: STATUS_FAILED_CODE,\n /** The program that wrote the file marked it as successful but added an error message; the message is shown. */\n STATUS_WARNING: STATUS_WARNING_CODE,\n /**\n * A member of the file's top-level array that is not a block with one key (`{\"nodes\": [...]}`), or an element of a\n * block that is not an object. It is skipped; the rest of the file is read.\n */\n BAD_ASPECT_BLOCK: BAD_ASPECT_BLOCK_CODE,\n /** An aspect after the post-metadata or after the status, a third metaData. */\n ASPECT_ORDER: ASPECT_ORDER_CODE,\n /** A metaData element count disagrees with what was read. */\n COUNT_MISMATCH: COUNT_MISMATCH_CODE,\n /** A value that does not parse as its data type; the cell is unset. */\n BAD_VALUE: BAD_VALUE_CODE,\n /**\n * An attribute's type was widened because a later value did not fit: an integer above 2^31 in an integer column,\n * or two declared types for one attribute.\n */\n WIDENED: WIDENED_CODE,\n /** A data type CX does not define; the value is kept as text. */\n UNKNOWN_ATTR_TYPE: UNKNOWN_ATTR_TYPE_CODE,\n /** An attribute, layout, bypass, subnetwork member, view or provenance entry naming nothing. */\n DANGLING_REFERENCE: DANGLING_REFERENCE_CODE,\n /** The same attribute twice on one element (or n and a different name attribute); the later wins. */\n DUPLICATE_ATTRIBUTE: DUPLICATE_ATTRIBUTE_CODE,\n /** A group member naming no node. */\n UNKNOWN_PARENT: UNKNOWN_PARENT_CODE,\n /** A group membership that would close a parent cycle; dropped. */\n PARENT_CYCLE: PARENT_CYCLE_CODE,\n /** The style rules of cyVisualProperties are not applied; they are kept so a CX export writes them back. */\n STYLES_NOT_IMPORTED: STYLES_NOT_IMPORTED_CODE,\n /** A node without an id (its `@id` key). The node is skipped. */\n MISSING_ID: MISSING_ID_CODE,\n /** An edge without s or t. */\n MISSING_ENDPOINT: MISSING_ENDPOINT_CODE,\n /** A node id declared twice; the second merges into the first. */\n DUPLICATE_NODE: DUPLICATE_NODE_CODE,\n /** An edge id declared twice; the second edge is skipped. */\n DUPLICATE_EDGE_ID: DUPLICATE_EDGE_ID_CODE,\n /** An id that is not an integer. */\n INVALID_ID: \"E_INVALID_ID\",\n /**\n * A node or edge key CX does not define, an aspect graph-io keeps for writing back, or a table CX does not define;\n * it is skipped.\n */\n UNKNOWN_ELEMENT: UNKNOWN_ELEMENT_CODE,\n /** A member holding several aspects; each array-valued key is read as its own fragment. */\n MULTI_ASPECT_FRAGMENT: MULTI_ASPECT_FRAGMENT_CODE,\n /** An aspect written as one object, not an array of elements; read as one element. */\n SINGLE_OBJECT_ASPECT: SINGLE_OBJECT_ASPECT_CODE,\n /** The bare tokens NaN / Infinity / -Infinity (Python's json writes them), read as numbers. */\n JSON_NONSTANDARD_NUMBER: JSON_NONSTANDARD_NUMBER_CODE,\n /** An edge endpoint naming no node of the graph (addMissingNodes false, the default). */\n UNKNOWN_NODE: \"E_UNKNOWN_NODE\",\n /** A weight that is not a number. */\n INVALID_WEIGHT: \"E_INVALID_WEIGHT\",\n /** An id spelled as a string or a non-integer literal; read as the integer. */\n ID_TEXT_TYPE: ID_TEXT_TYPE_CODE,\n /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: \"string\"` to keep every digit. */\n PRECISION: PRECISION_CODE,\n /** Two id texts merged under `ids: \"number\"`. */\n ID_MERGED: ID_MERGED_CODE,\n /**\n * The file holds several graphs and only the first was read. It is not added when `graphIndex` or `graphName` chose the graph.\n * `importAllGraphs()` reads every one.\n */\n MULTIPLE_GRAPHS: MULTIPLE_GRAPHS_CODE,\n /** `graphIndex` or `graphName` matches no subnetwork. The import stops. */\n GRAPH_NOT_FOUND: GRAPH_NOT_FOUND_CODE,\n /** `graphName` matches several subnetworks. The import stops. */\n AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,\n /** The input holds no graph. The import stops. */\n NO_GRAPH: NO_GRAPH_CODE,\n /**\n * An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example\n * two attributes declared with the same name.\n */\n COLUMN_RENAMED: COLUMN_RENAMED_CODE,\n /**\n * You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as\n * a plain attribute.\n */\n ROLE_TAKEN: ROLE_TAKEN_CODE,\n /**\n * You read into a graph builder whose direction is already set, or which already holds edges, so the file is read\n * with the builder's direction instead of its own.\n */\n DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,\n /** Edges of the other direction were read with the direction `onMixedDirection` chose. */\n DIRECTION_FORCED: DIRECTION_FORCED_CODE,\n /** You set an option this format does not use; it had no effect. The message names the option. */\n OPTION_IGNORED: OPTION_IGNORED_CODE,\n /**\n * You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,\n * `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.\n */\n SINK_OPTION: SINK_OPTION_CODE,\n /** The input is larger than graph-io's size limit. The import stops. */\n TOO_LARGE: TOO_LARGE_CODE,\n});\n\nconst USED_OPTIONS: ReadonlySet<keyof CommonImportOptions> = new Set<keyof CommonImportOptions>([\n \"ids\",\n \"addMissingNodes\",\n \"duplicateEdges\",\n \"selfLoops\",\n \"onMixedDirection\",\n \"weightFrom\",\n \"weightDtype\",\n \"long\",\n \"restoreMangledIds\",\n \"errorLimit\",\n \"signal\",\n \"onProgress\",\n]);\n\n/** CX has no undirected edge: defaultDirected never applies (reported W_OPTION_IGNORED). */\nconst FORMAT_DEFAULTS: ImportFormatDefaults = {\n ids: \"keep\",\n defaultDirected: true,\n weightFrom: \"weight\",\n addMissingNodes: false,\n};\n\nconst ABORT_CHECK_INTERVAL = 64;\n\n/** The numberVerification values a reader accepts: 2^48 - 1 and Java's Long.MAX_VALUE. */\nconst NUMBER_VERIFICATION_VALUES: ReadonlySet<string> = new Set([\"281474976710655\", \"9223372036854775807\"]);\n\n/** Old Cytoscape aspect names and the names they are read under. */\nconst OLD_ASPECT_NAMES: ReadonlyMap<string, string> = new Map([\n [\"visualProperties\", \"cyVisualProperties\"],\n [\"subNetworks\", \"cySubNetworks\"],\n [\"networkRelations\", \"cyNetworkRelations\"],\n [\"hiddenAttributes\", \"cyHiddenAttributes\"],\n]);\n\n/** The keys a nodes element defines. */\nconst NODE_KEYS: ReadonlySet<string> = new Set([\"@id\", \"n\", \"r\"]);\n\n/** The keys an edges element defines. */\nconst EDGE_KEYS: ReadonlySet<string> = new Set([\"@id\", \"s\", \"t\", \"i\"]);\n\n/** The tables cyTableColumn applies to. */\nconst TABLES: ReadonlySet<string> = new Set([\"node_table\", \"edge_table\", \"network_table\"]);\n\n/** The aspects the importer reads into the graph (everything else is kept verbatim). */\nconst READ_ASPECTS: ReadonlySet<string> = new Set([\n \"nodes\",\n \"edges\",\n \"nodeAttributes\",\n \"edgeAttributes\",\n \"networkAttributes\",\n \"cartesianLayout\",\n \"cySubNetworks\",\n \"cyNetworkRelations\",\n \"cyViews\",\n \"cyGroups\",\n \"cyVisualProperties\",\n \"cyTableColumn\",\n \"citations\",\n \"supports\",\n \"nodeCitations\",\n \"edgeCitations\",\n \"nodeSupports\",\n \"edgeSupports\",\n \"functionTerms\",\n \"reifiedEdges\",\n \"numberVerification\",\n \"metaData\",\n \"status\",\n]);\n\n/** The aspects also kept verbatim in meta.extra.cx although they are read. */\nconst ALSO_KEPT: ReadonlySet<string> = new Set([\n \"cySubNetworks\",\n \"cyNetworkRelations\",\n \"cyViews\",\n \"cyVisualProperties\",\n \"cyTableColumn\",\n \"numberVerification\",\n \"metaData\",\n]);\n\n/** Cytoscape's table-cell style aspects (both spellings): style rules, kept and reported, never read. */\nconst TABLE_STYLE_ASPECTS: readonly string[] = [\"tableVisualProperties\", \"cyTableVisualProperties\"];\n\n/** The importer's own entries of meta.extra.cx, which an aspect of the same name would collide with. */\nconst OWN_EXTRA_KEYS: readonly string[] = [\"groups\", \"subnetwork\"];\n\n/** The first keys that make a head CX for sure, and the other aspect names a CX document may start with. */\nconst CX_FIRST_KEYS: readonly string[] = [\"numberVerification\", \"metaData\"];\nconst CX_ASPECT_KEYS: readonly string[] = [\n \"nodes\",\n \"edges\",\n \"nodeAttributes\",\n \"edgeAttributes\",\n \"networkAttributes\",\n \"cartesianLayout\",\n \"@context\",\n \"cySubNetworks\",\n \"subNetworks\",\n \"cyNetworkRelations\",\n \"networkRelations\",\n \"cyVisualProperties\",\n \"visualProperties\",\n \"cyHiddenAttributes\",\n \"hiddenAttributes\",\n \"cyTableColumn\",\n \"cyGroups\",\n \"cyViews\",\n \"ndexStatus\",\n \"provenanceHistory\",\n \"citations\",\n \"supports\",\n \"functionTerms\",\n];\n\n// ============================================================ values\n\n/** The canonical CX scalar types. */\ntype CxScalar = \"string\" | \"boolean\" | \"integer\" | \"long\" | \"double\";\n\n/** A CX data type. */\ninterface CxType {\n readonly scalar: CxScalar;\n readonly list: boolean;\n}\n\n/** The CX data types, with the Java reader's float aliases. */\nconst SCALARS: ReadonlyMap<string, CxScalar> = new Map([\n [\"string\", \"string\"],\n [\"boolean\", \"boolean\"],\n [\"integer\", \"integer\"],\n [\"long\", \"long\"],\n [\"double\", \"double\"],\n [\"float\", \"double\"],\n]);\n\n/**\n * Resolve a `d` value.\n * @param d - the data type (undefined: string)\n * @returns the type, or null when CX does not define it\n */\nfunction cxType(d: unknown): CxType | null {\n if (d === undefined || d === null) {\n return { scalar: \"string\", list: false };\n }\n if (typeof d !== \"string\") {\n return null;\n }\n const list = d.startsWith(\"list_of_\");\n const scalar = SCALARS.get(list ? d.slice(\"list_of_\".length) : d);\n return scalar === undefined ? null : { scalar, list };\n}\n\n/**\n * The type text of a type.\n * @param type - the type\n * @returns `list_of_double`, `string`, ...\n */\nfunction typeText(type: CxType): string {\n return type.list ? `list_of_${type.scalar}` : type.scalar;\n}\n\n/** The widening rank of the scalar types (design 5.1 order; boolean and numbers widen to string). */\nconst RANK: Readonly<Record<CxScalar, number>> = { boolean: 0, integer: 1, long: 2, double: 3, string: 4 };\n\n/**\n * Widen two types to one that holds both.\n * @param a - the type so far\n * @param b - another type\n * @returns the wider type, or null when they cannot share a column (a list and a scalar)\n */\nfunction widenType(a: CxType, b: CxType): CxType | null {\n if (a.list !== b.list) {\n return null;\n }\n if (a.scalar === b.scalar) {\n return a;\n }\n const numeric = (s: CxScalar): boolean => s === \"integer\" || s === \"long\" || s === \"double\";\n if (numeric(a.scalar) && numeric(b.scalar)) {\n return RANK[a.scalar] > RANK[b.scalar] ? a : b;\n }\n return { scalar: \"string\", list: a.list };\n}\n\n/** What parseValue() returns for a value that does not parse. */\nconst BAD = Symbol(\"bad\");\n\n/** What parseValue() returns for a value Cytoscape reads as null (\"\", \"null\"). */\nconst UNSET = Symbol(\"unset\");\n\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\nconst INTEGER_TEXT = /^-?[0-9]+$/;\nconst DECIMAL_TEXT = /^-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([eE][+-]?[0-9]+)?$/;\n\n/**\n * Whether a text is Cytoscape's null: the empty string or \"null\" in any case.\n * @param text - the text\n * @returns true for a null text\n */\nfunction isNullText(text: string): boolean {\n return text === \"\" || text.toLowerCase() === \"null\";\n}\n\n/**\n * Parse one scalar value (or list item) of a CX attribute by its type, with Cytoscape's value\n * rule: \"\" and \"null\" are unset, \"NaN\" is NaN in a double (unset in an integer or long), native JSON\n * numbers and booleans are accepted, anything else that does not parse is BAD.\n * @param value - the value (never null)\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value, UNSET or BAD\n */\nfunction parseScalar(\n value: unknown,\n scalar: CxScalar,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n if (value instanceof ExactInteger) {\n if (scalar === \"string\" || (scalar === \"long\" && long === \"string\")) {\n return value.digits;\n }\n if (scalar === \"long\" || scalar === \"double\") {\n if (scalar === \"long\") {\n onPrecision(value.digits);\n }\n return Number(value.digits);\n }\n return BAD;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return parseNative(value, scalar, long);\n }\n if (typeof value !== \"string\") {\n return BAD;\n }\n if (scalar === \"string\") {\n return value;\n }\n if (isNullText(value)) {\n return UNSET;\n }\n switch (scalar) {\n case \"boolean\": {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"false\") {\n return lower === \"true\";\n }\n return BAD;\n }\n case \"integer\":\n case \"long\": {\n if (value === \"NaN\") {\n return UNSET;\n }\n if (!INTEGER_TEXT.test(value)) {\n return BAD;\n }\n const n = Number(value);\n if (scalar === \"integer\") {\n return n >= I32_MIN && n <= I32_MAX ? n : BAD;\n }\n if (long === \"string\") {\n return value;\n }\n if (!Number.isSafeInteger(n)) {\n onPrecision(value);\n }\n return n;\n }\n default: {\n if (value === \"NaN\" || value === \"nan\") {\n return Number.NaN;\n }\n if (value === \"Infinity\" || value === \"-Infinity\") {\n return Number(value);\n }\n if (!DECIMAL_TEXT.test(value)) {\n return BAD;\n }\n const n = Number(value);\n if (!Number.isFinite(n)) {\n // beyond the range of a double: Java's parseDouble gives Infinity too, but say so\n onPrecision(value);\n }\n return n;\n }\n }\n}\n\n/**\n * Parse a native JSON number or boolean by a type.\n * @param value - the value\n * @param scalar - the type\n * @param long - the importer's `long` option\n * @returns the value or BAD\n */\nfunction parseNative(value: number | boolean, scalar: CxScalar, long: \"f64\" | \"string\"): unknown {\n switch (scalar) {\n case \"string\":\n return String(value);\n case \"boolean\":\n return typeof value === \"boolean\" ? value : BAD;\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX\n ? value\n : BAD;\n case \"long\":\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n return BAD;\n }\n return long === \"string\" ? String(value) : value;\n default:\n return typeof value === \"number\" ? value : BAD;\n }\n}\n\n/**\n * Parse an attribute value by its type: a scalar, or a list whose items parse one by one (a null\n * item is NaN in a double list and BAD elsewhere).\n * @param value - the value (never null)\n * @param type - the type\n * @param long - the importer's `long` option\n * @param onPrecision - called for a long beyond 2^53\n * @returns the value, UNSET or BAD\n */\nfunction parseValue(\n value: unknown,\n type: CxType,\n long: \"f64\" | \"string\",\n onPrecision: (digits: string) => void,\n): unknown {\n if (Array.isArray(value) !== type.list) {\n return BAD;\n }\n if (!type.list) {\n return parseScalar(value, type.scalar, long, onPrecision);\n }\n const out: unknown[] = [];\n for (const item of value as unknown[]) {\n let parsed = item === null ? UNSET : parseScalar(item, type.scalar, long, onPrecision);\n if (parsed === UNSET) {\n parsed = type.scalar === \"double\" ? Number.NaN : BAD;\n }\n if (parsed === BAD) {\n return BAD;\n }\n out.push(parsed);\n }\n return out;\n}\n\n/**\n * The column dtype of a type.\n * @param scalar - the scalar type\n * @param long - the importer's `long` option\n * @returns the dtype\n */\nfunction scalarDtype(scalar: CxScalar, long: \"f64\" | \"string\"): ScalarDtype {\n switch (scalar) {\n case \"boolean\":\n return \"bool\";\n case \"integer\":\n return \"i32\";\n case \"long\":\n return long === \"string\" ? \"string\" : \"f64\";\n case \"double\":\n return \"f64\";\n default:\n return \"string\";\n }\n}\n\n/**\n * A parsed value converted to the column's type (a narrower value in a widened column).\n * @param value - the parsed value\n * @param type - the column's type\n * @returns the value to store\n */\nfunction toColumn(value: unknown, type: CxType): unknown {\n if (type.scalar !== \"string\") {\n return value;\n }\n if (type.list) {\n return (value as unknown[]).map((item) => (typeof item === \"string\" ? item : String(item)));\n }\n return typeof value === \"string\" ? value : String(value);\n}\n\n/**\n * A short JSON rendering of a value for a message.\n * @param value - the value\n * @returns the text, at most 60 characters\n */\nfunction shown(value: unknown): string {\n if (value instanceof ExactInteger) {\n return value.digits;\n }\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\n// ============================================================ the document as read\n\n/** A parsed aspect element with where it came from. */\ninterface Held {\n readonly value: unknown;\n readonly line: number;\n /** Bit 1: @id, bit 2: s, bit 4: t was written as a non-integer literal. */\n readonly inexact: number;\n}\n\n/** Everything the scan collects. */\ninterface CxDocument {\n /** The read aspects by their (cy) name. */\n readonly aspects: Map<string, Held[]>;\n /** Attribute elements by table and attribute name. */\n readonly attributes: {\n readonly node: Map<string, Held[]>;\n readonly edge: Map<string, Held[]>;\n readonly network: Map<string, Held[]>;\n };\n /** Aspects kept verbatim in meta.extra.cx. */\n readonly kept: Map<string, unknown[]>;\n readonly structure: CxStructure;\n}\n\n/**\n * The elements of a read aspect.\n * @param doc - the document\n * @param name - the aspect\n * @returns the elements, empty when absent\n */\nfunction aspect(doc: CxDocument, name: string): readonly Held[] {\n return doc.aspects.get(name) ?? [];\n}\n\n/**\n * The inexact-literal bits of an element.\n * @param text - the element's JSON text\n * @param keys - the id keys to check, bit 1, 2, 4 in order\n * @param depth - the depth of the element's own keys in the text (2: a member's single object)\n * @returns the bits\n */\nfunction inexactBits(text: string, keys: readonly string[], depth = 1): number {\n if (!/[0-9][.eE]/.test(text)) {\n return 0;\n }\n let bits = 0;\n keys.forEach((key, i) => {\n if (inexactLiteral(text, key, depth)) {\n bits |= 1 << i;\n }\n });\n return bits;\n}\n\n/**\n * The attribute map of an attribute aspect.\n * @param doc - the document\n * @param name - the aspect name\n * @returns the map, or null for another aspect\n */\nfunction attributeTable(doc: CxDocument, name: string): Map<string, Held[]> | null {\n switch (name) {\n case \"nodeAttributes\":\n return doc.attributes.node;\n case \"edgeAttributes\":\n return doc.attributes.edge;\n case \"networkAttributes\":\n return doc.attributes.network;\n default:\n return null;\n }\n}\n\n/**\n * Check a numberVerification element: 2^48 - 1 (or Java's Long.MAX_VALUE), and only one.\n * @param value - the element\n * @param count - how many numberVerification elements were read, this one included\n * @param report - the report\n * @param line - its line\n */\nfunction checkNumberVerification(value: unknown, count: number, report: ImportReportBuilder, line: number): void {\n const raw = isRecord(value) ? value.longNumber : undefined;\n const digits = raw instanceof ExactInteger ? raw.digits : String(raw);\n if (count > 1 || !NUMBER_VERIFICATION_VALUES.has(digits)) {\n report.warning(\n \"validation-error\",\n CX_ISSUE.NUMBER_VERIFICATION,\n count > 1\n ? \"a second numberVerification element; ignored\"\n : `numberVerification holds ${shown(raw === undefined ? null : digits)}, not 281474976710655`,\n { line, element: \"numberVerification\" },\n );\n }\n}\n\n/**\n * Whether an aspect name is one CX (or NDEx, or Cytoscape) defines.\n * @param name - the aspect name as written\n * @returns true for a known aspect\n */\nfunction isCxAspect(name: string): boolean {\n return (\n READ_ASPECTS.has(name) ||\n OLD_ASPECT_NAMES.has(name) ||\n CX_ASPECT_KEYS.includes(name) ||\n TABLE_STYLE_ASPECTS.includes(name)\n );\n}\n\n/** What collectElement() needs across elements. */\ninterface CollectState {\n readonly doc: CxDocument;\n readonly report: ImportReportBuilder;\n /** numberVerification elements read so far. */\n verifications: number;\n /** The precision callback of the kept aspects. */\n readonly onKeptPrecision: (digits: string) => void;\n}\n\n/** One parsed aspect element and where it came from. */\ninterface CollectedElement {\n readonly name: string;\n readonly value: unknown;\n readonly text: string;\n readonly line: number;\n readonly exact: boolean;\n /** The depth of the element's own keys in text (2 for a member's single object). */\n readonly depth: number;\n}\n\n/** The id keys of the aspects whose ids are checked for precision. */\nconst ID_KEYS: ReadonlyMap<string, readonly string[]> = new Map([\n [\"nodes\", [\"@id\"]],\n [\"edges\", [\"@id\", \"s\", \"t\"]],\n]);\n\n/**\n * File an attribute element by its attribute name n; one without a usable name is reported and skipped.\n * @param table - the aspect's attribute table\n * @param name - the aspect\n * @param held - the element\n * @param report - the report\n */\nfunction fileAttribute(table: Map<string, Held[]>, name: string, held: Held, report: ImportReportBuilder): void {\n const { value, line } = held;\n const n = isRecord(value) ? value.n : undefined;\n if (n === undefined || n === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, `a ${name} element has no attribute name n; skipped`, {\n line,\n element: name,\n });\n return;\n }\n if (typeof n !== \"string\" || n === \"\") {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a ${name} element has the attribute name n ${shown(n)}, not a non-empty string; skipped`,\n { line, element: name },\n );\n return;\n }\n if (!table.has(n)) {\n table.set(n, []);\n }\n table.get(n)?.push(held);\n}\n\n/**\n * File one parsed aspect element: kept verbatim, checked (numberVerification), filed by attribute\n * name (an attribute element without a usable name n is reported and skipped) or by aspect.\n * @param state - the document being collected\n * @param element - the element\n */\nfunction collectElement(state: CollectState, element: CollectedElement): void {\n const { doc, report } = state;\n const { name, value, text, line, exact, depth } = element;\n doc.structure.element(name, value, line);\n if (ALSO_KEPT.has(name) || !READ_ASPECTS.has(name)) {\n if (!doc.kept.has(name)) {\n doc.kept.set(name, []);\n }\n // numberVerification holds Java's Long.MAX_VALUE in every Cytoscape file: checked, never warned\n const onPrecision = name === \"numberVerification\" ? undefined : state.onKeptPrecision;\n doc.kept.get(name)?.push(exact ? plainJson(value, onPrecision) : value);\n }\n if (!READ_ASPECTS.has(name) || name === \"metaData\" || name === \"status\") {\n return;\n }\n if (name === \"numberVerification\") {\n checkNumberVerification(value, ++state.verifications, report, line);\n return;\n }\n const ids = ID_KEYS.get(name);\n const held: Held = { value, line, inexact: ids === undefined ? 0 : inexactBits(text, ids, depth) };\n const table = attributeTable(doc, name);\n if (table !== null) {\n fileAttribute(table, name, held, report);\n return;\n }\n if (!doc.aspects.has(name)) {\n doc.aspects.set(name, []);\n }\n doc.aspects.get(name)?.push(held);\n}\n\n/**\n * Read the whole document through the streaming scanner, checking its structure.\n * @param input - the input\n * @param report - the report\n * @param options - the resolved options\n * @returns what was read\n */\nasync function readDocument(\n input: ImportInput,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n): Promise<CxDocument> {\n const structure = new CxStructure(report, (name) => OLD_ASPECT_NAMES.get(name) ?? name);\n const doc: CxDocument = {\n aspects: new Map(),\n attributes: { node: new Map(), edge: new Map(), network: new Map() },\n kept: new Map(),\n structure,\n };\n const state: CollectState = {\n doc,\n report,\n verifications: 0,\n onKeptPrecision: keptPrecision(report, \"meta.extra.cx\"),\n };\n let sinceCheck = 0;\n let members = 0;\n let known = 0;\n const unknownNames = new Set<string>();\n const lastMember = { block: -1 };\n const countMember = (block: number, name: string | null): void => {\n if (block !== lastMember.block) {\n lastMember.block = block;\n members++;\n }\n if (name !== null && isCxAspect(name)) {\n known++;\n } else if (name !== null) {\n unknownNames.add(name);\n }\n };\n const canonical = (name: string, line: number): string => {\n const renamed = OLD_ASPECT_NAMES.get(name);\n if (renamed === undefined) {\n return name;\n }\n report.warnOnce(\n \"coercion\",\n CX_ISSUE.OLD_ASPECT_NAME,\n `the old aspect name \"${name}\" is read as \"${renamed}\"`,\n { line, element: name },\n `${CX_ISSUE.OLD_ASPECT_NAME}:${name}`,\n );\n return renamed;\n };\n const collect = (name: string, value: unknown, text: string, line: number, exact: boolean, depth = 1): void => {\n collectElement(state, { name, value, text, line, exact, depth });\n };\n try {\n for await (const event of scanAspects(textChunks(input, report, options), report)) {\n if (++sinceCheck >= ABORT_CHECK_INTERVAL) {\n sinceCheck = 0;\n throwIfAborted(options.signal);\n }\n switch (event.kind) {\n case \"root\":\n report.fail(\n CX_ISSUE.NOT_CX,\n `a CX document is a JSON array of aspects; found ${event.object ? \"an object\" : shown(event.value)}`,\n { line: event.line },\n );\n break;\n case \"member\": {\n const { value } = event;\n if (isRecord(value) && \"CXVersion\" in value) {\n report.fail(\n CX_ISSUE.NOT_CX,\n `the document is CX2 (CXVersion ${shown(value.CXVersion)}), not CX version 1; read it with the cx2 importer`,\n { line: event.line },\n );\n }\n const keys = isRecord(value) ? Object.keys(value) : [];\n if (isRecord(value) && keys.length === 1 && isRecord(value[keys[0]])) {\n countMember(event.block, keys[0]);\n const name = canonical(keys[0], event.line);\n if (isCxAspect(name)) {\n report.warning(\n \"validation-error\",\n CX_ISSUE.SINGLE_OBJECT_ASPECT,\n `the \"${keys[0]}\" aspect is one object, not an array of elements; read as one element`,\n { line: event.line, element: keys[0] },\n );\n }\n structure.block(name, event.line);\n collect(name, value[keys[0]], event.text, event.line, event.exact, 2);\n break;\n }\n countMember(event.block, null);\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a member of the document is ${keys.length > 1 ? `an object with ${keys.length} keys (${keys.join(\", \")})` : shown(value)}, not a one-key aspect fragment; skipped`,\n { line: event.line, element: keys[0] ?? null },\n );\n break;\n }\n case \"block\":\n countMember(event.block, event.aspect);\n reportSharedBlock(report, event);\n structure.block(canonical(event.aspect, event.line), event.line);\n break;\n case \"element\": {\n const name = OLD_ASPECT_NAMES.get(event.aspect) ?? event.aspect;\n collect(name, event.value, event.text, event.line, event.exact);\n break;\n }\n case \"deep\":\n countMember(event.block, event.aspect);\n reportTooDeep(report, event);\n break;\n case \"extraKeys\":\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `the \"${event.aspect}\" fragment holds more keys (${event.keys.join(\", \")}) whose values are not arrays; a fragment has one key, the others are skipped`,\n { line: event.line, element: event.aspect },\n );\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (err instanceof JsonScanError) {\n report.fail(err.empty ? EMPTY_INPUT_CODE : SYNTAX_CODE, err.message, { line: err.line });\n }\n throw err;\n }\n if (members > 0 && known === 0) {\n const found = [...unknownNames].slice(0, 5).map((n) => JSON.stringify(n));\n const hint = unknownNames.has(\"data\") ? \": Cytoscape.js elements?\" : \"\";\n const seen = found.length > 0 ? ` (found ${found.join(\", \")}${hint})` : \"\";\n report.fail(CX_ISSUE.NOT_CX, `no member of the array is a CX aspect${seen}; the input is not CX`);\n }\n if (structure.hasStatus && !structure.statusWellFormed()) {\n report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the status element is ${shown(structure.status ?? null)}, not an object with a boolean success; ignored`,\n { element: \"status\" },\n );\n }\n structure.checkCounts();\n return doc;\n}\n\n// ============================================================ graphs (subnetworks)\n\n/** One graph of a document: the root network, or one subnetwork of a collection. */\ninterface GraphPlan {\n readonly index: number;\n readonly name: string | null;\n /** The subnetwork's id, or null for the root network. */\n readonly subnetwork: NodeId | null;\n /** The member node ids, or null for every node. */\n readonly nodes: ReadonlySet<NodeId> | null;\n /** The member edge ids, or null for every edge. */\n readonly edges: ReadonlySet<NodeId> | null;\n /** The views of the graph, the first one first. */\n readonly views: readonly NodeId[];\n}\n\n/**\n * An id of a reference, or null when it is not one.\n * @param raw - the parsed reference\n * @returns the id\n */\nfunction refId(raw: unknown): NodeId | null {\n try {\n return cxId(raw).id;\n } catch {\n return null;\n }\n}\n\n/**\n * A member list: the ids of an array, or null for \"all\" (an absent list is empty).\n * @param raw - the list\n * @param onBad - told about a list that is neither an array nor \"all\" (BAD_VALUE) and about a\n * member that is not an id (INVALID_ID)\n * @returns the set, or null for every element\n */\nfunction memberSet(raw: unknown, onBad?: (code: string, message: string) => void): Set<NodeId> | null {\n if (raw === \"all\") {\n return null;\n }\n const out = new Set<NodeId>();\n if (Array.isArray(raw)) {\n for (const item of raw) {\n const id = refId(item);\n if (id === null) {\n onBad?.(CX_ISSUE.INVALID_ID, `the member ${shown(item)} is not an id; ignored`);\n } else {\n out.add(id);\n }\n }\n } else if (raw !== undefined) {\n onBad?.(BAD_VALUE_CODE, `the member list ${shown(raw)} is neither a list of ids nor \"all\"; read as empty`);\n }\n return out;\n}\n\n/**\n * The id of an element of a structural aspect (cySubNetworks, cyViews, cyNetworkRelations), or\n * null with an issue: E_BAD_ASPECT_BLOCK for an element that is not an object, E_MISSING_ID or\n * E_INVALID_ID for its id.\n * @param held - the element\n * @param name - the aspect\n * @param key - the id key\n * @param report - the report\n * @returns the element and its id, or null\n */\nfunction structuralId(\n held: Held,\n name: string,\n key: string,\n report: ImportReportBuilder,\n): { readonly value: Record<string, unknown>; readonly id: NodeId } | null {\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a ${name} element is ${shown(value)}, not an object; skipped`,\n {\n line,\n element: name,\n },\n );\n return null;\n }\n if (value[key] === undefined || value[key] === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, `a ${name} element has no ${key}; skipped`, {\n line,\n element: name,\n });\n return null;\n }\n const id = refId(value[key]);\n if (id === null) {\n report.error(\n \"validation-error\",\n CX_ISSUE.INVALID_ID,\n `a ${name} element has the ${key} ${shown(value[key])}, not an integer id; skipped`,\n {\n line,\n element: name,\n },\n );\n return null;\n }\n return { value, id };\n}\n\n/**\n * The graphs of a document, in the order Cytoscape opens them.\n * @param doc - the document\n * @param report - where malformed subnetworks, views and relations are recorded\n * @returns one plan per graph (at least one)\n */\nfunction graphPlans(doc: CxDocument, report: ImportReportBuilder): GraphPlan[] {\n const subs = readSubnetworks(doc, report);\n const { relationNames, order, views } = readRelations(doc, subs, report);\n if (order.length <= 1) {\n const sub = order.length === 1 ? order[0] : null;\n const members = sub === null ? undefined : subs.get(sub);\n let graphViews = sub === null ? [] : (views.get(sub) ?? []);\n if (graphViews.length === 0) {\n graphViews = [...new Set([...views.values()].flat())];\n }\n if (graphViews.length === 0) {\n graphViews = layoutViews(doc);\n }\n const relationName = sub === null ? null : (relationNames.get(sub) ?? null);\n return [\n {\n index: 0,\n name: relationName ?? networkName(doc, sub),\n subnetwork: sub,\n nodes: members?.nodes ?? null,\n edges: members?.edges ?? null,\n views: graphViews,\n },\n ];\n }\n return order.map((sub, index) => ({\n index,\n name: relationNames.get(sub) ?? networkName(doc, sub),\n subnetwork: sub,\n nodes: subs.get(sub)?.nodes ?? null,\n edges: subs.get(sub)?.edges ?? null,\n views: views.get(sub) ?? [],\n }));\n}\n\n/** A subnetwork's members: null when the element does not list them. */\ntype Subnetwork = { nodes: Set<NodeId> | null; edges: Set<NodeId> | null };\n\n/**\n * The subnetworks a document declares (cySubNetworks), by id; a repeated id is reported and skipped.\n * @param doc - the document\n * @param report - the report\n * @returns the subnetworks\n */\nfunction readSubnetworks(doc: CxDocument, report: ImportReportBuilder): Map<NodeId, Subnetwork> {\n const subs = new Map<NodeId, Subnetwork>();\n for (const held of aspect(doc, \"cySubNetworks\")) {\n const sub = structuralId(held, \"cySubNetworks\", \"@id\", report);\n if (sub === null) {\n continue;\n }\n const { value, id } = sub;\n if (subs.has(id)) {\n report.error(\n \"validation-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a second cySubNetworks element has the @id ${String(id)}; skipped, the first is used`,\n { line: held.line, element: \"cySubNetworks\" },\n );\n continue;\n }\n const onBad = (code: string, message: string): void => {\n report.error(\"validation-error\", code, `subnetwork ${String(id)}: ${message}`, {\n line: held.line,\n element: \"cySubNetworks\",\n });\n };\n subs.set(id, { nodes: memberSet(value.nodes, onBad), edges: memberSet(value.edges, onBad) });\n }\n return subs;\n}\n\n/**\n * The network relations of a document: each subnetwork's name, the order Cytoscape opens them in\n * (the relations' order, then the other subnetworks), and each one's views.\n * @param doc - the document\n * @param subs - the subnetworks\n * @param report - the report\n * @returns the names, the order and the views\n */\nfunction readRelations(\n doc: CxDocument,\n subs: ReadonlyMap<NodeId, Subnetwork>,\n report: ImportReportBuilder,\n): { relationNames: Map<NodeId, string>; order: NodeId[]; views: Map<NodeId, NodeId[]> } {\n const relationNames = new Map<NodeId, string>();\n const order: NodeId[] = [];\n const views = new Map<NodeId, NodeId[]>();\n const addView = (sub: NodeId, view: NodeId): void => {\n const list = views.get(sub) ?? [];\n if (!list.includes(view)) {\n list.push(view);\n }\n views.set(sub, list);\n };\n\n for (const held of aspect(doc, \"cyNetworkRelations\")) {\n const relation = structuralId(held, \"cyNetworkRelations\", \"c\", report);\n if (relation !== null) {\n fileRelation(relation, subs, { relationNames, order, addView });\n }\n }\n for (const held of aspect(doc, \"cyViews\")) {\n const view = structuralId(held, \"cyViews\", \"@id\", report);\n const sub = view === null ? null : refId(view.value.s);\n if (view !== null && sub !== null) {\n addView(sub, view.id);\n }\n }\n order.push(...[...subs.keys()].filter((id) => !order.includes(id)));\n return { relationNames, order, views };\n}\n\n/**\n * File one network relation: a view of a subnetwork, or a subnetwork's name and its place in the order.\n * @param relation - the relation element and its child id\n * @param relation.value - the element\n * @param relation.id - the child: a view or a subnetwork\n * @param subs - the subnetworks\n * @param out - where the relation is filed\n * @param out.relationNames - each subnetwork's name\n * @param out.order - the subnetworks in relation order\n * @param out.addView - records a view of a subnetwork\n */\nfunction fileRelation(\n relation: { readonly value: Record<string, unknown>; readonly id: NodeId },\n subs: ReadonlyMap<NodeId, Subnetwork>,\n out: { relationNames: Map<NodeId, string>; order: NodeId[]; addView: (sub: NodeId, view: NodeId) => void },\n): void {\n const { value, id: child } = relation;\n if (value.r === \"view\") {\n const parent = refId(value.p);\n if (parent !== null) {\n out.addView(parent, child);\n }\n return;\n }\n if (typeof value.name === \"string\") {\n out.relationNames.set(child, value.name);\n }\n if (subs.has(child) && !out.order.includes(child)) {\n out.order.push(child);\n }\n}\n\n/**\n * A subnetwork's name from the network attributes: the one scoped to it, else the unscoped one.\n * @param doc - the document\n * @param sub - the subnetwork, or null\n * @returns the name, or null\n */\nfunction networkName(doc: CxDocument, sub: NodeId | null): string | null {\n let found: string | null = null;\n for (const { value } of doc.attributes.network.get(\"name\") ?? []) {\n if (!isRecord(value) || typeof value.v !== \"string\") {\n continue;\n }\n const scope = value.s === undefined ? null : refId(value.s);\n if (scope === sub) {\n return value.v;\n }\n if (scope === null) {\n found ??= value.v;\n }\n }\n return found;\n}\n\n/**\n * The distinct views the layout entries name, in order of appearance.\n * @param doc - the document\n * @returns the view ids\n */\nfunction layoutViews(doc: CxDocument): NodeId[] {\n const out: NodeId[] = [];\n for (const { value } of aspect(doc, \"cartesianLayout\")) {\n const view = isRecord(value) && value.view !== undefined ? refId(value.view) : null;\n if (view !== null && !out.includes(view)) {\n out.push(view);\n }\n }\n return out;\n}\n\n/**\n * How many elements a member set holds.\n * @param members - the set, or null for every element\n * @param total - the element count of the root network\n * @returns the count\n */\nfunction memberCount(members: ReadonlySet<NodeId> | null, total: number): number {\n return members === null ? total : members.size;\n}\n\n// ============================================================ the build\n\n/** One attribute column of the graph being built. */\ninterface AttributeColumn {\n readonly name: string;\n readonly type: CxType | null;\n /** null: values are kept as text (an unknown or conflicting type). */\n handle: ColumnHandle;\n}\n\n/** Reads one graph of a collected document into a sink. */\nclass CxReader {\n private readonly sink: GraphSink;\n\n private readonly report: ImportReportBuilder;\n\n private readonly options: ResolvedImportOptions;\n\n private readonly zAs: \"column\" | \"position\";\n\n private readonly doc: CxDocument;\n\n private readonly plan: GraphPlan;\n\n private readonly direction: DirectionResolver;\n\n private readonly coercer: IdCoercer;\n\n /** Every node id of the root network. */\n private readonly rootNodes = new Set<NodeId>();\n\n /** Every edge id of the root network. */\n private readonly rootEdges = new Set<NodeId>();\n\n /** CX node id (as written, before the `ids` option) -> sink node index, for this graph. */\n private readonly nodeRows = new Map<NodeId, number>();\n\n /** Sink node id -> sink node index: two CX ids the `ids` option makes one are one node. */\n private readonly sinkRows = new Map<NodeId, number>();\n\n /** CX edge id (as written) -> sink edge index, for this graph. */\n private readonly edgeRows = new Map<NodeId, number>();\n\n /** CX node id -> the id given to the sink, for the nodes whose original id was restored. */\n private readonly sinkIds = new Map<NodeId, NodeId>();\n\n /** The subnetwork ids of the document. */\n private readonly subnetworks = new Set<NodeId>();\n\n private readonly dangling = new Map<string, number>();\n\n private nameHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private representsHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private interactionHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private edgeIdHandle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n private sinceCheck = 0;\n\n private idType: \"integer\" | \"mixed\" = \"integer\";\n\n private weighted = false;\n\n /**\n * Create the reader.\n * @param sink - the sink\n * @param report - the report\n * @param options - the resolved options\n * @param zAs - where z goes\n * @param doc - the collected document\n * @param plan - the graph to read\n */\n constructor(\n sink: GraphSink,\n report: ImportReportBuilder,\n options: ResolvedImportOptions,\n zAs: \"column\" | \"position\",\n doc: CxDocument,\n plan: GraphPlan,\n ) {\n this.sink = sink;\n this.report = report;\n this.options = options;\n this.zAs = zAs;\n this.doc = doc;\n this.plan = plan;\n this.direction = new DirectionResolver(sink, report, options.onMixedDirection);\n this.coercer = new IdCoercer(options.ids);\n for (const { value } of aspect(doc, \"nodes\")) {\n const id = isRecord(value) ? refId(value[\"@id\"]) : null;\n if (id !== null) {\n this.rootNodes.add(id);\n }\n }\n for (const { value } of aspect(doc, \"edges\")) {\n const id = isRecord(value) ? refId(value[\"@id\"]) : null;\n if (id !== null) {\n this.rootEdges.add(id);\n }\n }\n for (const { value } of aspect(doc, \"cySubNetworks\")) {\n const id = isRecord(value) ? refId(value[\"@id\"]) : null;\n if (id !== null) {\n this.subnetworks.add(id);\n }\n }\n }\n\n /** Build the graph. */\n build(): void {\n const { report } = this;\n this.direction.setHeader(true);\n this.checkMembers();\n this.checkRootOnly();\n this.checkTableColumns();\n const nodeColumns = this.declareAttributes(\"node\");\n this.readNodes();\n this.readGroups();\n this.writeAttributes(\"node\", nodeColumns);\n this.readLayout();\n const edgeColumns = this.declareAttributes(\"edge\");\n this.readEdges();\n this.writeAttributes(\"edge\", edgeColumns);\n this.readNetworkAttributes();\n this.readVisualProperties();\n this.readProvenance();\n for (const [kind, count] of this.dangling) {\n report.warning(\n \"validation-error\",\n DANGLING_REFERENCE_CODE,\n `${count} ${kind}${plural(count)} ${agree(count, \"names\", \"name\")} nothing; ignored`,\n {\n element: kind,\n },\n );\n }\n this.setMeta();\n }\n\n // ------------------------------------------------------------ helpers\n\n /**\n * Count a reference that names nothing.\n * @param kind - what referred\n */\n private dangle(kind: string): void {\n this.dangling.set(kind, (this.dangling.get(kind) ?? 0) + 1);\n }\n\n /** Check the cancellation signal every ABORT_CHECK_INTERVAL elements. */\n private checkAbort(): void {\n if (++this.sinceCheck >= ABORT_CHECK_INTERVAL) {\n this.sinceCheck = 0;\n throwIfAborted(this.options.signal);\n }\n }\n\n /**\n * Whether a node id belongs to this graph.\n * @param id - the CX id\n * @returns true for a member\n */\n private inGraph(id: NodeId): boolean {\n return this.plan.nodes === null || this.plan.nodes.has(id);\n }\n\n /**\n * Whether a scoped value applies to this graph: unscoped, or scoped to its subnetwork. A scope\n * naming no subnetwork is counted as dangling.\n * @param scope - the element's s\n * @returns 1 for an unscoped value, 2 for this graph's own, 0 for another graph's\n */\n private scopeOf(scope: unknown): 0 | 1 | 2 {\n if (scope === undefined || scope === null) {\n return 1;\n }\n const id = refId(scope);\n if (id !== null && id === this.plan.subnetwork) {\n return 2;\n }\n if (id === null || !this.subnetworks.has(id)) {\n this.dangle(\"attribute subnetwork reference\");\n }\n return 0;\n }\n\n /**\n * The id of an element by the CX id rule, as the document's references name it (the `ids`\n * option applies only to the id the sink holds, sinkId()).\n * @param raw - the parsed id\n * @param inexact - whether the literal was not a plain integer\n * @param element - the element name for issues\n * @param line - the element's line\n * @param edgeId - whether this is an edge's own id (stored in the f64 id column, not kept as digits)\n * @returns the id, or null when it was reported\n */\n private idOf(raw: unknown, inexact: boolean, element: string, line: number, edgeId = false): NodeId | null {\n try {\n const parsed = cxId(raw, inexact);\n if (parsed.note === \"text\") {\n this.report.warnOnce(\n \"coercion\",\n ID_TEXT_TYPE_CODE,\n `${element}: the id ${shown(raw)} is not written as an integer; read as ${String(parsed.id)}`,\n { line, element },\n );\n } else if (parsed.note === \"precision\" && edgeId) {\n // the edge is told apart by its digits, but the id column is f64\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the edge id ${String(parsed.id)} is beyond 2^53; the id column holds the nearest double`,\n { line, element },\n `${PRECISION_CODE}:edge`,\n );\n } else if (parsed.note === \"precision\") {\n this.idType = \"mixed\";\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${element}: the id ${String(parsed.id)} is beyond 2^53; kept as its digits (a string id)`,\n { line, element },\n );\n }\n return parsed.id;\n } catch (err) {\n this.report.recordError(err, { line, element });\n return null;\n }\n }\n\n /**\n * The id the sink holds a CX node under: its restored original id, else the `ids` option applied.\n * @param id - the CX id\n * @returns the sink id\n */\n private sinkId(id: NodeId): NodeId {\n const original = this.sinkIds.get(id);\n if (original !== undefined) {\n return original;\n }\n return this.options.ids === \"keep\" ? id : this.coercer.value(id);\n }\n\n /**\n * Add a node to the sink (once per sink id) and map its CX id to the row.\n * @param id - the CX id\n * @returns the row, and whether the sink id was new\n */\n private addNode(id: NodeId): { readonly row: number; readonly added: boolean } {\n const sinkId = this.sinkId(id);\n const existing = this.sinkRows.get(sinkId);\n if (existing !== undefined) {\n this.nodeRows.set(id, existing);\n return { row: existing, added: false };\n }\n const row = this.sink.addNode(sinkId);\n this.sinkRows.set(sinkId, row);\n this.nodeRows.set(id, row);\n return { row, added: true };\n }\n\n /**\n * Record a long value beyond 2^53 (once).\n * @param name - the attribute\n * @param digits - the value\n */\n private precision(name: string, digits: string): void {\n const overflow = !Number.isFinite(Number(digits));\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n overflow\n ? `\"${name}\": ${digits} is beyond the range of a double; stored as ${String(Number(digits))}`\n : `\"${name}\": ${digits} is beyond 2^53; stored as the nearest double`,\n { element: name },\n `${PRECISION_CODE}:value`,\n );\n }\n\n /**\n * Report the keys of a node or edge element CX does not define, once per key.\n * @param record - the element\n * @param known - the keys it defines\n * @param what - nodes or edges\n * @param line - its line\n */\n private unknownKeys(record: Record<string, unknown>, known: ReadonlySet<string>, what: string, line: number): void {\n for (const key of Object.keys(record)) {\n if (!known.has(key)) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `the ${what} key \"${key}\" is not defined by CX; its values are not read`,\n { line, element: key },\n `${UNKNOWN_ELEMENT_CODE}:${what}:${key}`,\n );\n }\n }\n }\n\n /** Report cyTableColumn entries for a table CX does not define (once per table name). */\n private checkTableColumns(): void {\n for (const { value, line } of aspect(this.doc, \"cyTableColumn\")) {\n if (isRecord(value) && typeof value.applies_to === \"string\" && !TABLES.has(value.applies_to)) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `a cyTableColumn entry applies to \"${value.applies_to}\", which is not node_table, edge_table or network_table; ignored`,\n { line, element: value.applies_to },\n `${UNKNOWN_ELEMENT_CODE}:table:${value.applies_to}`,\n );\n }\n }\n }\n\n /** Count the subnetwork members that name no node or edge. */\n private checkMembers(): void {\n for (const id of this.plan.nodes ?? []) {\n if (!this.rootNodes.has(id)) {\n this.dangle(\"subnetwork node member\");\n }\n }\n for (const id of this.plan.edges ?? []) {\n if (!this.rootEdges.has(id)) {\n this.dangle(\"subnetwork edge member\");\n }\n }\n }\n\n /**\n * Report the root network's nodes and edges that no subnetwork holds (W_CX_ROOT_ONLY): they\n * belong to no graph Cytoscape opens, so no graph of this file reads them.\n */\n private checkRootOnly(): void {\n const subs = aspect(this.doc, \"cySubNetworks\");\n if (subs.length === 0) {\n return;\n }\n const held = { nodes: new Set<NodeId>(), edges: new Set<NodeId>() };\n const all = { nodes: false, edges: false };\n for (const { value } of subs) {\n if (!isRecord(value)) {\n continue;\n }\n for (const key of [\"nodes\", \"edges\"] as const) {\n const members = memberSet(value[key]);\n if (members === null) {\n all[key] = true;\n } else {\n members.forEach((id) => held[key].add(id));\n }\n }\n }\n const lost = (key: \"nodes\" | \"edges\", root: ReadonlySet<NodeId>): number =>\n all[key] ? 0 : [...root].filter((id) => !held[key].has(id)).length;\n const nodes = lost(\"nodes\", this.rootNodes);\n const edges = lost(\"edges\", this.rootEdges);\n if (nodes + edges > 0) {\n this.report.warning(\n \"unsupported\",\n CX_ISSUE.ROOT_ONLY,\n `${nodes} node${plural(nodes)} and ${edges} edge${plural(edges)} of the root network belong to no subnetwork (cySubNetworks); they are not read`,\n { element: \"cySubNetworks\" },\n );\n }\n }\n\n /**\n * The handle of a structural column, declared on first use.\n * @param domain - node or edge\n * @param current - the handle so far\n * @param decl - the declaration\n * @returns the handle\n */\n private structural(domain: \"node\" | \"edge\", current: ColumnHandle, decl: ColumnDecl): ColumnHandle {\n return current === INVALID_INDEX ? declareResolved(this.sink, domain, decl, this.report).handle : current;\n }\n\n // ------------------------------------------------------------ attribute columns\n\n /**\n * Type and declare the attribute columns of a table for this graph: each name's type is the\n * wider of the types its applicable elements and its cyTableColumn entries give (W_WIDENED when\n * they differ); a name with a type CX does not define keeps its values as text.\n * @param domain - node or edge\n * @returns the columns by attribute name\n */\n private declareAttributes(domain: \"node\" | \"edge\"): Map<string, AttributeColumn> {\n const columns = new Map<string, AttributeColumn>();\n const declared = this.tableColumns(domain === \"node\" ? \"node_table\" : \"edge_table\");\n const names = new Set<string>([...declared.keys(), ...this.doc.attributes[domain].keys()]);\n for (const name of names) {\n if (\n (domain === \"edge\" && name === this.options.weightFrom) ||\n (domain === \"node\" && name === ORIGINAL_ID_ATTRIBUTE && this.options.restoreMangledIds)\n ) {\n continue;\n }\n const types: CxType[] = [];\n let unknown = false;\n const tableType = declared.get(name);\n if (tableType !== undefined) {\n types.push(tableType);\n }\n for (const { value } of this.doc.attributes[domain].get(name) ?? []) {\n if (!isRecord(value) || this.scopePeek(value.s) === 0) {\n continue;\n }\n const type = cxType(value.d);\n if (type === null) {\n unknown = true;\n continue;\n }\n if (!types.some((t) => t.scalar === type.scalar && t.list === type.list)) {\n types.push(type);\n }\n }\n if (unknown) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `a ${domain} attribute \"${name}\" declares a data type CX does not define; its values are kept as text`,\n { element: name },\n `${UNKNOWN_ATTR_TYPE_CODE}:${domain}:${name}`,\n );\n types.push({ scalar: \"string\", list: false });\n }\n let type: CxType | null = types[0] ?? { scalar: \"string\", list: false };\n for (const other of types.slice(1)) {\n type = type === null ? null : widenType(type, other);\n }\n if (types.length > 1) {\n this.report.warnOnce(\n \"coercion\",\n WIDENED_CODE,\n `the ${domain} attribute \"${name}\" has the data types ${types.map(typeText).join(\", \")}; the column holds ${type === null ? \"their values as JSON\" : typeText(type)}`,\n { element: name },\n `${WIDENED_CODE}:${domain}:${name}`,\n );\n }\n if (this.isStructural(domain, name)) {\n columns.set(name, {\n name,\n type: { scalar: \"string\", list: false },\n handle: INVALID_INDEX as ColumnHandle,\n });\n continue;\n }\n columns.set(name, { name, type, handle: this.declareColumn(domain, name, type) });\n }\n return columns;\n }\n\n /**\n * Whether an attribute name is the column of a core field (n / r on nodes, i on edges).\n * @param domain - node or edge\n * @param name - the attribute name\n * @returns true for name, represents and interaction\n */\n private isStructural(domain: \"node\" | \"edge\", name: string): boolean {\n return domain === \"node\" ? name === \"name\" || name === \"represents\" : name === \"interaction\";\n }\n\n /**\n * The scope of a value without counting a dangling one (for typing, which runs before the values).\n * @param scope - the element's s\n * @returns as scopeOf()\n */\n private scopePeek(scope: unknown): 0 | 1 | 2 {\n if (scope === undefined || scope === null) {\n return 1;\n }\n const id = refId(scope);\n return id !== null && id === this.plan.subnetwork ? 2 : 0;\n }\n\n /**\n * The column types cyTableColumn declares for one table and this graph.\n * @param table - node_table, edge_table or network_table\n * @returns name -> type\n */\n private tableColumns(table: string): Map<string, CxType> {\n const out = new Map<string, CxType>();\n for (const { value } of aspect(this.doc, \"cyTableColumn\")) {\n if (!isRecord(value) || value.applies_to !== table || typeof value.n !== \"string\") {\n continue;\n }\n if (this.scopePeek(value.s) === 0) {\n continue;\n }\n const type = cxType(value.d);\n if (type === null) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `cyTableColumn declares \"${value.n}\" with the data type ${shown(value.d)}, which CX does not define; its values are typed by their own d`,\n { element: value.n },\n `${UNKNOWN_ATTR_TYPE_CODE}:table:${table}:${value.n}`,\n );\n } else {\n out.set(value.n, type);\n }\n }\n return out;\n }\n\n /**\n * Declare one attribute column.\n * @param domain - node or edge\n * @param name - the attribute name\n * @param type - the type, or null for a json column\n * @returns the handle\n */\n private declareColumn(domain: \"node\" | \"edge\", name: string, type: CxType | null): ColumnHandle {\n const { long } = this.options;\n const decl: ColumnDecl =\n type === null\n ? { name, dtype: \"json\", nullable: true, origin: { format: CX_FORMAT, id: null } }\n : {\n name,\n dtype: type.list ? \"list\" : scalarDtype(type.scalar, long),\n ...(type.list ? { itemDtype: scalarDtype(type.scalar, long) } : {}),\n nullable: true,\n origin: { format: CX_FORMAT, id: null, type: typeText(type) },\n };\n return declareResolved(this.sink, domain, decl, this.report).handle;\n }\n\n /**\n * Write the attribute values of a table: per element, its own subnetwork's value beats the\n * unscoped one; a repeated value of the same scope is the later one (W_DUPLICATE_ATTRIBUTE\n * when they differ).\n * @param domain - node or edge\n * @param columns - the columns from declareAttributes()\n */\n private writeAttributes(domain: \"node\" | \"edge\", columns: ReadonlyMap<string, AttributeColumn>): void {\n const rows = domain === \"node\" ? this.nodeRows : this.edgeRows;\n const root = domain === \"node\" ? this.rootNodes : this.rootEdges;\n for (const column of columns.values()) {\n const chosen = new Map<number, { scope: 1 | 2; value: unknown; d: unknown; line: number }>();\n for (const held of this.doc.attributes[domain].get(column.name) ?? []) {\n this.checkAbort();\n const { value, line } = held;\n if (!isRecord(value)) {\n this.report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a ${domain}Attributes element is not an object`,\n {\n line,\n element: `${domain}Attributes`,\n },\n );\n continue;\n }\n const scope = this.scopeOf(value.s);\n if (scope === 0) {\n continue;\n }\n if (value.v === undefined) {\n this.report.error(\n \"missing-value\",\n BAD_VALUE_CODE,\n `a ${domain}Attributes element for \"${column.name}\" has no v; skipped`,\n {\n line,\n element: column.name,\n },\n );\n continue;\n }\n // po names one element, or (cxio's shared values) a list of them\n for (const raw of Array.isArray(value.po) ? (value.po as unknown[]) : [value.po]) {\n const target = refId(raw);\n const row = target === null ? undefined : rows.get(target);\n if (row === undefined) {\n if (target === null || !root.has(target)) {\n this.dangle(`${domain} attribute target`);\n }\n continue;\n }\n if (value.v === null) {\n continue;\n }\n const previous = chosen.get(row);\n if (previous !== undefined && previous.scope > scope) {\n continue;\n }\n if (\n previous?.scope === scope &&\n JSON.stringify(previous.value) !== JSON.stringify(plainJson(value.v))\n ) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `${domain} ${shown(raw)} has the attribute \"${column.name}\" twice; the later value wins`,\n { line, element: column.name },\n `${DUPLICATE_ATTRIBUTE_CODE}:${domain}:${column.name}`,\n );\n }\n chosen.set(row, { scope, value: value.v, d: value.d, line });\n }\n }\n for (const [row, { value, d, line }] of chosen) {\n this.writeCell(domain, column, row, value, d, line);\n }\n }\n }\n\n /**\n * Parse and write one attribute cell. The core fields' attributes (name, represents,\n * interaction) go into their columns; a name attribute that differs from n wins with\n * W_DUPLICATE_ATTRIBUTE.\n * @param domain - node or edge\n * @param column - the column\n * @param row - the row\n * @param raw - the value\n * @param d - the data type the value was written with\n * @param line - its line\n */\n private writeCell(\n domain: \"node\" | \"edge\",\n column: AttributeColumn,\n row: number,\n raw: unknown,\n d: unknown,\n line: number,\n ): void {\n const element = `${domain} attribute \"${column.name}\"`;\n let value: unknown;\n if (column.type === null) {\n value = plainJson(raw, (digits) => {\n this.precision(column.name, digits);\n });\n } else {\n const own = cxType(d) ?? { scalar: \"string\", list: false };\n const parsed = parseValue(raw, own, this.options.long, (digits) => {\n this.precision(column.name, digits);\n });\n if (parsed === UNSET) {\n return;\n }\n if (parsed === BAD) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: ${shown(raw)} is not a ${typeText(own)}; the cell is unset`,\n { line, element: column.name },\n );\n return;\n }\n value = toColumn(parsed, column.type);\n }\n let { handle } = column;\n if (this.isStructural(domain, column.name)) {\n if (Array.isArray(raw)) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: ${shown(raw)} is a list; \"${column.name}\" holds one string, the cell is unset`,\n { line, element: column.name },\n );\n return;\n }\n handle = this.coreColumn(domain, column.name);\n const prior = this.coreValue(domain, row, column.name);\n if (prior !== undefined && prior !== value) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `a ${domain} has \"${column.name}\" both as its core field and as an attribute with another value; the attribute wins`,\n { line, element: column.name },\n `${DUPLICATE_ATTRIBUTE_CODE}:core:${column.name}`,\n );\n }\n }\n try {\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, row, value);\n } else {\n this.sink.setEdgeValue(handle, row, value);\n }\n } catch (err) {\n this.report.recordError(err, { line, element: column.name });\n }\n }\n\n /** The core field values written per row (n, r), to detect a differing name attribute. */\n private readonly coreValues = new Map<string, Map<number, string>>();\n\n /**\n * The core field value of a row.\n * @param domain - node or edge\n * @param row - the row\n * @param name - name, represents or interaction\n * @returns the value, or undefined\n */\n private coreValue(domain: \"node\" | \"edge\", row: number, name: string): string | undefined {\n return this.coreValues.get(`${domain}:${name}`)?.get(row);\n }\n\n /**\n * The column of a core field.\n * @param domain - node or edge\n * @param name - name, represents or interaction\n * @returns the handle\n */\n private coreColumn(domain: \"node\" | \"edge\", name: string): ColumnHandle {\n if (domain === \"edge\") {\n this.interactionHandle = this.structural(\"edge\", this.interactionHandle, {\n name: \"interaction\",\n dtype: \"string\",\n nullable: true,\n origin: { format: CX_FORMAT, id: \"i\", type: \"string\" },\n });\n return this.interactionHandle;\n }\n if (name === \"name\") {\n this.nameHandle = this.structural(\"node\", this.nameHandle, {\n name: \"name\",\n dtype: \"string\",\n role: \"label\",\n nullable: true,\n origin: { format: CX_FORMAT, id: \"n\", type: \"string\" },\n });\n return this.nameHandle;\n }\n this.representsHandle = this.structural(\"node\", this.representsHandle, {\n name: \"represents\",\n dtype: \"string\",\n nullable: true,\n origin: { format: CX_FORMAT, id: \"r\", type: \"string\" },\n });\n return this.representsHandle;\n }\n\n // ------------------------------------------------------------ nodes, groups, layout\n\n /** Read the nodes of this graph. */\n private readNodes(): void {\n const { report } = this;\n const originals = this.originalIds();\n for (const held of aspect(this.doc, \"nodes\")) {\n this.checkAbort();\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a nodes element is ${shown(value)}, not an object`,\n {\n line,\n element: \"nodes\",\n },\n );\n report.counts.skippedNodes++;\n continue;\n }\n if (value[\"@id\"] === undefined || value[\"@id\"] === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"a node has no @id\", { line, element: \"nodes\" });\n report.counts.skippedNodes++;\n continue;\n }\n this.unknownKeys(value, NODE_KEYS, \"node\", line);\n const element = `node ${shown(value[\"@id\"])}`;\n const id = this.idOf(value[\"@id\"], (held.inexact & 1) !== 0, element, line);\n if (id === null) {\n report.counts.skippedNodes++;\n continue;\n }\n if (!this.inGraph(id)) {\n continue;\n }\n let row = this.nodeRows.get(id);\n let added = false;\n if (row === undefined) {\n const original = originals.get(refId(value[\"@id\"]) ?? id);\n if (original !== undefined) {\n this.idType = \"mixed\";\n this.sinkIds.set(id, original);\n }\n try {\n ({ row, added } = this.addNode(id));\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedNodes++;\n continue;\n }\n }\n if (added) {\n report.counts.nodes++;\n } else {\n report.warning(\n \"merged\",\n DUPLICATE_NODE_CODE,\n `${element} is declared more than once; its fields are merged (the later values win)`,\n { line, element },\n );\n }\n this.writeCore(\"node\", row, \"name\", value.n, element, line);\n this.writeCore(\"node\", row, \"represents\", value.r, element, line);\n }\n }\n\n /**\n * The original ids the exporter's `sanitizeIds: \"mangle\"` kept in the `graphty:originalId`\n * attribute, when they are to be restored.\n * @returns CX node id -> original id\n */\n private originalIds(): Map<NodeId, string> {\n const out = new Map<NodeId, string>();\n if (!this.options.restoreMangledIds) {\n return out;\n }\n for (const { value } of this.doc.attributes.node.get(ORIGINAL_ID_ATTRIBUTE) ?? []) {\n const po = isRecord(value) && this.scopePeek(value.s) !== 0 ? refId(value.po) : null;\n if (po !== null && isRecord(value) && typeof value.v === \"string\") {\n out.set(po, value.v);\n }\n }\n return out;\n }\n\n /**\n * Write a core string field (n, r, i).\n * @param domain - node or edge\n * @param row - the row\n * @param name - the column\n * @param raw - the value\n * @param element - the element name\n * @param line - its line\n */\n private writeCore(\n domain: \"node\" | \"edge\",\n row: number,\n name: string,\n raw: unknown,\n element: string,\n line: number,\n ): void {\n if (raw === undefined || raw === null) {\n return;\n }\n if (typeof raw !== \"string\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `${element}: ${name} is ${shown(raw)}, not a string`,\n {\n line,\n element,\n },\n );\n return;\n }\n const handle = this.coreColumn(domain, name);\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, row, raw);\n } else {\n this.sink.setEdgeValue(handle, row, raw);\n }\n const key = `${domain}:${name}`;\n let values = this.coreValues.get(key);\n if (values === undefined) {\n values = new Map();\n this.coreValues.set(key, values);\n }\n values.set(row, raw);\n }\n\n /**\n * Read cyGroups: a group's members get the group node as their parent (parents when a node is in\n * several groups); a group whose id is not a node gets one (W_CX_GROUP_NODE_ADDED); collapsed is\n * a bool column on the group node.\n */\n private readGroups(): void {\n const groups = aspect(this.doc, \"cyGroups\");\n if (groups.length === 0) {\n return;\n }\n const parents = new Map<number, number[]>();\n const collapsed: [number, boolean][] = [];\n for (const held of groups) {\n const group = structuralId(held, \"cyGroups\", \"@id\", this.report);\n if (group === null) {\n continue;\n }\n const { value, id } = group;\n const { line } = held;\n if (value.nodes !== undefined && value.nodes !== null && !Array.isArray(value.nodes)) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `group ${String(id)}: nodes is ${shown(value.nodes)}, not a list of node ids; no member is read`,\n { line, element: String(id) },\n );\n }\n if (value.collapsed !== undefined && value.collapsed !== null && typeof value.collapsed !== \"boolean\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `group ${String(id)}: collapsed is ${shown(value.collapsed)}, not a boolean; unset`,\n { line, element: String(id) },\n );\n }\n let groupRow = this.nodeRows.get(id);\n if (groupRow === undefined) {\n if (this.rootNodes.has(id) || !this.hasMemberIn(value.nodes)) {\n continue;\n }\n try {\n groupRow = this.addNode(id).row;\n } catch (err) {\n this.report.recordError(err, { line, element: String(id) });\n continue;\n }\n this.report.counts.nodes++;\n this.report.warning(\n \"coercion\",\n CX_ISSUE.GROUP_NODE_ADDED,\n `group ${String(id)} is not a node; its group node is added`,\n { line, element: String(id) },\n );\n }\n if (typeof value.n === \"string\" && this.coreValue(\"node\", groupRow, \"name\") === undefined) {\n this.writeCore(\"node\", groupRow, \"name\", value.n, `group ${String(id)}`, line);\n }\n if (typeof value.collapsed === \"boolean\") {\n collapsed.push([groupRow, value.collapsed]);\n }\n for (const raw of Array.isArray(value.nodes) ? (value.nodes as unknown[]) : []) {\n const member = refId(raw);\n const row = member === null ? undefined : this.nodeRows.get(member);\n if (row === undefined) {\n if (member === null || !this.rootNodes.has(member)) {\n this.report.error(\n \"missing-value\",\n UNKNOWN_PARENT_CODE,\n `group ${String(id)}: the member ${shown(raw)} is not a node`,\n { line, element: String(id) },\n );\n }\n continue;\n }\n if (this.closesCycle(parents, row, groupRow)) {\n this.report.error(\n \"validation-error\",\n PARENT_CYCLE_CODE,\n `group ${String(id)}: making ${shown(raw)} a member would close a parent cycle; that membership is dropped`,\n { line, element: String(id) },\n );\n continue;\n }\n const list = parents.get(row) ?? [];\n if (!list.includes(groupRow)) {\n list.push(groupRow);\n }\n parents.set(row, list);\n }\n }\n this.writeParents(parents);\n if (collapsed.length > 0) {\n const { handle } = declareResolved(\n this.sink,\n \"node\",\n {\n name: \"collapsed\",\n dtype: \"bool\",\n nullable: true,\n origin: { format: CX_FORMAT, namespace: \"cyGroups\" },\n },\n this.report,\n );\n for (const [row, flag] of collapsed) {\n this.sink.setNodeValue(handle, row, flag);\n }\n }\n }\n\n /**\n * Whether a member list names a node of this graph.\n * @param raw - the list\n * @returns true when one member is in the graph\n */\n private hasMemberIn(raw: unknown): boolean {\n return (\n Array.isArray(raw) &&\n raw.some((item) => {\n const id = refId(item);\n return id !== null && this.nodeRows.has(id);\n })\n );\n }\n\n /**\n * Whether making `child` a member of `group` closes a cycle: the group already is, through its\n * own parents, below the child.\n * @param parents - the memberships so far\n * @param child - the member row\n * @param group - the group row\n * @returns true for a cycle\n */\n private closesCycle(parents: ReadonlyMap<number, readonly number[]>, child: number, group: number): boolean {\n const stack = [group];\n const seen = new Set<number>();\n while (stack.length > 0) {\n const row = stack.pop() as number;\n if (row === child) {\n return true;\n }\n if (seen.has(row)) {\n continue;\n }\n seen.add(row);\n stack.push(...(parents.get(row) ?? []));\n }\n return false;\n }\n\n /**\n * Write the group memberships: a parent column, or a parents list column when a node is in\n * several groups.\n * @param parents - member row -> group rows\n */\n private writeParents(parents: ReadonlyMap<number, readonly number[]>): void {\n if (parents.size === 0) {\n return;\n }\n const several = [...parents.values()].some((list) => list.length > 1);\n const decl: ColumnDecl = several\n ? { name: \"parents\", dtype: \"list\", itemDtype: \"u32\", role: \"parents\", refersTo: \"node\", nullable: true }\n : { name: \"parent\", dtype: \"u32\", role: \"parent\", refersTo: \"node\", nullable: true };\n const { handle } = declareResolved(this.sink, \"node\", decl, this.report);\n for (const [row, list] of parents) {\n this.sink.setNodeValue(handle, row, several ? list : list[0]);\n }\n }\n\n /**\n * Read cartesianLayout for this graph's views: the first view is the position (y flipped), z the\n * z column, every other view a position@n column.\n */\n private readLayout(): void {\n const entries = aspect(this.doc, \"cartesianLayout\");\n if (entries.length === 0) {\n return;\n }\n const { views } = this.plan;\n const knownViews = this.allViews();\n const columns = new Map<number, ColumnHandle>();\n const zHandle = { current: INVALID_INDEX as ColumnHandle };\n const seen = new Set<string>();\n const point: [number, number, number] = [0, 0, 0];\n for (const { value, line } of entries) {\n this.checkAbort();\n if (!isRecord(value)) {\n this.report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `a cartesianLayout element is ${shown(value)}, not an object; skipped`,\n { line, element: \"cartesianLayout\" },\n );\n continue;\n }\n const view = value.view === undefined || value.view === null ? null : refId(value.view);\n if (view !== null && knownViews.size > 0 && !knownViews.has(view)) {\n this.dangle(\"layout view reference\");\n continue;\n }\n const slot = view === null ? 0 : views.indexOf(view);\n if (slot < 0) {\n continue;\n }\n if (typeof value.x !== \"number\" || typeof value.y !== \"number\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a cartesianLayout element for node ${shown(value.node)} has no numeric x and y; skipped`,\n { line, element: \"cartesianLayout\" },\n );\n continue;\n }\n if (!Number.isFinite(value.x) || !Number.isFinite(value.y)) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a cartesianLayout element for node ${shown(value.node)} has the coordinates ${String(value.x)}, ${String(value.y)}, which are not both finite; skipped`,\n { line, element: \"cartesianLayout\" },\n );\n continue;\n }\n const node = refId(value.node);\n const row = node === null ? undefined : this.nodeRows.get(node);\n if (row === undefined) {\n if (node === null || !this.rootNodes.has(node)) {\n this.dangle(\"layout entry\");\n }\n continue;\n }\n if (value.z !== undefined && value.z !== null && typeof value.z !== \"number\") {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `a cartesianLayout element for node ${shown(value.node)} has the z ${shown(value.z)}, not a number; z is unset`,\n { line, element: \"cartesianLayout\" },\n );\n }\n const key = `${slot}:${row}`;\n if (seen.has(key)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `node ${shown(value.node)} has two layout entries for one view; the later wins`,\n { line, element: \"cartesianLayout\" },\n `${DUPLICATE_ATTRIBUTE_CODE}:layout`,\n );\n }\n seen.add(key);\n const z = typeof value.z === \"number\" ? value.z : null;\n point[0] = value.x;\n point[1] = flipY(value.y);\n point[2] = slot === 0 && this.zAs === \"position\" && z !== null ? z : 0;\n this.sink.setNodeValue(this.layoutColumn(columns, slot, views), row, point);\n if (slot === 0 && z !== null && this.zAs === \"column\") {\n zHandle.current = this.structural(\"node\", zHandle.current, zDecl(CX_FORMAT));\n this.sink.setNodeValue(zHandle.current, row, z);\n }\n }\n }\n\n /**\n * Every view id the document names.\n * @returns the set (empty when the document names none)\n */\n private allViews(): Set<NodeId> {\n const out = new Set<NodeId>();\n for (const { value } of aspect(this.doc, \"cyNetworkRelations\")) {\n if (isRecord(value) && value.r === \"view\") {\n const id = refId(value.c);\n if (id !== null) {\n out.add(id);\n }\n }\n }\n for (const { value } of aspect(this.doc, \"cyViews\")) {\n const id = isRecord(value) ? refId(value[\"@id\"]) : null;\n if (id !== null) {\n out.add(id);\n }\n }\n return out;\n }\n\n /**\n * The position column of a view slot, declared on first use.\n * @param columns - slot -> handle\n * @param slot - 0 for the position, n - 1 for position@n\n * @param views - the graph's views\n * @returns the handle\n */\n private layoutColumn(columns: Map<number, ColumnHandle>, slot: number, views: readonly NodeId[]): ColumnHandle {\n let handle = columns.get(slot);\n if (handle === undefined) {\n const base = positionDecl(CX_FORMAT, this.zAs === \"position\" && slot === 0 ? 3 : 2);\n const decl: ColumnDecl =\n slot === 0\n ? base\n : {\n ...base,\n name: `position@${slot + 1}`,\n role: undefined,\n origin: { format: CX_FORMAT, namespace: \"cytoscape\", id: String(views[slot]) },\n };\n ({ handle } = declareResolved(this.sink, \"node\", decl, this.report));\n columns.set(slot, handle);\n }\n return handle;\n }\n\n // ------------------------------------------------------------ edges\n\n /** Read the edges of this graph. */\n private readEdges(): void {\n const { report, sink } = this;\n const members = this.plan.edges;\n this.weights = this.edgeWeights();\n for (const held of aspect(this.doc, \"edges\")) {\n this.checkAbort();\n const { value, line } = held;\n if (!isRecord(value)) {\n report.error(\n \"parse-error\",\n BAD_ASPECT_BLOCK_CODE,\n `an edges element is ${shown(value)}, not an object`,\n {\n line,\n element: \"edges\",\n },\n );\n report.counts.skippedEdges++;\n continue;\n }\n if (value[\"@id\"] === undefined || value[\"@id\"] === null) {\n report.error(\"missing-value\", MISSING_ID_CODE, \"an edge has no @id\", { line, element: \"edges\" });\n report.counts.skippedEdges++;\n continue;\n }\n this.unknownKeys(value, EDGE_KEYS, \"edge\", line);\n const element = `edge ${shown(value[\"@id\"])}`;\n const id = this.idOf(value[\"@id\"], (held.inexact & 1) !== 0, element, line, true);\n if (id === null) {\n report.counts.skippedEdges++;\n continue;\n }\n if (members !== null && !members.has(id)) {\n continue;\n }\n if (value.s === undefined || value.s === null || value.t === undefined || value.t === null) {\n report.error(\n \"missing-value\",\n MISSING_ENDPOINT_CODE,\n `${element} has no ${value.s === undefined || value.s === null ? \"s\" : \"t\"}`,\n {\n line,\n element,\n },\n );\n report.counts.skippedEdges++;\n continue;\n }\n const s = this.idOf(value.s, (held.inexact & 2) !== 0, element, line);\n const t = s === null ? null : this.idOf(value.t, (held.inexact & 4) !== 0, element, line);\n if (s === null || t === null) {\n report.counts.skippedEdges++;\n continue;\n }\n if (this.edgeRows.has(id)) {\n report.error(\n \"validation-error\",\n DUPLICATE_EDGE_ID_CODE,\n `${element} is declared more than once; the later edge is skipped`,\n { line, element },\n );\n report.counts.skippedEdges++;\n continue;\n }\n if (!this.endpoint(s, element, line) || !this.endpoint(t, element, line)) {\n report.counts.skippedEdges++;\n continue;\n }\n let weight: number | undefined;\n try {\n weight = this.weightOf(id);\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n continue;\n }\n const before = sink.edgeCount;\n let edge: number;\n try {\n edge = this.direction.addEdge(this.sinkId(s), this.sinkId(t), \"directed\", weight, { line, element });\n } catch (err) {\n report.recordError(err, { line, element });\n report.counts.skippedEdges++;\n continue;\n }\n if (weight !== undefined) {\n this.weighted = true;\n }\n report.counts.edges += sink.edgeCount - before;\n this.edgeRows.set(id, edge);\n this.edgeIdHandle = this.structural(\"edge\", this.edgeIdHandle, {\n name: uniqueColumnName(\"id\", \"cx\", (n) => sink.edgeColumn(n) !== INVALID_INDEX),\n dtype: \"f64\",\n role: \"id\",\n nullable: true,\n });\n sink.setEdgeValue(this.edgeIdHandle, edge, typeof id === \"number\" ? id : Number(id));\n this.writeCore(\"edge\", edge, \"interaction\", value.i, element, line);\n }\n }\n\n /**\n * Whether an endpoint is a node of this graph; under addMissingNodes it is created.\n * @param id - the endpoint\n * @param element - the edge name\n * @param line - its line\n * @returns false when the edge is to be skipped (reported)\n */\n private endpoint(id: NodeId, element: string, line: number): boolean {\n if (this.nodeRows.has(id)) {\n return true;\n }\n if (!this.options.addMissingNodes) {\n this.report.error(\n \"missing-value\",\n CX_ISSUE.UNKNOWN_NODE,\n `${element}: the endpoint ${String(id)} is not a node of the graph; the edge is skipped`,\n { line, element },\n );\n return false;\n }\n try {\n if (this.addNode(id).added) {\n this.report.counts.nodes++;\n }\n } catch (err) {\n this.report.recordError(err, { line, element });\n return false;\n }\n return true;\n }\n\n /** The weight attribute values of the edges, by edge id. */\n private weights = new Map<NodeId, unknown>();\n\n /**\n * The weightFrom attribute values by edge id: this subnetwork's own value beats the unscoped\n * one, and of two in one scope the later wins (W_DUPLICATE_ATTRIBUTE when they differ), as\n * writeAttributes() rules every other attribute.\n * @returns the values (parsed JSON) by edge id\n */\n private edgeWeights(): Map<NodeId, unknown> {\n const { weightFrom } = this.options;\n const chosen = new Map<NodeId, { scope: number; value: unknown }>();\n if (weightFrom === null) {\n return new Map();\n }\n for (const { value, line } of this.doc.attributes.edge.get(weightFrom) ?? []) {\n const scope = isRecord(value) ? this.scopePeek(value.s) : 0;\n if (!isRecord(value) || scope === 0 || value.v === undefined || value.v === null) {\n continue;\n }\n const v = plainJson(value.v);\n for (const raw of Array.isArray(value.po) ? (value.po as unknown[]) : [value.po]) {\n this.chooseWeight(chosen, raw, { scope, value: v }, line, weightFrom);\n }\n }\n return new Map([...chosen].map(([id, { value }]) => [id, value]));\n }\n\n /**\n * Keep one weight attribute element's value for one edge, unless a more specific scope already\n * gave it one; a second value in the same scope wins, with a warning.\n * @param chosen - the value chosen so far per edge\n * @param raw - the edge reference as written\n * @param weight - the value and the scope it applies in\n * @param weight.scope - the scope: higher is more specific\n * @param weight.value - the value\n * @param line - the element's line\n * @param weightFrom - the attribute name\n */\n private chooseWeight(\n chosen: Map<NodeId, { scope: number; value: unknown }>,\n raw: unknown,\n weight: { scope: number; value: unknown },\n line: number,\n weightFrom: string,\n ): void {\n const po = refId(raw);\n const previous = po === null ? undefined : chosen.get(po);\n if (po === null || (previous !== undefined && previous.scope > weight.scope)) {\n return;\n }\n if (previous?.scope === weight.scope && JSON.stringify(previous.value) !== JSON.stringify(weight.value)) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `edge ${shown(raw)} has the attribute \"${weightFrom}\" twice; the later value wins`,\n { line, element: weightFrom },\n `${DUPLICATE_ATTRIBUTE_CODE}:edge:${weightFrom}`,\n );\n }\n chosen.set(po, weight);\n }\n\n /**\n * The weight of an edge: its weightFrom attribute, parsed as a number (the declared d is not\n * consulted: a value that is not a number is E_INVALID_WEIGHT whatever its type says).\n * @param id - the edge id\n * @returns the weight, or undefined; E_INVALID_WEIGHT for a non-number\n */\n private weightOf(id: NodeId): number | undefined {\n if (this.options.weightFrom === null) {\n return undefined;\n }\n const raw = this.weights.get(id);\n if (typeof raw === \"string\" && isNullText(raw)) {\n return undefined;\n }\n return weightFromValue(raw);\n }\n\n // ------------------------------------------------------------ network, visual properties, provenance\n\n /** Write the network attributes (unscoped and this subnetwork's, its own winning) as graph columns. */\n private readNetworkAttributes(): void {\n for (const [name, elements] of this.doc.attributes.network) {\n let chosen: Record<string, unknown> | null = null;\n let chosenScope = 0;\n for (const { value, line } of elements) {\n if (!isRecord(value)) {\n continue;\n }\n const scope = this.scopeOf(value.s);\n if (scope === 0) {\n continue;\n }\n if (value.v === undefined) {\n this.report.error(\n \"missing-value\",\n BAD_VALUE_CODE,\n `a networkAttributes element for \"${name}\" has no v; skipped`,\n { line, element: name },\n );\n continue;\n }\n if (\n chosen !== null &&\n scope === chosenScope &&\n JSON.stringify(plainJson(chosen.v)) !== JSON.stringify(plainJson(value.v))\n ) {\n this.report.warnOnce(\n \"validation-error\",\n DUPLICATE_ATTRIBUTE_CODE,\n `the network attribute \"${name}\" is given twice; the later value wins`,\n { line, element: name },\n `${DUPLICATE_ATTRIBUTE_CODE}:network:${name}`,\n );\n }\n if (scope >= chosenScope) {\n chosen = value;\n chosenScope = scope;\n }\n }\n if (chosen?.v === undefined || chosen.v === null) {\n continue;\n }\n const type = cxType(chosen.d);\n if (type === null) {\n this.report.warnOnce(\n \"unsupported\",\n UNKNOWN_ATTR_TYPE_CODE,\n `the network attribute \"${name}\" declares a data type CX does not define; kept as text`,\n { element: name },\n `${UNKNOWN_ATTR_TYPE_CODE}:network:${name}`,\n );\n }\n const effective = type ?? { scalar: \"string\", list: false };\n const parsed = parseValue(chosen.v, effective, this.options.long, (digits) => {\n this.precision(name, digits);\n });\n if (parsed === UNSET) {\n continue;\n }\n if (parsed === BAD) {\n this.report.error(\n \"validation-error\",\n BAD_VALUE_CODE,\n `the network attribute \"${name}\" is ${shown(chosen.v)}, not a ${typeText(effective)}; unset`,\n { element: name },\n );\n continue;\n }\n if ((name === \"name\" || name === \"description\") && typeof parsed === \"string\") {\n continue;\n }\n const scalar = scalarDtype(effective.scalar, this.options.long);\n try {\n this.sink.setGraphValue(name, parsed, {\n dtype: effective.list ? \"list\" : scalar,\n ...(effective.list ? { itemDtype: scalar } : {}),\n origin: { format: CX_FORMAT, id: null, type: typeText(effective) },\n });\n } catch (err) {\n this.report.recordError(err, { element: name });\n }\n }\n }\n\n /**\n * Read cyVisualProperties for this graph's views: per-element and network values become columns\n * (origin namespace cx.bypass); defaults, mappings and dependencies are style rules, kept and not\n * applied.\n */\n private readVisualProperties(): void {\n const entries = aspect(this.doc, \"cyVisualProperties\");\n // Cytoscape's table-cell styles: a visual property aspect graph-io keeps but does not read\n const tableStyles = TABLE_STYLE_ASPECTS.reduce((n, name) => n + (this.doc.kept.get(name)?.length ?? 0), 0);\n // the graph's own view (its first): the one its positions come from; the others stay in meta.extra.cx\n const views = new Set(this.plan.views.slice(0, 1));\n const columns = { node: new Map<string, [number, string][]>(), edge: new Map<string, [number, string][]>() };\n const network = new Map<string, string>();\n let defaults = 0;\n let mappings = 0;\n let dependencies = 0;\n for (const { value } of entries) {\n if (!isRecord(value)) {\n continue;\n }\n const view = value.view === undefined || value.view === null ? null : refId(value.view);\n if (view !== null && views.size > 0 && !views.has(view)) {\n continue;\n }\n const properties = isRecord(value.properties) ? value.properties : {};\n mappings += isRecord(value.mappings) ? Object.keys(value.mappings).length : 0;\n dependencies += isRecord(value.dependencies) ? Object.keys(value.dependencies).length : 0;\n switch (value.properties_of) {\n case \"nodes\":\n case \"edges\": {\n const domain = value.properties_of === \"nodes\" ? \"node\" : \"edge\";\n const target = refId(value.applies_to);\n const rows = domain === \"node\" ? this.nodeRows : this.edgeRows;\n const row = target === null ? undefined : rows.get(target);\n if (row === undefined) {\n if (target === null || !(domain === \"node\" ? this.rootNodes : this.rootEdges).has(target)) {\n this.dangle(`${domain} visual property entry`);\n }\n continue;\n }\n for (const [property, raw] of Object.entries(properties)) {\n const list = columns[domain].get(property) ?? [];\n list.push([row, typeof raw === \"string\" ? raw : JSON.stringify(raw)]);\n columns[domain].set(property, list);\n }\n break;\n }\n case \"network\":\n for (const [property, raw] of Object.entries(properties)) {\n network.set(property, typeof raw === \"string\" ? raw : JSON.stringify(raw));\n }\n break;\n default:\n defaults += Object.keys(properties).length;\n break;\n }\n }\n for (const domain of [\"node\", \"edge\"] as const) {\n for (const [property, cells] of columns[domain]) {\n const handle = declareFresh(\n this.sink,\n domain,\n {\n name: property,\n dtype: \"string\",\n nullable: true,\n origin: { format: CX_FORMAT, id: property, namespace: CX_BYPASS_NAMESPACE },\n },\n this.report,\n );\n for (const [row, text] of cells) {\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, row, text);\n } else {\n this.sink.setEdgeValue(handle, row, text);\n }\n }\n }\n }\n for (const [property, text] of network) {\n try {\n this.sink.setGraphValue(property, text, {\n dtype: \"string\",\n origin: { format: CX_FORMAT, id: null, namespace: CX_BYPASS_NAMESPACE },\n });\n } catch (err) {\n this.report.recordError(err, { element: property });\n }\n }\n if (defaults + mappings + dependencies + tableStyles > 0) {\n const parts = [\n `cyVisualProperties: ${defaults} default${plural(defaults)}, ${mappings} mapping${plural(mappings)}, ${dependencies} dependenc(ies)`,\n ];\n if (tableStyles > 0) {\n parts.push(`${tableStyles} table style element${plural(tableStyles)}`);\n }\n this.report.warning(\n \"unsupported\",\n STYLES_NOT_IMPORTED_CODE,\n `the file's style rules are not applied (${parts.join(\"; \")}); they are kept in meta.extra.cx`,\n { element: \"cyVisualProperties\" },\n );\n }\n }\n\n /**\n * Read the provenance aspects: citations and supports as extension tables cx:citations and\n * cx:supports, the node / edge links to them as list columns, functionTerms as a json column,\n * reifiedEdges as a u32 column referring to edges.\n */\n private readProvenance(): void {\n for (const name of [\"citations\", \"supports\"] as const) {\n this.extensionTable(`cx:${name}`, aspect(this.doc, name));\n }\n for (const [aspectName, domain, column] of [\n [\"nodeCitations\", \"node\", \"citations\"],\n [\"edgeCitations\", \"edge\", \"citations\"],\n [\"nodeSupports\", \"node\", \"supports\"],\n [\"edgeSupports\", \"edge\", \"supports\"],\n ] as const) {\n this.linkColumn(aspectName, domain, column);\n }\n const terms: [number, unknown][] = [];\n for (const { value } of aspect(this.doc, \"functionTerms\")) {\n if (!isRecord(value)) {\n continue;\n }\n const po = refId(value.po);\n const row = po === null ? undefined : this.nodeRows.get(po);\n if (row === undefined) {\n if (po === null || !this.rootNodes.has(po)) {\n this.dangle(\"functionTerms entry\");\n }\n continue;\n }\n const { po: _po, ...term } = value;\n terms.push([row, plainJson(term)]);\n }\n this.writeColumn(\"node\", \"functionTerm\", \"json\", null, terms);\n const reified: [number, number][] = [];\n for (const { value } of aspect(this.doc, \"reifiedEdges\")) {\n if (!isRecord(value)) {\n continue;\n }\n const node = refId(value.node);\n const edge = refId(value.edge);\n const row = node === null ? undefined : this.nodeRows.get(node);\n const edgeRow = edge === null ? undefined : this.edgeRows.get(edge);\n if (row === undefined || edgeRow === undefined) {\n if (node === null || !this.rootNodes.has(node) || edge === null || !this.rootEdges.has(edge)) {\n this.dangle(\"reifiedEdges entry\");\n }\n continue;\n }\n reified.push([row, edgeRow]);\n }\n if (reified.length > 0) {\n const { handle } = declareResolved(\n this.sink,\n \"node\",\n {\n name: \"reifiedEdge\",\n dtype: \"u32\",\n refersTo: \"edge\",\n nullable: true,\n origin: { format: CX_FORMAT, namespace: \"reifiedEdges\" },\n },\n this.report,\n );\n for (const [row, edge] of reified) {\n this.sink.setNodeValue(handle, row, edge);\n }\n }\n }\n\n /**\n * An extension table of a provenance aspect: an f64 `id` column and one json column per field.\n * @param name - the table name\n * @param elements - the elements\n */\n private extensionTable(name: string, elements: readonly Held[]): void {\n const records = elements.map((h) => h.value).filter(isRecord);\n if (records.length === 0) {\n return;\n }\n const fields = [...new Set(records.flatMap((r) => Object.keys(r)).filter((k) => k !== \"@id\"))];\n const names = new Set([\"id\"]);\n const decls: ColumnDecl[] = [\n { name: \"id\", dtype: \"f64\", nullable: true },\n ...fields.map((field): ColumnDecl => {\n const column = uniqueColumnName(field, null, (n) => names.has(n));\n names.add(column);\n if (column !== field) {\n this.report.warning(\n \"coercion\",\n COLUMN_RENAMED_CODE,\n `${name} column \"${field}\" renamed to \"${column}\": the table's own id column holds that name`,\n { element: field },\n );\n }\n return { name: column, dtype: \"json\", nullable: true };\n }),\n ];\n const table = this.sink.addExtensionTable(name, decls);\n const precision = (digits: string): void => {\n this.precision(name, digits);\n };\n for (const record of records) {\n const id = refId(record[\"@id\"]);\n if (typeof id === \"string\") {\n precision(id);\n }\n this.sink.addExtensionRow(table, [\n id === null ? null : Number(id),\n ...fields.map((field) => (record[field] === undefined ? null : plainJson(record[field], precision))),\n ]);\n }\n }\n\n /**\n * A list column of the citation or support ids a node or edge links to.\n * @param aspectName - nodeCitations, edgeCitations, nodeSupports or edgeSupports\n * @param domain - node or edge\n * @param column - citations or supports\n */\n private linkColumn(aspectName: string, domain: \"node\" | \"edge\", column: \"citations\" | \"supports\"): void {\n const rows = domain === \"node\" ? this.nodeRows : this.edgeRows;\n const root = domain === \"node\" ? this.rootNodes : this.rootEdges;\n const links = new Map<number, number[]>();\n for (const { value } of aspect(this.doc, aspectName)) {\n if (!isRecord(value)) {\n continue;\n }\n const targets = Array.isArray(value.po) ? (value.po as unknown[]) : [value.po];\n const ids = (Array.isArray(value[column]) ? (value[column] as unknown[]) : [])\n .map(refId)\n .filter((id): id is NodeId => id !== null)\n .map(Number);\n for (const raw of targets) {\n const target = refId(raw);\n const row = target === null ? undefined : rows.get(target);\n if (row === undefined) {\n if (target === null || !root.has(target)) {\n this.dangle(`${aspectName} entry`);\n }\n continue;\n }\n links.set(row, [...(links.get(row) ?? []), ...ids]);\n }\n }\n this.writeColumn(domain, column, \"list\", \"f64\", [...links]);\n }\n\n /**\n * Declare a column and write its cells (nothing when there are none).\n * @param domain - node or edge\n * @param name - the column name\n * @param dtype - the dtype\n * @param itemDtype - the list item dtype, or null\n * @param cells - row and value pairs\n */\n private writeColumn(\n domain: \"node\" | \"edge\",\n name: string,\n dtype: Dtype,\n itemDtype: ScalarDtype | null,\n cells: readonly (readonly [number, unknown])[],\n ): void {\n if (cells.length === 0) {\n return;\n }\n const decl: ColumnDecl = {\n name,\n dtype,\n ...(itemDtype === null ? {} : { itemDtype }),\n nullable: true,\n origin: { format: CX_FORMAT, namespace: \"provenance\" },\n };\n const { handle } = declareResolved(this.sink, domain, decl, this.report);\n for (const [row, value] of cells) {\n if (domain === \"node\") {\n this.sink.setNodeValue(handle, row, value);\n } else {\n this.sink.setEdgeValue(handle, row, value);\n }\n }\n }\n\n /** Record the metadata: source format, name, description, id type, the kept aspects. */\n private setMeta(): void {\n const describe = (key: string): string | null => {\n let found: string | null = null;\n for (const { value } of this.doc.attributes.network.get(key) ?? []) {\n if (isRecord(value) && typeof value.v === \"string\") {\n const scope = this.scopePeek(value.s);\n if (scope === 2) {\n return value.v;\n }\n if (scope === 1) {\n found ??= value.v;\n }\n }\n }\n return found;\n };\n const extra: Record<string, unknown> = Object.fromEntries(this.doc.kept);\n const groups = aspect(this.doc, \"cyGroups\").map((h) => plainJson(h.value));\n const own: Record<string, unknown> = {};\n if (groups.length > 0) {\n own.groups = groups;\n }\n if (this.plan.subnetwork !== null) {\n own.subnetwork = this.plan.subnetwork;\n }\n for (const key of OWN_EXTRA_KEYS) {\n if (key in own && this.doc.kept.has(key)) {\n this.report.warning(\n \"unsupported\",\n UNKNOWN_ELEMENT_CODE,\n `the aspect \"${key}\" is not kept: meta.extra.cx.${key} holds the importer's own ${key === \"groups\" ? \"cyGroups\" : \"subnetwork\"} data`,\n { element: key },\n );\n }\n }\n Object.assign(extra, own);\n const { weightFrom } = this.options;\n const name = this.plan.name ?? describe(\"name\");\n const description = describe(\"description\");\n const patch: GraphMetaPatch = {\n sourceFormat: CX_FORMAT,\n sourceVersion: \"1\",\n idType: this.idType,\n ...(name === null ? {} : { name }),\n ...(description === null ? {} : { description }),\n ...(this.weighted && weightFrom !== null\n ? { weightOrigin: { format: CX_FORMAT, id: null, title: weightFrom, type: \"double\", namespace: null } }\n : {}),\n extra: { cx: extra },\n };\n this.sink.setMeta(patch);\n }\n}\n\n// ============================================================ the plugin\n\n/**\n * Read a document, then build the graphs `pick` selects.\n * @param input - the input\n * @param options - the caller's options\n * @param sinkFor - the sink of graph i, or null to skip it\n * @param pick - which graph indexes to build, given the plans and the first report\n * @returns one report per built graph\n */\nasync function run(\n input: ImportInput,\n options: (CxImportOptions & CommonImportOptions) | undefined,\n sinkFor: (index: number) => GraphSink,\n pick: (plans: readonly GraphPlan[], report: ImportReportBuilder) => readonly number[],\n): Promise<ImportReport[]> {\n const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);\n const zAs = zAsOption(options?.zAs);\n const first = new ImportReportBuilder(CX_FORMAT, resolved.errorLimit);\n reportUnusedOptions(options, first, USED_OPTIONS);\n const doc = await readDocument(input, first, resolved);\n const plans = graphPlans(doc, first);\n const chosen = pick(plans, first);\n const reports: ImportReport[] = [];\n chosen.forEach((index, k) => {\n const report = k === 0 ? first : new ImportReportBuilder(CX_FORMAT, resolved.errorLimit);\n const sink = sinkFor(index);\n reportSinkOptions(sink, options, report, true);\n new CxReader(sink, report, resolved, zAs, doc, plans[index]).build();\n throwIfAborted(resolved.signal);\n reports.push(report.finish());\n });\n return reports;\n}\n\n/**\n * The CX version 1 importer plugin.\n * @category Built-in formats\n */\nexport const cxImporter: GraphImporter<CxImportOptions> = Object.freeze({\n format: CX_FORMAT,\n options: Object.freeze([\"zAs\"]),\n extensions: Object.freeze([\".cx\"]),\n mimeTypes: Object.freeze([\"application/json\"]),\n\n /**\n * Confidence that the head is CX version 1: 0.95 when a top-level array starts with an object\n * whose first key is numberVerification or metaData (Cytoscape's file filter), 0.7 for another\n * CX aspect name.\n * @param head - the first bytes\n * @returns the confidence\n */\n sniff(head: Uint8Array): number {\n const match = /^\\s*\\[\\s*\\{\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*:/.exec(headText(head));\n if (match === null) {\n return 0;\n }\n if (CX_FIRST_KEYS.includes(match[1])) {\n return 0.95;\n }\n return CX_ASPECT_KEYS.includes(match[1]) ? 0.7 : 0;\n },\n\n /**\n * Read one graph of a CX document into the sink: the root network, or the subnetwork\n * graphIndex / graphName picks (the first by default; W_MULTIPLE_GRAPHS names the others).\n * @param input - the text, bytes or stream\n * @param sink - the sink\n * @param options - format-specific and common options\n * @returns the import report; ImportError on a fatal error or beyond the error limit\n */\n async import(\n input: ImportInput,\n sink: GraphSink,\n options?: CxImportOptions & CommonImportOptions,\n ): Promise<ImportReport> {\n const [report] = await run(\n input,\n options,\n () => sink,\n (plans, first) => {\n const index = chooseGraph(\n plans.map((p) => p.name),\n options,\n first,\n );\n if (plans.length > 1 && !graphChosen(options)) {\n first.warning(\n \"unsupported\",\n MULTIPLE_GRAPHS_CODE,\n `the collection holds ${plans.length} subnetworks; graph ${index} is read and ${plans.length - 1} skipped (importAllGraphs() reads every one)`,\n );\n }\n return [index];\n },\n );\n return report;\n },\n\n /**\n * Read every graph of a CX document: one per subnetwork of a collection, in the order of\n * cyNetworkRelations; the root network for any other document.\n * @param input - the text, bytes or stream\n * @param sinkFor - the sink of the graph with this index, called before its first push\n * @param options - format-specific and common options\n * @returns one report per graph\n */\n importAll(\n input: ImportInput,\n sinkFor: (index: number) => GraphSink,\n options?: CxImportOptions & CommonImportOptions,\n ): Promise<ImportReport[]> {\n return run(input, options, sinkFor, (plans) => plans.map((p) => p.index));\n },\n\n /**\n * List the graphs of a CX document with their names and member counts.\n * @param input - the text, bytes or stream\n * @param options - format-specific and common options\n * @returns one listing per graph\n */\n async listGraphs(\n input: ImportInput,\n options?: CxImportOptions & CommonImportOptions,\n ): Promise<readonly GraphListing[]> {\n const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);\n const report = new ImportReportBuilder(CX_FORMAT, resolved.errorLimit);\n const doc = await readDocument(input, report, resolved);\n const nodes = aspect(doc, \"nodes\").length;\n const edges = aspect(doc, \"edges\").length;\n return graphPlans(doc, report).map((plan) =>\n Object.freeze({\n index: plan.index,\n name: plan.name,\n nodes: memberCount(plan.nodes, nodes),\n edges: memberCount(plan.edges, edges),\n }),\n );\n },\n});\n"],"names":["CX_FORMAT","plan","i","aspect","type"],"mappings":"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"}