diff --git a/packages/connected/src/ConnectedLdoTransactionDataset.ts b/packages/connected/src/ConnectedLdoTransactionDataset.ts index dfefe5e..8e204b9 100644 --- a/packages/connected/src/ConnectedLdoTransactionDataset.ts +++ b/packages/connected/src/ConnectedLdoTransactionDataset.ts @@ -65,6 +65,8 @@ export class ConnectedLdoTransactionDataset extends LdoTransactionDataset implements IConnectedLdoDataset { + public instanceId: number; + static nextId = 0; /** * @internal */ @@ -91,6 +93,14 @@ export class ConnectedLdoTransactionDataset ) { super(parentDataset, datasetFactory, transactionDatasetFactory); this.context = context; + this.instanceId = ConnectedLdoTransactionDataset.nextId++; + } + + add(quad: Quad): this { + console.log("Adding"); + super.add(quad); + console.log(this); + return this; } getResource< diff --git a/packages/connected/src/trackingProxy/TrackingProxyContext.ts b/packages/connected/src/trackingProxy/TrackingProxyContext.ts index 277bb38..39f8aeb 100644 --- a/packages/connected/src/trackingProxy/TrackingProxyContext.ts +++ b/packages/connected/src/trackingProxy/TrackingProxyContext.ts @@ -41,6 +41,7 @@ export class TrackingProxyContext extends ProxyContext { listener: nodeEventListener, ) { super(options); + console.log("trackingProxyContextDataset", options.dataset); this.subscribableDataset = options.dataset; this.listener = listener; } @@ -51,6 +52,7 @@ export class TrackingProxyContext extends ProxyContext { if (!listeners.includes(this.listener)) { this.subscribableDataset.on(eventName, this.listener); } + console.log("Added Listener", this.subscribableDataset); } protected createNewSubjectProxy(node: NamedNode | BlankNode): SubjectProxy { diff --git a/packages/connected/src/trackingProxy/TrackingSubjectProxy.ts b/packages/connected/src/trackingProxy/TrackingSubjectProxy.ts index 4ee9093..16fdded 100644 --- a/packages/connected/src/trackingProxy/TrackingSubjectProxy.ts +++ b/packages/connected/src/trackingProxy/TrackingSubjectProxy.ts @@ -19,11 +19,12 @@ export function createTrackingSubjectProxy( ): SubjectProxy { const baseHandler = createSubjectHandler(proxyContext); const oldGetFunction = baseHandler.get; - const newGetFunction: ProxyHandler["get"] = ( + const trackingProxyGetFunction: ProxyHandler["get"] = ( target: SubjectProxyTarget, key: string | symbol, receiver, ) => { + console.log("Should be calling this get function"); const subject = target["@id"]; const rdfTypes = proxyContext.getRdfType(subject); if (typeof key === "symbol") { @@ -31,6 +32,7 @@ export function createTrackingSubjectProxy( } else if (key === "@id") { proxyContext.addListener([subject, null, null, null]); } else if (!proxyContext.contextUtil.isSet(key, rdfTypes)) { + console.log("Should be registering here!!!!", key); const predicate = namedNode( proxyContext.contextUtil.keyToIri(key, rdfTypes), ); @@ -38,7 +40,7 @@ export function createTrackingSubjectProxy( } return oldGetFunction && oldGetFunction(target, key, receiver); }; - baseHandler.get = newGetFunction; + baseHandler.get = trackingProxyGetFunction; baseHandler.set = () => { console.warn( "You've attempted to set a value on a Linked Data Object from the useSubject, useMatchingSubject, or useMatchingObject hooks. These linked data objects should only be used to render data, not modify it. To modify data, use the `changeData` function.", diff --git a/packages/connected/src/trackingProxy/createTrackingProxy.ts b/packages/connected/src/trackingProxy/createTrackingProxy.ts index 16add22..dddf855 100644 --- a/packages/connected/src/trackingProxy/createTrackingProxy.ts +++ b/packages/connected/src/trackingProxy/createTrackingProxy.ts @@ -25,6 +25,7 @@ export function createTrackingProxyBuilder( // Rebuild the LdoBuilder from scratch to inject TrackingProxyContext const contextUtil = new ContextUtil(shapeType.context); + console.log("Creating proxy", dataset); const proxyContext = new TrackingProxyContext( { dataset, diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 35c283b..34544e4 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -7,5 +7,10 @@ export * from "./methods/useResource.js"; export * from "./methods/useSubject.js"; export * from "./methods/useSubscribeToResource.js"; export * from "./methods/useLinkQuery.js"; +export * from "./methods/change/types.js"; +export * from "./methods/change/useChangeDataset.js"; +export * from "./methods/change/useChangeMatchObject.js"; +export * from "./methods/change/useChangeMatchSubject.js"; +export * from "./methods/change/useChangeSubject.js"; export * from "./util/useTrackingProxy.js"; diff --git a/packages/react/src/methods/change/types.ts b/packages/react/src/methods/change/types.ts index cabb35c..690b8aa 100644 --- a/packages/react/src/methods/change/types.ts +++ b/packages/react/src/methods/change/types.ts @@ -6,16 +6,17 @@ import type { LdoBase, LdSet } from "@ldo/ldo"; export type useChangeReturn = [ Type, - useChangeSetData, + useChangeSetData, useChangeCommitData, ]; type BaseOtherType = LdoBase | LdSet; -export type useChangeSetData = < +export type useChangeSetData = < OtherType extends BaseOtherType | undefined = undefined, >( - changer: (toChange: OtherType extends undefined ? T : OtherType) => void, + resource: Plugins[number]["types"]["resource"], + changer: (toChange: OtherType extends undefined ? Type : OtherType) => void, input?: OtherType, ) => void; diff --git a/packages/react/src/methods/change/useChangeDataset.ts b/packages/react/src/methods/change/useChangeDataset.ts index 55ba4df..01f8e09 100644 --- a/packages/react/src/methods/change/useChangeDataset.ts +++ b/packages/react/src/methods/change/useChangeDataset.ts @@ -32,6 +32,7 @@ export function createUseChangeDataset( specificDataset?: IConnectedLdoDataset, ): useChangeDatasetReturn { const transactionDataset = useMemo(() => { + console.log("Uh oh! Getting another dataset!!!"); return ( specificDataset ?? dataset ).startTransaction() as ConnectedLdoTransactionDataset; @@ -47,6 +48,10 @@ export function createUseChangeDataset( ); const commitData = useCallback>(() => { + const changes = transactionDataset.getChanges(); + console.log("Changes!!!!!"); + console.log(changes.added?.toString()); + console.log(changes.removed?.toString()); return transactionDataset.commitToRemote(); }, [transactionDataset]); diff --git a/packages/react/src/methods/change/useChangeMatchObject.ts b/packages/react/src/methods/change/useChangeMatchObject.ts index 037b736..e8513e5 100644 --- a/packages/react/src/methods/change/useChangeMatchObject.ts +++ b/packages/react/src/methods/change/useChangeMatchObject.ts @@ -23,7 +23,6 @@ export function createUseChangeMatchObject( */ return function useChangeSubject( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], subject?: QuadMatch[0] | string, predicate?: QuadMatch[1] | string, graph?: QuadMatch[3] | string, @@ -37,8 +36,8 @@ export function createUseChangeMatchObject( dataset: transactionDataset, }); - const setData = useCallback>>( - (changer) => { + const setData = useCallback, Plugins>>( + (writeResource, changer, _other) => { setDataset((dataset) => { const ldSet = dataset .usingType(shapeType) @@ -49,7 +48,7 @@ export function createUseChangeMatchObject( changer(ldSet); }); }, - [setDataset, subject, predicate, graph, shapeType, writeResource], + [setDataset, subject, predicate, graph, shapeType], ); return useMemo( diff --git a/packages/react/src/methods/change/useChangeMatchSubject.ts b/packages/react/src/methods/change/useChangeMatchSubject.ts index 8978cce..206fc8f 100644 --- a/packages/react/src/methods/change/useChangeMatchSubject.ts +++ b/packages/react/src/methods/change/useChangeMatchSubject.ts @@ -25,7 +25,6 @@ export function createUseChangeMatchSubject( */ return function useChangeSubject( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], predicate?: QuadMatch[1] | string, object?: QuadMatch[2] | string, graph?: QuadMatch[3] | string, @@ -39,8 +38,8 @@ export function createUseChangeMatchSubject( dataset: transactionDataset, }); - const setData = useCallback>>( - (changer) => { + const setData = useCallback, Plugins>>( + (writeResource, changer, _other) => { setDataset((dataset) => { const ldSet = dataset .usingType(shapeType) @@ -51,7 +50,7 @@ export function createUseChangeMatchSubject( changer(ldSet); }); }, - [setDataset, object, predicate, graph, shapeType, writeResource], + [setDataset, object, predicate, graph, shapeType], ); return useMemo( diff --git a/packages/react/src/methods/change/useChangeSubject.ts b/packages/react/src/methods/change/useChangeSubject.ts index 82d07f3..da61040 100644 --- a/packages/react/src/methods/change/useChangeSubject.ts +++ b/packages/react/src/methods/change/useChangeSubject.ts @@ -3,7 +3,7 @@ import type { ConnectedLdoDataset, ConnectedPlugin } from "@ldo/connected"; import { createUseChangeDataset } from "./useChangeDataset.js"; import type { UseSubjectOptions } from "../useSubject.js"; import { createUseSubject } from "../useSubject.js"; -import type { LdoBase, ShapeType } from "@ldo/ldo"; +import { write, type LdoBase, type ShapeType } from "@ldo/ldo"; import type { SubjectNode } from "@ldo/rdf-utils"; import type { useChangeReturn, useChangeSetData } from "./types.js"; import { createProxyInteractOptions } from "@ldo/jsonld-dataset-proxy"; @@ -11,19 +11,16 @@ import { createProxyInteractOptions } from "@ldo/jsonld-dataset-proxy"; export type useChangeSubjectType = { ( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], subject: string | SubjectNode, options?: UseSubjectOptions, ): useChangeReturn; ( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], subject?: string | SubjectNode, options?: UseSubjectOptions, ): useChangeReturn; ( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], subject?: string | SubjectNode, options?: UseSubjectOptions, ): useChangeReturn; @@ -45,7 +42,6 @@ export function createUseChangeSubject( */ return function useChangeSubject( shapeType: ShapeType, - writeResource: Plugins[number]["types"]["resource"], subject?: string | SubjectNode, options?: UseSubjectOptions, ): useChangeReturn { @@ -57,14 +53,17 @@ export function createUseChangeSubject( dataset: transactionDataset, }); - const setData = useCallback>( - (changer, otherType?) => { + const setData = useCallback>( + (writeResource, changer, otherType?) => { + console.log("Setting data"); if (!subject) return; setDataset((dataset) => { const ldObject = otherType - ? createProxyInteractOptions("dataset", dataset).usingCopy( - otherType, - ) + ? write(writeResource.uri).usingCopy( + createProxyInteractOptions("dataset", dataset).usingCopy( + otherType, + )[0], + )[0] : dataset .usingType(shapeType) .write(writeResource.uri) @@ -74,9 +73,11 @@ export function createUseChangeSubject( changer(ldObject); }); }, - [setDataset, subject, shapeType, writeResource], + [setDataset, subject, shapeType], ); + console.log("This is ldObject", ldObject); + return useMemo( () => [ldObject, setData, commitData], [ldObject, setData, commitData], diff --git a/packages/react/src/methods/useSubject.ts b/packages/react/src/methods/useSubject.ts index e198b03..53bc6f2 100644 --- a/packages/react/src/methods/useSubject.ts +++ b/packages/react/src/methods/useSubject.ts @@ -50,6 +50,8 @@ export function createUseSubject( subject?: string | SubjectNode, options?: UseSubjectOptions, ): Type | undefined { + console.log("options", options); + const fromSubject = useCallback( (builder: LdoBuilder) => { if (!subject) return; diff --git a/packages/react/temptest/.gitignore b/packages/react/temptest/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/packages/react/temptest/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/react/temptest/README.md b/packages/react/temptest/README.md new file mode 100644 index 0000000..7959ce4 --- /dev/null +++ b/packages/react/temptest/README.md @@ -0,0 +1,69 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/packages/react/temptest/eslint.config.js b/packages/react/temptest/eslint.config.js new file mode 100644 index 0000000..d94e7de --- /dev/null +++ b/packages/react/temptest/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/packages/react/temptest/index.html b/packages/react/temptest/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/packages/react/temptest/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/packages/react/temptest/package.json b/packages/react/temptest/package.json new file mode 100644 index 0000000..36a53c7 --- /dev/null +++ b/packages/react/temptest/package.json @@ -0,0 +1,29 @@ +{ + "name": "temptest", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/packages/react/temptest/public/vite.svg b/packages/react/temptest/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/packages/react/temptest/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/react/temptest/src/App.css b/packages/react/temptest/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/packages/react/temptest/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/packages/react/temptest/src/App.tsx b/packages/react/temptest/src/App.tsx new file mode 100644 index 0000000..025959e --- /dev/null +++ b/packages/react/temptest/src/App.tsx @@ -0,0 +1,116 @@ +import { useState, type FunctionComponent } from "react"; +import { useResource, useChangeSubject, useSubject } from "../../../solid-react"; +import { SolidProfileShapeShapeType } from "../../test/.ldo/solidProfile.shapeTypes.js"; +import { set } from "@ldo/ldo"; + +const FormTest: FunctionComponent = () => { + const randomResource = useResource("http://example.com/resource.ttl"); + const submittedData = useSubject(SolidProfileShapeShapeType, "Example0"); + + const [count, setCount] = useState(1); + + const [data, setData, commitData] = useChangeSubject( + SolidProfileShapeShapeType, + "Example0", + ); + + console.log("This is data", data); + + return ( +
+

Form

+ +
{ + e.preventDefault(); + const result = await commitData(); + console.log(result); + }} + > + {/* Primary name field */} + { + setData(randomResource, (profile) => { + console.log("Inside changer"); + profile.fn = e.target.value; + }) + }} + /> + + {/* Friends */} + {data?.knows?.map((person) => ( +
+

{person["@id"]}

+ + setData(randomResource, (p) => { + p.fn = e.target.value; + }, person) + } + /> + +
+ ))} + + + + +
+ +
+ + {/* Committed view */} +

Submitted Data

+
+

Name: {submittedData?.fn ?? ""}

+
    + {submittedData?.knows?.map((person) => ( +
  • + Id: {person["@id"]} Name: {person.fn} +
  • + ))} +
+
+
+ ); +}; + +function App() { + + return ( +
+ +
+ ) +} + +export default App diff --git a/packages/react/temptest/src/assets/react.svg b/packages/react/temptest/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/packages/react/temptest/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/react/temptest/src/index.css b/packages/react/temptest/src/index.css new file mode 100644 index 0000000..69cc6f9 --- /dev/null +++ b/packages/react/temptest/src/index.css @@ -0,0 +1,72 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} \ No newline at end of file diff --git a/packages/react/temptest/src/main.tsx b/packages/react/temptest/src/main.tsx new file mode 100644 index 0000000..a757447 --- /dev/null +++ b/packages/react/temptest/src/main.tsx @@ -0,0 +1,7 @@ +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + +) diff --git a/packages/react/temptest/src/vite-env.d.ts b/packages/react/temptest/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/react/temptest/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/react/temptest/tsconfig.app.json b/packages/react/temptest/tsconfig.app.json new file mode 100644 index 0000000..227a6c6 --- /dev/null +++ b/packages/react/temptest/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/packages/react/temptest/tsconfig.json b/packages/react/temptest/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/packages/react/temptest/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/packages/react/temptest/tsconfig.node.json b/packages/react/temptest/tsconfig.node.json new file mode 100644 index 0000000..f85a399 --- /dev/null +++ b/packages/react/temptest/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/react/temptest/vite.config.ts b/packages/react/temptest/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/packages/react/temptest/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/packages/solid-react/src/defaultIntance.ts b/packages/solid-react/src/defaultIntance.ts index f3807a5..fe22bbc 100644 --- a/packages/solid-react/src/defaultIntance.ts +++ b/packages/solid-react/src/defaultIntance.ts @@ -7,6 +7,7 @@ import { createBrowserSolidReactMethods } from "./createBrowserSolidReactMethods */ export const { dataset, + useDataset, useLdo, useMatchObject, useMatchSubject, @@ -14,6 +15,10 @@ export const { useSubject, useSubscribeToResource, useLinkQuery, + useChangeDataset, + useChangeSubject, + useChangeMatchObject, + useChangeMatchSubject, } = createLdoReactMethods([solidConnectedPlugin]); export const { BrowserSolidLdoProvider, useSolidAuth, useRootContainerFor } = diff --git a/packages/subscribable-dataset/src/SubscribableDataset.ts b/packages/subscribable-dataset/src/SubscribableDataset.ts index 5fbacfd..f8ded4d 100644 --- a/packages/subscribable-dataset/src/SubscribableDataset.ts +++ b/packages/subscribable-dataset/src/SubscribableDataset.ts @@ -42,7 +42,7 @@ export class SubscribableDataset /** * Helps find all the events for a given listener */ - private listenerHashMap: Map, Set> = + protected listenerHashMap: Map, Set> = new Map(); /** @@ -170,7 +170,7 @@ export class SubscribableDataset * Triggers all subscriptions based on an updated quads * @param changed The changed triples of the transaction */ - private triggerSubscriptionForQuads( + protected triggerSubscriptionForQuads( changed: DatasetChanges, ): void { // A mapping of serialized QuadMatches to the changed quads diff --git a/packages/subscribable-dataset/src/TransactionDataset.ts b/packages/subscribable-dataset/src/TransactionDataset.ts index 208db2b..a4e1520 100644 --- a/packages/subscribable-dataset/src/TransactionDataset.ts +++ b/packages/subscribable-dataset/src/TransactionDataset.ts @@ -1,6 +1,9 @@ import type { Dataset, BaseQuad, Term, DatasetFactory } from "@rdfjs/types"; import type { DatasetChanges } from "@ldo/rdf-utils"; -import type { ITransactionDataset, ITransactionDatasetFactory } from "./types.js"; +import type { + ITransactionDataset, + ITransactionDatasetFactory, +} from "./types.js"; import { mergeDatasetChanges } from "./mergeDatasetChanges.js"; import { SubscribableDataset } from "./SubscribableDataset.js"; import { updateDatasetInBulk } from "./util.js"; @@ -232,15 +235,18 @@ export class TransactionDataset removed?: Dataset | InAndOutQuad[]; }): void { this.checkIfTransactionCommitted(); - - mergeDatasetChanges(this.datasetChanges, { + const newDatasetChanges = { added: changes.added ? this.datasetFactory.dataset(changes.added) : undefined, removed: changes.removed ? this.datasetFactory.dataset(changes.removed) : undefined, - }); + }; + + mergeDatasetChanges(this.datasetChanges, newDatasetChanges); + + this.triggerSubscriptionForQuads(newDatasetChanges); } /** diff --git a/packages/subscribable-dataset/src/util.ts b/packages/subscribable-dataset/src/util.ts index c0048f1..c93c7fc 100644 --- a/packages/subscribable-dataset/src/util.ts +++ b/packages/subscribable-dataset/src/util.ts @@ -11,8 +11,10 @@ export function updateDatasetInBulk( dataset: Dataset, datasetChanges: DatasetChanges, ) { + console.log("Update Dataset In Bulk"); // eslint-disable-next-line @typescript-eslint/no-explicit-any if ((dataset as any).bulk) { + console.log("Updating in bulk"); (dataset as IBulkEditableDataset).bulk(datasetChanges); } else { if (datasetChanges.added) {