grafeo-ogm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1121 -0
- package/dist/cjs/compilers/fulltext.compiler.d.ts +67 -0
- package/dist/cjs/compilers/fulltext.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/fulltext.compiler.js +254 -0
- package/dist/cjs/compilers/fulltext.compiler.js.map +1 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts +126 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/mutation.compiler.js +1239 -0
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -0
- package/dist/cjs/compilers/select-normalizer.d.ts +50 -0
- package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -0
- package/dist/cjs/compilers/select-normalizer.js +225 -0
- package/dist/cjs/compilers/select-normalizer.js.map +1 -0
- package/dist/cjs/compilers/selection.compiler.d.ts +113 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/selection.compiler.js +410 -0
- package/dist/cjs/compilers/selection.compiler.js.map +1 -0
- package/dist/cjs/compilers/where.compiler.d.ts +39 -0
- package/dist/cjs/compilers/where.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/where.compiler.js +456 -0
- package/dist/cjs/compilers/where.compiler.js.map +1 -0
- package/dist/cjs/errors.d.ts +28 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +42 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/execution/executor.d.ts +38 -0
- package/dist/cjs/execution/executor.d.ts.map +1 -0
- package/dist/cjs/execution/executor.js +50 -0
- package/dist/cjs/execution/executor.js.map +1 -0
- package/dist/cjs/execution/result-mapper.d.ts +26 -0
- package/dist/cjs/execution/result-mapper.d.ts.map +1 -0
- package/dist/cjs/execution/result-mapper.js +92 -0
- package/dist/cjs/execution/result-mapper.js.map +1 -0
- package/dist/cjs/generator/generate-types.d.ts +55 -0
- package/dist/cjs/generator/generate-types.d.ts.map +1 -0
- package/dist/cjs/generator/generate-types.js +181 -0
- package/dist/cjs/generator/generate-types.js.map +1 -0
- package/dist/cjs/generator/index.d.ts +3 -0
- package/dist/cjs/generator/index.d.ts.map +1 -0
- package/dist/cjs/generator/index.js +6 -0
- package/dist/cjs/generator/index.js.map +1 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts +7 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js +196 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.d.ts +22 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.js +270 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.d.ts +7 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.js +45 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts +15 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.js +80 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/helpers.d.ts +32 -0
- package/dist/cjs/generator/type-emitters/helpers.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/helpers.js +69 -0
- package/dist/cjs/generator/type-emitters/helpers.js.map +1 -0
- package/dist/cjs/generator/type-emitters/input-emitter.d.ts +6 -0
- package/dist/cjs/generator/type-emitters/input-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/input-emitter.js +560 -0
- package/dist/cjs/generator/type-emitters/input-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.d.ts +10 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.js +88 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +32 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.js +154 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.js +69 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts +13 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.js +123 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts +8 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js +169 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts +9 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.js +61 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts +8 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js +47 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/utility-types.d.ts +10 -0
- package/dist/cjs/generator/type-emitters/utility-types.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/utility-types.js +93 -0
- package/dist/cjs/generator/type-emitters/utility-types.js.map +1 -0
- package/dist/cjs/generator/type-emitters/where-emitter.d.ts +15 -0
- package/dist/cjs/generator/type-emitters/where-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js +189 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -0
- package/dist/cjs/index.d.ts +30 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +59 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interface-model.d.ts +158 -0
- package/dist/cjs/interface-model.d.ts.map +1 -0
- package/dist/cjs/interface-model.js +214 -0
- package/dist/cjs/interface-model.js.map +1 -0
- package/dist/cjs/model.d.ts +354 -0
- package/dist/cjs/model.d.ts.map +1 -0
- package/dist/cjs/model.js +513 -0
- package/dist/cjs/model.js.map +1 -0
- package/dist/cjs/ogm.d.ts +97 -0
- package/dist/cjs/ogm.d.ts.map +1 -0
- package/dist/cjs/ogm.js +224 -0
- package/dist/cjs/ogm.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schema/parser.d.ts +12 -0
- package/dist/cjs/schema/parser.d.ts.map +1 -0
- package/dist/cjs/schema/parser.js +331 -0
- package/dist/cjs/schema/parser.js.map +1 -0
- package/dist/cjs/schema/types.d.ts +66 -0
- package/dist/cjs/schema/types.d.ts.map +1 -0
- package/dist/cjs/schema/types.js +3 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/schema/utils.d.ts +23 -0
- package/dist/cjs/schema/utils.d.ts.map +1 -0
- package/dist/cjs/schema/utils.js +92 -0
- package/dist/cjs/schema/utils.js.map +1 -0
- package/dist/cjs/subgraph/index.d.ts +3 -0
- package/dist/cjs/subgraph/index.d.ts.map +1 -0
- package/dist/cjs/subgraph/index.js +7 -0
- package/dist/cjs/subgraph/index.js.map +1 -0
- package/dist/cjs/subgraph/subgraph-operations.d.ts +34 -0
- package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -0
- package/dist/cjs/subgraph/subgraph-operations.js +225 -0
- package/dist/cjs/subgraph/subgraph-operations.js.map +1 -0
- package/dist/cjs/subgraph/types.d.ts +23 -0
- package/dist/cjs/subgraph/types.d.ts.map +1 -0
- package/dist/cjs/subgraph/types.js +3 -0
- package/dist/cjs/subgraph/types.js.map +1 -0
- package/dist/cjs/testing/cypher-assert.d.ts +35 -0
- package/dist/cjs/testing/cypher-assert.d.ts.map +1 -0
- package/dist/cjs/testing/cypher-assert.js +72 -0
- package/dist/cjs/testing/cypher-assert.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +4 -0
- package/dist/cjs/testing/index.d.ts.map +1 -0
- package/dist/cjs/testing/index.js +10 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/neo4j-record-factory.d.ts +25 -0
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -0
- package/dist/cjs/testing/neo4j-record-factory.js +43 -0
- package/dist/cjs/testing/neo4j-record-factory.js.map +1 -0
- package/dist/cjs/testing/selection-set-factory.d.ts +24 -0
- package/dist/cjs/testing/selection-set-factory.d.ts.map +1 -0
- package/dist/cjs/testing/selection-set-factory.js +44 -0
- package/dist/cjs/testing/selection-set-factory.js.map +1 -0
- package/dist/cjs/utils/lucene.d.ts +9 -0
- package/dist/cjs/utils/lucene.d.ts.map +1 -0
- package/dist/cjs/utils/lucene.js +25 -0
- package/dist/cjs/utils/lucene.js.map +1 -0
- package/dist/cjs/utils/validation.d.ts +25 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +53 -0
- package/dist/cjs/utils/validation.js.map +1 -0
- package/dist/esm/compilers/fulltext.compiler.d.ts +67 -0
- package/dist/esm/compilers/fulltext.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/fulltext.compiler.js +250 -0
- package/dist/esm/compilers/fulltext.compiler.js.map +1 -0
- package/dist/esm/compilers/mutation.compiler.d.ts +126 -0
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/mutation.compiler.js +1235 -0
- package/dist/esm/compilers/mutation.compiler.js.map +1 -0
- package/dist/esm/compilers/select-normalizer.d.ts +50 -0
- package/dist/esm/compilers/select-normalizer.d.ts.map +1 -0
- package/dist/esm/compilers/select-normalizer.js +221 -0
- package/dist/esm/compilers/select-normalizer.js.map +1 -0
- package/dist/esm/compilers/selection.compiler.d.ts +113 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/selection.compiler.js +406 -0
- package/dist/esm/compilers/selection.compiler.js.map +1 -0
- package/dist/esm/compilers/where.compiler.d.ts +39 -0
- package/dist/esm/compilers/where.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/where.compiler.js +452 -0
- package/dist/esm/compilers/where.compiler.js.map +1 -0
- package/dist/esm/errors.d.ts +28 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +36 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/execution/executor.d.ts +38 -0
- package/dist/esm/execution/executor.d.ts.map +1 -0
- package/dist/esm/execution/executor.js +46 -0
- package/dist/esm/execution/executor.js.map +1 -0
- package/dist/esm/execution/result-mapper.d.ts +26 -0
- package/dist/esm/execution/result-mapper.d.ts.map +1 -0
- package/dist/esm/execution/result-mapper.js +85 -0
- package/dist/esm/execution/result-mapper.js.map +1 -0
- package/dist/esm/generator/generate-types.d.ts +55 -0
- package/dist/esm/generator/generate-types.d.ts.map +1 -0
- package/dist/esm/generator/generate-types.js +141 -0
- package/dist/esm/generator/generate-types.js.map +1 -0
- package/dist/esm/generator/index.d.ts +3 -0
- package/dist/esm/generator/index.d.ts.map +1 -0
- package/dist/esm/generator/index.js +2 -0
- package/dist/esm/generator/index.js.map +1 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts +7 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.js +193 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/connection-emitter.d.ts +22 -0
- package/dist/esm/generator/type-emitters/connection-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/connection-emitter.js +266 -0
- package/dist/esm/generator/type-emitters/connection-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/enum-emitter.d.ts +7 -0
- package/dist/esm/generator/type-emitters/enum-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/enum-emitter.js +42 -0
- package/dist/esm/generator/type-emitters/enum-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts +15 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.js +77 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/helpers.d.ts +32 -0
- package/dist/esm/generator/type-emitters/helpers.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/helpers.js +63 -0
- package/dist/esm/generator/type-emitters/helpers.js.map +1 -0
- package/dist/esm/generator/type-emitters/input-emitter.d.ts +6 -0
- package/dist/esm/generator/type-emitters/input-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/input-emitter.js +557 -0
- package/dist/esm/generator/type-emitters/input-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/interface-emitter.d.ts +10 -0
- package/dist/esm/generator/type-emitters/interface-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/interface-emitter.js +85 -0
- package/dist/esm/generator/type-emitters/interface-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +32 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.js +149 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.js +66 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts +13 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.js +120 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts +8 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.js +166 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.d.ts +9 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.js +58 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts +8 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.js +44 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/utility-types.d.ts +10 -0
- package/dist/esm/generator/type-emitters/utility-types.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/utility-types.js +88 -0
- package/dist/esm/generator/type-emitters/utility-types.js.map +1 -0
- package/dist/esm/generator/type-emitters/where-emitter.d.ts +15 -0
- package/dist/esm/generator/type-emitters/where-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/where-emitter.js +186 -0
- package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -0
- package/dist/esm/index.d.ts +30 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +29 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interface-model.d.ts +158 -0
- package/dist/esm/interface-model.d.ts.map +1 -0
- package/dist/esm/interface-model.js +210 -0
- package/dist/esm/interface-model.js.map +1 -0
- package/dist/esm/model.d.ts +354 -0
- package/dist/esm/model.d.ts.map +1 -0
- package/dist/esm/model.js +507 -0
- package/dist/esm/model.js.map +1 -0
- package/dist/esm/ogm.d.ts +97 -0
- package/dist/esm/ogm.d.ts.map +1 -0
- package/dist/esm/ogm.js +220 -0
- package/dist/esm/ogm.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schema/parser.d.ts +12 -0
- package/dist/esm/schema/parser.d.ts.map +1 -0
- package/dist/esm/schema/parser.js +324 -0
- package/dist/esm/schema/parser.js.map +1 -0
- package/dist/esm/schema/types.d.ts +66 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +2 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/schema/utils.d.ts +23 -0
- package/dist/esm/schema/utils.d.ts.map +1 -0
- package/dist/esm/schema/utils.js +87 -0
- package/dist/esm/schema/utils.js.map +1 -0
- package/dist/esm/subgraph/index.d.ts +3 -0
- package/dist/esm/subgraph/index.d.ts.map +1 -0
- package/dist/esm/subgraph/index.js +2 -0
- package/dist/esm/subgraph/index.js.map +1 -0
- package/dist/esm/subgraph/subgraph-operations.d.ts +34 -0
- package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -0
- package/dist/esm/subgraph/subgraph-operations.js +221 -0
- package/dist/esm/subgraph/subgraph-operations.js.map +1 -0
- package/dist/esm/subgraph/types.d.ts +23 -0
- package/dist/esm/subgraph/types.d.ts.map +1 -0
- package/dist/esm/subgraph/types.js +2 -0
- package/dist/esm/subgraph/types.js.map +1 -0
- package/dist/esm/testing/cypher-assert.d.ts +35 -0
- package/dist/esm/testing/cypher-assert.d.ts.map +1 -0
- package/dist/esm/testing/cypher-assert.js +68 -0
- package/dist/esm/testing/cypher-assert.js.map +1 -0
- package/dist/esm/testing/index.d.ts +4 -0
- package/dist/esm/testing/index.d.ts.map +1 -0
- package/dist/esm/testing/index.js +4 -0
- package/dist/esm/testing/index.js.map +1 -0
- package/dist/esm/testing/neo4j-record-factory.d.ts +25 -0
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -0
- package/dist/esm/testing/neo4j-record-factory.js +36 -0
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -0
- package/dist/esm/testing/selection-set-factory.d.ts +24 -0
- package/dist/esm/testing/selection-set-factory.d.ts.map +1 -0
- package/dist/esm/testing/selection-set-factory.js +40 -0
- package/dist/esm/testing/selection-set-factory.js.map +1 -0
- package/dist/esm/utils/lucene.d.ts +9 -0
- package/dist/esm/utils/lucene.d.ts.map +1 -0
- package/dist/esm/utils/lucene.js +22 -0
- package/dist/esm/utils/lucene.js.map +1 -0
- package/dist/esm/utils/validation.d.ts +25 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +46 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CypherAssert = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Structural Cypher comparison utility that normalizes whitespace
|
|
6
|
+
* and parameter names for deterministic test assertions.
|
|
7
|
+
*/
|
|
8
|
+
class CypherAssert {
|
|
9
|
+
/**
|
|
10
|
+
* Normalize a Cypher string for structural comparison:
|
|
11
|
+
* - Collapse all whitespace sequences to a single space
|
|
12
|
+
* - Trim leading/trailing whitespace
|
|
13
|
+
* - Rename params to canonical $p0, $p1, etc. (in order of appearance)
|
|
14
|
+
*/
|
|
15
|
+
static normalize(cypher) {
|
|
16
|
+
const collapsed = cypher.replace(/\s+/g, ' ').trim();
|
|
17
|
+
const seen = new Map();
|
|
18
|
+
let counter = 0;
|
|
19
|
+
const normalized = collapsed.replace(/\$[a-zA-Z_][a-zA-Z0-9_]*/g, (match) => {
|
|
20
|
+
if (!seen.has(match))
|
|
21
|
+
seen.set(match, `$p${counter++}`);
|
|
22
|
+
return seen.get(match);
|
|
23
|
+
});
|
|
24
|
+
return normalized;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Assert two Cypher strings are structurally equal after normalization.
|
|
28
|
+
* Throws an Error if they differ.
|
|
29
|
+
*/
|
|
30
|
+
static assertStructurallyEqual(actual, expected) {
|
|
31
|
+
const normalizedActual = CypherAssert.normalize(actual);
|
|
32
|
+
const normalizedExpected = CypherAssert.normalize(expected);
|
|
33
|
+
if (normalizedActual !== normalizedExpected)
|
|
34
|
+
throw new Error(`Cypher mismatch:\n Actual: ${normalizedActual}\n Expected: ${normalizedExpected}`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Assert that a Cypher string contains a specific clause.
|
|
38
|
+
* @param cypher - The full Cypher string
|
|
39
|
+
* @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
|
|
40
|
+
* @param pattern - Substring to search for within the clause
|
|
41
|
+
*/
|
|
42
|
+
static assertContainsClause(cypher, clauseType, pattern) {
|
|
43
|
+
if (!cypher.toUpperCase().includes(clauseType.toUpperCase()))
|
|
44
|
+
throw new Error(`Cypher does not contain clause '${clauseType}':\n ${cypher}`);
|
|
45
|
+
if (!cypher.includes(pattern))
|
|
46
|
+
throw new Error(`Cypher does not contain pattern '${pattern}':\n ${cypher}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Assert that a Cypher string does NOT contain a specific clause/pattern.
|
|
50
|
+
*/
|
|
51
|
+
static assertNotContainsClause(cypher, clauseTypeOrPattern, pattern) {
|
|
52
|
+
const effectivePattern = pattern ?? clauseTypeOrPattern;
|
|
53
|
+
if (cypher.includes(effectivePattern))
|
|
54
|
+
throw new Error(`Cypher unexpectedly contains pattern '${effectivePattern}':\n ${cypher}`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Assert parameter values match expected.
|
|
58
|
+
* Only checks the keys present in expected (doesn't require exact match on all params).
|
|
59
|
+
*/
|
|
60
|
+
static assertParams(actual, expected) {
|
|
61
|
+
for (const key of Object.keys(expected)) {
|
|
62
|
+
if (!(key in actual))
|
|
63
|
+
throw new Error(`Missing param key '${key}' in actual params: ${JSON.stringify(actual)}`);
|
|
64
|
+
const actualVal = JSON.stringify(actual[key]);
|
|
65
|
+
const expectedVal = JSON.stringify(expected[key]);
|
|
66
|
+
if (actualVal !== expectedVal)
|
|
67
|
+
throw new Error(`Param '${key}' mismatch:\n Actual: ${actualVal}\n Expected: ${expectedVal}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.CypherAssert = CypherAssert;
|
|
72
|
+
//# sourceMappingURL=cypher-assert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,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;AAjGD,oCAiGC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectionSetFactory = exports.Neo4jRecordFactory = exports.CypherAssert = void 0;
|
|
4
|
+
var cypher_assert_1 = require("./cypher-assert");
|
|
5
|
+
Object.defineProperty(exports, "CypherAssert", { enumerable: true, get: function () { return cypher_assert_1.CypherAssert; } });
|
|
6
|
+
var neo4j_record_factory_1 = require("./neo4j-record-factory");
|
|
7
|
+
Object.defineProperty(exports, "Neo4jRecordFactory", { enumerable: true, get: function () { return neo4j_record_factory_1.Neo4jRecordFactory; } });
|
|
8
|
+
var selection_set_factory_1 = require("./selection-set-factory");
|
|
9
|
+
Object.defineProperty(exports, "SelectionSetFactory", { enumerable: true, get: function () { return selection_set_factory_1.SelectionSetFactory; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Integer, Record as Neo4jRecord } from 'neo4j-driver';
|
|
2
|
+
/**
|
|
3
|
+
* Factory for creating mock Neo4j Record objects for testing.
|
|
4
|
+
*/
|
|
5
|
+
export declare class Neo4jRecordFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Create a Neo4j Record from a plain object.
|
|
8
|
+
* @param data - Object with keys as field names and values as properties
|
|
9
|
+
* @returns A Neo4j Record instance with get(), toObject(), and keys
|
|
10
|
+
*/
|
|
11
|
+
static create(data: Record<string, unknown>): Neo4jRecord;
|
|
12
|
+
/**
|
|
13
|
+
* Create a Neo4j Integer value.
|
|
14
|
+
*/
|
|
15
|
+
static integer(value: number): Integer;
|
|
16
|
+
/**
|
|
17
|
+
* Create a Neo4j DateTime value from an ISO string.
|
|
18
|
+
*/
|
|
19
|
+
static dateTime(isoString: string): unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Create a mock Neo4j Node.
|
|
22
|
+
*/
|
|
23
|
+
static node(labels: string[], properties: Record<string, unknown>): unknown;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=neo4j-record-factory.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Neo4jRecordFactory = void 0;
|
|
7
|
+
const neo4j_driver_1 = __importDefault(require("neo4j-driver"));
|
|
8
|
+
/**
|
|
9
|
+
* Factory for creating mock Neo4j Record objects for testing.
|
|
10
|
+
*/
|
|
11
|
+
class Neo4jRecordFactory {
|
|
12
|
+
/**
|
|
13
|
+
* Create a Neo4j Record from a plain object.
|
|
14
|
+
* @param data - Object with keys as field names and values as properties
|
|
15
|
+
* @returns A Neo4j Record instance with get(), toObject(), and keys
|
|
16
|
+
*/
|
|
17
|
+
static create(data) {
|
|
18
|
+
const keys = Object.keys(data);
|
|
19
|
+
const values = keys.map((k) => data[k]);
|
|
20
|
+
return new neo4j_driver_1.default.types.Record(keys, values);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a Neo4j Integer value.
|
|
24
|
+
*/
|
|
25
|
+
static integer(value) {
|
|
26
|
+
return neo4j_driver_1.default.int(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a Neo4j DateTime value from an ISO string.
|
|
30
|
+
*/
|
|
31
|
+
static dateTime(isoString) {
|
|
32
|
+
const d = new Date(isoString);
|
|
33
|
+
return new neo4j_driver_1.default.types.DateTime(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() * 1000000, 0);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a mock Neo4j Node.
|
|
37
|
+
*/
|
|
38
|
+
static node(labels, properties) {
|
|
39
|
+
return new neo4j_driver_1.default.types.Node(neo4j_driver_1.default.int(0), labels, properties);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.Neo4jRecordFactory = Neo4jRecordFactory;
|
|
43
|
+
//# sourceMappingURL=neo4j-record-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-record-factory.js","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqE;AAErE;;GAEG;AACH,MAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAA6B;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAA2B,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,sBAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAiB;QAC/B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,QAAQ,CAC7B,CAAC,CAAC,cAAc,EAAE,EAClB,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EACnB,CAAC,CAAC,UAAU,EAAE,EACd,CAAC,CAAC,WAAW,EAAE,EACf,CAAC,CAAC,aAAa,EAAE,EACjB,CAAC,CAAC,aAAa,EAAE,EACjB,CAAC,CAAC,kBAAkB,EAAE,GAAG,OAAS,EAClC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAgB,EAAE,UAAmC;QAC/D,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;CACF;AA1CD,gDA0CC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type FieldSpec = string | Record<string, FieldSpec[]>;
|
|
2
|
+
/**
|
|
3
|
+
* Convenience factory for building GraphQL selection sets in tests.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SelectionSetFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Build a GraphQL selection set string from a simplified spec.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* SelectionSetFactory.gql(['id', 'name', { drugs: ['id', 'drugName'] }])
|
|
11
|
+
* // => '{ id name drugs { id drugName } }'
|
|
12
|
+
*/
|
|
13
|
+
static gql(fields: FieldSpec[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build a select object from a simplified spec.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* SelectionSetFactory.select(['id', 'name', { drugs: ['id', 'drugName'] }])
|
|
19
|
+
* // => { id: true, name: true, drugs: { select: { id: true, drugName: true } } }
|
|
20
|
+
*/
|
|
21
|
+
static select(fields: FieldSpec[]): Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=selection-set-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-set-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/selection-set-factory.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAEtD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM;IAYvC;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAW5D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectionSetFactory = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Convenience factory for building GraphQL selection sets in tests.
|
|
6
|
+
*/
|
|
7
|
+
class SelectionSetFactory {
|
|
8
|
+
/**
|
|
9
|
+
* Build a GraphQL selection set string from a simplified spec.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* SelectionSetFactory.gql(['id', 'name', { drugs: ['id', 'drugName'] }])
|
|
13
|
+
* // => '{ id name drugs { id drugName } }'
|
|
14
|
+
*/
|
|
15
|
+
static gql(fields) {
|
|
16
|
+
const parts = [];
|
|
17
|
+
for (const field of fields)
|
|
18
|
+
if (typeof field === 'string')
|
|
19
|
+
parts.push(field);
|
|
20
|
+
else
|
|
21
|
+
for (const [key, nested] of Object.entries(field))
|
|
22
|
+
parts.push(`${key} ${SelectionSetFactory.gql(nested)}`);
|
|
23
|
+
return `{ ${parts.join(' ')} }`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build a select object from a simplified spec.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* SelectionSetFactory.select(['id', 'name', { drugs: ['id', 'drugName'] }])
|
|
30
|
+
* // => { id: true, name: true, drugs: { select: { id: true, drugName: true } } }
|
|
31
|
+
*/
|
|
32
|
+
static select(fields) {
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const field of fields)
|
|
35
|
+
if (typeof field === 'string')
|
|
36
|
+
result[field] = true;
|
|
37
|
+
else
|
|
38
|
+
for (const [key, nested] of Object.entries(field))
|
|
39
|
+
result[key] = { select: SelectionSetFactory.select(nested) };
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.SelectionSetFactory = SelectionSetFactory;
|
|
44
|
+
//# sourceMappingURL=selection-set-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-set-factory.js","sourceRoot":"","sources":["../../../src/testing/selection-set-factory.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,mBAAmB;IAC9B;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CAAC,MAAmB;QAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,MAAM;YACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;oBAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9D,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAmB;QAC/B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,KAAK,MAAM,KAAK,IAAI,MAAM;YACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;;gBAElD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;oBAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAEnE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAtCD,kDAsCC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escapes special Lucene characters in a query string.
|
|
3
|
+
* Special characters: + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
|
|
4
|
+
*
|
|
5
|
+
* Handles multi-character operators (&&, ||) as atomic units,
|
|
6
|
+
* then escapes remaining individual special characters.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitizeLuceneQuery(query: string): string;
|
|
9
|
+
//# sourceMappingURL=lucene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucene.d.ts","sourceRoot":"","sources":["../../../src/utils/lucene.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBzD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanitizeLuceneQuery = sanitizeLuceneQuery;
|
|
4
|
+
/**
|
|
5
|
+
* Escapes special Lucene characters in a query string.
|
|
6
|
+
* Special characters: + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
|
|
7
|
+
*
|
|
8
|
+
* Handles multi-character operators (&&, ||) as atomic units,
|
|
9
|
+
* then escapes remaining individual special characters.
|
|
10
|
+
*/
|
|
11
|
+
function sanitizeLuceneQuery(query) {
|
|
12
|
+
// First pass: escape multi-char operators as atomic units
|
|
13
|
+
// Use placeholders to prevent double-escaping by the second pass
|
|
14
|
+
let result = query
|
|
15
|
+
.replace(/&&/g, '\u0000AND\u0000')
|
|
16
|
+
.replace(/\|\|/g, '\u0000OR\u0000');
|
|
17
|
+
// Second pass: escape individual special characters (& and | individually)
|
|
18
|
+
result = result.replace(/([+\-&|!(){}[\]^"~*?:\\/])/g, '\\$1');
|
|
19
|
+
// Restore multi-char operators with proper escaping
|
|
20
|
+
result = result
|
|
21
|
+
.replace(/\u0000AND\u0000/g, '\\&\\&')
|
|
22
|
+
.replace(/\u0000OR\u0000/g, '\\|\\|');
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=lucene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucene.js","sourceRoot":"","sources":["../../../src/utils/lucene.ts"],"names":[],"mappings":";;AAOA,kDAgBC;AAvBD;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,KAAa;IAC/C,0DAA0D;IAC1D,iEAAiE;IACjE,IAAI,MAAM,GAAG,KAAK;SACf,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC;SACjC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAEtC,2EAA2E;IAC3E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;IAE/D,oDAAoD;IACpD,MAAM,GAAG,MAAM;SACZ,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC;SACrC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assert that a key is not a prototype pollution vector.
|
|
3
|
+
*/
|
|
4
|
+
export declare function assertSafeKey(key: string, context: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Validate that a string is a safe Cypher identifier.
|
|
7
|
+
* Throws if the identifier contains characters that could enable Cypher injection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function assertSafeIdentifier(value: string, context: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Escape an identifier for safe interpolation into Cypher queries.
|
|
12
|
+
* Wraps in backticks and doubles any existing backticks inside.
|
|
13
|
+
* This handles Cypher reserved words (ORDER, MATCH, SET, CALL, etc.)
|
|
14
|
+
* since backtick-quoted identifiers bypass keyword interpretation.
|
|
15
|
+
*/
|
|
16
|
+
export declare function escapeIdentifier(identifier: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Validate a label name is a safe identifier and return it backtick-escaped.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assertSafeLabel(label: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Validate sort direction is strictly ASC or DESC.
|
|
23
|
+
*/
|
|
24
|
+
export declare function assertSortDirection(direction: string): 'ASC' | 'DESC';
|
|
25
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKhE;AAKD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKzE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAMrE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertSafeKey = assertSafeKey;
|
|
4
|
+
exports.assertSafeIdentifier = assertSafeIdentifier;
|
|
5
|
+
exports.escapeIdentifier = escapeIdentifier;
|
|
6
|
+
exports.assertSafeLabel = assertSafeLabel;
|
|
7
|
+
exports.assertSortDirection = assertSortDirection;
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
/** Dangerous property names that could indicate prototype pollution */
|
|
10
|
+
const BLOCKED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
11
|
+
/**
|
|
12
|
+
* Assert that a key is not a prototype pollution vector.
|
|
13
|
+
*/
|
|
14
|
+
function assertSafeKey(key, context) {
|
|
15
|
+
if (BLOCKED_KEYS.has(key))
|
|
16
|
+
throw new errors_1.OGMError(`Potentially dangerous key "${key}" in ${context}. This key is not allowed.`);
|
|
17
|
+
}
|
|
18
|
+
/** Regex for valid Cypher identifiers */
|
|
19
|
+
const SAFE_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
20
|
+
/**
|
|
21
|
+
* Validate that a string is a safe Cypher identifier.
|
|
22
|
+
* Throws if the identifier contains characters that could enable Cypher injection.
|
|
23
|
+
*/
|
|
24
|
+
function assertSafeIdentifier(value, context) {
|
|
25
|
+
if (!SAFE_IDENTIFIER.test(value))
|
|
26
|
+
throw new errors_1.OGMError(`Invalid identifier "${value}" in ${context}. Identifiers must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Escape an identifier for safe interpolation into Cypher queries.
|
|
30
|
+
* Wraps in backticks and doubles any existing backticks inside.
|
|
31
|
+
* This handles Cypher reserved words (ORDER, MATCH, SET, CALL, etc.)
|
|
32
|
+
* since backtick-quoted identifiers bypass keyword interpretation.
|
|
33
|
+
*/
|
|
34
|
+
function escapeIdentifier(identifier) {
|
|
35
|
+
const sanitized = identifier.replace(/`/g, '``');
|
|
36
|
+
return `\`${sanitized}\``;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate a label name is a safe identifier and return it backtick-escaped.
|
|
40
|
+
*/
|
|
41
|
+
function assertSafeLabel(label) {
|
|
42
|
+
assertSafeIdentifier(label, 'label');
|
|
43
|
+
return escapeIdentifier(label);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate sort direction is strictly ASC or DESC.
|
|
47
|
+
*/
|
|
48
|
+
function assertSortDirection(direction) {
|
|
49
|
+
if (direction !== 'ASC' && direction !== 'DESC')
|
|
50
|
+
throw new errors_1.OGMError(`Invalid sort direction "${direction}". Must be "ASC" or "DESC".`);
|
|
51
|
+
return direction;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":";;AAQA,sCAKC;AASD,oDAKC;AAQD,4CAGC;AAKD,0CAGC;AAKD,kDAMC;AAzDD,sCAAqC;AAErC,uEAAuE;AACvE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAExE;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,OAAe;IACxD,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QACvB,MAAM,IAAI,iBAAQ,CAChB,8BAA8B,GAAG,QAAQ,OAAO,4BAA4B,CAC7E,CAAC;AACN,CAAC;AAED,yCAAyC;AACzC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAAa,EAAE,OAAe;IACjE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,IAAI,iBAAQ,CAChB,uBAAuB,KAAK,QAAQ,OAAO,sDAAsD,CAClG,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,SAAS,IAAI,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAa;IAC3C,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM;QAC7C,MAAM,IAAI,iBAAQ,CAChB,2BAA2B,SAAS,6BAA6B,CAClE,CAAC;IACJ,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { FulltextInput } from '../model';
|
|
2
|
+
import { FulltextIndex, NodeDefinition, SchemaMetadata } from '../schema/types';
|
|
3
|
+
export interface FulltextResult {
|
|
4
|
+
cypher: string;
|
|
5
|
+
params: Record<string, unknown>;
|
|
6
|
+
scoreThreshold?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Compiles fulltext search input into Cypher CALL clauses using
|
|
10
|
+
* db.index.fulltext.queryNodes and db.index.fulltext.queryRelationships.
|
|
11
|
+
*
|
|
12
|
+
* Supports logical operators:
|
|
13
|
+
* - **Leaf (node index)**: `{ IndexName: { phrase, score? } }` → `queryNodes`
|
|
14
|
+
* - **Leaf (relationship index)**: `{ relField: { IndexName: { phrase, score? } } }` → `queryRelationships`
|
|
15
|
+
* - **OR**: `CALL { ... UNION ... }` combining multiple branches
|
|
16
|
+
* - **AND**: Sequential correlated subqueries with node identity matching
|
|
17
|
+
* - **NOT**: `WHERE NOT EXISTS { ... }` exclusion pattern (Neo4j 5+)
|
|
18
|
+
*/
|
|
19
|
+
export declare class FulltextCompiler {
|
|
20
|
+
private schema;
|
|
21
|
+
constructor(schema: SchemaMetadata);
|
|
22
|
+
/**
|
|
23
|
+
* Compile fulltext input to Cypher CALL clause(s).
|
|
24
|
+
* Handles flat leaves AND recursive OR/AND/NOT expressions.
|
|
25
|
+
*/
|
|
26
|
+
compile(fulltext: FulltextInput, nodeDef: NodeDefinition, nodeVar?: string): FulltextResult;
|
|
27
|
+
/**
|
|
28
|
+
* Compile fulltext input for a relationship index into a Cypher CALL clause.
|
|
29
|
+
* Uses db.index.fulltext.queryRelationships.
|
|
30
|
+
*/
|
|
31
|
+
compileRelationship(fulltext: Record<string, {
|
|
32
|
+
phrase: string;
|
|
33
|
+
score?: number;
|
|
34
|
+
}>, relIndex: FulltextIndex, relVar?: string): FulltextResult;
|
|
35
|
+
private compileNode;
|
|
36
|
+
/**
|
|
37
|
+
* Compile a leaf entry. Two shapes:
|
|
38
|
+
* - Node index: `{ IndexName: { phrase, score? } }` — value has `phrase`
|
|
39
|
+
* - Relationship index: `{ relField: { IndexName: { phrase, score? } } }` — value is nested
|
|
40
|
+
*/
|
|
41
|
+
private compileLeaf;
|
|
42
|
+
/** Compile a node-level fulltext index: `{ IndexName: { phrase, score? } }` */
|
|
43
|
+
private compileNodeIndex;
|
|
44
|
+
/**
|
|
45
|
+
* Compile a relationship fulltext index:
|
|
46
|
+
* `{ relFieldName: { IndexName: { phrase, score? } } }`
|
|
47
|
+
*
|
|
48
|
+
* Validates that the relationship field exists on the node and that the
|
|
49
|
+
* index belongs to its @relationshipProperties type.
|
|
50
|
+
*/
|
|
51
|
+
private compileRelationshipIndex;
|
|
52
|
+
/**
|
|
53
|
+
* OR: wrap branches in `CALL { ... UNION ... }` with max(score) deduplication.
|
|
54
|
+
*/
|
|
55
|
+
private compileOr;
|
|
56
|
+
/**
|
|
57
|
+
* AND: sequential correlated subqueries.
|
|
58
|
+
* First branch yields nodes, subsequent branches filter to matching nodes.
|
|
59
|
+
*/
|
|
60
|
+
private compileAnd;
|
|
61
|
+
/**
|
|
62
|
+
* NOT: produces a WHERE NOT EXISTS { ... } clause.
|
|
63
|
+
* When used standalone, wraps in a MATCH-all then filters out.
|
|
64
|
+
*/
|
|
65
|
+
private compileNot;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=fulltext.compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fulltext.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/fulltext.compiler.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,EAEd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMhF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;;OAGG;IACH,OAAO,CACL,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,SAAM,GACZ,cAAc;IAqBjB;;;OAGG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAC5D,QAAQ,EAAE,aAAa,EACvB,MAAM,SAAM,GACX,cAAc;IA4CjB,OAAO,CAAC,WAAW;IA4CnB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgCnB,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB;IAqCxB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAmEhC;;OAEG;IACH,OAAO,CAAC,SAAS;IAiDjB;;;OAGG;IACH,OAAO,CAAC,UAAU;IA8DlB;;;OAGG;IACH,OAAO,CAAC,UAAU;CA2BnB"}
|