grafeo-ogm 2.4.7 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +95 -35
  3. package/dist/cjs/cli/commands/db-push.d.ts.map +1 -1
  4. package/dist/cjs/cli/commands/db-push.js +74 -8
  5. package/dist/cjs/cli/commands/db-push.js.map +1 -1
  6. package/dist/cjs/cli/commands/db-seed.d.ts.map +1 -1
  7. package/dist/cjs/cli/commands/db-seed.js +10 -1
  8. package/dist/cjs/cli/commands/db-seed.js.map +1 -1
  9. package/dist/cjs/cli/introspect.d.ts +2 -2
  10. package/dist/cjs/cli/introspect.d.ts.map +1 -1
  11. package/dist/cjs/cli/introspect.js +44 -2
  12. package/dist/cjs/cli/introspect.js.map +1 -1
  13. package/dist/cjs/cli/push-planner.d.ts +57 -2
  14. package/dist/cjs/cli/push-planner.d.ts.map +1 -1
  15. package/dist/cjs/cli/push-planner.js +161 -3
  16. package/dist/cjs/cli/push-planner.js.map +1 -1
  17. package/dist/cjs/compilers/fulltext.compiler.d.ts.map +1 -1
  18. package/dist/cjs/compilers/fulltext.compiler.js +5 -1
  19. package/dist/cjs/compilers/fulltext.compiler.js.map +1 -1
  20. package/dist/cjs/compilers/mutation.compiler.d.ts +107 -1
  21. package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
  22. package/dist/cjs/compilers/mutation.compiler.js +695 -422
  23. package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
  24. package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -1
  25. package/dist/cjs/compilers/select-normalizer.js +12 -1
  26. package/dist/cjs/compilers/select-normalizer.js.map +1 -1
  27. package/dist/cjs/compilers/selection.compiler.d.ts +56 -0
  28. package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
  29. package/dist/cjs/compilers/selection.compiler.js +271 -29
  30. package/dist/cjs/compilers/selection.compiler.js.map +1 -1
  31. package/dist/cjs/compilers/where.compiler.d.ts.map +1 -1
  32. package/dist/cjs/compilers/where.compiler.js +36 -15
  33. package/dist/cjs/compilers/where.compiler.js.map +1 -1
  34. package/dist/cjs/execution/executor.d.ts +34 -9
  35. package/dist/cjs/execution/executor.d.ts.map +1 -1
  36. package/dist/cjs/execution/executor.js +42 -5
  37. package/dist/cjs/execution/executor.js.map +1 -1
  38. package/dist/cjs/execution/result-mapper.d.ts.map +1 -1
  39. package/dist/cjs/execution/result-mapper.js +4 -2
  40. package/dist/cjs/execution/result-mapper.js.map +1 -1
  41. package/dist/cjs/generator/generate-types.d.ts.map +1 -1
  42. package/dist/cjs/generator/generate-types.js +76 -0
  43. package/dist/cjs/generator/generate-types.js.map +1 -1
  44. package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts.map +1 -1
  45. package/dist/cjs/generator/type-emitters/aggregation-emitter.js +19 -7
  46. package/dist/cjs/generator/type-emitters/aggregation-emitter.js.map +1 -1
  47. package/dist/cjs/generator/type-emitters/input-emitter.js +13 -4
  48. package/dist/cjs/generator/type-emitters/input-emitter.js.map +1 -1
  49. package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +1 -0
  50. package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
  51. package/dist/cjs/generator/type-emitters/model-map-emitter.js +5 -20
  52. package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -1
  53. package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts +3 -0
  54. package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts.map +1 -1
  55. package/dist/cjs/generator/type-emitters/node-type-emitter.js +6 -11
  56. package/dist/cjs/generator/type-emitters/node-type-emitter.js.map +1 -1
  57. package/dist/cjs/generator/type-emitters/select-fields-emitter.js +21 -2
  58. package/dist/cjs/generator/type-emitters/select-fields-emitter.js.map +1 -1
  59. package/dist/cjs/generator/type-emitters/where-emitter.js +19 -3
  60. package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -1
  61. package/dist/cjs/index.d.ts +1 -1
  62. package/dist/cjs/index.d.ts.map +1 -1
  63. package/dist/cjs/interface-model.d.ts +12 -0
  64. package/dist/cjs/interface-model.d.ts.map +1 -1
  65. package/dist/cjs/interface-model.js +27 -13
  66. package/dist/cjs/interface-model.js.map +1 -1
  67. package/dist/cjs/model.d.ts.map +1 -1
  68. package/dist/cjs/model.js +12 -0
  69. package/dist/cjs/model.js.map +1 -1
  70. package/dist/cjs/ogm.d.ts +22 -2
  71. package/dist/cjs/ogm.d.ts.map +1 -1
  72. package/dist/cjs/ogm.js +42 -5
  73. package/dist/cjs/ogm.js.map +1 -1
  74. package/dist/cjs/policy/nested-writes.d.ts.map +1 -1
  75. package/dist/cjs/policy/nested-writes.js +40 -20
  76. package/dist/cjs/policy/nested-writes.js.map +1 -1
  77. package/dist/cjs/schema/parser.d.ts.map +1 -1
  78. package/dist/cjs/schema/parser.js +94 -16
  79. package/dist/cjs/schema/parser.js.map +1 -1
  80. package/dist/cjs/schema/types.d.ts +1 -1
  81. package/dist/cjs/schema/types.d.ts.map +1 -1
  82. package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -1
  83. package/dist/cjs/subgraph/subgraph-operations.js +71 -6
  84. package/dist/cjs/subgraph/subgraph-operations.js.map +1 -1
  85. package/dist/cjs/subgraph/types.d.ts +14 -0
  86. package/dist/cjs/subgraph/types.d.ts.map +1 -1
  87. package/dist/cjs/testing/cypher-assert.d.ts +19 -1
  88. package/dist/cjs/testing/cypher-assert.d.ts.map +1 -1
  89. package/dist/cjs/testing/cypher-assert.js +217 -13
  90. package/dist/cjs/testing/cypher-assert.js.map +1 -1
  91. package/dist/cjs/testing/neo4j-record-factory.d.ts +29 -2
  92. package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
  93. package/dist/cjs/testing/neo4j-record-factory.js +93 -3
  94. package/dist/cjs/testing/neo4j-record-factory.js.map +1 -1
  95. package/dist/cjs/utils/cypher-field-projection.d.ts +31 -3
  96. package/dist/cjs/utils/cypher-field-projection.d.ts.map +1 -1
  97. package/dist/cjs/utils/cypher-field-projection.js +59 -7
  98. package/dist/cjs/utils/cypher-field-projection.js.map +1 -1
  99. package/dist/cjs/utils/write-coercion.d.ts +18 -0
  100. package/dist/cjs/utils/write-coercion.d.ts.map +1 -1
  101. package/dist/cjs/utils/write-coercion.js +74 -1
  102. package/dist/cjs/utils/write-coercion.js.map +1 -1
  103. package/dist/esm/cli/commands/db-push.d.ts.map +1 -1
  104. package/dist/esm/cli/commands/db-push.js +74 -8
  105. package/dist/esm/cli/commands/db-push.js.map +1 -1
  106. package/dist/esm/cli/commands/db-seed.d.ts.map +1 -1
  107. package/dist/esm/cli/commands/db-seed.js +10 -1
  108. package/dist/esm/cli/commands/db-seed.js.map +1 -1
  109. package/dist/esm/cli/introspect.d.ts +2 -2
  110. package/dist/esm/cli/introspect.d.ts.map +1 -1
  111. package/dist/esm/cli/introspect.js +44 -2
  112. package/dist/esm/cli/introspect.js.map +1 -1
  113. package/dist/esm/cli/push-planner.d.ts +57 -2
  114. package/dist/esm/cli/push-planner.d.ts.map +1 -1
  115. package/dist/esm/cli/push-planner.js +162 -4
  116. package/dist/esm/cli/push-planner.js.map +1 -1
  117. package/dist/esm/compilers/fulltext.compiler.d.ts.map +1 -1
  118. package/dist/esm/compilers/fulltext.compiler.js +5 -1
  119. package/dist/esm/compilers/fulltext.compiler.js.map +1 -1
  120. package/dist/esm/compilers/mutation.compiler.d.ts +107 -1
  121. package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
  122. package/dist/esm/compilers/mutation.compiler.js +692 -422
  123. package/dist/esm/compilers/mutation.compiler.js.map +1 -1
  124. package/dist/esm/compilers/select-normalizer.d.ts.map +1 -1
  125. package/dist/esm/compilers/select-normalizer.js +12 -1
  126. package/dist/esm/compilers/select-normalizer.js.map +1 -1
  127. package/dist/esm/compilers/selection.compiler.d.ts +56 -0
  128. package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
  129. package/dist/esm/compilers/selection.compiler.js +273 -31
  130. package/dist/esm/compilers/selection.compiler.js.map +1 -1
  131. package/dist/esm/compilers/where.compiler.d.ts.map +1 -1
  132. package/dist/esm/compilers/where.compiler.js +37 -16
  133. package/dist/esm/compilers/where.compiler.js.map +1 -1
  134. package/dist/esm/execution/executor.d.ts +34 -9
  135. package/dist/esm/execution/executor.d.ts.map +1 -1
  136. package/dist/esm/execution/executor.js +41 -5
  137. package/dist/esm/execution/executor.js.map +1 -1
  138. package/dist/esm/execution/result-mapper.d.ts.map +1 -1
  139. package/dist/esm/execution/result-mapper.js +4 -2
  140. package/dist/esm/execution/result-mapper.js.map +1 -1
  141. package/dist/esm/generator/generate-types.d.ts.map +1 -1
  142. package/dist/esm/generator/generate-types.js +76 -0
  143. package/dist/esm/generator/generate-types.js.map +1 -1
  144. package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts.map +1 -1
  145. package/dist/esm/generator/type-emitters/aggregation-emitter.js +19 -7
  146. package/dist/esm/generator/type-emitters/aggregation-emitter.js.map +1 -1
  147. package/dist/esm/generator/type-emitters/input-emitter.js +13 -4
  148. package/dist/esm/generator/type-emitters/input-emitter.js.map +1 -1
  149. package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +1 -0
  150. package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
  151. package/dist/esm/generator/type-emitters/model-map-emitter.js +5 -20
  152. package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -1
  153. package/dist/esm/generator/type-emitters/node-type-emitter.d.ts +3 -0
  154. package/dist/esm/generator/type-emitters/node-type-emitter.d.ts.map +1 -1
  155. package/dist/esm/generator/type-emitters/node-type-emitter.js +6 -11
  156. package/dist/esm/generator/type-emitters/node-type-emitter.js.map +1 -1
  157. package/dist/esm/generator/type-emitters/select-fields-emitter.js +21 -2
  158. package/dist/esm/generator/type-emitters/select-fields-emitter.js.map +1 -1
  159. package/dist/esm/generator/type-emitters/where-emitter.js +19 -3
  160. package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -1
  161. package/dist/esm/index.d.ts +1 -1
  162. package/dist/esm/index.d.ts.map +1 -1
  163. package/dist/esm/interface-model.d.ts +12 -0
  164. package/dist/esm/interface-model.d.ts.map +1 -1
  165. package/dist/esm/interface-model.js +27 -13
  166. package/dist/esm/interface-model.js.map +1 -1
  167. package/dist/esm/model.d.ts.map +1 -1
  168. package/dist/esm/model.js +12 -0
  169. package/dist/esm/model.js.map +1 -1
  170. package/dist/esm/ogm.d.ts +22 -2
  171. package/dist/esm/ogm.d.ts.map +1 -1
  172. package/dist/esm/ogm.js +43 -6
  173. package/dist/esm/ogm.js.map +1 -1
  174. package/dist/esm/policy/nested-writes.d.ts.map +1 -1
  175. package/dist/esm/policy/nested-writes.js +40 -20
  176. package/dist/esm/policy/nested-writes.js.map +1 -1
  177. package/dist/esm/schema/parser.d.ts.map +1 -1
  178. package/dist/esm/schema/parser.js +94 -16
  179. package/dist/esm/schema/parser.js.map +1 -1
  180. package/dist/esm/schema/types.d.ts +1 -1
  181. package/dist/esm/schema/types.d.ts.map +1 -1
  182. package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -1
  183. package/dist/esm/subgraph/subgraph-operations.js +71 -6
  184. package/dist/esm/subgraph/subgraph-operations.js.map +1 -1
  185. package/dist/esm/subgraph/types.d.ts +14 -0
  186. package/dist/esm/subgraph/types.d.ts.map +1 -1
  187. package/dist/esm/testing/cypher-assert.d.ts +19 -1
  188. package/dist/esm/testing/cypher-assert.d.ts.map +1 -1
  189. package/dist/esm/testing/cypher-assert.js +217 -13
  190. package/dist/esm/testing/cypher-assert.js.map +1 -1
  191. package/dist/esm/testing/neo4j-record-factory.d.ts +29 -2
  192. package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
  193. package/dist/esm/testing/neo4j-record-factory.js +93 -3
  194. package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
  195. package/dist/esm/utils/cypher-field-projection.d.ts +31 -3
  196. package/dist/esm/utils/cypher-field-projection.d.ts.map +1 -1
  197. package/dist/esm/utils/cypher-field-projection.js +58 -7
  198. package/dist/esm/utils/cypher-field-projection.js.map +1 -1
  199. package/dist/esm/utils/write-coercion.d.ts +18 -0
  200. package/dist/esm/utils/write-coercion.d.ts.map +1 -1
  201. package/dist/esm/utils/write-coercion.js +73 -1
  202. package/dist/esm/utils/write-coercion.js.map +1 -1
  203. package/package.json +1 -1
@@ -2,6 +2,48 @@ import { SubgraphOperationError } from '../errors';
2
2
  import { assertSafeIdentifier, assertSafeLabel, escapeIdentifier, } from '../utils/validation';
3
3
  /** No-op logger used when no logger is provided. */
4
4
  const NOOP_LOGGER = { debug: () => { } };
5
+ /**
6
+ * An owned relationship entry: a type with an optional APOC direction
7
+ * marker. APOC parses the joined relationshipFilter itself, so nothing
8
+ * outside this shape (e.g. a `|` smuggling in another type) may pass.
9
+ */
10
+ const OWNED_RELATIONSHIP = /^<?[A-Za-z_][A-Za-z0-9_]*>?$/;
11
+ /**
12
+ * The APOC relationshipFilter for the owned relationships. A bare type is
13
+ * traversed OUTGOING (`TYPE>`); `<TYPE` is incoming and `<TYPE>` is both.
14
+ *
15
+ * Before v2.5.0 bare types were passed as-is, and APOC expands a bare type
16
+ * in BOTH directions: from a Chapter shared by two Books, deleting Book A
17
+ * climbed back up to Book B and deleted it too, and deleting a Chapter
18
+ * deleted its parent Book.
19
+ */
20
+ /**
21
+ * The escaped label the root is matched with: `rootLabel`, else the first
22
+ * owned label (v2.5.0). Called after validateConfig, which checked both.
23
+ */
24
+ function rootLabelOf(config) {
25
+ return assertSafeLabel(config.rootLabel ?? config.ownedLabels[0]);
26
+ }
27
+ /**
28
+ * Message of the apoc.util.validate guards in the clone query, without the
29
+ * `Failed to invoke procedure … java.lang.RuntimeException:` wrapper.
30
+ */
31
+ const CLONE_GUARD_MESSAGE = /cloneSubgraph: (\d+ owned node\(s\) [^\n]*)/;
32
+ function ownedRelationshipFilter(config) {
33
+ return config.ownedRelationships
34
+ .map((rel) => {
35
+ const incoming = rel.startsWith('<');
36
+ const outgoing = rel.endsWith('>');
37
+ // APOC reads `<TYPE>` as incoming only (checked on APOC 5.26), so
38
+ // "both" is sent as the bare type, which APOC expands both ways.
39
+ if (incoming && outgoing)
40
+ return rel.slice(1, -1);
41
+ if (incoming || outgoing)
42
+ return rel;
43
+ return `${rel}>`;
44
+ })
45
+ .join('|');
46
+ }
5
47
  /**
6
48
  * Validates all labels and relationship types in a SubgraphConfig
7
49
  * to prevent Cypher injection (these values are string-interpolated),
@@ -25,8 +67,12 @@ function validateConfig(config, operation, rootId) {
25
67
  'would traverse every relationship reachable from the root.');
26
68
  for (const label of config.ownedLabels)
27
69
  assertSafeLabel(label);
70
+ if (config.rootLabel !== undefined)
71
+ assertSafeLabel(config.rootLabel);
28
72
  for (const rel of config.ownedRelationships)
29
- assertSafeIdentifier(rel, 'owned relationship type');
73
+ if (!OWNED_RELATIONSHIP.test(rel))
74
+ throw new SubgraphOperationError(operation, rootId, `Invalid owned relationship "${rel}": expected TYPE, TYPE>, <TYPE ` +
75
+ 'or <TYPE> where TYPE matches [A-Za-z_][A-Za-z0-9_]*');
30
76
  for (const ref of config.referenceRelationships) {
31
77
  assertSafeLabel(ref.fromLabel);
32
78
  assertSafeIdentifier(ref.relationshipType, 'reference relationship type');
@@ -63,7 +109,8 @@ export async function cloneSubgraph(sourceRootId, config, transaction, logger) {
63
109
  catch (error) {
64
110
  if (error instanceof SubgraphOperationError)
65
111
  throw error;
66
- throw new SubgraphOperationError('clone', sourceRootId, error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
112
+ const message = error instanceof Error ? error.message : String(error);
113
+ throw new SubgraphOperationError('clone', sourceRootId, CLONE_GUARD_MESSAGE.exec(message)?.[1] ?? message, error instanceof Error ? error : undefined);
67
114
  }
68
115
  }
69
116
  /**
@@ -81,11 +128,12 @@ export async function cloneSubgraph(sourceRootId, config, transaction, logger) {
81
128
  export async function deleteSubgraph(rootId, config, transaction, logger) {
82
129
  const log = logger ?? NOOP_LOGGER;
83
130
  validateConfig(config, 'delete', rootId);
84
- const relFilter = config.ownedRelationships.join('|');
131
+ const relFilter = ownedRelationshipFilter(config);
85
132
  const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
133
+ const rootLabel = rootLabelOf(config);
86
134
  try {
87
135
  const result = await transaction.run(`
88
- MATCH (source {id: $rootId})
136
+ MATCH (source:${rootLabel} {id: $rootId})
89
137
  CALL apoc.path.subgraphAll(source, {
90
138
  relationshipFilter: $relFilter,
91
139
  labelFilter: $labelFilter,
@@ -116,19 +164,36 @@ export async function deleteSubgraph(rootId, config, transaction, logger) {
116
164
  * Executes the APOC subgraph clone and generates new UUIDs for cloned nodes.
117
165
  */
118
166
  async function executeApocClone(sourceRootId, config, transaction, logger) {
119
- const relFilter = config.ownedRelationships.join('|');
167
+ const relFilter = ownedRelationshipFilter(config);
120
168
  const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
169
+ const rootLabel = rootLabelOf(config);
121
170
  // Step 1: Collect subgraph and clone it
122
171
  // APOC cloneSubgraph returns: input=INTEGER (original internal ID), output=NODE (clone).
123
172
  // skipProperties: ['id'] avoids unique constraint violations during clone.
124
173
  // We use `input` (internal ID) to match back to the original's app-level id.
174
+ //
175
+ // v2.5.0 — nodeMapping is keyed by the original's `id`, so an owned node
176
+ // with no id (or one sharing an id with another owned node) cannot be
177
+ // mapped: before v2.5.0 they collapsed onto one key, and only one of them
178
+ // got a new UUID. The apoc.util.validate guards abort before anything is
179
+ // cloned.
125
180
  const result = await transaction.run(`
126
- MATCH (source {id: $sourceId})
181
+ MATCH (source:${rootLabel} {id: $sourceId})
127
182
  CALL apoc.path.subgraphAll(source, {
128
183
  relationshipFilter: $relFilter,
129
184
  labelFilter: $labelFilter,
130
185
  maxLevel: $maxLevel
131
186
  }) YIELD nodes, relationships
187
+ WITH nodes, relationships, [n IN nodes WHERE n.id IS NOT NULL | n.id] AS ids
188
+ WITH nodes, relationships,
189
+ size(nodes) - size(ids) AS missingIds,
190
+ size(ids) - size(apoc.coll.toSet(ids)) AS duplicateIds
191
+ CALL apoc.util.validate(missingIds > 0,
192
+ 'cloneSubgraph: %d owned node(s) have no \`id\`; every owned node needs a unique \`id\` to be mapped to its clone',
193
+ [missingIds])
194
+ CALL apoc.util.validate(duplicateIds > 0,
195
+ 'cloneSubgraph: %d owned node(s) share an \`id\` with another owned node; every owned node needs a unique \`id\` to be mapped to its clone',
196
+ [duplicateIds])
132
197
  CALL apoc.refactor.cloneSubgraph(nodes, relationships, {skipProperties: ['id']})
133
198
  YIELD input, output, error
134
199
  WHERE output IS NOT NULL
@@ -1 +1 @@
1
- {"version":3,"file":"subgraph-operations.js","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subgraph-operations.js","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,20 @@ export interface SubgraphReferenceRelationship {
7
7
  /** Configuration for clone/delete operations — domain-agnostic blueprint. */
8
8
  export interface SubgraphConfig {
9
9
  ownedLabels: string[];
10
+ /**
11
+ * Label the root node must carry; defaults to `ownedLabels[0]` (v2.5.0).
12
+ * The root is matched as `(:rootLabel {id})`. Before v2.5.0 it was
13
+ * matched by `id` alone, so a node of any label with that id became a
14
+ * root, and the lookup scanned every node.
15
+ */
16
+ rootLabel?: string;
17
+ /**
18
+ * Relationship types the traversal follows from the root. A bare
19
+ * `'TYPE'` is followed OUTGOING only; write `'<TYPE'` for incoming and
20
+ * `'<TYPE>'` for both directions (v2.5.0). Before v2.5.0 a bare type was
21
+ * followed both ways, so the traversal could climb from a shared child
22
+ * up to another parent and take it in too.
23
+ */
10
24
  ownedRelationships: string[];
11
25
  maxLevel: number;
12
26
  referenceRelationships: SubgraphReferenceRelationship[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,6BAA6B,EAAE,CAAC;CACzD;AAED,oBAAoB;AACpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,6BAA6B,EAAE,CAAC;CACzD;AAED,oBAAoB;AACpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB"}
@@ -8,6 +8,11 @@ export declare class CypherAssert {
8
8
  * - Collapse all whitespace sequences to a single space
9
9
  * - Trim leading/trailing whitespace
10
10
  * - Rename params to canonical $p0, $p1, etc. (in order of appearance)
11
+ *
12
+ * String literals and backticked names are kept verbatim (v2.5.0): their
13
+ * whitespace is part of the value, and a `$name` inside a string is text,
14
+ * not a parameter. Before v2.5.0 both were collapsed and renamed, so
15
+ * `'a b'` equalled `'a b'`.
11
16
  */
12
17
  static normalize(cypher: string): string;
13
18
  /**
@@ -16,7 +21,20 @@ export declare class CypherAssert {
16
21
  */
17
22
  static assertStructurallyEqual(actual: string, expected: string): void;
18
23
  /**
19
- * Assert that a Cypher string contains a specific clause.
24
+ * Assert that a Cypher string contains a clause, and that `pattern`
25
+ * appears inside that clause.
26
+ *
27
+ * The clause keyword is matched case-insensitively as a whole word (or
28
+ * words, e.g. 'ORDER BY', 'ON CREATE SET'), never inside a name, a
29
+ * parameter, a string or a comment. A clause runs from its keyword to the
30
+ * next clause keyword at the same bracket depth (WHERE, ORDER BY, SKIP and
31
+ * LIMIT each count as their own clause), a `|` at that depth, or the
32
+ * bracket closing the enclosing one. The assertion passes when any
33
+ * occurrence of the clause contains `pattern`.
34
+ *
35
+ * Before v2.5.0 the clause was a raw substring (`'SET'` matched
36
+ * `$offset`) and `pattern` could appear anywhere in the query.
37
+ *
20
38
  * @param cypher - The full Cypher string
21
39
  * @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
22
40
  * @param pattern - Substring to search for within the clause
@@ -1 +1 @@
1
- {"version":3,"file":"cypher-assert.d.ts","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBxC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAStE;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI;IAYP;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAQP;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;CAeR"}
1
+ {"version":3,"file":"cypher-assert.d.ts","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAmLA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBxC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAStE;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI;IAaP;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAQP;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;CAeR"}
@@ -1,3 +1,180 @@
1
+ /**
2
+ * JSON with object keys sorted at every depth and bigints written as
3
+ * `{"$bigint":"<digits>"}`, so two values compare equal regardless of key
4
+ * order and a bigint never equals the number or string with its digits.
5
+ *
6
+ * Every pair that JSON.stringify called equal before v2.4.8 is still equal:
7
+ * this only sorts keys and gives bigint (which used to throw a TypeError)
8
+ * an encoding. A neo4j Integer stays `{"high":…,"low":…}`, so it equals an
9
+ * Integer of the same value and not a plain number.
10
+ */
11
+ function canonicalJson(value) {
12
+ return JSON.stringify(value, (_key, v) => {
13
+ if (typeof v === 'bigint')
14
+ return { $bigint: v.toString() };
15
+ if (v && typeof v === 'object' && !Array.isArray(v)) {
16
+ const sorted = {};
17
+ for (const k of Object.keys(v).sort())
18
+ sorted[k] = v[k];
19
+ return sorted;
20
+ }
21
+ return v;
22
+ });
23
+ }
24
+ /**
25
+ * Split Cypher into tokens, keeping string literals, backticked names and
26
+ * comments whole so nothing inside them is read as a keyword, a parameter
27
+ * or collapsible whitespace (v2.5.0).
28
+ */
29
+ function tokenize(cypher) {
30
+ const tokens = [];
31
+ let i = 0;
32
+ const push = (kind, end) => {
33
+ tokens.push({ kind, text: cypher.slice(i, end), start: i, end });
34
+ i = end;
35
+ };
36
+ while (i < cypher.length) {
37
+ const ch = cypher[i];
38
+ if (/\s/.test(ch)) {
39
+ let j = i + 1;
40
+ while (j < cypher.length && /\s/.test(cypher[j]))
41
+ j++;
42
+ push('space', j);
43
+ }
44
+ else if (ch === "'" || ch === '"') {
45
+ let j = i + 1;
46
+ while (j < cypher.length && cypher[j] !== ch)
47
+ j += cypher[j] === '\\' ? 2 : 1;
48
+ push('quoted', Math.min(j + 1, cypher.length));
49
+ }
50
+ else if (ch === '`') {
51
+ // A backticked name escapes a backtick by doubling it.
52
+ let j = i + 1;
53
+ while (j < cypher.length)
54
+ if (cypher[j] === '`' && cypher[j + 1] === '`')
55
+ j += 2;
56
+ else if (cypher[j] === '`')
57
+ break;
58
+ else
59
+ j++;
60
+ push('quoted', Math.min(j + 1, cypher.length));
61
+ }
62
+ else if (cypher.startsWith('//', i)) {
63
+ const nl = cypher.indexOf('\n', i);
64
+ push('comment', nl === -1 ? cypher.length : nl);
65
+ }
66
+ else if (cypher.startsWith('/*', i)) {
67
+ const close = cypher.indexOf('*/', i + 2);
68
+ push('comment', close === -1 ? cypher.length : close + 2);
69
+ }
70
+ else if (ch === '$' && /[A-Za-z_]/.test(cypher[i + 1] ?? '')) {
71
+ let j = i + 1;
72
+ while (j < cypher.length && /[A-Za-z0-9_]/.test(cypher[j]))
73
+ j++;
74
+ push('param', j);
75
+ }
76
+ else if (/[A-Za-z0-9_]/.test(ch)) {
77
+ let j = i + 1;
78
+ while (j < cypher.length && /[A-Za-z0-9_]/.test(cypher[j]))
79
+ j++;
80
+ push('word', j);
81
+ }
82
+ else
83
+ push('punct', i + 1);
84
+ }
85
+ return tokens;
86
+ }
87
+ /** Keywords that start a clause, and so end the clause before them. */
88
+ const CLAUSE_KEYWORDS = new Set([
89
+ 'CALL',
90
+ 'CREATE',
91
+ 'DELETE',
92
+ 'DETACH',
93
+ 'FINISH',
94
+ 'FOREACH',
95
+ 'LIMIT',
96
+ 'LOAD',
97
+ 'MATCH',
98
+ 'MERGE',
99
+ 'OFFSET',
100
+ 'ON',
101
+ 'OPTIONAL',
102
+ 'ORDER',
103
+ 'REMOVE',
104
+ 'RETURN',
105
+ 'SET',
106
+ 'SKIP',
107
+ 'UNION',
108
+ 'UNWIND',
109
+ 'USE',
110
+ 'WHERE',
111
+ 'WITH',
112
+ 'YIELD',
113
+ ]);
114
+ /** The tokens that carry meaning, so keyword checks look past whitespace. */
115
+ function significant(tokens) {
116
+ return tokens.filter((t) => t.kind !== 'space' && t.kind !== 'comment');
117
+ }
118
+ /**
119
+ * Whether `sig[k]` (a word) is used as a keyword rather than a name: not a
120
+ * property (`.set`), a label or type (`:Set`), a map key (`set:`), or the
121
+ * WITH of `STARTS WITH` / `ENDS WITH`.
122
+ */
123
+ function isKeywordUse(sig, k) {
124
+ const prev = sig[k - 1];
125
+ const next = sig[k + 1];
126
+ if (prev?.kind === 'punct' && (prev.text === '.' || prev.text === ':'))
127
+ return false;
128
+ if (next?.kind === 'punct' && next.text === ':')
129
+ return false;
130
+ if (sig[k].text.toUpperCase() === 'WITH' &&
131
+ prev?.kind === 'word' &&
132
+ ['STARTS', 'ENDS'].includes(prev.text.toUpperCase()))
133
+ return false;
134
+ return true;
135
+ }
136
+ /**
137
+ * The source text of every occurrence of `clauseType` used as a keyword:
138
+ * from the keyword to the next clause keyword at the same bracket depth,
139
+ * a `|` at that depth (list and pattern comprehensions), or the bracket
140
+ * that closes the enclosing one — whichever comes first.
141
+ */
142
+ function clauseSegments(cypher, clauseType) {
143
+ const words = clauseType.trim().toUpperCase().split(/\s+/);
144
+ const sig = significant(tokenize(cypher));
145
+ const segments = [];
146
+ for (let k = 0; k + words.length <= sig.length; k++) {
147
+ const matches = words.every((w, n) => sig[k + n].kind === 'word' && sig[k + n].text.toUpperCase() === w);
148
+ if (!matches || !isKeywordUse(sig, k))
149
+ continue;
150
+ let depth = 0;
151
+ let end = cypher.length;
152
+ for (let j = k + words.length; j < sig.length; j++) {
153
+ const t = sig[j];
154
+ if (t.kind === 'punct' && '([{'.includes(t.text))
155
+ depth++;
156
+ else if (t.kind === 'punct' && ')]}'.includes(t.text)) {
157
+ if (--depth < 0) {
158
+ end = t.start;
159
+ break;
160
+ }
161
+ }
162
+ else if (depth === 0 && t.kind === 'punct' && t.text === '|') {
163
+ end = t.start;
164
+ break;
165
+ }
166
+ else if (depth === 0 &&
167
+ t.kind === 'word' &&
168
+ CLAUSE_KEYWORDS.has(t.text.toUpperCase()) &&
169
+ isKeywordUse(sig, j)) {
170
+ end = t.start;
171
+ break;
172
+ }
173
+ }
174
+ segments.push(cypher.slice(sig[k].start, end));
175
+ }
176
+ return segments;
177
+ }
1
178
  /**
2
179
  * Structural Cypher comparison utility that normalizes whitespace
3
180
  * and parameter names for deterministic test assertions.
@@ -8,17 +185,30 @@ export class CypherAssert {
8
185
  * - Collapse all whitespace sequences to a single space
9
186
  * - Trim leading/trailing whitespace
10
187
  * - Rename params to canonical $p0, $p1, etc. (in order of appearance)
188
+ *
189
+ * String literals and backticked names are kept verbatim (v2.5.0): their
190
+ * whitespace is part of the value, and a `$name` inside a string is text,
191
+ * not a parameter. Before v2.5.0 both were collapsed and renamed, so
192
+ * `'a b'` equalled `'a b'`.
11
193
  */
12
194
  static normalize(cypher) {
13
- const collapsed = cypher.replace(/\s+/g, ' ').trim();
14
195
  const seen = new Map();
15
196
  let counter = 0;
16
- const normalized = collapsed.replace(/\$[a-zA-Z_][a-zA-Z0-9_]*/g, (match) => {
17
- if (!seen.has(match))
18
- seen.set(match, `$p${counter++}`);
19
- return seen.get(match);
20
- });
21
- return normalized;
197
+ return tokenize(cypher)
198
+ .map((t) => {
199
+ if (t.kind === 'space')
200
+ return ' ';
201
+ if (t.kind === 'comment')
202
+ return t.text.replace(/\s+/g, ' ');
203
+ if (t.kind === 'param') {
204
+ if (!seen.has(t.text))
205
+ seen.set(t.text, `$p${counter++}`);
206
+ return seen.get(t.text);
207
+ }
208
+ return t.text;
209
+ })
210
+ .join('')
211
+ .trim();
22
212
  }
23
213
  /**
24
214
  * Assert two Cypher strings are structurally equal after normalization.
@@ -31,16 +221,30 @@ export class CypherAssert {
31
221
  throw new Error(`Cypher mismatch:\n Actual: ${normalizedActual}\n Expected: ${normalizedExpected}`);
32
222
  }
33
223
  /**
34
- * Assert that a Cypher string contains a specific clause.
224
+ * Assert that a Cypher string contains a clause, and that `pattern`
225
+ * appears inside that clause.
226
+ *
227
+ * The clause keyword is matched case-insensitively as a whole word (or
228
+ * words, e.g. 'ORDER BY', 'ON CREATE SET'), never inside a name, a
229
+ * parameter, a string or a comment. A clause runs from its keyword to the
230
+ * next clause keyword at the same bracket depth (WHERE, ORDER BY, SKIP and
231
+ * LIMIT each count as their own clause), a `|` at that depth, or the
232
+ * bracket closing the enclosing one. The assertion passes when any
233
+ * occurrence of the clause contains `pattern`.
234
+ *
235
+ * Before v2.5.0 the clause was a raw substring (`'SET'` matched
236
+ * `$offset`) and `pattern` could appear anywhere in the query.
237
+ *
35
238
  * @param cypher - The full Cypher string
36
239
  * @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
37
240
  * @param pattern - Substring to search for within the clause
38
241
  */
39
242
  static assertContainsClause(cypher, clauseType, pattern) {
40
- if (!cypher.toUpperCase().includes(clauseType.toUpperCase()))
243
+ const segments = clauseSegments(cypher, clauseType);
244
+ if (segments.length === 0)
41
245
  throw new Error(`Cypher does not contain clause '${clauseType}':\n ${cypher}`);
42
- if (!cypher.includes(pattern))
43
- throw new Error(`Cypher does not contain pattern '${pattern}':\n ${cypher}`);
246
+ if (!segments.some((s) => s.includes(pattern)))
247
+ throw new Error(`Cypher does not contain pattern '${pattern}' within a '${clauseType}' clause:\n ${cypher}`);
44
248
  }
45
249
  /**
46
250
  * Assert that a Cypher string does NOT contain a specific clause/pattern.
@@ -58,8 +262,8 @@ export class CypherAssert {
58
262
  for (const key of Object.keys(expected)) {
59
263
  if (!(key in actual))
60
264
  throw new Error(`Missing param key '${key}' in actual params: ${JSON.stringify(actual)}`);
61
- const actualVal = JSON.stringify(actual[key]);
62
- const expectedVal = JSON.stringify(expected[key]);
265
+ const actualVal = canonicalJson(actual[key]);
266
+ const expectedVal = canonicalJson(expected[key]);
63
267
  if (actualVal !== expectedVal)
64
268
  throw new Error(`Param '${key}' mismatch:\n Actual: ${actualVal}\n Expected: ${expectedVal}`);
65
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAc;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAClC,2BAA2B,EAC3B,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;YAExD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QAC1B,CAAC,CACF,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAc,EAAE,QAAgB;QAC7D,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,gBAAgB,KAAK,kBAAkB;YACzC,MAAM,IAAI,KAAK,CACb,iCAAiC,gBAAgB,iBAAiB,kBAAkB,EAAE,CACvF,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAc,EACd,UAAkB,EAClB,OAAe;QAEf,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,SAAS,MAAM,EAAE,CAC/D,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,oCAAoC,OAAO,SAAS,MAAM,EAAE,CAC7D,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAc,EACd,mBAA2B,EAC3B,OAAgB;QAEhB,MAAM,gBAAgB,GAAG,OAAO,IAAI,mBAAmB,CAAC;QACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,yCAAyC,gBAAgB,SAAS,MAAM,EAAE,CAC3E,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAA+B,EAC/B,QAAiC;QAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,sBAAsB,GAAG,uBAAuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACzE,CAAC;YAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,WAAW;gBAC3B,MAAM,IAAI,KAAK,CACb,UAAU,GAAG,4BAA4B,SAAS,iBAAiB,WAAW,EAAE,CACjF,CAAC;QACN,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"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"}
@@ -14,12 +14,39 @@ export declare class Neo4jRecordFactory {
14
14
  */
15
15
  static integer(value: number): Integer;
16
16
  /**
17
- * Create a Neo4j DateTime value from an ISO string.
17
+ * Create a Neo4j DateTime value from an ISO string, as the driver would
18
+ * return `datetime(isoString)`: the wall-clock fields and the offset are
19
+ * kept as written (`10:00+02:00` stays `10:00+02:00`), all nine fractional
20
+ * digits are kept, and a `[Area/City]` zone id is carried over.
21
+ *
22
+ * Field values are plain numbers (what the driver returns with
23
+ * `disableLosslessIntegers`), so `toString()` matches the driver's.
24
+ *
25
+ * A string with neither an offset nor a zone id is read as UTC, as Neo4j
26
+ * reads it with its default zone.
27
+ *
28
+ * Before v2.4.8 the value was converted to UTC with the offset dropped
29
+ * and the fraction cut to milliseconds; before v2.5.0 an offset-less
30
+ * string was read in the machine's local zone.
18
31
  */
19
32
  static dateTime(isoString: string): unknown;
33
+ /** The pre-v2.5.0 parse: through `Date`, in UTC, millisecond precision. */
34
+ private static legacyDateTime;
20
35
  /**
21
36
  * Create a mock Neo4j Node.
37
+ *
38
+ * `properties` are stored as given. The driver returns an Int property as
39
+ * an Integer, so pass `Neo4jRecordFactory.integer(n)` where a test needs
40
+ * that; a JS number is never converted, because it may stand for a Float.
41
+ *
42
+ * `options.identity` and `options.elementId` (v2.5.0) give mock nodes
43
+ * distinct ids; without them every node has identity 0 and elementId "0".
44
+ * A given identity alone yields elementId `String(identity)`, as the
45
+ * driver does for a 4.x server.
22
46
  */
23
- static node(labels: string[], properties: Record<string, unknown>): unknown;
47
+ static node(labels: string[], properties: Record<string, unknown>, options?: {
48
+ identity?: number | Integer;
49
+ elementId?: string;
50
+ }): unknown;
24
51
  }
25
52
  //# sourceMappingURL=neo4j-record-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"neo4j-record-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAMzD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAc3C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAG5E"}
1
+ {"version":3,"file":"neo4j-record-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAoDrE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAMzD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAsC3C,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,CACT,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO;CASX"}