Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changeset/fresh-podman-candidate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@graphrefly/ts": minor
---

Add the independent rootless native Libpod API v0 PostgreSQL backend family and
its Node-local certifier. The certifier keeps socket discovery and resource
handles private and admits only the package-owned exact host profile after all
containment, network, secret, cancellation, cleanup, and zero-residue probes
succeed.
9 changes: 9 additions & 0 deletions .changeset/strict-core-package-floor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@graphrefly/ts": minor
---

Enforce the strict zero-dependency package floor. Framework and third-party
runtime integrations move to `@graphrefly/react`, `@graphrefly/vue`,
`@graphrefly/solid`, `@graphrefly/svelte`, `@graphrefly/nestjs`, and
`@graphrefly/reactive-layout-node-canvas`; the core manifest no longer declares
dependencies, optional dependencies, or peer dependencies.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ import { map, switchMap } from "@graphrefly/ts/operators";
import { fromPromise, timer } from "@graphrefly/ts/sources";
import { memoryKv } from "@graphrefly/ts/storage";
import { describeToMermaid } from "@graphrefly/ts/render";
import { useNodeValue } from "@graphrefly/ts/adapters/react";
import { useNodeValue } from "@graphrefly/react";
```

Node-only and browser-only helpers are split:
Expand Down
4 changes: 4 additions & 0 deletions demos/compat-matrix/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
"preview": "astro preview"
},
"dependencies": {
"@graphrefly/react": "^0.1.0",
"@graphrefly/solid": "^0.1.0",
"@graphrefly/svelte": "^0.1.0",
"@graphrefly/ts": "workspace:*",
"@graphrefly/vue": "^0.1.0",
"astro": "^5.16.0",
"@astrojs/react": "^4.0.0",
"@astrojs/vue": "^5.1.4",
Expand Down
10 changes: 5 additions & 5 deletions demos/compat-matrix/src/components/ReactDemo.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import {
useNodeRecord,
useNodeInput as useStore,
useNodeValue as useSubscribe,
} from "@graphrefly/react";
import type {
JotaiAtom,
NanoAtom,
WritableJotaiAtom,
WritableNanoAtom,
ZustandStoreApi,
} from "@graphrefly/ts/adapters";
import {
useNodeRecord,
useNodeInput as useStore,
useNodeValue as useSubscribe,
} from "@graphrefly/ts/adapters/react";
import type { Node } from "@graphrefly/ts/graph";
import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from "react";
import {
Expand Down
10 changes: 5 additions & 5 deletions demos/compat-matrix/src/components/SolidDemo.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
/** @jsxImportSource solid-js */

import {
createNodeRecord,
createNodeInput as useStore,
createNodeValue as useSubscribe,
} from "@graphrefly/solid";
import type {
JotaiAtom,
NanoAtom,
WritableJotaiAtom,
WritableNanoAtom,
ZustandStoreApi,
} from "@graphrefly/ts/adapters";
import {
createNodeRecord,
createNodeInput as useStore,
createNodeValue as useSubscribe,
} from "@graphrefly/ts/adapters/solid";
import type { Node } from "@graphrefly/ts/graph";
import { createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js";
import {
Expand Down
2 changes: 1 addition & 1 deletion demos/compat-matrix/src/components/SvelteDemo.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
nodeRecord,
nodeWritable as useStore,
nodeReadable as useSubscribe,
} from "@graphrefly/ts/adapters/svelte";
} from "@graphrefly/svelte";
import type { Node } from "@graphrefly/ts/graph";
import { onMount } from "svelte";
import { readable, writable } from "svelte/store";
Expand Down
6 changes: 1 addition & 5 deletions demos/compat-matrix/src/components/VueDemo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,8 @@ import type {
WritableNode,
ZustandStoreApi,
} from "@graphrefly/ts/adapters";
import {
useNodeInput,
useNodeRecord,
useNodeValue as useSubscribe,
} from "@graphrefly/ts/adapters/vue";
import type { Node } from "@graphrefly/ts/graph";
import { useNodeInput, useNodeRecord, useNodeValue as useSubscribe } from "@graphrefly/vue";
import { computed, onMounted, onUnmounted, ref, watch } from "vue";
import {
counterGraph,
Expand Down
16 changes: 8 additions & 8 deletions demos/compat-matrix/src/lib/counter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export type FrameworkName = "react" | "vue" | "solid" | "svelte";
const GRAPHREFLY_BY_FRAMEWORK: Record<FrameworkName, string> = {
react: `// GraphReFly direct node binding [React]
import { graph } from "@graphrefly/ts/graph";
import { useNodeInput, useNodeValue } from "@graphrefly/ts/adapters/react";
import { useNodeInput, useNodeValue } from "@graphrefly/react";

const g = graph({ name: "counter" });
const count = g.state(0, { name: "count" });
Expand All @@ -149,7 +149,7 @@ function Counter() {
vue: `<!-- GraphReFly direct node binding [Vue] -->
<script setup lang="ts">
import { graph } from "@graphrefly/ts/graph";
import { useNodeInput, useNodeValue } from "@graphrefly/ts/adapters/vue";
import { useNodeInput, useNodeValue } from "@graphrefly/vue";

const g = graph({ name: "counter" });
const count = g.state(0, { name: "count" });
Expand All @@ -168,7 +168,7 @@ const dbl = useNodeValue(doubled);
</template>`,
solid: `// GraphReFly direct node binding [SolidJS]
import { graph } from "@graphrefly/ts/graph";
import { createNodeInput, createNodeValue } from "@graphrefly/ts/adapters/solid";
import { createNodeInput, createNodeValue } from "@graphrefly/solid";

const g = graph({ name: "counter" });
const count = g.state(0, { name: "count" });
Expand All @@ -189,7 +189,7 @@ export function Counter() {
svelte: `<!-- GraphReFly direct node binding [Svelte] -->
<script lang="ts">
import { graph } from "@graphrefly/ts/graph";
import { nodeWritable, nodeReadable } from "@graphrefly/ts/adapters/svelte";
import { nodeWritable, nodeReadable } from "@graphrefly/svelte";

const g = graph({ name: "counter" });
const count = g.state(0, { name: "count" });
Expand All @@ -208,7 +208,7 @@ export function Counter() {

const LEADERBOARD_BY_FRAMEWORK: Record<FrameworkName, string> = {
react: `// Leaderboard: useNodeRecord maps keys through a node factory [React]
import { useNodeRecord, useNodeValue } from "@graphrefly/ts/adapters/react";
import { useNodeRecord, useNodeValue } from "@graphrefly/react";

const keys = g.state(["graphrefly", "jotai", "nanostores", "zustand"]);
const record = useNodeRecord(keys, (key) => ({ count: nodeForKey(key) }));
Expand All @@ -222,7 +222,7 @@ return (
);`,
vue: `<!-- Leaderboard: useNodeRecord maps keys through a node factory [Vue] -->
<script setup lang="ts">
import { useNodeRecord, useNodeValue } from "@graphrefly/ts/adapters/vue";
import { useNodeRecord, useNodeValue } from "@graphrefly/vue";

const keys = g.state(["graphrefly", "jotai", "nanostores", "zustand"]);
const record = useNodeRecord(keys, (key) => ({ count: nodeForKey(key) }));
Expand All @@ -236,7 +236,7 @@ const total = useNodeValue(totalNode);
</ul>
</template>`,
solid: `// Leaderboard: createNodeRecord maps keys through a node factory [SolidJS]
import { createNodeRecord, createNodeValue } from "@graphrefly/ts/adapters/solid";
import { createNodeRecord, createNodeValue } from "@graphrefly/solid";

const keys = g.state(["graphrefly", "jotai", "nanostores", "zustand"]);
const record = createNodeRecord(keys, (key) => ({ count: nodeForKey(key) }));
Expand All @@ -252,7 +252,7 @@ return (
);`,
svelte: `<!-- Leaderboard: nodeRecord maps keys through a node factory [Svelte] -->
<script lang="ts">
import { nodeRecord, nodeReadable } from "@graphrefly/ts/adapters/svelte";
import { nodeRecord, nodeReadable } from "@graphrefly/svelte";

const keys = g.state(["graphrefly", "jotai", "nanostores", "zustand"]);
const recordStore = nodeRecord(keys, (key) => ({ count: nodeForKey(key) }));
Expand Down
8 changes: 4 additions & 4 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ examples/
│ ├── nanostores/ Nanostores-style atom facade over caller-owned GraphReFly nodes
│ └── zustand/ Zustand StoreApi facade over a caller-owned GraphReFly state node
├── framework/
│ ├── react/ Vite + React 19, useNodeInput/useNodeValue via `@graphrefly/ts/adapters/react` (D238)
│ ├── vue/ Vite + Vue 3, useNodeInput/useNodeValue via `@graphrefly/ts/adapters/vue` (D238)
│ ├── solid/ Vite + SolidJS, createNodeInput/createNodeValue via `@graphrefly/ts/adapters/solid` (D238)
│ └── svelte/ Vite + Svelte 5 (runes), nodeWritable/nodeReadable via `@graphrefly/ts/adapters/svelte` (D238)
│ ├── react/ Vite + React 19, useNodeInput/useNodeValue via `@graphrefly/react` (D238)
│ ├── vue/ Vite + Vue 3, useNodeInput/useNodeValue via `@graphrefly/vue` (D238)
│ ├── solid/ Vite + SolidJS, createNodeInput/createNodeValue via `@graphrefly/solid` (D238)
│ └── svelte/ Vite + Svelte 5 (runes), nodeWritable/nodeReadable via `@graphrefly/svelte` (D238)
├── knowledge-graph/ Node-runnable semantic-memory KG reducer via `@graphrefly/ts/patterns`
├── nestjs-graph-boundary/ NestJS HTTP, WebSocket, message, cron, guard/filter boundary nodes via focused provider bundles
├── reactive-layout/
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/react/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Minimal React + GraphReFly counter.
- `useNodeInput(node)` -> `[value, setValue]` — tied to a state node.
- `useNodeValue(node)` -> `value` — works for any node (here: a derived).

Both hooks come from the focused D238 subpath `@graphrefly/ts/adapters/react`.
Both hooks come from the focused D238 subpath `@graphrefly/react`.

## Run

Expand Down
1 change: 1 addition & 0 deletions examples/framework/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
"@graphrefly/react": "^0.1.0",
"@graphrefly/ts": "workspace:*",
"react": "^19.0.0",
"react-dom": "^19.0.0"
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/react/src/Counter.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useNodeInput, useNodeValue } from "@graphrefly/ts/adapters/react";
import { useNodeInput, useNodeValue } from "@graphrefly/react";
import { count, doubled } from "./store";

export function Counter() {
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/solid/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Minimal SolidJS + GraphReFly counter.
- `createNodeInput(node)` -> `[Accessor<T>, setter]`.
- `createNodeValue(node)` -> `Accessor<T>` — works for any node (here: a derived).

The helpers come from the D238-focused `@graphrefly/ts/adapters/solid` subpath; cleanup is
The helpers come from the D238-focused `@graphrefly/solid` subpath; cleanup is
tied to the Solid reactive owner via `onCleanup`.

## Run
Expand Down
1 change: 1 addition & 0 deletions examples/framework/solid/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
"@graphrefly/solid": "^0.1.0",
"@graphrefly/ts": "workspace:*",
"solid-js": "^1.9.0"
},
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/solid/src/Counter.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createNodeInput, createNodeValue } from "@graphrefly/ts/adapters/solid";
import { createNodeInput, createNodeValue } from "@graphrefly/solid";
import type { Component } from "solid-js";
import { count, doubled } from "./store";

Expand Down
2 changes: 1 addition & 1 deletion examples/framework/svelte/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Minimal Svelte 5 (runes mode) + GraphReFly counter.
- `nodeReadable(node)` -> a Svelte readable store for any node (here: a
derived). Read as `$dbl`.

Both helpers come from the D238-focused `@graphrefly/ts/adapters/svelte` subpath. The `$`-prefix
Both helpers come from the D238-focused `@graphrefly/svelte` subpath. The `$`-prefix
auto-subscription is the idiomatic Svelte path and stays clean in runes mode.

## Run
Expand Down
1 change: 1 addition & 0 deletions examples/framework/svelte/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
"@graphrefly/svelte": "^0.1.0",
"@graphrefly/ts": "workspace:*",
"svelte": "^5.0.0"
},
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/svelte/src/App.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script lang="ts">
import { nodeReadable, nodeWritable } from "@graphrefly/ts/adapters/svelte";
import { nodeReadable, nodeWritable } from "@graphrefly/svelte";
import { count, doubled } from "./store";

const value = nodeWritable(count);
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/vue/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Minimal Vue 3 + GraphReFly counter.
- `useNodeValue(node)` -> read-only `Ref<T>` — works for any node (here: a
derived).

The helpers come from the D238-focused `@graphrefly/ts/adapters/vue` subpath; subscriptions
The helpers come from the D238-focused `@graphrefly/vue` subpath; subscriptions
clean up automatically on `onScopeDispose`.

## Run
Expand Down
1 change: 1 addition & 0 deletions examples/framework/vue/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
},
"dependencies": {
"@graphrefly/ts": "workspace:*",
"@graphrefly/vue": "^0.1.0",
"vue": "^3.5.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion examples/framework/vue/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { useNodeInput, useNodeValue } from "@graphrefly/ts/adapters/vue";
import { useNodeInput, useNodeValue } from "@graphrefly/vue";
import { count, doubled } from "./store";

const [value, setValue] = useNodeInput(count);
Expand Down
2 changes: 1 addition & 1 deletion examples/nestjs-graph-boundary/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# NestJS Graph Boundary

NestJS integration demo for `@graphrefly/ts/adapters/nestjs`.
NestJS integration demo for `@graphrefly/nestjs`.

The demo uses the D494/D495 provider bundle helpers over D486/D488 phase bridges: `POST /echo` and `POST /orders` bind existing graph boundary nodes with `@GraphReq(...)` and `@GraphHttpReply(...)`, the WebSocket gateway binds `@GraphWs(...)` with `@GraphWsAck(...)` and `@GraphWsReply(...)`, and the message-pattern controller binds `@GraphMessage(...)` with `@GraphMessageReply(...)`. Standard GraphReFly Nest providers consume the metadata for interceptor, guard, filter, cron, lifecycle, WebSocket, and message phases. `POST /orders` also shows guard denial response headers through the targeted GraphReFly guard-denial filter. It also shows a Nest Logger provider observing the graph-visible `orders.audit` node through `graph.observe(...)` and an explicit diagnostics boundary for sanitized adapter diagnostics.

Expand Down
1 change: 1 addition & 0 deletions examples/nestjs-graph-boundary/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"check": "pnpm --dir ../.. --filter @graphrefly/ts build && tsc --noEmit"
},
"dependencies": {
"@graphrefly/nestjs": "^0.1.0",
"@graphrefly/ts": "workspace:*",
"@nestjs/common": "^11.1.17",
"@nestjs/core": "^11.1.17",
Expand Down
10 changes: 5 additions & 5 deletions examples/nestjs-graph-boundary/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import "reflect-metadata";
import { depLatest } from "@graphrefly/ts";
import {
fromNestCron,
fromNestDiagnostics,
Expand All @@ -18,23 +17,23 @@ import {
type HttpDataIssue,
type NestBoundaryEnvelope,
type NestReplyEnvelope,
} from "@graphrefly/ts/adapters/nestjs";
} from "@graphrefly/nestjs";
import {
fromNestMessage,
GRAPHREFLY_NEST_MESSAGE_BRIDGE,
GraphMessage,
type GraphMessageBridge,
GraphMessageReply,
provideGraphMessageProviders,
} from "@graphrefly/ts/adapters/nestjs/microservices";
} from "@graphrefly/nestjs/microservices";
import {
createGraphCronController,
createGraphExceptionFilter,
GraphGuardDeniedFilter,
graphCronTarget,
graphLifecycleTarget,
provideGraphNativeProviders,
} from "@graphrefly/ts/adapters/nestjs/native";
} from "@graphrefly/nestjs/native";
import {
fromNestWs,
GRAPHREFLY_NEST_WS_BRIDGE,
Expand All @@ -43,7 +42,8 @@ import {
type GraphWsBridge,
GraphWsReply,
provideGraphWsProviders,
} from "@graphrefly/ts/adapters/nestjs/websockets";
} from "@graphrefly/nestjs/websockets";
import { depLatest } from "@graphrefly/ts";
import { type Graph, graph } from "@graphrefly/ts/graph";
import {
BadRequestException,
Expand Down
10 changes: 5 additions & 5 deletions packages/ts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,15 @@ The package includes `reactiveMap`, `reactiveList`, `reactiveLog`,
Focused adapter subpaths keep framework/runtime ownership explicit:

```ts
import { useNodeValue as useReactNodeValue } from "@graphrefly/ts/adapters/react";
import { useNodeValue as useVueNodeValue } from "@graphrefly/ts/adapters/vue";
import { nodeReadable } from "@graphrefly/ts/adapters/svelte";
import { createNodeValue } from "@graphrefly/ts/adapters/solid";
import { useNodeValue as useReactNodeValue } from "@graphrefly/react";
import { useNodeValue as useVueNodeValue } from "@graphrefly/vue";
import { nodeReadable } from "@graphrefly/svelte";
import { createNodeValue } from "@graphrefly/solid";
```

Other focused surfaces include:

- `@graphrefly/ts/adapters/nestjs`
- `@graphrefly/nestjs`
- `@graphrefly/ts/adapters/observe-storage`
- `@graphrefly/ts/messaging`
- `@graphrefly/ts/memory`
Expand Down
Loading