grafeo-ogm 2.1.1 → 2.2.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/CHANGELOG.md +43 -0
- package/README.md +49 -0
- package/dist/cjs/compilers/where.compiler.d.ts +83 -6
- package/dist/cjs/compilers/where.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/where.compiler.js +155 -75
- package/dist/cjs/compilers/where.compiler.js.map +1 -1
- package/dist/cjs/execution/executor.d.ts +11 -1
- package/dist/cjs/execution/executor.d.ts.map +1 -1
- package/dist/cjs/execution/executor.js +6 -3
- package/dist/cjs/execution/executor.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/model.d.ts +38 -1
- package/dist/cjs/model.d.ts.map +1 -1
- package/dist/cjs/model.js +120 -2
- package/dist/cjs/model.js.map +1 -1
- package/dist/cjs/ogm.d.ts.map +1 -1
- package/dist/cjs/ogm.js +1 -0
- package/dist/cjs/ogm.js.map +1 -1
- package/dist/cjs/policy/explain.d.ts +59 -0
- package/dist/cjs/policy/explain.d.ts.map +1 -0
- package/dist/cjs/policy/explain.js +175 -0
- package/dist/cjs/policy/explain.js.map +1 -0
- package/dist/cjs/policy/resolver.d.ts +26 -2
- package/dist/cjs/policy/resolver.d.ts.map +1 -1
- package/dist/cjs/policy/resolver.js +103 -33
- package/dist/cjs/policy/resolver.js.map +1 -1
- package/dist/cjs/policy/types.d.ts +87 -0
- package/dist/cjs/policy/types.d.ts.map +1 -1
- package/dist/esm/compilers/where.compiler.d.ts +83 -6
- package/dist/esm/compilers/where.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/where.compiler.js +154 -75
- package/dist/esm/compilers/where.compiler.js.map +1 -1
- package/dist/esm/execution/executor.d.ts +11 -1
- package/dist/esm/execution/executor.d.ts.map +1 -1
- package/dist/esm/execution/executor.js +6 -3
- package/dist/esm/execution/executor.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/model.d.ts +38 -1
- package/dist/esm/model.d.ts.map +1 -1
- package/dist/esm/model.js +121 -3
- package/dist/esm/model.js.map +1 -1
- package/dist/esm/ogm.d.ts.map +1 -1
- package/dist/esm/ogm.js +1 -0
- package/dist/esm/ogm.js.map +1 -1
- package/dist/esm/policy/explain.d.ts +59 -0
- package/dist/esm/policy/explain.d.ts.map +1 -0
- package/dist/esm/policy/explain.js +169 -0
- package/dist/esm/policy/explain.js.map +1 -0
- package/dist/esm/policy/resolver.d.ts +26 -2
- package/dist/esm/policy/resolver.d.ts.map +1 -1
- package/dist/esm/policy/resolver.js +102 -33
- package/dist/esm/policy/resolver.js.map +1 -1
- package/dist/esm/policy/types.d.ts +87 -0
- package/dist/esm/policy/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PolicyResolver = void 0;
|
|
4
|
+
exports.projectResolution = projectResolution;
|
|
4
5
|
exports.hashCtx = hashCtx;
|
|
5
6
|
const crypto_1 = require("crypto");
|
|
6
7
|
/**
|
|
@@ -30,68 +31,137 @@ class PolicyResolver {
|
|
|
30
31
|
* identical Cypher).
|
|
31
32
|
*/
|
|
32
33
|
resolve(typeName, op, ctx) {
|
|
34
|
+
const detailed = this.resolveDetailed(typeName, op, ctx);
|
|
35
|
+
return detailed ? projectResolution(detailed) : null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve every operation-matching policy for `(typeName, op, ctx)`
|
|
39
|
+
* WITHOUT dropping any: `applied` records the `appliesWhen(ctx)` gate
|
|
40
|
+
* (or, for overrides, `when(ctx)`), and `skipped` marks policies never
|
|
41
|
+
* evaluated because an earlier override fired. This is the single place
|
|
42
|
+
* the resolver invokes `appliesWhen`; `resolve()` projects from it.
|
|
43
|
+
*
|
|
44
|
+
* Callback invocation order is unchanged from the pre-explain resolver:
|
|
45
|
+
* override `when` callbacks first (stopping at the first that fires),
|
|
46
|
+
* then `appliesWhen` in registration order — skipped entirely when an
|
|
47
|
+
* override fired.
|
|
48
|
+
*
|
|
49
|
+
* Returns `null` exactly when `resolve()` does.
|
|
50
|
+
*/
|
|
51
|
+
resolveDetailed(typeName, op, ctx) {
|
|
33
52
|
const sources = this.gatherSources(typeName);
|
|
34
53
|
if (sources.length === 0)
|
|
35
54
|
return null;
|
|
36
55
|
const matching = [];
|
|
37
|
-
for (const
|
|
38
|
-
|
|
39
|
-
if (operationMatches(
|
|
40
|
-
matching.push(
|
|
56
|
+
for (const { source, policies } of sources)
|
|
57
|
+
policies.forEach((policy, index) => {
|
|
58
|
+
if (operationMatches(policy.operations, op))
|
|
59
|
+
matching.push({ policy, source, index });
|
|
60
|
+
});
|
|
41
61
|
if (matching.length === 0)
|
|
42
62
|
return null;
|
|
43
63
|
// Override short-circuit. First matching override whose `when` returns
|
|
44
|
-
// true wins —
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
evaluated: [p.name ?? 'override'],
|
|
52
|
-
};
|
|
53
|
-
const permissives = [];
|
|
54
|
-
const restrictives = [];
|
|
55
|
-
const evaluated = [];
|
|
56
|
-
for (const p of matching)
|
|
57
|
-
if (p.kind === 'permissive') {
|
|
58
|
-
// appliesWhen is compile-time. False → drop policy entirely.
|
|
59
|
-
if (p.appliesWhen && !p.appliesWhen(ctx))
|
|
60
|
-
continue;
|
|
61
|
-
permissives.push(p);
|
|
62
|
-
evaluated.push(p.name ?? 'permissive');
|
|
64
|
+
// true wins — nothing after it is evaluated.
|
|
65
|
+
let firing = -1;
|
|
66
|
+
for (let i = 0; i < matching.length; i++) {
|
|
67
|
+
const p = matching[i].policy;
|
|
68
|
+
if (p.kind === 'override' && p.when(ctx)) {
|
|
69
|
+
firing = i;
|
|
70
|
+
break;
|
|
63
71
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
}
|
|
73
|
+
const entries = matching.map(({ policy, source, index }, i) => {
|
|
74
|
+
const named = Boolean(policy.name);
|
|
75
|
+
const name = named
|
|
76
|
+
? policy.name
|
|
77
|
+
: `${source}.${policy.kind}[${index}]`;
|
|
78
|
+
const base = { policy, kind: policy.kind, source, index, name, named };
|
|
79
|
+
if (firing >= 0) {
|
|
80
|
+
if (i === firing)
|
|
81
|
+
return { ...base, applied: true, skipped: false };
|
|
82
|
+
// Overrides before the firing one WERE evaluated (to false).
|
|
83
|
+
if (policy.kind === 'override' && i < firing)
|
|
84
|
+
return { ...base, applied: false, skipped: false };
|
|
85
|
+
return { ...base, applied: false, skipped: true };
|
|
67
86
|
}
|
|
87
|
+
if (policy.kind === 'override')
|
|
88
|
+
return { ...base, applied: false, skipped: false };
|
|
89
|
+
const applied = !policy.appliesWhen || policy.appliesWhen(ctx);
|
|
90
|
+
return { ...base, applied, skipped: false };
|
|
91
|
+
});
|
|
68
92
|
return {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
restrictives,
|
|
72
|
-
evaluated,
|
|
93
|
+
overriddenBy: firing >= 0 ? entries[firing].name : null,
|
|
94
|
+
entries,
|
|
73
95
|
};
|
|
74
96
|
}
|
|
75
97
|
/**
|
|
76
98
|
* Gather all sources of policy that apply to a given concrete type:
|
|
77
|
-
* the type's own list, plus any interfaces it implements
|
|
99
|
+
* the type's own list, plus any interfaces it implements — each tagged
|
|
100
|
+
* with the registry key that declared it.
|
|
78
101
|
*/
|
|
79
102
|
gatherSources(typeName) {
|
|
80
103
|
const out = [];
|
|
81
104
|
const own = this.registry.get(typeName);
|
|
82
105
|
if (own)
|
|
83
|
-
out.push(own);
|
|
106
|
+
out.push({ source: typeName, policies: own });
|
|
84
107
|
const nodeDef = this.schema.nodes.get(typeName);
|
|
85
108
|
if (nodeDef)
|
|
86
109
|
for (const ifaceName of nodeDef.implementsInterfaces) {
|
|
87
110
|
const ifacePolicies = this.registry.get(ifaceName);
|
|
88
111
|
if (ifacePolicies)
|
|
89
|
-
out.push(ifacePolicies);
|
|
112
|
+
out.push({ source: ifaceName, policies: ifacePolicies });
|
|
90
113
|
}
|
|
91
114
|
return out;
|
|
92
115
|
}
|
|
93
116
|
}
|
|
94
117
|
exports.PolicyResolver = PolicyResolver;
|
|
118
|
+
/**
|
|
119
|
+
* Project a detailed resolution onto the `ResolvedPolicies` shape the
|
|
120
|
+
* compilers consume. `PolicyResolver.resolve()` is exactly
|
|
121
|
+
* `projectResolution(resolveDetailed(...))`; the explain path calls it on
|
|
122
|
+
* the SAME detailed object it reports on, so the compiled fragments stay
|
|
123
|
+
* positionally aligned with the reported entries.
|
|
124
|
+
*/
|
|
125
|
+
function projectResolution(detailed) {
|
|
126
|
+
if (detailed.overriddenBy !== null) {
|
|
127
|
+
const firing = detailed.entries.find((e) => e.policy.kind === 'override' && e.applied);
|
|
128
|
+
return {
|
|
129
|
+
overridden: true,
|
|
130
|
+
permissives: [],
|
|
131
|
+
restrictives: [],
|
|
132
|
+
evaluated: [firing.policy.name ?? 'override'],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const permissives = [];
|
|
136
|
+
const restrictives = [];
|
|
137
|
+
const evaluated = [];
|
|
138
|
+
for (const { policy: p, applied } of detailed.entries)
|
|
139
|
+
if (p.kind === 'permissive') {
|
|
140
|
+
// appliesWhen is compile-time. False → drop policy entirely.
|
|
141
|
+
if (!applied)
|
|
142
|
+
continue;
|
|
143
|
+
permissives.push(p);
|
|
144
|
+
evaluated.push(p.name ?? 'permissive');
|
|
145
|
+
}
|
|
146
|
+
else if (p.kind === 'restrictive') {
|
|
147
|
+
// Restrictives are kept even when `appliesWhen(ctx)` is false —
|
|
148
|
+
// the compiler / `evaluateWriteRestrictives` enforce the gate
|
|
149
|
+
// downstream. Dropping them here would change what
|
|
150
|
+
// `InterfaceModel.compileInterfacePolicyClause` sees: an
|
|
151
|
+
// implementer left with no permissives AND no restrictives is
|
|
152
|
+
// treated as unconstrained (`THEN true`) instead of default-deny.
|
|
153
|
+
restrictives.push(p);
|
|
154
|
+
// Audit metadata lists only policies that actually applied.
|
|
155
|
+
if (applied)
|
|
156
|
+
evaluated.push(p.name ?? 'restrictive');
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
overridden: false,
|
|
160
|
+
permissives,
|
|
161
|
+
restrictives,
|
|
162
|
+
evaluated,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
95
165
|
function operationMatches(operations, op) {
|
|
96
166
|
for (const candidate of operations)
|
|
97
167
|
if (candidate === '*' || candidate === op)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -167,6 +167,93 @@ export interface ResolvedPolicies<C extends PolicyContext = PolicyContext> {
|
|
|
167
167
|
/** Names of policies that fired (for audit logging). */
|
|
168
168
|
evaluated: ReadonlyArray<string>;
|
|
169
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* One operation-matching policy as seen by
|
|
172
|
+
* `PolicyResolver.resolveDetailed()`. Unlike `ResolvedPolicies`, nothing
|
|
173
|
+
* is dropped: policies gated off by `appliesWhen` and policies never
|
|
174
|
+
* evaluated because an override fired are reported too. Consumed by the
|
|
175
|
+
* explain path (`Model.explainPolicies`).
|
|
176
|
+
*/
|
|
177
|
+
export interface DetailedPolicy<C extends PolicyContext = PolicyContext> {
|
|
178
|
+
readonly policy: Policy<C>;
|
|
179
|
+
readonly kind: Policy<C>['kind'];
|
|
180
|
+
/** Type or interface whose registry entry declared this policy. */
|
|
181
|
+
readonly source: string;
|
|
182
|
+
/** Position in `source`'s registration list (all operations counted). */
|
|
183
|
+
readonly index: number;
|
|
184
|
+
/** `policy.name`, or `<source>.<kind>[<index>]` when unnamed. */
|
|
185
|
+
readonly name: string;
|
|
186
|
+
/** False when `name` is the synthesized fallback identifier. */
|
|
187
|
+
readonly named: boolean;
|
|
188
|
+
/**
|
|
189
|
+
* `appliesWhen(ctx)` held (absent counts as held). For an override:
|
|
190
|
+
* its `when(ctx)` returned true. Always false when `skipped`.
|
|
191
|
+
*/
|
|
192
|
+
readonly applied: boolean;
|
|
193
|
+
/** Not evaluated at all because an earlier override fired. */
|
|
194
|
+
readonly skipped: boolean;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Outcome of one policy for one candidate node, as reported by
|
|
198
|
+
* `Model.explainPolicies()`:
|
|
199
|
+
*
|
|
200
|
+
* - `pass` — applied; its predicate evaluated to `true`.
|
|
201
|
+
* - `fail` — applied; evaluated to `false` (includes a restrictive hard
|
|
202
|
+
* deny, `when: () => false`).
|
|
203
|
+
* - `null` — applied; evaluated to NULL (three-valued logic, e.g. a
|
|
204
|
+
* missing property). Enforcement treats it as not-true.
|
|
205
|
+
* - `abstain` — applied, but emitted no predicate. A permissive abstain
|
|
206
|
+
* grants nothing; a restrictive abstain restricts nothing.
|
|
207
|
+
* - `not-applied` — `appliesWhen(ctx)` was false (override: `when(ctx)`
|
|
208
|
+
* was false). Not compiled or evaluated.
|
|
209
|
+
* - `skipped` — not evaluated because an earlier override fired.
|
|
210
|
+
*/
|
|
211
|
+
export type PolicyClauseOutcome = 'pass' | 'fail' | 'null' | 'abstain' | 'not-applied' | 'skipped';
|
|
212
|
+
/** One policy's report within a `PolicyExplanation`. */
|
|
213
|
+
export interface PolicyClauseExplanation {
|
|
214
|
+
/** `policy.name`, or `<source>.<kind>[<index>]` when unnamed. */
|
|
215
|
+
readonly name: string;
|
|
216
|
+
/** False when `name` is the synthesized fallback identifier. */
|
|
217
|
+
readonly named: boolean;
|
|
218
|
+
readonly kind: 'override' | 'permissive' | 'restrictive';
|
|
219
|
+
/** Type or interface whose registry entry declared the policy. */
|
|
220
|
+
readonly source: string;
|
|
221
|
+
/** `appliesWhen(ctx)` held (override: `when(ctx)` was true). */
|
|
222
|
+
readonly applied: boolean;
|
|
223
|
+
readonly outcome: PolicyClauseOutcome;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Per-candidate result of `Model.explainPolicies()`. `visible` is the
|
|
227
|
+
* exact verdict `find` enforces for the same bound context; the other
|
|
228
|
+
* fields explain it.
|
|
229
|
+
*/
|
|
230
|
+
export interface PolicyExplanation<T = Record<string, unknown>> {
|
|
231
|
+
/** The candidate, projected with the requested selection. */
|
|
232
|
+
readonly node: T;
|
|
233
|
+
/** Would `find` return this node for the bound context? */
|
|
234
|
+
readonly visible: boolean;
|
|
235
|
+
/** Name of the override that fired, else `null`. */
|
|
236
|
+
readonly overriddenBy: string | null;
|
|
237
|
+
/**
|
|
238
|
+
* Some permissive granted access (`true` when an override fired or the
|
|
239
|
+
* type has no policies). `false` → default deny.
|
|
240
|
+
*/
|
|
241
|
+
readonly permissiveGranted: boolean;
|
|
242
|
+
/** Names of applied restrictives whose outcome is `fail` or `null`. */
|
|
243
|
+
readonly failedRestrictives: ReadonlyArray<string>;
|
|
244
|
+
/** Every `read` policy for the type, in registration order. */
|
|
245
|
+
readonly policies: ReadonlyArray<PolicyClauseExplanation>;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Full resolution for one (typeName, operation, ctx) triple. Entries are
|
|
249
|
+
* in registration order — the type's own policies first, then each
|
|
250
|
+
* implemented interface's.
|
|
251
|
+
*/
|
|
252
|
+
export interface DetailedResolution<C extends PolicyContext = PolicyContext> {
|
|
253
|
+
/** Fallback-aware name of the override that fired, else `null`. */
|
|
254
|
+
readonly overriddenBy: string | null;
|
|
255
|
+
readonly entries: ReadonlyArray<DetailedPolicy<C>>;
|
|
256
|
+
}
|
|
170
257
|
/**
|
|
171
258
|
* Carries policy state through one compile pass. Created per query in
|
|
172
259
|
* `Model` / `InterfaceModel` and threaded into `WhereCompiler` /
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/policy/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/policy/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { OGMLogger } from '../execution/executor';
|
|
2
|
-
import type { PolicyContextBundle } from '../policy/types';
|
|
2
|
+
import type { PermissivePolicy, PolicyContextBundle, RestrictivePolicy } from '../policy/types';
|
|
3
3
|
import { NodeDefinition, SchemaMetadata } from '../schema/types';
|
|
4
4
|
export interface WhereResult {
|
|
5
5
|
cypher: string;
|
|
@@ -17,6 +17,43 @@ export interface WhereResult {
|
|
|
17
17
|
*/
|
|
18
18
|
preludes?: string[];
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* One resolved policy's compiled contribution to the policy clause.
|
|
22
|
+
* `parts` are its boolean fragments in emission order (the `when` part,
|
|
23
|
+
* then the `cypher` part) — exactly what `composePolicyClause` joins.
|
|
24
|
+
* Empty `parts` → the policy emitted no predicate: it abstained, or (for
|
|
25
|
+
* restrictives) it is write-side or gated off by `appliesWhen`.
|
|
26
|
+
*/
|
|
27
|
+
export interface CompiledPolicy {
|
|
28
|
+
readonly policy: PermissivePolicy | RestrictivePolicy;
|
|
29
|
+
readonly parts: ReadonlyArray<string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Per-policy compilation of one (typeName, op) frame. Positionally
|
|
33
|
+
* aligned with the bundle's `resolved.permissives` /
|
|
34
|
+
* `resolved.restrictives` — one entry per policy, in order.
|
|
35
|
+
*/
|
|
36
|
+
export interface CompiledPolicyFragments {
|
|
37
|
+
readonly permissives: ReadonlyArray<CompiledPolicy>;
|
|
38
|
+
readonly restrictives: ReadonlyArray<CompiledPolicy>;
|
|
39
|
+
}
|
|
40
|
+
/** Result of `WhereCompiler.compileForExplain` (explain path). */
|
|
41
|
+
export interface ExplainWhereResult {
|
|
42
|
+
/** User where body only — the candidate filter. `''` when absent. */
|
|
43
|
+
userCypher: string;
|
|
44
|
+
/** User-where params followed by policy params (same as `compile()`). */
|
|
45
|
+
params: Record<string, unknown>;
|
|
46
|
+
/** Top-level `@cypher` preludes for BOTH the user where and policies. */
|
|
47
|
+
preludes: string[];
|
|
48
|
+
/**
|
|
49
|
+
* Root policy clause, or `null` when none applies (override fired).
|
|
50
|
+
* `clause` is byte-identical to what `compile()` AND-stitches.
|
|
51
|
+
*/
|
|
52
|
+
policy: {
|
|
53
|
+
fragments: CompiledPolicyFragments;
|
|
54
|
+
clause: string;
|
|
55
|
+
} | null;
|
|
56
|
+
}
|
|
20
57
|
type OperatorSuffix = string;
|
|
21
58
|
export interface WhereCompilerOptions {
|
|
22
59
|
/** Set of operator suffixes to reject at runtime (e.g. `new Set(['_MATCHES'])`) */
|
|
@@ -75,15 +112,44 @@ export declare class WhereCompiler {
|
|
|
75
112
|
policyContext?: PolicyContextBundle;
|
|
76
113
|
}): WhereResult;
|
|
77
114
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* same `paramCounter
|
|
81
|
-
*
|
|
115
|
+
* Explain-path twin of `compile()`, used by `Model.explainPolicies`.
|
|
116
|
+
* Compiles the user `where` EXACTLY as `compile()` does — same order,
|
|
117
|
+
* same `paramCounter`, same `@cypher` prelude scope, same policy-aware
|
|
118
|
+
* relationship traversal — but returns the root policy clause
|
|
119
|
+
* separately instead of AND-stitching it: as per-policy fragments AND
|
|
120
|
+
* as the composed string `compile()` would have stitched. Both come
|
|
121
|
+
* from one compilation, so an explanation cannot drift from
|
|
122
|
+
* enforcement.
|
|
123
|
+
*
|
|
124
|
+
* `policy` is `null` when no root policy clause applies (an override
|
|
125
|
+
* fired).
|
|
126
|
+
*
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
compileForExplain(where: Record<string, unknown> | undefined | null, nodeVar: string, nodeDef: NodeDefinition, paramCounter: {
|
|
130
|
+
count: number;
|
|
131
|
+
}, policyContext: PolicyContextBundle): ExplainWhereResult;
|
|
132
|
+
/**
|
|
133
|
+
* Shared body of `compile()` / `compileForExplain()`: compiles the user
|
|
134
|
+
* where, then the policy fragments, sharing one `paramCounter` and one
|
|
135
|
+
* top-level `@cypher` scope. Returns `null` when there is nothing to
|
|
136
|
+
* compile (no user where and no active policy).
|
|
137
|
+
*/
|
|
138
|
+
private compileUserAndPolicy;
|
|
139
|
+
/**
|
|
140
|
+
* Compile each resolved policy of a single (typeName, op) frame into
|
|
141
|
+
* its boolean fragments ("parts"), WITHOUT combining them —
|
|
142
|
+
* `composePolicyClause` does that. Shares the same `paramCounter` and
|
|
143
|
+
* `scope` as the user where so that nothing collides downstream.
|
|
144
|
+
*
|
|
145
|
+
* The result is positionally aligned with `resolved.permissives` /
|
|
146
|
+
* `resolved.restrictives`: one entry per policy, in order, even when a
|
|
147
|
+
* policy contributes no part.
|
|
82
148
|
*
|
|
83
149
|
* Permissive `cypher.params` keys are namespaced with `policy_p<n>_`
|
|
84
150
|
* to guarantee no collision with `param0..N`.
|
|
85
151
|
*/
|
|
86
|
-
private
|
|
152
|
+
private compilePolicyFragments;
|
|
87
153
|
/**
|
|
88
154
|
* Build a `PolicyContextBundle` for a target type when crossing a
|
|
89
155
|
* node-type boundary inside a relationship traversal (`_SOME` /
|
|
@@ -139,5 +205,16 @@ export declare class WhereCompiler {
|
|
|
139
205
|
*/
|
|
140
206
|
private compileScalarCondition;
|
|
141
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* The boolean value ONE compiled policy contributes to
|
|
210
|
+
* `composePolicyClause`, as a standalone expression (explain path): a
|
|
211
|
+
* permissive's parts are OR-ed — they join the permissive disjunction —
|
|
212
|
+
* and a restrictive's parts are AND-ed — they join the restrictive
|
|
213
|
+
* conjunction. OR/AND are associative in Cypher's three-valued logic,
|
|
214
|
+
* so grouping per policy preserves the composed clause's truth value.
|
|
215
|
+
*
|
|
216
|
+
* Returns `null` when the policy has no parts (it abstained).
|
|
217
|
+
*/
|
|
218
|
+
export declare function policyValueExpression(kind: 'permissive' | 'restrictive', parts: ReadonlyArray<string>): string | null;
|
|
142
219
|
export {};
|
|
143
220
|
//# sourceMappingURL=where.compiler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/where.compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"where.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/where.compiler.ts"],"names":[],"mappings":"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"}
|