@lix-js/sdk 0.6.0-preview.0 → 0.6.0-preview.2
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/README.md +9 -0
- package/SKILL.md +468 -0
- package/dist/engine-wasm/index.d.ts +15 -11
- package/dist/engine-wasm/index.js +105 -38
- package/dist/engine-wasm/wasm/lix_engine.d.ts +14 -2
- package/dist/engine-wasm/wasm/lix_engine.js +18 -17
- package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
- package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +2 -1
- package/dist/generated/builtin-schemas.d.ts +31 -41
- package/dist/generated/builtin-schemas.js +52 -56
- package/dist/open-lix.d.ts +141 -24
- package/dist/open-lix.js +199 -35
- package/dist/sqlite/index.js +99 -22
- package/dist-engine-src/README.md +18 -0
- package/dist-engine-src/src/backend/kv.rs +358 -0
- package/dist-engine-src/src/backend/mod.rs +12 -0
- package/dist-engine-src/src/backend/testing.rs +658 -0
- package/dist-engine-src/src/backend/types.rs +96 -0
- package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
- package/dist-engine-src/src/binary_cas/codec.rs +346 -0
- package/dist-engine-src/src/binary_cas/context.rs +139 -0
- package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
- package/dist-engine-src/src/binary_cas/mod.rs +11 -0
- package/dist-engine-src/src/binary_cas/types.rs +127 -0
- package/dist-engine-src/src/cel/context.rs +86 -0
- package/dist-engine-src/src/cel/error.rs +19 -0
- package/dist-engine-src/src/cel/mod.rs +8 -0
- package/dist-engine-src/src/cel/provider.rs +9 -0
- package/dist-engine-src/src/cel/runtime.rs +167 -0
- package/dist-engine-src/src/cel/value.rs +50 -0
- package/dist-engine-src/src/changelog/codec.rs +321 -0
- package/dist-engine-src/src/changelog/context.rs +92 -0
- package/dist-engine-src/src/changelog/materialization.rs +121 -0
- package/dist-engine-src/src/changelog/mod.rs +13 -0
- package/dist-engine-src/src/changelog/reader.rs +20 -0
- package/dist-engine-src/src/changelog/storage.rs +220 -0
- package/dist-engine-src/src/changelog/types.rs +38 -0
- package/dist-engine-src/src/commit_graph/context.rs +1588 -0
- package/dist-engine-src/src/commit_graph/mod.rs +12 -0
- package/dist-engine-src/src/commit_graph/types.rs +145 -0
- package/dist-engine-src/src/commit_graph/walker.rs +780 -0
- package/dist-engine-src/src/common/error.rs +313 -0
- package/dist-engine-src/src/common/fingerprint.rs +3 -0
- package/dist-engine-src/src/common/fs_path.rs +1336 -0
- package/dist-engine-src/src/common/identity.rs +135 -0
- package/dist-engine-src/src/common/metadata.rs +35 -0
- package/dist-engine-src/src/common/mod.rs +23 -0
- package/dist-engine-src/src/common/types.rs +105 -0
- package/dist-engine-src/src/common/wire.rs +222 -0
- package/dist-engine-src/src/engine.rs +239 -0
- package/dist-engine-src/src/entity_identity.rs +285 -0
- package/dist-engine-src/src/functions/context.rs +327 -0
- package/dist-engine-src/src/functions/deterministic.rs +113 -0
- package/dist-engine-src/src/functions/mod.rs +18 -0
- package/dist-engine-src/src/functions/provider.rs +130 -0
- package/dist-engine-src/src/functions/state.rs +363 -0
- package/dist-engine-src/src/functions/types.rs +37 -0
- package/dist-engine-src/src/init.rs +505 -0
- package/dist-engine-src/src/json_store/compression.rs +77 -0
- package/dist-engine-src/src/json_store/context.rs +129 -0
- package/dist-engine-src/src/json_store/encoded.rs +15 -0
- package/dist-engine-src/src/json_store/mod.rs +9 -0
- package/dist-engine-src/src/json_store/store.rs +236 -0
- package/dist-engine-src/src/json_store/types.rs +52 -0
- package/dist-engine-src/src/lib.rs +61 -0
- package/dist-engine-src/src/live_state/context.rs +2241 -0
- package/dist-engine-src/src/live_state/mod.rs +15 -0
- package/dist-engine-src/src/live_state/overlay.rs +75 -0
- package/dist-engine-src/src/live_state/reader.rs +23 -0
- package/dist-engine-src/src/live_state/types.rs +239 -0
- package/dist-engine-src/src/live_state/visibility.rs +218 -0
- package/dist-engine-src/src/plugin/archive.rs +441 -0
- package/dist-engine-src/src/plugin/component.rs +183 -0
- package/dist-engine-src/src/plugin/install.rs +637 -0
- package/dist-engine-src/src/plugin/manifest.rs +516 -0
- package/dist-engine-src/src/plugin/materializer.rs +477 -0
- package/dist-engine-src/src/plugin/mod.rs +33 -0
- package/dist-engine-src/src/plugin/plugin_manifest.json +119 -0
- package/dist-engine-src/src/plugin/storage.rs +74 -0
- package/dist-engine-src/src/schema/annotations/defaults.rs +280 -0
- package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
- package/dist-engine-src/src/schema/builtin/lix_account.json +22 -0
- package/dist-engine-src/src/schema/builtin/lix_active_account.json +30 -0
- package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +30 -0
- package/dist-engine-src/src/schema/builtin/lix_change.json +62 -0
- package/dist-engine-src/src/schema/builtin/lix_change_author.json +46 -0
- package/dist-engine-src/src/schema/builtin/lix_change_set.json +18 -0
- package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +75 -0
- package/dist-engine-src/src/schema/builtin/lix_commit.json +62 -0
- package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +46 -0
- package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +53 -0
- package/dist-engine-src/src/schema/builtin/lix_entity_label.json +63 -0
- package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +53 -0
- package/dist-engine-src/src/schema/builtin/lix_key_value.json +41 -0
- package/dist-engine-src/src/schema/builtin/lix_label.json +22 -0
- package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +31 -0
- package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +35 -0
- package/dist-engine-src/src/schema/builtin/lix_version_ref.json +49 -0
- package/dist-engine-src/src/schema/builtin/mod.rs +271 -0
- package/dist-engine-src/src/schema/definition.json +157 -0
- package/dist-engine-src/src/schema/definition.rs +636 -0
- package/dist-engine-src/src/schema/key.rs +206 -0
- package/dist-engine-src/src/schema/mod.rs +20 -0
- package/dist-engine-src/src/schema/seed.rs +14 -0
- package/dist-engine-src/src/schema/tests.rs +739 -0
- package/dist-engine-src/src/schema_registry.rs +294 -0
- package/dist-engine-src/src/session/context.rs +366 -0
- package/dist-engine-src/src/session/create_version.rs +80 -0
- package/dist-engine-src/src/session/execute.rs +447 -0
- package/dist-engine-src/src/session/merge/analysis.rs +102 -0
- package/dist-engine-src/src/session/merge/apply.rs +23 -0
- package/dist-engine-src/src/session/merge/conflicts.rs +62 -0
- package/dist-engine-src/src/session/merge/mod.rs +11 -0
- package/dist-engine-src/src/session/merge/stats.rs +65 -0
- package/dist-engine-src/src/session/merge/version.rs +437 -0
- package/dist-engine-src/src/session/mod.rs +25 -0
- package/dist-engine-src/src/session/switch_version.rs +121 -0
- package/dist-engine-src/src/sql2/change_provider.rs +337 -0
- package/dist-engine-src/src/sql2/classify.rs +147 -0
- package/dist-engine-src/src/sql2/commit_derived_provider.rs +591 -0
- package/dist-engine-src/src/sql2/context.rs +307 -0
- package/dist-engine-src/src/sql2/directory_history_provider.rs +623 -0
- package/dist-engine-src/src/sql2/directory_provider.rs +2405 -0
- package/dist-engine-src/src/sql2/dml.rs +148 -0
- package/dist-engine-src/src/sql2/entity_history_provider.rs +444 -0
- package/dist-engine-src/src/sql2/entity_provider.rs +2700 -0
- package/dist-engine-src/src/sql2/error.rs +196 -0
- package/dist-engine-src/src/sql2/execute.rs +3379 -0
- package/dist-engine-src/src/sql2/file_history_provider.rs +902 -0
- package/dist-engine-src/src/sql2/file_provider.rs +3254 -0
- package/dist-engine-src/src/sql2/filesystem_planner.rs +1526 -0
- package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
- package/dist-engine-src/src/sql2/filesystem_visibility.rs +369 -0
- package/dist-engine-src/src/sql2/history_projection.rs +80 -0
- package/dist-engine-src/src/sql2/history_provider.rs +418 -0
- package/dist-engine-src/src/sql2/history_route.rs +643 -0
- package/dist-engine-src/src/sql2/lix_state_provider.rs +2430 -0
- package/dist-engine-src/src/sql2/mod.rs +43 -0
- package/dist-engine-src/src/sql2/read_only.rs +65 -0
- package/dist-engine-src/src/sql2/record_batch.rs +17 -0
- package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
- package/dist-engine-src/src/sql2/runtime.rs +60 -0
- package/dist-engine-src/src/sql2/session.rs +135 -0
- package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
- package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
- package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
- package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
- package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
- package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
- package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
- package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
- package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
- package/dist-engine-src/src/sql2/udfs/mod.rs +82 -0
- package/dist-engine-src/src/sql2/version_provider.rs +1187 -0
- package/dist-engine-src/src/sql2/version_scope.rs +394 -0
- package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
- package/dist-engine-src/src/storage/context.rs +356 -0
- package/dist-engine-src/src/storage/mod.rs +14 -0
- package/dist-engine-src/src/storage/read_scope.rs +88 -0
- package/dist-engine-src/src/storage/types.rs +501 -0
- package/dist-engine-src/src/storage_bench.rs +3406 -0
- package/dist-engine-src/src/test_support.rs +81 -0
- package/dist-engine-src/src/tracked_state/by_file_index.rs +102 -0
- package/dist-engine-src/src/tracked_state/codec.rs +747 -0
- package/dist-engine-src/src/tracked_state/context.rs +983 -0
- package/dist-engine-src/src/tracked_state/diff.rs +494 -0
- package/dist-engine-src/src/tracked_state/materialization.rs +141 -0
- package/dist-engine-src/src/tracked_state/merge.rs +474 -0
- package/dist-engine-src/src/tracked_state/mod.rs +31 -0
- package/dist-engine-src/src/tracked_state/rebuild.rs +771 -0
- package/dist-engine-src/src/tracked_state/storage.rs +243 -0
- package/dist-engine-src/src/tracked_state/tree.rs +2744 -0
- package/dist-engine-src/src/tracked_state/tree_types.rs +176 -0
- package/dist-engine-src/src/tracked_state/types.rs +61 -0
- package/dist-engine-src/src/transaction/commit.rs +1224 -0
- package/dist-engine-src/src/transaction/context.rs +1307 -0
- package/dist-engine-src/src/transaction/live_state_overlay.rs +34 -0
- package/dist-engine-src/src/transaction/mod.rs +11 -0
- package/dist-engine-src/src/transaction/normalization.rs +1026 -0
- package/dist-engine-src/src/transaction/schema_resolver.rs +127 -0
- package/dist-engine-src/src/transaction/staging.rs +1436 -0
- package/dist-engine-src/src/transaction/types.rs +351 -0
- package/dist-engine-src/src/transaction/validation.rs +4811 -0
- package/dist-engine-src/src/untracked_state/codec.rs +363 -0
- package/dist-engine-src/src/untracked_state/context.rs +82 -0
- package/dist-engine-src/src/untracked_state/materialization.rs +157 -0
- package/dist-engine-src/src/untracked_state/mod.rs +17 -0
- package/dist-engine-src/src/untracked_state/storage.rs +348 -0
- package/dist-engine-src/src/untracked_state/types.rs +96 -0
- package/dist-engine-src/src/version/context.rs +52 -0
- package/dist-engine-src/src/version/mod.rs +12 -0
- package/dist-engine-src/src/version/refs.rs +421 -0
- package/dist-engine-src/src/version/stage_rows.rs +71 -0
- package/dist-engine-src/src/version/types.rs +21 -0
- package/dist-engine-src/src/wasm/mod.rs +60 -0
- package/package.json +68 -63
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
use serde_json::{Map as JsonMap, Value as JsonValue};
|
|
2
|
+
|
|
3
|
+
use crate::cel::{CelEvaluator, CelFunctionProvider};
|
|
4
|
+
use crate::LixError;
|
|
5
|
+
|
|
6
|
+
pub(crate) fn apply_schema_defaults<P>(
|
|
7
|
+
snapshot: &mut JsonMap<String, JsonValue>,
|
|
8
|
+
schema: &JsonValue,
|
|
9
|
+
evaluator: &CelEvaluator,
|
|
10
|
+
functions: P,
|
|
11
|
+
schema_key: &str,
|
|
12
|
+
schema_version: &str,
|
|
13
|
+
) -> Result<bool, LixError>
|
|
14
|
+
where
|
|
15
|
+
P: CelFunctionProvider,
|
|
16
|
+
{
|
|
17
|
+
apply_schema_defaults_with_context(
|
|
18
|
+
snapshot,
|
|
19
|
+
schema,
|
|
20
|
+
&snapshot.clone(),
|
|
21
|
+
evaluator,
|
|
22
|
+
functions,
|
|
23
|
+
schema_key,
|
|
24
|
+
schema_version,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
pub(crate) fn apply_schema_defaults_with_shared_runtime<P>(
|
|
29
|
+
snapshot: &mut JsonMap<String, JsonValue>,
|
|
30
|
+
schema: &JsonValue,
|
|
31
|
+
functions: P,
|
|
32
|
+
schema_key: &str,
|
|
33
|
+
schema_version: &str,
|
|
34
|
+
) -> Result<bool, LixError>
|
|
35
|
+
where
|
|
36
|
+
P: CelFunctionProvider,
|
|
37
|
+
{
|
|
38
|
+
apply_schema_defaults(
|
|
39
|
+
snapshot,
|
|
40
|
+
schema,
|
|
41
|
+
crate::cel::shared_runtime(),
|
|
42
|
+
functions,
|
|
43
|
+
schema_key,
|
|
44
|
+
schema_version,
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
pub(crate) fn apply_schema_defaults_with_context<P>(
|
|
49
|
+
snapshot: &mut JsonMap<String, JsonValue>,
|
|
50
|
+
schema: &JsonValue,
|
|
51
|
+
context: &JsonMap<String, JsonValue>,
|
|
52
|
+
evaluator: &CelEvaluator,
|
|
53
|
+
functions: P,
|
|
54
|
+
schema_key: &str,
|
|
55
|
+
schema_version: &str,
|
|
56
|
+
) -> Result<bool, LixError>
|
|
57
|
+
where
|
|
58
|
+
P: CelFunctionProvider,
|
|
59
|
+
{
|
|
60
|
+
let Some(properties) = schema.get("properties").and_then(|value| value.as_object()) else {
|
|
61
|
+
return Ok(false);
|
|
62
|
+
};
|
|
63
|
+
let mut ordered_properties: Vec<(&String, &JsonValue)> = properties.iter().collect();
|
|
64
|
+
ordered_properties.sort_by(|(left_name, _), (right_name, _)| left_name.cmp(right_name));
|
|
65
|
+
|
|
66
|
+
let mut changed = false;
|
|
67
|
+
for (field_name, field_schema) in ordered_properties {
|
|
68
|
+
if snapshot.contains_key(field_name) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if let Some(expression) = field_schema
|
|
73
|
+
.get("x-lix-default")
|
|
74
|
+
.and_then(|value| value.as_str())
|
|
75
|
+
{
|
|
76
|
+
let value = evaluator
|
|
77
|
+
.evaluate_with_functions(expression, context, functions.clone())
|
|
78
|
+
.map_err(|err| LixError {
|
|
79
|
+
code: "LIX_ERROR_UNKNOWN".to_string(),
|
|
80
|
+
message: format!(
|
|
81
|
+
"failed to evaluate x-lix-default for '{}.{}' ({}): {}",
|
|
82
|
+
schema_key, field_name, schema_version, err.message
|
|
83
|
+
),
|
|
84
|
+
hint: None,
|
|
85
|
+
details: None,
|
|
86
|
+
})?;
|
|
87
|
+
snapshot.insert(field_name.clone(), value);
|
|
88
|
+
changed = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if let Some(default_value) = field_schema.get("default") {
|
|
93
|
+
snapshot.insert(field_name.clone(), default_value.clone());
|
|
94
|
+
changed = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
Ok(changed)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
#[cfg(test)]
|
|
102
|
+
mod tests {
|
|
103
|
+
use serde_json::{json, Map as JsonMap, Value as JsonValue};
|
|
104
|
+
|
|
105
|
+
use crate::cel::{CelEvaluator, CelFunctionProvider};
|
|
106
|
+
|
|
107
|
+
use super::apply_schema_defaults_with_context;
|
|
108
|
+
|
|
109
|
+
#[test]
|
|
110
|
+
fn applies_x_lix_default_for_missing_fields() {
|
|
111
|
+
let evaluator = CelEvaluator::new();
|
|
112
|
+
let schema = json!({
|
|
113
|
+
"properties": {
|
|
114
|
+
"slug": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"x-lix-default": "name + '-slug'"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
let mut snapshot = JsonMap::new();
|
|
121
|
+
snapshot.insert("name".to_string(), JsonValue::String("sample".to_string()));
|
|
122
|
+
let context = snapshot.clone();
|
|
123
|
+
|
|
124
|
+
let changed = apply_schema_defaults_with_context(
|
|
125
|
+
&mut snapshot,
|
|
126
|
+
&schema,
|
|
127
|
+
&context,
|
|
128
|
+
&evaluator,
|
|
129
|
+
fixed_functions(),
|
|
130
|
+
"test_schema",
|
|
131
|
+
"1",
|
|
132
|
+
)
|
|
133
|
+
.expect("apply defaults");
|
|
134
|
+
|
|
135
|
+
assert!(changed);
|
|
136
|
+
assert_eq!(
|
|
137
|
+
snapshot.get("slug"),
|
|
138
|
+
Some(&JsonValue::String("sample-slug".to_string()))
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
#[test]
|
|
143
|
+
fn x_lix_default_overrides_json_default() {
|
|
144
|
+
let evaluator = CelEvaluator::new();
|
|
145
|
+
let schema = json!({
|
|
146
|
+
"properties": {
|
|
147
|
+
"status": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"default": "literal",
|
|
150
|
+
"x-lix-default": "'computed'"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
let mut snapshot = JsonMap::new();
|
|
155
|
+
let context = snapshot.clone();
|
|
156
|
+
|
|
157
|
+
let changed = apply_schema_defaults_with_context(
|
|
158
|
+
&mut snapshot,
|
|
159
|
+
&schema,
|
|
160
|
+
&context,
|
|
161
|
+
&evaluator,
|
|
162
|
+
fixed_functions(),
|
|
163
|
+
"test_schema",
|
|
164
|
+
"1",
|
|
165
|
+
)
|
|
166
|
+
.expect("apply defaults");
|
|
167
|
+
|
|
168
|
+
assert!(changed);
|
|
169
|
+
assert_eq!(
|
|
170
|
+
snapshot.get("status"),
|
|
171
|
+
Some(&JsonValue::String("computed".to_string()))
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
#[test]
|
|
176
|
+
fn does_not_default_explicit_null_values() {
|
|
177
|
+
let evaluator = CelEvaluator::new();
|
|
178
|
+
let schema = json!({
|
|
179
|
+
"properties": {
|
|
180
|
+
"status": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"x-lix-default": "'computed'"
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
let mut snapshot = JsonMap::new();
|
|
187
|
+
snapshot.insert("status".to_string(), JsonValue::Null);
|
|
188
|
+
let context = snapshot.clone();
|
|
189
|
+
|
|
190
|
+
let changed = apply_schema_defaults_with_context(
|
|
191
|
+
&mut snapshot,
|
|
192
|
+
&schema,
|
|
193
|
+
&context,
|
|
194
|
+
&evaluator,
|
|
195
|
+
fixed_functions(),
|
|
196
|
+
"test_schema",
|
|
197
|
+
"1",
|
|
198
|
+
)
|
|
199
|
+
.expect("apply defaults");
|
|
200
|
+
|
|
201
|
+
assert!(!changed);
|
|
202
|
+
assert_eq!(snapshot.get("status"), Some(&JsonValue::Null));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
#[test]
|
|
206
|
+
fn applies_cel_defaults_in_stable_sorted_field_order() {
|
|
207
|
+
#[derive(Clone)]
|
|
208
|
+
struct CountingFunctions {
|
|
209
|
+
next: std::sync::Arc<std::sync::atomic::AtomicI64>,
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
impl CelFunctionProvider for CountingFunctions {
|
|
213
|
+
fn call_uuid_v7(&self) -> String {
|
|
214
|
+
let current = self.next.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
|
|
215
|
+
format!("uuid-{current}")
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
fn call_timestamp(&self) -> String {
|
|
219
|
+
let current = self.next.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
|
|
220
|
+
format!("ts-{current}")
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
let evaluator = CelEvaluator::new();
|
|
225
|
+
let schema = json!({
|
|
226
|
+
"properties": {
|
|
227
|
+
"z_uuid": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"x-lix-default": "lix_uuid_v7()"
|
|
230
|
+
},
|
|
231
|
+
"a_timestamp": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"x-lix-default": "lix_timestamp()"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
let mut snapshot = JsonMap::new();
|
|
238
|
+
let context = snapshot.clone();
|
|
239
|
+
|
|
240
|
+
let changed = apply_schema_defaults_with_context(
|
|
241
|
+
&mut snapshot,
|
|
242
|
+
&schema,
|
|
243
|
+
&context,
|
|
244
|
+
&evaluator,
|
|
245
|
+
CountingFunctions {
|
|
246
|
+
next: std::sync::Arc::new(std::sync::atomic::AtomicI64::new(0)),
|
|
247
|
+
},
|
|
248
|
+
"test_schema",
|
|
249
|
+
"1",
|
|
250
|
+
)
|
|
251
|
+
.expect("apply defaults");
|
|
252
|
+
|
|
253
|
+
assert!(changed);
|
|
254
|
+
assert_eq!(
|
|
255
|
+
snapshot.get("a_timestamp"),
|
|
256
|
+
Some(&JsonValue::String("ts-0".to_string()))
|
|
257
|
+
);
|
|
258
|
+
assert_eq!(
|
|
259
|
+
snapshot.get("z_uuid"),
|
|
260
|
+
Some(&JsonValue::String("uuid-1".to_string()))
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#[derive(Clone)]
|
|
265
|
+
struct FixedFunctions;
|
|
266
|
+
|
|
267
|
+
impl CelFunctionProvider for FixedFunctions {
|
|
268
|
+
fn call_uuid_v7(&self) -> String {
|
|
269
|
+
"uuid-fixed".to_string()
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
fn call_timestamp(&self) -> String {
|
|
273
|
+
"1970-01-01T00:00:00.000Z".to_string()
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
fn fixed_functions() -> FixedFunctions {
|
|
278
|
+
FixedFunctions
|
|
279
|
+
}
|
|
280
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pub(crate) mod defaults;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_account",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"x-lix-primary-key": [
|
|
5
|
+
"/id"
|
|
6
|
+
],
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"x-lix-default": "lix_uuid_v7()"
|
|
12
|
+
},
|
|
13
|
+
"name": {
|
|
14
|
+
"type": "string"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"required": [
|
|
18
|
+
"id",
|
|
19
|
+
"name"
|
|
20
|
+
],
|
|
21
|
+
"additionalProperties": false
|
|
22
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_active_account",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"x-lix-primary-key": [
|
|
5
|
+
"/account_id"
|
|
6
|
+
],
|
|
7
|
+
"x-lix-foreign-keys": [
|
|
8
|
+
{
|
|
9
|
+
"properties": [
|
|
10
|
+
"/account_id"
|
|
11
|
+
],
|
|
12
|
+
"references": {
|
|
13
|
+
"schemaKey": "lix_account",
|
|
14
|
+
"properties": [
|
|
15
|
+
"/id"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"account_id": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"required": [
|
|
27
|
+
"account_id"
|
|
28
|
+
],
|
|
29
|
+
"additionalProperties": false
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_binary_blob_ref",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"description": "Metadata pointer from a file version to its binary payload in internal CAS storage.",
|
|
5
|
+
"x-lix-primary-key": [
|
|
6
|
+
"/id"
|
|
7
|
+
],
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"id": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "File/entity identifier (matches lix_file.id) for this binary reference row."
|
|
13
|
+
},
|
|
14
|
+
"blob_hash": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "BLAKE3 content hash used as the canonical CAS key for the binary payload."
|
|
17
|
+
},
|
|
18
|
+
"size_bytes": {
|
|
19
|
+
"type": "integer",
|
|
20
|
+
"minimum": 0,
|
|
21
|
+
"description": "Logical uncompressed file size in bytes for the referenced binary payload."
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"required": [
|
|
25
|
+
"id",
|
|
26
|
+
"blob_hash",
|
|
27
|
+
"size_bytes"
|
|
28
|
+
],
|
|
29
|
+
"additionalProperties": false
|
|
30
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_change",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"description": "Canonical immutable change fact. This surface represents the authoritative stream of journaled change facts. Commit lineage and non-commit scope are modeled separately around these facts.",
|
|
5
|
+
"x-lix-primary-key": [
|
|
6
|
+
"/id"
|
|
7
|
+
],
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"id": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"x-lix-default": "lix_uuid_v7()",
|
|
13
|
+
"description": "Stable change identifier (UUIDv7). Referenced from `lix_commit.change_ids` and `lix_change_set_element.change_id`."
|
|
14
|
+
},
|
|
15
|
+
"entity_id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "The entity this change applies to, scoped by (`schema_key`, `file_id`)."
|
|
18
|
+
},
|
|
19
|
+
"schema_key": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Schema identifier of the entity (e.g. `lix_file_descriptor`, `lix_commit`, or a user-registered key)."
|
|
22
|
+
},
|
|
23
|
+
"schema_version": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Schema version the snapshot_content was written against (matches `x-lix-version` on the schema at write time)."
|
|
26
|
+
},
|
|
27
|
+
"file_id": {
|
|
28
|
+
"type": [
|
|
29
|
+
"string",
|
|
30
|
+
"null"
|
|
31
|
+
],
|
|
32
|
+
"description": "Filesystem-scoped file identifier when the change belongs to a file; NULL for engine-internal entities (commits, versions, settings)."
|
|
33
|
+
},
|
|
34
|
+
"metadata": {
|
|
35
|
+
"type": [
|
|
36
|
+
"object",
|
|
37
|
+
"null"
|
|
38
|
+
],
|
|
39
|
+
"description": "Optional user-provided JSON metadata attached to the change; NULL when nothing was supplied."
|
|
40
|
+
},
|
|
41
|
+
"created_at": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "ISO-8601 timestamp at which the change was recorded (set via `lix_timestamp()` at write time)."
|
|
44
|
+
},
|
|
45
|
+
"snapshot_content": {
|
|
46
|
+
"type": [
|
|
47
|
+
"object",
|
|
48
|
+
"null"
|
|
49
|
+
],
|
|
50
|
+
"description": "Entity JSON body at this change; NULL represents a tombstone (deletion)."
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"required": [
|
|
54
|
+
"id",
|
|
55
|
+
"entity_id",
|
|
56
|
+
"schema_key",
|
|
57
|
+
"schema_version",
|
|
58
|
+
"file_id",
|
|
59
|
+
"created_at"
|
|
60
|
+
],
|
|
61
|
+
"additionalProperties": false
|
|
62
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_change_author",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"x-lix-primary-key": [
|
|
5
|
+
"/change_id",
|
|
6
|
+
"/account_id"
|
|
7
|
+
],
|
|
8
|
+
"x-lix-foreign-keys": [
|
|
9
|
+
{
|
|
10
|
+
"properties": [
|
|
11
|
+
"/change_id"
|
|
12
|
+
],
|
|
13
|
+
"references": {
|
|
14
|
+
"schemaKey": "lix_change",
|
|
15
|
+
"properties": [
|
|
16
|
+
"/id"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"properties": [
|
|
22
|
+
"/account_id"
|
|
23
|
+
],
|
|
24
|
+
"references": {
|
|
25
|
+
"schemaKey": "lix_account",
|
|
26
|
+
"properties": [
|
|
27
|
+
"/id"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"change_id": {
|
|
35
|
+
"type": "string"
|
|
36
|
+
},
|
|
37
|
+
"account_id": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"required": [
|
|
42
|
+
"change_id",
|
|
43
|
+
"account_id"
|
|
44
|
+
],
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_change_set",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"x-lix-primary-key": [
|
|
5
|
+
"/id"
|
|
6
|
+
],
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"x-lix-default": "lix_uuid_v7()"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"required": [
|
|
15
|
+
"id"
|
|
16
|
+
],
|
|
17
|
+
"additionalProperties": false
|
|
18
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_change_set_element",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"description": "Derived relational index mapping a change_set to the canonical changes introduced by its commit relative to the commit's first parent. Rebuildable from `lix_commit.change_ids` plus the referenced `lix_change` rows; the unique constraint enforces at most one change per (entity, schema, file) tuple within a single change_set.",
|
|
5
|
+
"x-lix-primary-key": [
|
|
6
|
+
"/change_set_id",
|
|
7
|
+
"/change_id"
|
|
8
|
+
],
|
|
9
|
+
"x-lix-unique": [
|
|
10
|
+
[
|
|
11
|
+
"/change_set_id",
|
|
12
|
+
"/entity_id",
|
|
13
|
+
"/schema_key",
|
|
14
|
+
"/file_id"
|
|
15
|
+
]
|
|
16
|
+
],
|
|
17
|
+
"x-lix-foreign-keys": [
|
|
18
|
+
{
|
|
19
|
+
"properties": [
|
|
20
|
+
"/change_set_id"
|
|
21
|
+
],
|
|
22
|
+
"references": {
|
|
23
|
+
"schemaKey": "lix_change_set",
|
|
24
|
+
"properties": [
|
|
25
|
+
"/id"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"properties": [
|
|
31
|
+
"/change_id"
|
|
32
|
+
],
|
|
33
|
+
"references": {
|
|
34
|
+
"schemaKey": "lix_change",
|
|
35
|
+
"properties": [
|
|
36
|
+
"/id"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"type": "object",
|
|
42
|
+
"properties": {
|
|
43
|
+
"change_set_id": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "The change_set this element belongs to (references `lix_change_set.id`)."
|
|
46
|
+
},
|
|
47
|
+
"change_id": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "The canonical change introduced/adopted by the change_set's commit (references `lix_change.id`)."
|
|
50
|
+
},
|
|
51
|
+
"entity_id": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"description": "Denormalized from the referenced `lix_change` for fast entity-scoped queries and to anchor the unique constraint."
|
|
54
|
+
},
|
|
55
|
+
"schema_key": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"description": "Denormalized schema identifier from the referenced `lix_change`; part of the per-change_set uniqueness tuple."
|
|
58
|
+
},
|
|
59
|
+
"file_id": {
|
|
60
|
+
"type": [
|
|
61
|
+
"string",
|
|
62
|
+
"null"
|
|
63
|
+
],
|
|
64
|
+
"description": "Denormalized file scope from the referenced `lix_change`; NULL for engine-internal entities. Part of the per-change_set uniqueness tuple."
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"required": [
|
|
68
|
+
"change_set_id",
|
|
69
|
+
"change_id",
|
|
70
|
+
"entity_id",
|
|
71
|
+
"schema_key",
|
|
72
|
+
"file_id"
|
|
73
|
+
],
|
|
74
|
+
"additionalProperties": false
|
|
75
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_commit",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"description": "Commit header change. Canonical commit membership is stored in change_ids as the ordered list of canonical changes whose effects this commit introduces relative to its first parent. A merge commit may reference canonical changes originally authored in another parent instead of copying them. Derived projections such as lix_change_set_element must be rebuildable from this header plus the referenced change rows. Version head pointers such as lix_version_ref are maintained separately and are not commit members.",
|
|
5
|
+
"x-lix-primary-key": [
|
|
6
|
+
"/id"
|
|
7
|
+
],
|
|
8
|
+
"x-lix-foreign-keys": [
|
|
9
|
+
{
|
|
10
|
+
"properties": [
|
|
11
|
+
"/change_set_id"
|
|
12
|
+
],
|
|
13
|
+
"references": {
|
|
14
|
+
"schemaKey": "lix_change_set",
|
|
15
|
+
"properties": [
|
|
16
|
+
"/id"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"x-lix-default": "lix_uuid_v7()",
|
|
26
|
+
"description": "Stable commit identifier."
|
|
27
|
+
},
|
|
28
|
+
"change_set_id": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "Commit-local grouping identifier used by derived relational indexes and projections such as lix_change_set_element."
|
|
31
|
+
},
|
|
32
|
+
"change_ids": {
|
|
33
|
+
"type": "array",
|
|
34
|
+
"default": [],
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
},
|
|
38
|
+
"description": "Canonical ordered membership list of non-header change IDs whose effects this commit introduces relative to its first parent. Merge commits may reference existing changes from another parent instead of minting equivalent copies. Derived indexes such as lix_change_set_element must be rebuildable from this list. This does not include lix_version_ref pointer rows."
|
|
39
|
+
},
|
|
40
|
+
"author_account_ids": {
|
|
41
|
+
"type": "array",
|
|
42
|
+
"default": [],
|
|
43
|
+
"items": {
|
|
44
|
+
"type": "string"
|
|
45
|
+
},
|
|
46
|
+
"description": "Ordered set of author account IDs associated with this commit."
|
|
47
|
+
},
|
|
48
|
+
"parent_commit_ids": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"default": [],
|
|
51
|
+
"items": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
},
|
|
54
|
+
"description": "Parent commit IDs for commit graph topology."
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"required": [
|
|
58
|
+
"id",
|
|
59
|
+
"change_set_id"
|
|
60
|
+
],
|
|
61
|
+
"additionalProperties": false
|
|
62
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"x-lix-key": "lix_commit_edge",
|
|
3
|
+
"x-lix-version": "1",
|
|
4
|
+
"x-lix-primary-key": [
|
|
5
|
+
"/parent_id",
|
|
6
|
+
"/child_id"
|
|
7
|
+
],
|
|
8
|
+
"x-lix-foreign-keys": [
|
|
9
|
+
{
|
|
10
|
+
"properties": [
|
|
11
|
+
"/parent_id"
|
|
12
|
+
],
|
|
13
|
+
"references": {
|
|
14
|
+
"schemaKey": "lix_commit",
|
|
15
|
+
"properties": [
|
|
16
|
+
"/id"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"properties": [
|
|
22
|
+
"/child_id"
|
|
23
|
+
],
|
|
24
|
+
"references": {
|
|
25
|
+
"schemaKey": "lix_commit",
|
|
26
|
+
"properties": [
|
|
27
|
+
"/id"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"parent_id": {
|
|
35
|
+
"type": "string"
|
|
36
|
+
},
|
|
37
|
+
"child_id": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"required": [
|
|
42
|
+
"parent_id",
|
|
43
|
+
"child_id"
|
|
44
|
+
],
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
}
|