Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
34d7664
Remove redundant comment about retry behavior
steida Feb 2, 2026
0c4ce6b
Add shutdown-aware createRunner; rename relay API
steida Feb 2, 2026
284d9cc
Update pnpm-lock.yaml
steida Feb 2, 2026
e3739cc
Add browser Task runner with global error handling
steida Feb 2, 2026
6d368c2
Remove re-export of @evolu/web from react-web
steida Feb 2, 2026
364b359
Refactor abort handling in Task and update sizes
steida Feb 2, 2026
fdbc834
Remove Feature.id and use name as key
steida Feb 2, 2026
9b576d1
Enable React strict mode in Next.js config
steida Feb 3, 2026
c75b321
Update browserslist and add @evolu/web dependency
steida Feb 3, 2026
5acfef4
Update pnpm-lock.yaml
steida Feb 3, 2026
2e81edc
Rename TaskDisposableStack to AsyncDisposableStack
steida Feb 3, 2026
c93474f
Fix lint-monorepo
steida Feb 3, 2026
a0d1a8f
Refactor Console docs and expand examples
steida Feb 3, 2026
1d27962
Use default time dep in console formatter
steida Feb 3, 2026
cae05f6
Limit published files to dist/src and src
steida Feb 3, 2026
4d99d53
Remove createTime usage in console formatter
steida Feb 3, 2026
b1b17bc
Add React Native runner and ErrorUtils handling
steida Feb 3, 2026
aea7f85
Bump several package versions in pnpm-lock
steida Feb 3, 2026
635cfa9
Reorder package exports and add default entries
steida Feb 3, 2026
e57edbe
Use workspace deps and react catalog in examples
steida Feb 3, 2026
133fc15
Adjust tests to use mocked listeners and console
steida Feb 3, 2026
e8ad8cc
Clarify ESLint 'Unsafe...' troubleshooting
steida Feb 3, 2026
3f4ebaf
Migrate to monorepo Vitest config
steida Feb 3, 2026
797c53d
Expand TDD guidance and add Vitest examples
steida Feb 3, 2026
ab88e4c
Update pnpm-lock.yaml
steida Feb 3, 2026
ee15fba
Update TreeShaking.test.ts
steida Feb 3, 2026
098935c
Use 'observability' term in error comment
steida Feb 3, 2026
5425031
Rename vitest config to .mts and add scripts tests
steida Feb 3, 2026
5275b07
Add createQueryBuilder, replace createQuery usage
steida Feb 3, 2026
19fef0c
Remove multitenant Example
steida Feb 3, 2026
a5cdd8c
Clarify test naming and execution guidance
steida Feb 4, 2026
8d4c871
Add zipArray utility and tests
steida Feb 4, 2026
630a8a3
Upgrade Biome to v2.3.14
steida Feb 4, 2026
6cbe5bd
Update Features content and icons
steida Feb 4, 2026
80168d9
Normalize casing in docs, tests, and JSDoc groups
steida Feb 4, 2026
06330b8
Rename Runner to Run
steida Feb 4, 2026
4a67e14
Add build/test docs and architecture overview
steida Feb 5, 2026
82c941a
Rename test app owners
steida Feb 5, 2026
f79f9f8
Add incremental TS builds and workspace references
steida Feb 5, 2026
585a79a
Enable ESLint cache and remove monorepo note
steida Feb 5, 2026
cadf5c0
Update pnpm-lock.yaml
steida Feb 6, 2026
6cf8870
Cleaned up tsconfig files across packages
steida Feb 6, 2026
bba6488
Fixed package.json export paths to include src directory
steida Feb 6, 2026
9950864
Added build dependency to turbo dev task
steida Feb 6, 2026
0618f54
Improved createRun JSDoc across platforms
steida Feb 6, 2026
30ee124
Sorted imports in Task.test.ts
steida Feb 6, 2026
eff36aa
Rewrote Evolu as Task-based createEvolu
steida Feb 6, 2026
26bc572
Simplified platform Evolu deps for web, React Native, and React Web
steida Feb 6, 2026
ccf4da1
Restructured React hooks into local-first directory
steida Feb 6, 2026
83f6d3d
Updated Svelte appOwnerState for synchronous appOwner
steida Feb 6, 2026
304da2d
Removed useEvoluError from Vue and sorted exports
steida Feb 6, 2026
6c793b2
Update tsconfig.json
steida Feb 6, 2026
6d98bd2
Update tsconfig.json
steida Feb 6, 2026
1563099
Update index.tsx
steida Feb 6, 2026
5b7f2f9
Stub EvoluFullExample; comment out implementation
steida Feb 6, 2026
84f907e
Update EvoluMinimalExample.tsx
steida Feb 6, 2026
cdf7f89
Shorten Console note in DI docs
steida Feb 6, 2026
53c2ce9
Update Copilot instructions and streamline guidelines
steida Feb 6, 2026
e276095
Update copilot-instructions.md
steida Feb 7, 2026
d41877a
Update pnpm-lock.yaml
steida Feb 7, 2026
2abf93d
Improve SQLite API and test
steida Feb 8, 2026
ab5fdba
Enforce TypeScript usage and 100% coverage
steida Feb 8, 2026
7af128d
Refactor Console formatter and update test snapshot
steida Feb 8, 2026
a506eb8
Cast EvoluContext value to Evolu
steida Feb 8, 2026
ca11fd0
Refactor schema & mutations to Standard Schema v1
steida Feb 8, 2026
89caf30
Remove bench scripts from package.json
steida Feb 8, 2026
c6c4fae
Reduce benchmark timestamp count to 50k
steida Feb 8, 2026
dc7d100
Clarify ESLint restart instruction in docs
steida Feb 9, 2026
eecfbf2
Exclude node_modules in VSCode settings
steida Feb 9, 2026
223a9fc
Use run_vscode_command for ESLint restart
steida Feb 9, 2026
97f5314
Refactor Console: formatter API & store/multi outputs
steida Feb 9, 2026
a76fef8
Update copilot-instructions.md
steida Feb 9, 2026
dfea0cf
Refactor worker abstraction and web worker APIs
steida Feb 9, 2026
3c79301
Bump pnpm to 10.29.2
steida Feb 10, 2026
d70872e
Update pnpm-lock.yaml
steida Feb 10, 2026
8751700
Add inline note for fileParallelism=false
steida Feb 10, 2026
01dd176
Add Console.write to replay entries
steida Feb 11, 2026
671b21c
Update pnpm-lock.yaml
steida Feb 11, 2026
5c134fc
Allow defer to accept cleanup callbacks
steida Feb 13, 2026
815ecf9
Update pnpm-lock.yaml
steida Feb 13, 2026
dc509ca
Bump Biome schema to v2.3.15
steida Feb 13, 2026
3ee6a43
Bump pnpm to 10.29.3
steida Feb 13, 2026
9b2e5ab
Add source exports and Next.js transpile config
steida Feb 13, 2026
9620c0a
Rename SimpleName to Name across codebase
steida Feb 13, 2026
3102f39
Add @emotion/is-prop-valid dependency
steida Feb 13, 2026
6043c38
Align Worker semantics
steida Feb 13, 2026
7ff9555
Initialize local-first Worker wiring
steida Feb 13, 2026
5257fb9
Update tree-shaking test snapshot
steida Feb 13, 2026
0187df6
Expose DisposableStack dependency in Evolu deps
steida Feb 13, 2026
dd66bf2
Update minimal playground to new Evolu config
steida Feb 13, 2026
c8de0c5
Merge remote-tracking branch 'upstream/common-v8' into sync/common-v8…
miccy Feb 13, 2026
ec33b3a
sync: finished
miccy Feb 13, 2026
a59c48b
fix: Correct React Context Provider usage, ensure worker initializati…
miccy Feb 13, 2026
2de8669
Initial plan
Copilot Feb 13, 2026
5194c56
Initial plan
Copilot Feb 13, 2026
6fb80be
Replace ESLint with Biome in react-vite-pwa example
Copilot Feb 13, 2026
2d3b438
Address PR review comments: Fix JSDoc, replace ESLint with Biome, imp…
Copilot Feb 13, 2026
6337210
Merge pull request #34 from SQLoot/copilot/sub-pr-33
miccy Feb 13, 2026
97df638
Remove unnecessary optional chaining after explicit assertions
Copilot Feb 13, 2026
b6af654
Merge branch 'sync/common-v8-2026-02-13' into copilot/sub-pr-33-again
miccy Feb 13, 2026
4b38a5d
Merge pull request #35 from SQLoot/copilot/sub-pr-33-again
miccy Feb 13, 2026
7b0d8a7
chore: Remove ESLint dependencies from examples, add `@evolu/web`, an…
miccy Feb 13, 2026
5ce9163
Merge branch 'sync/common-v8-2026-02-13' into bun-first
miccy Feb 13, 2026
8683c03
docs: keep Bun-first README after common-v8 merge
miccy Feb 13, 2026
2a0d49f
Revert "docs: keep Bun-first README after common-v8 merge"
miccy Feb 13, 2026
0986b37
Revert "Merge branch 'sync/common-v8-2026-02-13' into bun-first"
miccy Feb 13, 2026
c0859a5
sync(common-v8): port safe config/docs updates without regressing Bun…
miccy Feb 13, 2026
31e24f1
feat: Allow injecting ConsoleDep and add `appName` compatibility alia…
miccy Feb 14, 2026
5f34c2c
chore(docs): add bun hot workflow and set sync-guard default
miccy Feb 14, 2026
6480804
Update packages/common/src/local-first/Evolu.ts
miccy Feb 14, 2026
ff10175
refactor: centralize error and console message reporting from worker …
miccy Feb 14, 2026
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
1 change: 1 addition & 0 deletions .changeset/array-module-refactor.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ if (isNonEmptyArray(mutableArr)) { ... }
- **`sortArray`** — returns a new sorted array (wraps `toSorted`), preserving non-empty type
- **`reverseArray`** — returns a new reversed array (wraps `toReversed`), preserving non-empty type
- **`spliceArray`** — returns a new array with elements removed/replaced (wraps `toSpliced`)
- **`zipArray`** — combines multiple arrays into an array of tuples, preserving non-empty type

### Migration

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Redesigned Console with structured logging and pluggable outputs

- Replaced `enabled` property with `ConsoleLevel` filtering (trace < debug < log < info < warn < error < silent)
- Removed `enableLogging` config option - use `level` instead
- Removed `createConsoleWithTime` - use `createConsoleEntryFormatter` with `formatEntry` option
- Removed `createConsoleWithTime` - use `createConsoleFormatter` with `format` option
- Removed `assert` method
- Changed `TestConsole.getLogsSnapshot()` to `getEntriesSnapshot()` returning `ConsoleEntry` objects
- Changed `TestConsole.clearLogs()` to `clearEntries()`
Expand All @@ -21,6 +21,9 @@ Redesigned Console with structured logging and pluggable outputs
- `children: ReadonlySet<Console>` tracks child consoles for batch operations
- `name` property identifies consoles
- `getLevel()`, `setLevel(level | null)`, `hasOwnLevel()` for runtime level control
- `createConsoleEntryFormatter` for timestamps (relative, absolute, iso) and path prefixes
- `createConsoleFormatter` for timestamps (relative, absolute, iso) and path prefixes
- `createNativeConsoleOutput` and `createConsoleArrayOutput` built-in outputs
- Static level inheritance - children inherit parent's level at creation, then are independent
- `createConsoleStoreOutput` — a `ConsoleOutput` that stores the latest entry in a `ReadonlyStore` for observing log entries (e.g., forwarding from workers to main thread)
- `createMultiOutput` — fans out entries to multiple outputs (e.g., native console + store)
- Simplified `testCreateConsole` to delegate to `createConsole` internally
2 changes: 1 addition & 1 deletion .changeset/lovely-aliens-camp.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"@evolu/common": minor
---

Added `createObjectURL` helper for safe, disposable `URL.createObjectURL` usage using JS Resource Management so the URL is disposed automatically when the scope ends.
Added `createObjectURL` helper for safe, disposable `URL.createObjectURL` usage using JS Resource management so the URL is disposed automatically when the scope ends.

Example:

Expand Down
2 changes: 1 addition & 1 deletion .changeset/set-module.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Added Set module with type-safe helpers for immutable set operations.

- `emptySet` — singleton empty set to avoid allocations

**Type Guards:**
**Type guards:**

- `isNonEmptySet` — narrows to branded `NonEmptyReadonlySet`

Expand Down
2 changes: 1 addition & 1 deletion .changeset/spotty-coats-sort.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"@evolu/common": minor
---

Added Resource Management polyfills
Added Resource management polyfills

Provides `Symbol.dispose`, `Symbol.asyncDispose`, `DisposableStack`, and `AsyncDisposableStack` for environments without native support (e.g., Safari). This enables the `using` and `await using` declarations for automatic resource cleanup.

Expand Down
4 changes: 2 additions & 2 deletions .changeset/worker-abstraction-refactor.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
Refactored worker abstraction to support all platforms uniformly:

- Added platform-agnostic worker interfaces: `Worker<Input, Output>`, `SharedWorker<Input, Output>`, `MessagePort<Input, Output>`, `MessageChannel<Input, Output>`
- Added worker-side interfaces: `WorkerScope<Input, Output>` and `SharedWorkerScope<Input, Output>` that extend `GlobalErrorScope` for unified error handling
- Added worker-side interfaces: `WorkerSelf<Input, Output>` and `SharedWorkerSelf<Input, Output>` for typed worker `self` wrappers
- Changed `onMessage` from a method to a property for consistency with Web APIs
- Made all worker and message port interfaces `Disposable` for proper resource cleanup
- Added default generic parameters (`Output = never`) for simpler one-way communication patterns
- Added complete web platform implementations: `createWorker`, `createSharedWorker`, `createMessageChannel`, `createWorkerScope`, `createSharedWorkerScope`, `createMessagePort`
- Added complete web platform implementations: `createWorker`, `createSharedWorker`, `createMessageChannel`, `createWorkerSelf`, `createSharedWorkerSelf`, `createMessagePort`
- Added React Native polyfills for Workers and MessageChannel
26 changes: 26 additions & 0 deletions apps/web/next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,32 @@ const withMDX = nextMDX({
const nextConfig = {
reactStrictMode: true,
pageExtensions: ["js", "jsx", "ts", "tsx", "mdx"],

// Resolve workspace @evolu/* packages to TypeScript source for live reload.
// The "source" condition matches the export added to each package.json.
// The extensionAlias maps .js imports to .ts since packages use NodeNext
// module resolution with explicit .js extensions (required for npm publishing).
transpilePackages: [
"@evolu/common",
"@evolu/web",
"@evolu/react",
"@evolu/react-web",
],
webpack(config) {
config.resolve.conditionNames = [
"source",
"browser",
"import",
"module",
"require",
"default",
];
config.resolve.extensionAlias = {
".js": [".ts", ".tsx", ".js"],
};
return config;
},

outputFileTracingIncludes: {
"/**/*": ["./src/app/**/*.mdx"],
},
Expand Down
1 change: 1 addition & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
],
"dependencies": {
"@algolia/autocomplete-core": "^1.19.4",
"@emotion/is-prop-valid": "^1.4.0",
"@evolu/common": "workspace:*",
"@evolu/react": "workspace:*",
"@evolu/react-web": "workspace:*",
Expand Down
17 changes: 17 additions & 0 deletions apps/web/src/app/(docs)/docs/local-first/page.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,23 @@ const Schema = {
`createdAt`, `updatedAt`, `isDeleted`, and `ownerId`.
</Note>

## Bun hot workflow (schema iteration)

If you run your app entrypoint directly with Bun, you can use hot mode while
iterating on schema and mutations:

```bash
bun --hot ./apps/relay/src/index.ts
```

This keeps process startup fast during development and reloads on file changes.

<Note>
Schema changes can invalidate existing local data during development. If you
hit schema mismatch errors, reset local state (for example with
`resetAppOwner({ reload: false })`) before retrying.
</Note>

## Create Evolu

After defining the schema, create an Evolu instance for your environment.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,15 @@ const Schema = {

const deps = createEvoluDeps();

deps.evoluError.subscribe(() => {
const error = deps.evoluError.get();
if (!error) return;

alert("🚨 Evolu error occurred! Check the console.");
// eslint-disable-next-line no-console
console.error(error);
});

// Create Evolu instance for the React web platform.
const evolu = Evolu.createEvolu(deps)(Schema, {
name: Evolu.SimpleName.orThrow("minimal-example"),
Expand All @@ -46,20 +55,6 @@ const evolu = Evolu.createEvolu(deps)(Schema, {
// in tests via the EvoluProvider.
const useEvolu = createUseEvolu(evolu);

/**
* Subscribe to Evolu errors (database, network, sync issues). These should not
* happen in normal operation, so always log them for debugging. Show users a
* friendly error message instead of technical details.
*/
evolu.subscribeError(() => {
const error = evolu.getError();
if (!error) return;

alert("🚨 Evolu error occurred! Check the console.");
// eslint-disable-next-line no-console
console.error(error);
});

export const EvoluMinimalExample: FC = () => (
<div className="min-h-screen px-8 py-8">
<div className="mx-auto max-w-md">
Expand Down
Loading