footprintjs 9.48.2 → 10.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/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
3
|
-
*
|
|
4
|
-
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
5
|
-
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
|
-
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
|
-
*
|
|
8
|
-
* Intentional asymmetry:
|
|
9
|
-
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
10
|
-
* containers. It can follow an inherited object under an ordinary key.
|
|
11
|
-
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
|
-
* - nativeHas — own-property existence only, including own denied names
|
|
13
|
-
* and own undefined values; it does not use the DENIED rule.
|
|
14
|
-
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
15
|
-
* by spec so prototype keys never appear in the iteration.
|
|
16
|
-
*
|
|
17
|
-
* Nested diagnostic writers have their own whole-selector preflight and
|
|
18
|
-
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
19
|
-
*
|
|
20
|
-
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
21
|
-
*/
|
|
22
|
-
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
23
|
-
export declare function isDeniedSegment(segment: string | number): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Get the value at `path` in `obj`, returning `defaultValue` if absent.
|
|
26
|
-
*
|
|
27
|
-
* Security: each path segment is checked against the DENIED list and requires
|
|
28
|
-
* an own property at every step, preventing prototype-chain reads.
|
|
29
|
-
* e.g. nativeGet({}, '__proto__') and nativeGet({}, 'constructor') both return
|
|
30
|
-
* `defaultValue` instead of leaking Object.prototype / the Object constructor.
|
|
31
|
-
*/
|
|
32
|
-
export declare function nativeGet(obj: any, path: string | (string | number)[], defaultValue?: any): any;
|
|
33
|
-
/** Mutate `obj`, setting `value` at `path` (creates intermediate objects). Returns `obj`. */
|
|
34
|
-
export declare function nativeSet(obj: any, path: string | (string | number)[], value: any): any;
|
|
35
|
-
/**
|
|
36
|
-
* Remove the own property at `path` in `obj` (the replay primitive for the
|
|
37
|
-
* `delete` commit verb, #13c-B). No-op when any intermediate segment is
|
|
38
|
-
* missing — deleting an absent key has nothing to remove.
|
|
39
|
-
*
|
|
40
|
-
* Security: same DENIED + hasOwnProperty discipline as nativeGet — every
|
|
41
|
-
* segment is checked, so `nativeDelete(obj, '__proto__x')` and
|
|
42
|
-
* prototype-chain walks are inert.
|
|
43
|
-
*/
|
|
44
|
-
export declare function nativeDelete(obj: any, path: string | (string | number)[]): void;
|
|
45
|
-
/** A container a writer may own: anything `typeof 'object'` and not null. */
|
|
46
|
-
export declare function isContainer(value: unknown): value is object;
|
|
47
|
-
/**
|
|
48
|
-
* `parent[key]` when `parent` is a container that OWNS `key` — the slot
|
|
49
|
-
* {@link nativeGet} would read, refusing the same prototype-pollution
|
|
50
|
-
* segments — else `undefined`. One step of a path walk.
|
|
51
|
-
*/
|
|
52
|
-
export declare function ownChild(parent: unknown, key: string | number): unknown;
|
|
53
|
-
/**
|
|
54
|
-
* A SHALLOW copy of one container that keeps every slot the whole-state
|
|
55
|
-
* `structuredClone` this replaced kept — so a path copy and a deep clone give
|
|
56
|
-
* the same value at every path:
|
|
57
|
-
* - a plain object (or a null-prototype one): its own enumerable keys, in
|
|
58
|
-
* order, by spread — an own `__proto__` key stays a key; the result has
|
|
59
|
-
* `Object.prototype`, as a clone's does;
|
|
60
|
-
* - an array: its indices, holes and length (`slice`) AND any named
|
|
61
|
-
* property a nested write hung off it (`slice` alone would drop those);
|
|
62
|
-
* - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
|
|
63
|
-
* is deep-cloned, which is what the whole-state clone did to it; and the
|
|
64
|
-
* own enumerable properties the clone cannot carry (an expando a nested
|
|
65
|
-
* write hung on a `Date`) are carried over by reference, so a later write
|
|
66
|
-
* through it changes exactly its own path. Rare on a write path.
|
|
67
|
-
*/
|
|
68
|
-
export declare function shallowCopy<T extends object>(container: T): T;
|
|
69
|
-
/**
|
|
70
|
-
* Make the containers on the way to `path`'s LEAF ones the writer owns, so
|
|
71
|
-
* the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
|
|
72
|
-
* nothing it did not create.
|
|
73
|
-
*
|
|
74
|
-
* `root` must already be owned. Walking down, every container the writer did
|
|
75
|
-
* not create (`owned` does not hold it) is replaced, in its parent, by its
|
|
76
|
-
* {@link shallowCopy}, which the writer then owns. The walk stops where
|
|
77
|
-
* `nativeSet` would stop or create: a DENIED segment (the write is refused
|
|
78
|
-
* there anyway), or a missing / primitive intermediate (`nativeSet` makes a
|
|
79
|
-
* fresh container from that point on). The leaf itself is never copied — the
|
|
80
|
-
* write replaces it.
|
|
81
|
-
*
|
|
82
|
-
* Cost: one shallow copy per container on the path that this writer has not
|
|
83
|
-
* already copied — O(depth × width), independent of everything the write
|
|
84
|
-
* does not pass through. A path of one segment (a root key, the common case)
|
|
85
|
-
* copies nothing here.
|
|
86
|
-
*/
|
|
87
|
-
export declare function ownSpine(root: any, path: string | (string | number)[], owned: WeakSet<object>): void;
|
|
88
|
-
/**
|
|
89
|
-
* The root of a new generation: a shallow copy of `base` when it is a
|
|
90
|
-
* container (owned by the writer), else the historical deep clone of a
|
|
91
|
-
* non-container base (`undefined`, a primitive) so the callers' behaviour on
|
|
92
|
-
* such a base is unchanged.
|
|
93
|
-
*/
|
|
94
|
-
export declare function ownedRootOf(base: any, owned?: WeakSet<object>): any;
|
|
95
|
-
/** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
|
|
96
|
-
export declare function own(value: unknown, owned: WeakSet<object> | undefined): void;
|
|
97
|
-
/**
|
|
98
|
-
* Mark EVERY container of a tree the writer just created whole (a
|
|
99
|
-
* `structuredClone` result) as owned, so a later write through any of them
|
|
100
|
-
* edits it in place instead of copying it again. Walks own enumerable keys —
|
|
101
|
-
* the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
|
|
102
|
-
* tree's containers); a container already owned is not walked twice (a cycle
|
|
103
|
-
* inside the clone ends there).
|
|
104
|
-
*/
|
|
105
|
-
export declare function adopt(tree: unknown, owned: WeakSet<object>): void;
|
|
106
|
-
/** Returns true if `obj` has an own property at every segment of `path`. */
|
|
107
|
-
export declare function nativeHas(obj: any, path: string | (string | number)[]): boolean;
|
|
108
|
-
/**
|
|
109
|
-
* Deep merge where destination wins for any defined value.
|
|
110
|
-
* Fills missing keys from `src`, but never overwrites defined keys in `dst`.
|
|
111
|
-
* Arrays are not recursed — dst array always wins when present.
|
|
112
|
-
*
|
|
113
|
-
* Replaces: `mergeWith(dst, src, (objValue) => objValue !== undefined ? objValue : undefined)`
|
|
114
|
-
*/
|
|
115
|
-
export declare function mergeContextWins(dst: any, src: any): any;
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
3
|
-
*
|
|
4
|
-
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
5
|
-
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
|
-
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
|
-
*
|
|
8
|
-
* Intentional asymmetry:
|
|
9
|
-
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
10
|
-
* containers. It can follow an inherited object under an ordinary key.
|
|
11
|
-
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
|
-
* - nativeHas — own-property existence only, including own denied names
|
|
13
|
-
* and own undefined values; it does not use the DENIED rule.
|
|
14
|
-
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
15
|
-
* by spec so prototype keys never appear in the iteration.
|
|
16
|
-
*
|
|
17
|
-
* Nested diagnostic writers have their own whole-selector preflight and
|
|
18
|
-
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
19
|
-
*
|
|
20
|
-
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
21
|
-
*/
|
|
22
|
-
import { putOwn } from '../capture/ownData.js';
|
|
23
|
-
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
24
|
-
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
25
|
-
export function isDeniedSegment(segment) {
|
|
26
|
-
return DENIED.has(String(segment));
|
|
27
|
-
}
|
|
28
|
-
function toSegments(path) {
|
|
29
|
-
return Array.isArray(path) ? path : path.split('.');
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get the value at `path` in `obj`, returning `defaultValue` if absent.
|
|
33
|
-
*
|
|
34
|
-
* Security: each path segment is checked against the DENIED list and requires
|
|
35
|
-
* an own property at every step, preventing prototype-chain reads.
|
|
36
|
-
* e.g. nativeGet({}, '__proto__') and nativeGet({}, 'constructor') both return
|
|
37
|
-
* `defaultValue` instead of leaking Object.prototype / the Object constructor.
|
|
38
|
-
*/
|
|
39
|
-
export function nativeGet(obj, path, defaultValue) {
|
|
40
|
-
const segs = toSegments(path);
|
|
41
|
-
let curr = obj;
|
|
42
|
-
for (const seg of segs) {
|
|
43
|
-
if (curr == null)
|
|
44
|
-
return defaultValue;
|
|
45
|
-
if (DENIED.has(String(seg)))
|
|
46
|
-
return defaultValue;
|
|
47
|
-
if (!Object.prototype.hasOwnProperty.call(curr, seg))
|
|
48
|
-
return defaultValue;
|
|
49
|
-
curr = curr[seg];
|
|
50
|
-
}
|
|
51
|
-
return curr === undefined ? defaultValue : curr;
|
|
52
|
-
}
|
|
53
|
-
/** Mutate `obj`, setting `value` at `path` (creates intermediate objects). Returns `obj`. */
|
|
54
|
-
export function nativeSet(obj, path, value) {
|
|
55
|
-
const segs = toSegments(path);
|
|
56
|
-
let curr = obj;
|
|
57
|
-
for (let i = 0; i < segs.length - 1; i++) {
|
|
58
|
-
const k = segs[i];
|
|
59
|
-
if (DENIED.has(String(k)))
|
|
60
|
-
return obj;
|
|
61
|
-
if (curr[k] == null || typeof curr[k] !== 'object') {
|
|
62
|
-
curr[k] = typeof segs[i + 1] === 'number' ? [] : {};
|
|
63
|
-
}
|
|
64
|
-
curr = curr[k];
|
|
65
|
-
}
|
|
66
|
-
const last = segs[segs.length - 1];
|
|
67
|
-
if (DENIED.has(String(last)))
|
|
68
|
-
return obj;
|
|
69
|
-
curr[last] = value;
|
|
70
|
-
return obj;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Remove the own property at `path` in `obj` (the replay primitive for the
|
|
74
|
-
* `delete` commit verb, #13c-B). No-op when any intermediate segment is
|
|
75
|
-
* missing — deleting an absent key has nothing to remove.
|
|
76
|
-
*
|
|
77
|
-
* Security: same DENIED + hasOwnProperty discipline as nativeGet — every
|
|
78
|
-
* segment is checked, so `nativeDelete(obj, '__proto__x')` and
|
|
79
|
-
* prototype-chain walks are inert.
|
|
80
|
-
*/
|
|
81
|
-
export function nativeDelete(obj, path) {
|
|
82
|
-
const segs = toSegments(path);
|
|
83
|
-
let curr = obj;
|
|
84
|
-
for (let i = 0; i < segs.length - 1; i++) {
|
|
85
|
-
const seg = segs[i];
|
|
86
|
-
if (DENIED.has(String(seg)))
|
|
87
|
-
return;
|
|
88
|
-
if (curr == null || typeof curr !== 'object' || !Object.prototype.hasOwnProperty.call(curr, seg))
|
|
89
|
-
return;
|
|
90
|
-
curr = curr[seg];
|
|
91
|
-
}
|
|
92
|
-
const last = segs[segs.length - 1];
|
|
93
|
-
if (DENIED.has(String(last)))
|
|
94
|
-
return;
|
|
95
|
-
if (curr != null && typeof curr === 'object') {
|
|
96
|
-
delete curr[last];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// ── Copy-on-write primitives (docs/design/2026-10-copy-on-write-commit.md) ──
|
|
100
|
-
//
|
|
101
|
-
// THE LAW: a committed generation is never edited. A writer copies the root
|
|
102
|
-
// and every container on each path it writes, edits only containers it
|
|
103
|
-
// created during the current operation (its `owned` set), and shares every
|
|
104
|
-
// other subtree with the generation before it. The same law
|
|
105
|
-
// `reactive/structuralWrite.ts · setInPath` applies to a single value.
|
|
106
|
-
/** A container a writer may own: anything `typeof 'object'` and not null. */
|
|
107
|
-
export function isContainer(value) {
|
|
108
|
-
return value !== null && typeof value === 'object';
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* `parent[key]` when `parent` is a container that OWNS `key` — the slot
|
|
112
|
-
* {@link nativeGet} would read, refusing the same prototype-pollution
|
|
113
|
-
* segments — else `undefined`. One step of a path walk.
|
|
114
|
-
*/
|
|
115
|
-
export function ownChild(parent, key) {
|
|
116
|
-
return isContainer(parent) && !DENIED.has(String(key)) && Object.prototype.hasOwnProperty.call(parent, key)
|
|
117
|
-
? parent[key]
|
|
118
|
-
: undefined;
|
|
119
|
-
}
|
|
120
|
-
/** True for an own key of an array that is an array INDEX (`'0'`, `'12'`), not a name (`arr.note`). */
|
|
121
|
-
function isArrayIndexKey(key) {
|
|
122
|
-
const n = Number(key);
|
|
123
|
-
return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* The named (non-index) own keys of an array, in order. Own-key order puts
|
|
127
|
-
* every index first, ascending, and names after them — so the names are the
|
|
128
|
-
* tail of `Object.keys`, and an array without any is told by its last key.
|
|
129
|
-
*/
|
|
130
|
-
function namedArrayKeys(array) {
|
|
131
|
-
const keys = Object.keys(array);
|
|
132
|
-
let first = keys.length;
|
|
133
|
-
while (first > 0 && !isArrayIndexKey(keys[first - 1]))
|
|
134
|
-
first--;
|
|
135
|
-
return keys.slice(first);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* A SHALLOW copy of one container that keeps every slot the whole-state
|
|
139
|
-
* `structuredClone` this replaced kept — so a path copy and a deep clone give
|
|
140
|
-
* the same value at every path:
|
|
141
|
-
* - a plain object (or a null-prototype one): its own enumerable keys, in
|
|
142
|
-
* order, by spread — an own `__proto__` key stays a key; the result has
|
|
143
|
-
* `Object.prototype`, as a clone's does;
|
|
144
|
-
* - an array: its indices, holes and length (`slice`) AND any named
|
|
145
|
-
* property a nested write hung off it (`slice` alone would drop those);
|
|
146
|
-
* - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
|
|
147
|
-
* is deep-cloned, which is what the whole-state clone did to it; and the
|
|
148
|
-
* own enumerable properties the clone cannot carry (an expando a nested
|
|
149
|
-
* write hung on a `Date`) are carried over by reference, so a later write
|
|
150
|
-
* through it changes exactly its own path. Rare on a write path.
|
|
151
|
-
*/
|
|
152
|
-
export function shallowCopy(container) {
|
|
153
|
-
if (Array.isArray(container)) {
|
|
154
|
-
const copy = container.slice();
|
|
155
|
-
for (const key of namedArrayKeys(container))
|
|
156
|
-
putOwn(copy, key, container[key]);
|
|
157
|
-
return copy;
|
|
158
|
-
}
|
|
159
|
-
const proto = Object.getPrototypeOf(container);
|
|
160
|
-
if (proto === Object.prototype || proto === null)
|
|
161
|
-
return { ...container };
|
|
162
|
-
const copy = structuredClone(container);
|
|
163
|
-
for (const key of Object.keys(container)) {
|
|
164
|
-
if (!Object.prototype.hasOwnProperty.call(copy, key))
|
|
165
|
-
putOwn(copy, key, container[key]);
|
|
166
|
-
}
|
|
167
|
-
return copy;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Make the containers on the way to `path`'s LEAF ones the writer owns, so
|
|
171
|
-
* the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
|
|
172
|
-
* nothing it did not create.
|
|
173
|
-
*
|
|
174
|
-
* `root` must already be owned. Walking down, every container the writer did
|
|
175
|
-
* not create (`owned` does not hold it) is replaced, in its parent, by its
|
|
176
|
-
* {@link shallowCopy}, which the writer then owns. The walk stops where
|
|
177
|
-
* `nativeSet` would stop or create: a DENIED segment (the write is refused
|
|
178
|
-
* there anyway), or a missing / primitive intermediate (`nativeSet` makes a
|
|
179
|
-
* fresh container from that point on). The leaf itself is never copied — the
|
|
180
|
-
* write replaces it.
|
|
181
|
-
*
|
|
182
|
-
* Cost: one shallow copy per container on the path that this writer has not
|
|
183
|
-
* already copied — O(depth × width), independent of everything the write
|
|
184
|
-
* does not pass through. A path of one segment (a root key, the common case)
|
|
185
|
-
* copies nothing here.
|
|
186
|
-
*/
|
|
187
|
-
export function ownSpine(root, path, owned) {
|
|
188
|
-
const segs = toSegments(path);
|
|
189
|
-
let curr = root;
|
|
190
|
-
for (let i = 0; i < segs.length - 1; i++) {
|
|
191
|
-
const k = segs[i];
|
|
192
|
-
if (DENIED.has(String(k)))
|
|
193
|
-
return;
|
|
194
|
-
const next = curr[k];
|
|
195
|
-
if (!isContainer(next))
|
|
196
|
-
return;
|
|
197
|
-
if (owned.has(next)) {
|
|
198
|
-
curr = next;
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
const copy = shallowCopy(next);
|
|
202
|
-
owned.add(copy);
|
|
203
|
-
curr[k] = copy;
|
|
204
|
-
curr = copy;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* The root of a new generation: a shallow copy of `base` when it is a
|
|
209
|
-
* container (owned by the writer), else the historical deep clone of a
|
|
210
|
-
* non-container base (`undefined`, a primitive) so the callers' behaviour on
|
|
211
|
-
* such a base is unchanged.
|
|
212
|
-
*/
|
|
213
|
-
export function ownedRootOf(base, owned) {
|
|
214
|
-
if (!isContainer(base))
|
|
215
|
-
return structuredClone(base);
|
|
216
|
-
const root = shallowCopy(base);
|
|
217
|
-
owned?.add(root);
|
|
218
|
-
return root;
|
|
219
|
-
}
|
|
220
|
-
/** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
|
|
221
|
-
export function own(value, owned) {
|
|
222
|
-
if (owned !== undefined && isContainer(value))
|
|
223
|
-
owned.add(value);
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Mark EVERY container of a tree the writer just created whole (a
|
|
227
|
-
* `structuredClone` result) as owned, so a later write through any of them
|
|
228
|
-
* edits it in place instead of copying it again. Walks own enumerable keys —
|
|
229
|
-
* the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
|
|
230
|
-
* tree's containers); a container already owned is not walked twice (a cycle
|
|
231
|
-
* inside the clone ends there).
|
|
232
|
-
*/
|
|
233
|
-
export function adopt(tree, owned) {
|
|
234
|
-
const stack = [tree];
|
|
235
|
-
while (stack.length > 0) {
|
|
236
|
-
const value = stack.pop();
|
|
237
|
-
if (!isContainer(value) || owned.has(value))
|
|
238
|
-
continue;
|
|
239
|
-
owned.add(value);
|
|
240
|
-
for (const key of Object.keys(value))
|
|
241
|
-
stack.push(value[key]);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
/** Returns true if `obj` has an own property at every segment of `path`. */
|
|
245
|
-
export function nativeHas(obj, path) {
|
|
246
|
-
const segs = toSegments(path);
|
|
247
|
-
let curr = obj;
|
|
248
|
-
for (let i = 0; i < segs.length; i++) {
|
|
249
|
-
if (curr == null || !Object.prototype.hasOwnProperty.call(curr, segs[i]))
|
|
250
|
-
return false;
|
|
251
|
-
if (i < segs.length - 1)
|
|
252
|
-
curr = curr[segs[i]];
|
|
253
|
-
}
|
|
254
|
-
return true;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Deep merge where destination wins for any defined value.
|
|
258
|
-
* Fills missing keys from `src`, but never overwrites defined keys in `dst`.
|
|
259
|
-
* Arrays are not recursed — dst array always wins when present.
|
|
260
|
-
*
|
|
261
|
-
* Replaces: `mergeWith(dst, src, (objValue) => objValue !== undefined ? objValue : undefined)`
|
|
262
|
-
*/
|
|
263
|
-
export function mergeContextWins(dst, src) {
|
|
264
|
-
if (!src || typeof src !== 'object' || Array.isArray(src)) {
|
|
265
|
-
return dst !== undefined ? dst : src;
|
|
266
|
-
}
|
|
267
|
-
const out = dst != null && typeof dst === 'object' ? { ...dst } : {};
|
|
268
|
-
for (const key of Object.keys(src)) {
|
|
269
|
-
if (DENIED.has(key))
|
|
270
|
-
continue;
|
|
271
|
-
const dstVal = out[key];
|
|
272
|
-
if (dstVal !== undefined) {
|
|
273
|
-
// dst wins; recurse only if both sides are plain objects
|
|
274
|
-
if (dstVal !== null &&
|
|
275
|
-
typeof dstVal === 'object' &&
|
|
276
|
-
!Array.isArray(dstVal) &&
|
|
277
|
-
src[key] !== null &&
|
|
278
|
-
typeof src[key] === 'object' &&
|
|
279
|
-
!Array.isArray(src[key])) {
|
|
280
|
-
out[key] = mergeContextWins(dstVal, src[key]);
|
|
281
|
-
}
|
|
282
|
-
// else keep dstVal unchanged
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
out[key] = src[key];
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return out;
|
|
289
|
-
}
|
|
290
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXdCO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBa0M7SUFDcEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFrQyxFQUFFLFlBQWtCO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUks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R0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFRoZSBERU5JRUQgc2V0IGlzIHRoZSBzaGFyZWQgcnVsZSBmb3IgdGhyZWUgcHJvdG90eXBlLXBvbGx1dGlvbiBzZWxlY3RvclxuICogc2VnbWVudHMgKF9fcHJvdG9fXywgY29uc3RydWN0b3IsIHByb3RvdHlwZSkuIEVhY2ggb3BlcmF0aW9uJ3MgdHJhdmVyc2FsXG4gKiBjb250cmFjdCBpcyBleHBsaWNpdCBiZWxvdzsgbWVyZWx5IHVzaW5nIHRoaXMgbW9kdWxlIGlzIG5vdCBhIHNhbmRib3guXG4gKlxuICogSW50ZW50aW9uYWwgYXN5bW1ldHJ5OlxuICogICAtIG5hdGl2ZVNldCDigJQgREVOSUVEIGNoZWNrIGF0IGVhY2ggc2VnbWVudDsgdXNlZCBvbiB3cml0ZXItb3duZWRcbiAqICAgICBjb250YWluZXJzLiBJdCBjYW4gZm9sbG93IGFuIGluaGVyaXRlZCBvYmplY3QgdW5kZXIgYW4gb3JkaW5hcnkga2V5LlxuICogICAtIG5hdGl2ZUdldCDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgLSBuYXRpdmVIYXMg4oCUIG93bi1wcm9wZXJ0eSBleGlzdGVuY2Ugb25seSwgaW5jbHVkaW5nIG93biBkZW5pZWQgbmFtZXNcbiAqICAgICBhbmQgb3duIHVuZGVmaW5lZCB2YWx1ZXM7IGl0IGRvZXMgbm90IHVzZSB0aGUgREVOSUVEIHJ1bGUuXG4gKiAgIC0gbWVyZ2VDb250ZXh0V2lucyDigJQgREVOSUVEIGNoZWNrIG9ubHk7IE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seVxuICogICAgIGJ5IHNwZWMgc28gcHJvdG90eXBlIGtleXMgbmV2ZXIgYXBwZWFyIGluIHRoZSBpdGVyYXRpb24uXG4gKlxuICogTmVzdGVkIGRpYWdub3N0aWMgd3JpdGVycyBoYXZlIHRoZWlyIG93biB3aG9sZS1zZWxlY3RvciBwcmVmbGlnaHQgYW5kXG4gKiBvd24tcHJvcGVydHkgd3JpdGVzIGluIHV0aWxzLnRzLCB1c2luZyB0aGUgc2FtZSBpc0RlbmllZFNlZ21lbnQgcHJlZGljYXRlLlxuICpcbiAqIFBhdGhzIG1heSBiZSBkb3Qtbm90YXRpb24gc3RyaW5ncyBvciBwcmUtc3BsaXQgKHN0cmluZ3xudW1iZXIpW10gYXJyYXlzLlxuICovXG5cbmltcG9ydCB7IHB1dE93biB9IGZyb20gJy4uL2NhcHR1cmUvb3duRGF0YS5qcyc7XG5cbmNvbnN0IERFTklFRCA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKiogSXMgYHNlZ21lbnRgIG9uZSBvZiB0aGUgdGhyZWUgZGVuaWVkIHByb3RvdHlwZS1wb2xsdXRpb24gc2VsZWN0b3IgbmFtZXM/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gREVOSUVELmhhcyhTdHJpbmcoc2VnbWVudCkpO1xufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnRzKHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXQgYHBhdGhgIGluIGBvYmpgLCByZXR1cm5pbmcgYGRlZmF1bHRWYWx1ZWAgaWYgYWJzZW50LlxuICpcbiAqIFNlY3VyaXR5OiBlYWNoIHBhdGggc2VnbWVudCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIERFTklFRCBsaXN0IGFuZCByZXF1aXJlc1xuICogYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAsIHByZXZlbnRpbmcgcHJvdG90eXBlLWNoYWluIHJlYWRzLlxuICogZS5nLiBuYXRpdmVHZXQoe30sICdfX3Byb3RvX18nKSBhbmQgbmF0aXZlR2V0KHt9LCAnY29uc3RydWN0b3InKSBib3RoIHJldHVyblxuICogYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBvZiBsZWFraW5nIE9iamVjdC5wcm90b3R5cGUgLyB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ3MpIHtcbiAgICBpZiAoY3VyciA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgcmV0dXJuIGN1cnIgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IGN1cnI7XG59XG5cbi8qKiBNdXRhdGUgYG9iamAsIHNldHRpbmcgYHZhbHVlYCBhdCBgcGF0aGAgKGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMpLiBSZXR1cm5zIGBvYmpgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZVNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybiBvYmo7XG4gICAgaWYgKGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGN1cnJba10gPSB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fTtcbiAgICB9XG4gICAgY3VyciA9IGN1cnJba107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuIG9iajtcbiAgY3VycltsYXN0XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgb3duIHByb3BlcnR5IGF0IGBwYXRoYCBpbiBgb2JqYCAodGhlIHJlcGxheSBwcmltaXRpdmUgZm9yIHRoZVxuICogYGRlbGV0ZWAgY29tbWl0IHZlcmIsICMxM2MtQikuIE5vLW9wIHdoZW4gYW55IGludGVybWVkaWF0ZSBzZWdtZW50IGlzXG4gKiBtaXNzaW5nIOKAlCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGhhcyBub3RoaW5nIHRvIHJlbW92ZS5cbiAqXG4gKiBTZWN1cml0eTogc2FtZSBERU5JRUQgKyBoYXNPd25Qcm9wZXJ0eSBkaXNjaXBsaW5lIGFzIG5hdGl2ZUdldCDigJQgZXZlcnlcbiAqIHNlZ21lbnQgaXMgY2hlY2tlZCwgc28gYG5hdGl2ZURlbGV0ZShvYmosICdfX3Byb3RvX19cdTAwMWZ4JylgIGFuZFxuICogcHJvdG90eXBlLWNoYWluIHdhbGtzIGFyZSBpbmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZURlbGV0ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuO1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgdHlwZW9mIGN1cnIgIT09ICdvYmplY3QnIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuO1xuICBpZiAoY3VyciAhPSBudWxsICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyW2xhc3RdO1xuICB9XG59XG5cbi8vIOKUgOKUgCBDb3B5LW9uLXdyaXRlIHByaW1pdGl2ZXMgKGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpIOKUgOKUgFxuLy9cbi8vIFRIRSBMQVc6IGEgY29tbWl0dGVkIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBBIHdyaXRlciBjb3BpZXMgdGhlIHJvb3Rcbi8vIGFuZCBldmVyeSBjb250YWluZXIgb24gZWFjaCBwYXRoIGl0IHdyaXRlcywgZWRpdHMgb25seSBjb250YWluZXJzIGl0XG4vLyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gKGl0cyBgb3duZWRgIHNldCksIGFuZCBzaGFyZXMgZXZlcnlcbi8vIG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQuIFRoZSBzYW1lIGxhd1xuLy8gYHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZS50cyDCtyBzZXRJblBhdGhgIGFwcGxpZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG5cbi8qKiBBIGNvbnRhaW5lciBhIHdyaXRlciBtYXkgb3duOiBhbnl0aGluZyBgdHlwZW9mICdvYmplY3QnYCBhbmQgbm90IG51bGwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBgcGFyZW50W2tleV1gIHdoZW4gYHBhcmVudGAgaXMgYSBjb250YWluZXIgdGhhdCBPV05TIGBrZXlgIOKAlCB0aGUgc2xvdFxuICoge0BsaW5rIG5hdGl2ZUdldH0gd291bGQgcmVhZCwgcmVmdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlLXBvbGx1dGlvblxuICogc2VnbWVudHMg4oCUIGVsc2UgYHVuZGVmaW5lZGAuIE9uZSBzdGVwIG9mIGEgcGF0aCB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duQ2hpbGQocGFyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZyB8IG51bWJlcik6IHVua25vd24ge1xuICByZXR1cm4gaXNDb250YWluZXIocGFyZW50KSAmJiAhREVOSUVELmhhcyhTdHJpbmcoa2V5KSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmVudCwga2V5KVxuICAgID8gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSBmb3IgYW4gb3duIGtleSBvZiBhbiBhcnJheSB0aGF0IGlzIGFuIGFycmF5IElOREVYIChgJzAnYCwgYCcxMidgKSwgbm90IGEgbmFtZSAoYGFyci5ub3RlYCkuICovXG5mdW5jdGlvbiBpc0FycmF5SW5kZXhLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IE51bWJlcihrZXkpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgJiYgbiA8IDQyOTQ5NjcyOTUgJiYgU3RyaW5nKG4pID09PSBrZXk7XG59XG5cbi8qKlxuICogVGhlIG5hbWVkIChub24taW5kZXgpIG93biBrZXlzIG9mIGFuIGFycmF5LCBpbiBvcmRlci4gT3duLWtleSBvcmRlciBwdXRzXG4gKiBldmVyeSBpbmRleCBmaXJzdCwgYXNjZW5kaW5nLCBhbmQgbmFtZXMgYWZ0ZXIgdGhlbSDigJQgc28gdGhlIG5hbWVzIGFyZSB0aGVcbiAqIHRhaWwgb2YgYE9iamVjdC5rZXlzYCwgYW5kIGFuIGFycmF5IHdpdGhvdXQgYW55IGlzIHRvbGQgYnkgaXRzIGxhc3Qga2V5LlxuICovXG5mdW5jdGlvbiBuYW1lZEFycmF5S2V5cyhhcnJheTogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyYXkpO1xuICBsZXQgZmlyc3QgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGZpcnN0ID4gMCAmJiAhaXNBcnJheUluZGV4S2V5KGtleXNbZmlyc3QgLSAxXSkpIGZpcnN0LS07XG4gIHJldHVybiBrZXlzLnNsaWNlKGZpcnN0KTtcbn1cblxuLyoqXG4gKiBBIFNIQUxMT1cgY29weSBvZiBvbmUgY29udGFpbmVyIHRoYXQga2VlcHMgZXZlcnkgc2xvdCB0aGUgd2hvbGUtc3RhdGVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoaXMgcmVwbGFjZWQga2VwdCDigJQgc28gYSBwYXRoIGNvcHkgYW5kIGEgZGVlcCBjbG9uZSBnaXZlXG4gKiB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoOlxuICogICAtIGEgcGxhaW4gb2JqZWN0IChvciBhIG51bGwtcHJvdG90eXBlIG9uZSk6IGl0cyBvd24gZW51bWVyYWJsZSBrZXlzLCBpblxuICogICAgIG9yZGVyLCBieSBzcHJlYWQg4oCUIGFuIG93biBgX19wcm90b19fYCBrZXkgc3RheXMgYSBrZXk7IHRoZSByZXN1bHQgaGFzXG4gKiAgICAgYE9iamVjdC5wcm90b3R5cGVgLCBhcyBhIGNsb25lJ3MgZG9lcztcbiAqICAgLSBhbiBhcnJheTogaXRzIGluZGljZXMsIGhvbGVzIGFuZCBsZW5ndGggKGBzbGljZWApIEFORCBhbnkgbmFtZWRcbiAqICAgICBwcm9wZXJ0eSBhIG5lc3RlZCB3cml0ZSBodW5nIG9mZiBpdCAoYHNsaWNlYCBhbG9uZSB3b3VsZCBkcm9wIHRob3NlKTtcbiAqICAgLSBhbnl0aGluZyBlbHNlIOKAlCBhIGBEYXRlYCwgYE1hcGAsIGBTZXRgLCB0eXBlZCBhcnJheSwgYSBjbGFzcyBpbnN0YW5jZSDigJRcbiAqICAgICBpcyBkZWVwLWNsb25lZCwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgZGlkIHRvIGl0OyBhbmQgdGhlXG4gKiAgICAgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyB0aGUgY2xvbmUgY2Fubm90IGNhcnJ5IChhbiBleHBhbmRvIGEgbmVzdGVkXG4gKiAgICAgd3JpdGUgaHVuZyBvbiBhIGBEYXRlYCkgYXJlIGNhcnJpZWQgb3ZlciBieSByZWZlcmVuY2UsIHNvIGEgbGF0ZXIgd3JpdGVcbiAqICAgICB0aHJvdWdoIGl0IGNoYW5nZXMgZXhhY3RseSBpdHMgb3duIHBhdGguIFJhcmUgb24gYSB3cml0ZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VCBleHRlbmRzIG9iamVjdD4oY29udGFpbmVyOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb3B5ID0gY29udGFpbmVyLnNsaWNlKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuYW1lZEFycmF5S2V5cyhjb250YWluZXIpKVxuICAgICAgcHV0T3duKGNvcHksIGtleSwgKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldKTtcbiAgICByZXR1cm4gY29weSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29udGFpbmVyKTtcbiAgaWYgKHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsKSByZXR1cm4geyAuLi5jb250YWluZXIgfTtcbiAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZShjb250YWluZXIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb250YWluZXIpKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29weSwga2V5KSlcbiAgICAgIHB1dE93bihjb3B5LCBrZXksIChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* paths.ts — the path codec: how a path of segments is written into a
|
|
3
|
-
* `TraceEntry.path` and read back. A leaf (L0, imports nothing): the commit
|
|
4
|
-
* log's address format, one owner. Re-exported from `utils.ts`, so no importer
|
|
5
|
-
* moved.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* The separator that joins path SEGMENTS into a `TraceEntry.path`.
|
|
9
|
-
*
|
|
10
|
-
* WHY NOT `'.'` — the ambiguity this exists to prevent: a state key may itself
|
|
11
|
-
* CONTAIN a dot, and this library creates such keys routinely. `$setValue`
|
|
12
|
-
* takes a KEY, not a path, so `$setValue('a.b', v)` makes one top-level key
|
|
13
|
-
* literally named `a.b`. With a dot separator that key's path and the nested
|
|
14
|
-
* path `['a', 'b']` would both encode as `"a.b"`, and every reader of the
|
|
15
|
-
* commit log — `applySmartMerge`, `commitValueAt`, `redactPatch`,
|
|
16
|
-
* `findLastWriter`, the slice layer — would have to guess which one a bundle
|
|
17
|
-
* meant. Splitting the wrong way writes into (or reads from) the wrong place.
|
|
18
|
-
*
|
|
19
|
-
* ASCII Unit-Separator is the choice because it cannot appear in a JS
|
|
20
|
-
* identifier and is vanishingly unlikely in a hand-written key, so the
|
|
21
|
-
* encoding stays unambiguous. It is NOT a display character: a path rendered
|
|
22
|
-
* straight to a UI or a log looks like one broken word. Split it with
|
|
23
|
-
* {@link pathSegments} — that, not this constant, is the contract consumers
|
|
24
|
-
* should hold.
|
|
25
|
-
*/
|
|
26
|
-
export declare const DELIM = "\u001F";
|
|
27
|
-
/**
|
|
28
|
-
* Normalises an array path into a stable string key using DELIM.
|
|
29
|
-
*/
|
|
30
|
-
export declare function normalisePath(path: (string | number)[]): string;
|
|
31
|
-
/**
|
|
32
|
-
* The inverse of {@link normalisePath}: the SEGMENTS of a `TraceEntry.path`.
|
|
33
|
-
*
|
|
34
|
-
* A path in the commit log is DELIM-joined (see {@link DELIM}), which is not a
|
|
35
|
-
* display encoding — printing one verbatim shows a single broken-looking word,
|
|
36
|
-
* as a consumer rendering a path discovered. This is the supported way to take
|
|
37
|
-
* it apart; the delimiter itself stays an implementation detail, so a path can
|
|
38
|
-
* be read, rendered or re-joined without anyone hard-coding a control
|
|
39
|
-
* character.
|
|
40
|
-
*
|
|
41
|
-
* A single-segment path (the common case — a top-level state key) returns a
|
|
42
|
-
* one-element array, so callers need no special case.
|
|
43
|
-
*
|
|
44
|
-
* ```ts
|
|
45
|
-
* import { pathSegments } from 'footprintjs/trace';
|
|
46
|
-
*
|
|
47
|
-
* for (const entry of bundle.trace) {
|
|
48
|
-
* console.log(pathSegments(entry.path).join(' › ')); // 'order › lines'
|
|
49
|
-
* }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare function pathSegments(path: string): string[];
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* paths.ts — the path codec: how a path of segments is written into a
|
|
3
|
-
* `TraceEntry.path` and read back. A leaf (L0, imports nothing): the commit
|
|
4
|
-
* log's address format, one owner. Re-exported from `utils.ts`, so no importer
|
|
5
|
-
* moved.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* The separator that joins path SEGMENTS into a `TraceEntry.path`.
|
|
9
|
-
*
|
|
10
|
-
* WHY NOT `'.'` — the ambiguity this exists to prevent: a state key may itself
|
|
11
|
-
* CONTAIN a dot, and this library creates such keys routinely. `$setValue`
|
|
12
|
-
* takes a KEY, not a path, so `$setValue('a.b', v)` makes one top-level key
|
|
13
|
-
* literally named `a.b`. With a dot separator that key's path and the nested
|
|
14
|
-
* path `['a', 'b']` would both encode as `"a.b"`, and every reader of the
|
|
15
|
-
* commit log — `applySmartMerge`, `commitValueAt`, `redactPatch`,
|
|
16
|
-
* `findLastWriter`, the slice layer — would have to guess which one a bundle
|
|
17
|
-
* meant. Splitting the wrong way writes into (or reads from) the wrong place.
|
|
18
|
-
*
|
|
19
|
-
* ASCII Unit-Separator is the choice because it cannot appear in a JS
|
|
20
|
-
* identifier and is vanishingly unlikely in a hand-written key, so the
|
|
21
|
-
* encoding stays unambiguous. It is NOT a display character: a path rendered
|
|
22
|
-
* straight to a UI or a log looks like one broken word. Split it with
|
|
23
|
-
* {@link pathSegments} — that, not this constant, is the contract consumers
|
|
24
|
-
* should hold.
|
|
25
|
-
*/
|
|
26
|
-
export const DELIM = '\u001F';
|
|
27
|
-
/**
|
|
28
|
-
* Normalises an array path into a stable string key using DELIM.
|
|
29
|
-
*/
|
|
30
|
-
export function normalisePath(path) {
|
|
31
|
-
return path.map(String).join(DELIM);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* The inverse of {@link normalisePath}: the SEGMENTS of a `TraceEntry.path`.
|
|
35
|
-
*
|
|
36
|
-
* A path in the commit log is DELIM-joined (see {@link DELIM}), which is not a
|
|
37
|
-
* display encoding — printing one verbatim shows a single broken-looking word,
|
|
38
|
-
* as a consumer rendering a path discovered. This is the supported way to take
|
|
39
|
-
* it apart; the delimiter itself stays an implementation detail, so a path can
|
|
40
|
-
* be read, rendered or re-joined without anyone hard-coding a control
|
|
41
|
-
* character.
|
|
42
|
-
*
|
|
43
|
-
* A single-segment path (the common case — a top-level state key) returns a
|
|
44
|
-
* one-element array, so callers need no special case.
|
|
45
|
-
*
|
|
46
|
-
* ```ts
|
|
47
|
-
* import { pathSegments } from 'footprintjs/trace';
|
|
48
|
-
*
|
|
49
|
-
* for (const entry of bundle.trace) {
|
|
50
|
-
* console.log(pathSegments(entry.path).join(' › ')); // 'order › lines'
|
|
51
|
-
* }
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export function pathSegments(path) {
|
|
55
|
-
return path.split(DELIM);
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBRTlCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUF5QjtJQUNyRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhzLnRzIOKAlCB0aGUgcGF0aCBjb2RlYzogaG93IGEgcGF0aCBvZiBzZWdtZW50cyBpcyB3cml0dGVuIGludG8gYVxuICogYFRyYWNlRW50cnkucGF0aGAgYW5kIHJlYWQgYmFjay4gQSBsZWFmIChMMCwgaW1wb3J0cyBub3RoaW5nKTogdGhlIGNvbW1pdFxuICogbG9nJ3MgYWRkcmVzcyBmb3JtYXQsIG9uZSBvd25lci4gUmUtZXhwb3J0ZWQgZnJvbSBgdXRpbHMudHNgLCBzbyBubyBpbXBvcnRlclxuICogbW92ZWQuXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VwYXJhdG9yIHRoYXQgam9pbnMgcGF0aCBTRUdNRU5UUyBpbnRvIGEgYFRyYWNlRW50cnkucGF0aGAuXG4gKlxuICogV0hZIE5PVCBgJy4nYCDigJQgdGhlIGFtYmlndWl0eSB0aGlzIGV4aXN0cyB0byBwcmV2ZW50OiBhIHN0YXRlIGtleSBtYXkgaXRzZWxmXG4gKiBDT05UQUlOIGEgZG90LCBhbmQgdGhpcyBsaWJyYXJ5IGNyZWF0ZXMgc3VjaCBrZXlzIHJvdXRpbmVseS4gYCRzZXRWYWx1ZWBcbiAqIHRha2VzIGEgS0VZLCBub3QgYSBwYXRoLCBzbyBgJHNldFZhbHVlKCdhLmInLCB2KWAgbWFrZXMgb25lIHRvcC1sZXZlbCBrZXlcbiAqIGxpdGVyYWxseSBuYW1lZCBgYS5iYC4gV2l0aCBhIGRvdCBzZXBhcmF0b3IgdGhhdCBrZXkncyBwYXRoIGFuZCB0aGUgbmVzdGVkXG4gKiBwYXRoIGBbJ2EnLCAnYiddYCB3b3VsZCBib3RoIGVuY29kZSBhcyBgXCJhLmJcImAsIGFuZCBldmVyeSByZWFkZXIgb2YgdGhlXG4gKiBjb21taXQgbG9nIOKAlCBgYXBwbHlTbWFydE1lcmdlYCwgYGNvbW1pdFZhbHVlQXRgLCBgcmVkYWN0UGF0Y2hgLFxuICogYGZpbmRMYXN0V3JpdGVyYCwgdGhlIHNsaWNlIGxheWVyIOKAlCB3b3VsZCBoYXZlIHRvIGd1ZXNzIHdoaWNoIG9uZSBhIGJ1bmRsZVxuICogbWVhbnQuIFNwbGl0dGluZyB0aGUgd3Jvbmcgd2F5IHdyaXRlcyBpbnRvIChvciByZWFkcyBmcm9tKSB0aGUgd3JvbmcgcGxhY2UuXG4gKlxuICogQVNDSUkgVW5pdC1TZXBhcmF0b3IgaXMgdGhlIGNob2ljZSBiZWNhdXNlIGl0IGNhbm5vdCBhcHBlYXIgaW4gYSBKU1xuICogaWRlbnRpZmllciBhbmQgaXMgdmFuaXNoaW5nbHkgdW5saWtlbHkgaW4gYSBoYW5kLXdyaXR0ZW4ga2V5LCBzbyB0aGVcbiAqIGVuY29kaW5nIHN0YXlzIHVuYW1iaWd1b3VzLiBJdCBpcyBOT1QgYSBkaXNwbGF5IGNoYXJhY3RlcjogYSBwYXRoIHJlbmRlcmVkXG4gKiBzdHJhaWdodCB0byBhIFVJIG9yIGEgbG9nIGxvb2tzIGxpa2Ugb25lIGJyb2tlbiB3b3JkLiBTcGxpdCBpdCB3aXRoXG4gKiB7QGxpbmsgcGF0aFNlZ21lbnRzfSDigJQgdGhhdCwgbm90IHRoaXMgY29uc3RhbnQsIGlzIHRoZSBjb250cmFjdCBjb25zdW1lcnNcbiAqIHNob3VsZCBob2xkLlxuICovXG5leHBvcnQgY29uc3QgREVMSU0gPSAnXFx1MDAxRic7XG5cbi8qKlxuICogTm9ybWFsaXNlcyBhbiBhcnJheSBwYXRoIGludG8gYSBzdGFibGUgc3RyaW5nIGtleSB1c2luZyBERUxJTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLm1hcChTdHJpbmcpLmpvaW4oREVMSU0pO1xufVxuXG4vKipcbiAqIFRoZSBpbnZlcnNlIG9mIHtAbGluayBub3JtYWxpc2VQYXRofTogdGhlIFNFR01FTlRTIG9mIGEgYFRyYWNlRW50cnkucGF0aGAuXG4gKlxuICogQSBwYXRoIGluIHRoZSBjb21taXQgbG9nIGlzIERFTElNLWpvaW5lZCAoc2VlIHtAbGluayBERUxJTX0pLCB3aGljaCBpcyBub3QgYVxuICogZGlzcGxheSBlbmNvZGluZyDigJQgcHJpbnRpbmcgb25lIHZlcmJhdGltIHNob3dzIGEgc2luZ2xlIGJyb2tlbi1sb29raW5nIHdvcmQsXG4gKiBhcyBhIGNvbnN1bWVyIHJlbmRlcmluZyBhIHBhdGggZGlzY292ZXJlZC4gVGhpcyBpcyB0aGUgc3VwcG9ydGVkIHdheSB0byB0YWtlXG4gKiBpdCBhcGFydDsgdGhlIGRlbGltaXRlciBpdHNlbGYgc3RheXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBzbyBhIHBhdGggY2FuXG4gKiBiZSByZWFkLCByZW5kZXJlZCBvciByZS1qb2luZWQgd2l0aG91dCBhbnlvbmUgaGFyZC1jb2RpbmcgYSBjb250cm9sXG4gKiBjaGFyYWN0ZXIuXG4gKlxuICogQSBzaW5nbGUtc2VnbWVudCBwYXRoICh0aGUgY29tbW9uIGNhc2Ug4oCUIGEgdG9wLWxldmVsIHN0YXRlIGtleSkgcmV0dXJucyBhXG4gKiBvbmUtZWxlbWVudCBhcnJheSwgc28gY2FsbGVycyBuZWVkIG5vIHNwZWNpYWwgY2FzZS5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcGF0aFNlZ21lbnRzIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgYnVuZGxlLnRyYWNlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHBhdGhTZWdtZW50cyhlbnRyeS5wYXRoKS5qb2luKCcg4oC6ICcpKTsgLy8gJ29yZGVyIOKAuiBsaW5lcydcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoREVMSU0pO1xufVxuIl19
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* placeholders.ts — the string a redaction leaves where a value was, in the RECORD.
|
|
3
|
-
*
|
|
4
|
-
* WHY THIS FILE EXISTS. Before F4a six files each spelled a placeholder as a literal, and a spelling
|
|
5
|
-
* kept in six places is a placeholder a reader can no longer match on. Every `src/` file that writes
|
|
6
|
-
* the log's placeholder imports it from here, and `test/architecture/placeholders.test.ts` pins that
|
|
7
|
-
* no other `src/` file spells it.
|
|
8
|
-
*
|
|
9
|
-
* ONE STRING HERE, ITS TWIN ON THE VERDICT'S SIDE (C4, review N2). A redaction leaves one of two
|
|
10
|
-
* strings, and both are historical, so neither may change (stored recordings hold this one). Which
|
|
11
|
-
* one a reader sees depends on WHERE it reads, and each has the owner its reader has:
|
|
12
|
-
* - {@link LOG_PLACEHOLDER} (`'REDACTED'`, here) is a RECORD byte: the commit log and everything
|
|
13
|
-
* served from it — written into the log by the record's scrub (`memory/scrub.ts`, L2), and
|
|
14
|
-
* passed by the two places that serve a mirror (`runner/ExecutionRuntime.ts`, the mirror's
|
|
15
|
-
* seed; `engine/handlers/SubflowExecutor.ts`, a subflow's served state). The readers
|
|
16
|
-
* (`slice/`, `time-travel/`) only name it in their docs: they meet it as data in the log;
|
|
17
|
-
* - `SCOPE_PLACEHOLDER` (`'[REDACTED]'`) is the ENGINE's: the scope channel's retained reads and
|
|
18
|
-
* writes, recorder events, the narrative. It lives beside the verdict that writes it
|
|
19
|
-
* (`memory/redaction.ts`, L4). Until C4 both sat in this file ("two placeholders, one leaf");
|
|
20
|
-
* the record took the engine's string with it.
|
|
21
|
-
*
|
|
22
|
-
* WHY A LEAF OF ITS OWN (and not beside `honesty.ts · HONESTY_CODES`). Different readers, different
|
|
23
|
-
* reasons to change: this string is written on the engine's WRITE path on every redacted run, the
|
|
24
|
-
* honesty registry is read by a reader that explains a recording — and the registry's sentences have
|
|
25
|
-
* no business in the bundle of an app that only runs charts. This file imports NOTHING, so it is L0
|
|
26
|
-
* (the layer table is `scripts/layering.config.cjs`).
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* What the COMMIT LOG and the redacted MIRROR carry where a value was scrubbed.
|
|
30
|
-
*
|
|
31
|
-
* `memory/scrub.ts · scrubPatch` writes it into the patch the log records (both encodings), and the
|
|
32
|
-
* mirror's seed is scrubbed with the same string (`runner/ExecutionRuntime.ts`), so a fold of the log
|
|
33
|
-
* reproduces it (`stateAt` → `FoldedState.redactedPaths`) and a slice or an element birth, which
|
|
34
|
-
* re-serve the log's bytes, show it too. A subflow's SERVED state is the subflow's own nested mirror
|
|
35
|
-
* (9.20.0): `subflowResults[*].treeContext.globalContext` under `getSnapshot({ redact: true })`, and
|
|
36
|
-
* `onSubflowExit.outputState` whenever a policy keeps that mirror — so those carry this string as
|
|
37
|
-
* well, not the scope channel's `SCOPE_PLACEHOLDER` (`memory/redaction.ts`).
|
|
38
|
-
*/
|
|
39
|
-
export declare const LOG_PLACEHOLDER = "REDACTED";
|