diff --git a/engine/verifier/src/orm/handle_frontend_update.rs b/engine/verifier/src/orm/handle_frontend_update.rs index 26a1ebcb..358c26d9 100644 --- a/engine/verifier/src/orm/handle_frontend_update.rs +++ b/engine/verifier/src/orm/handle_frontend_update.rs @@ -302,10 +302,7 @@ fn create_sparql_update_query_for_diff( remove_statement, wheres.join(" .\n ") )); - log_info!( - "[create_sparql_update_query_for_diff] Added delete query #{}", - sparql_sub_queries.len() - ); + log_info!("[create_sparql_update_query_for_diff] Added delete query."); // var_counter += 1; // Not necessary because not used afterwards. } // The actual INSERT. @@ -315,10 +312,7 @@ fn create_sparql_update_query_for_diff( add_statement, where_statements.join(". \n ") )); - log_info!( - "[create_sparql_update_query_for_diff] Added insert query #{}", - sparql_sub_queries.len() - ); + log_info!("[create_sparql_update_query_for_diff] Added insert query."); } } diff --git a/engine/verifier/src/orm/initialize.rs b/engine/verifier/src/orm/initialize.rs index 5e158e4e..aa796b9d 100644 --- a/engine/verifier/src/orm/initialize.rs +++ b/engine/verifier/src/orm/initialize.rs @@ -62,7 +62,6 @@ impl Verifier { .push(orm_subscription); let orm_objects = self.create_orm_object_for_shape(nuri, session_id, &shape_type)?; - // log_debug!("create_orm_object_for_shape return {:?}", orm_objects); let _ = tx .send(AppResponse::V0(AppResponseV0::OrmInitial(orm_objects))) diff --git a/sdk/js/alien-deepsignals/test-map-type.js b/sdk/js/alien-deepsignals/test-map-type.js new file mode 100644 index 00000000..bd04ab70 --- /dev/null +++ b/sdk/js/alien-deepsignals/test-map-type.js @@ -0,0 +1,20 @@ +import { deepSignal } from './dist/index.js'; + +const root = deepSignal({ + mySet: new Set([ + { "@id": "obj1", value: 10 }, + { "@id": "obj2", value: 20 } + ]) +}); + +const result = root.mySet.values().map(entry => entry); +console.log('Type:', typeof result); +console.log('Constructor:', result.constructor.name); +console.log('Result:', result); +console.log('Has next?:', typeof result.next); +console.log('Is iterable?:', Symbol.iterator in result); + +// Convert to array +const arr = Array.from(result); +console.log('Array:', arr); +console.log('First entry:', arr[0]); diff --git a/sdk/js/alien-deepsignals/test-set-map.js b/sdk/js/alien-deepsignals/test-set-map.js new file mode 100644 index 00000000..984547ef --- /dev/null +++ b/sdk/js/alien-deepsignals/test-set-map.js @@ -0,0 +1,28 @@ +import { deepSignal, subscribeDeepMutations } from './dist/index.js'; + +const root = deepSignal({ + mySet: new Set([ + { "@id": "obj1", value: 10 }, + { "@id": "obj2", value: 20 } + ]) +}); + +subscribeDeepMutations(root, (patches) => { + console.log('Patches:', JSON.stringify(patches, null, 2)); +}); + +// Use .map() to get entries +const entries = root.mySet.values().map(entry => { + console.log('Entry:', entry); + return entry; +}); + +console.log('Got entries:', entries.length); +console.log('Modifying first entry...'); + +// Modify the first one +entries[0].value = 100; + +setTimeout(() => { + console.log('Done'); +}, 100); diff --git a/sdk/js/alien-deepsignals/test-set-paths.js b/sdk/js/alien-deepsignals/test-set-paths.js new file mode 100644 index 00000000..aa559ee4 --- /dev/null +++ b/sdk/js/alien-deepsignals/test-set-paths.js @@ -0,0 +1,25 @@ +import { deepSignal, subscribeDeepMutations } from './dist/index.js'; + +const root = deepSignal({ + mySet: new Set([ + { "@id": "obj1", value: 10 } + ]) +}); + +subscribeDeepMutations(root, (patches) => { + console.log('Patches:', JSON.stringify(patches, null, 2)); +}); + +// Get the first entry from the set +const entries = root.mySet.values(); +const firstEntry = entries.next().value; + +console.log('First entry:', firstEntry); +console.log('Modifying value...'); + +// Modify it +firstEntry.value = 20; + +setTimeout(() => { + console.log('Done'); +}, 100); diff --git a/sdk/js/examples/multi-framework-signals/src/app/pages/index.astro b/sdk/js/examples/multi-framework-signals/src/app/pages/index.astro index e25e7eae..e36eacdf 100644 --- a/sdk/js/examples/multi-framework-signals/src/app/pages/index.astro +++ b/sdk/js/examples/multi-framework-signals/src/app/pages/index.astro @@ -29,7 +29,8 @@ const title = "Multi-framework app"; console.log(info.V0.details); initNg(ng, event.session); - window.ng = ng; + window.ng = ng; + window.session = event.session; }, true, [] @@ -37,15 +38,15 @@ const title = "Multi-framework app"; - + - + diff --git a/sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx b/sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx index 54477baf..6751f77f 100644 --- a/sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx +++ b/sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx @@ -3,195 +3,289 @@ import { useShape } from "@ng-org/signals/react"; import flattenObject from "../utils/flattenObject"; import { TestObjectShapeType } from "../../shapes/orm/testShape.shapeTypes"; import { BasicShapeType } from "../../shapes/orm/basic.shapeTypes"; +import type { ShapeType } from "@ng-org/shex-orm"; +import type { Basic } from "../../shapes/orm/basic.typings"; + +const sparqlExampleData = ` +PREFIX ex: +INSERT DATA { + a ex:TestObject ; + ex:stringValue "hello world" ; + ex:numValue 42 ; + ex:boolValue true ; + ex:arrayValue 1,2,3 ; + ex:objectValue ; + ex:anotherObject , ; + ex:numOrStr "either" ; + ex:lit1Or2 "lit1" ; + ex:unrelated "some value" ; + ex:anotherUnrelated 4242 . + + + ex:nestedString "nested" ; + ex:nestedNum 7 ; + ex:nestedArray 5,6 . + + + ex:prop1 "one" ; + ex:prop2 1 . + + + ex:prop1 "two" ; + ex:prop2 2 . + + a ex:TestObject ; + ex:stringValue "hello world #2" ; + ex:numValue 422 ; + ex:boolValue false ; + ex:arrayValue 4,5,6 ; + ex:objectValue ; + ex:anotherObject , ; + ex:numOrStr 4 ; + ex:lit1Or2 "lit2" ; + ex:unrelated "some value2" ; + ex:anotherUnrelated 42422 . + + + ex:nestedString "nested2" ; + ex:nestedNum 72 ; + ex:nestedArray 7,8,9 . + + + ex:prop1 "one2" ; + ex:prop2 12 . + + + ex:prop1 "two2" ; + ex:prop2 22 . + + + + a ; + ex:basicString "string of object 1" . + + a ; + ex:basicString "string of object 2" . + +} + `; export function HelloWorldReact() { - const state = [...(useShape(BasicShapeType)?.entries() || [])][0]; + const state = useShape(BasicShapeType); // @ts-expect-error window.reactState = state; + console.log("react state", state); - if (!state) return <>Loading state; - + if (!state) return
Loading...
; // Create a table from the state object: One column for keys, one for values, one with an input to change the value. return (

Rendered in React

- {/* */} - - - - - - - - - - - {(() => { - const setNestedValue = ( - obj: any, - path: string, - value: any - ) => { - const keys = path.split("."); - let current = obj; - - for (let i = 0; i < keys.length - 1; i++) { - current = current[keys[i]]; - } - - current[keys[keys.length - 1]] = value; - }; - - const getNestedValue = (obj: any, path: string) => { - return path - .split(".") - .reduce((current, key) => current[key], obj); - }; - - return flattenObject(state).map(([key, value]) => ( - - - - + Add example data + + +
+ {state.values()?.map((ormObj) => ( +
KeyValueEdit
{key} - {value instanceof Set - ? Array.from(value).join(", ") - : Array.isArray(value) - ? `[${value.join(", ")}]` - : JSON.stringify(value)} - - {typeof value === "string" ? ( - { - setNestedValue( - state, - key, - e.target.value - ); - }} - /> - ) : typeof value === "number" ? ( - { - setNestedValue( - state, - key, - Number(e.target.value) - ); - }} - /> - ) : typeof value === "boolean" ? ( - { - setNestedValue( - state, - key, - e.target.checked - ); - }} - /> - ) : Array.isArray(value) ? ( -
- - -
- ) : value instanceof Set ? ( -
- - -
- ) : ( - "N/A" - )} -
+ + + + + - )); - })()} - -
KeyValueEdit
+ + + {(() => { + const setNestedValue = ( + obj: any, + path: string, + value: any + ) => { + const keys = path.split("."); + let current = obj; + + for (let i = 0; i < keys.length - 1; i++) { + current = current[keys[i]]; + } + + current[keys[keys.length - 1]] = value; + }; + + const getNestedValue = ( + obj: any, + path: string + ) => { + return path + .split(".") + .reduce( + (current, key) => current[key], + obj + ); + }; + + return flattenObject(ormObj).map( + ([key, value]) => ( + + {key} + + {value instanceof Set + ? Array.from(value).join( + ", " + ) + : Array.isArray(value) + ? `[${value.join(", ")}]` + : JSON.stringify(value)} + + + {typeof value === "string" ? ( + { + setNestedValue( + state, + key, + e.target.value + ); + }} + /> + ) : typeof value === + "number" ? ( + { + setNestedValue( + state, + key, + Number( + e.target + .value + ) + ); + }} + /> + ) : typeof value === + "boolean" ? ( + { + setNestedValue( + state, + key, + e.target.checked + ); + }} + /> + ) : Array.isArray(value) ? ( +
+ + +
+ ) : value instanceof Set ? ( +
+ + +
+ ) : ( + "N/A" + )} + + + ) + ); + })()} + + + ))} +
); } diff --git a/sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte b/sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte index 8a95a274..86721f41 100644 --- a/sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte +++ b/sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte @@ -19,9 +19,9 @@ } cur[keys[keys.length - 1]] = value; } - const flatEntries = $derived( + const flattenedObjects = $derived( $shapeObject - ? $shapeObject.entries().map((o) => flattenObject(o)[0] || ({} as any)) + ? $shapeObject.values().map((o) => flattenObject(o)[0] || ({} as any)) : [] ); $effect(() => { @@ -32,92 +32,95 @@ {#if $shapeObject}

Rendered in Svelte

- - - - - - - - - - {#each flatEntries as [key, value] (key)} + + {#each flattenedObjects as flatEntries} +
KeyValueEdit
+ - - - + + + - {/each} - -
{key} - {#if value instanceof Set} - {Array.from(value).join(", ")} - {:else if Array.isArray(value)} - [{value.join(", ")}] - {:else} - {JSON.stringify(value)} - {/if} - - {#if typeof value === "string"} - - setNestedValue($shapeObject, key, e.target.value)} - /> - {:else if typeof value === "number"} - - setNestedValue($shapeObject, key, Number(e.target.value))} - /> - {:else if typeof value === "boolean"} - - setNestedValue($shapeObject, key, e.target.checked)} - /> - {:else if Array.isArray(value)} -
- - -
- {:else if value instanceof Set} -
- - -
- {:else} - N/A - {/if} -
KeyValueEdit
+ + + {#each flatEntries as [key, value] (key)} + + {key} + + {#if value instanceof Set} + {Array.from(value).join(", ")} + {:else if Array.isArray(value)} + [{value.join(", ")}] + {:else} + {JSON.stringify(value)} + {/if} + + + {#if typeof value === "string"} + + setNestedValue($shapeObject, key, e.target.value)} + /> + {:else if typeof value === "number"} + + setNestedValue($shapeObject, key, Number(e.target.value))} + /> + {:else if typeof value === "boolean"} + + setNestedValue($shapeObject, key, e.target.checked)} + /> + {:else if Array.isArray(value)} +
+ + +
+ {:else if value instanceof Set} +
+ + +
+ {:else} + N/A + {/if} + + + {/each} + + + {/each}
{:else}

Loading state

diff --git a/sdk/js/examples/multi-framework-signals/src/frontends/vue/HelloWorld.vue b/sdk/js/examples/multi-framework-signals/src/frontends/vue/HelloWorld.vue index 3f367371..c8d54542 100644 --- a/sdk/js/examples/multi-framework-signals/src/frontends/vue/HelloWorld.vue +++ b/sdk/js/examples/multi-framework-signals/src/frontends/vue/HelloWorld.vue @@ -5,215 +5,214 @@ import flattenObject from "../utils/flattenObject"; import { TestObjectShapeType } from "../../shapes/orm/testShape.shapeTypes"; // Acquire deep signal object (proxy) for a shape; scope second arg left empty string for parity -const shapeObj = useShape(TestObjectShapeType); +const shapeObjects = useShape(TestObjectShapeType); // Expose for devtools exploration // @ts-ignore -window.vueState = shapeObj; +window.vueState = shapeObjects; -const flatEntries = computed(() => flattenObject(shapeObj));