Clean up examples and tutorials as well as minor doc tweaks.

Also add a reconnect loop to collab clicker.
This commit is contained in:
Sebastian Jeltsch
2025-01-24 13:41:45 +01:00
parent 66991290fc
commit c3a81d7359
70 changed files with 164 additions and 304 deletions

View File

@@ -13,7 +13,7 @@
<p>
<p align="center">
Simplify with fewer moving parts: an easy to self-host, single-file,
Simplify with fewer moving parts: an easy to self-host, single-executable,
extensible backend for your mobile, web or desktop application.
Sub-millisecond latencies eliminate the need for dedicated caches, no more
stale or inconsistent data.

View File

@@ -37,12 +37,17 @@ export default defineConfig({
slug: "getting-started/starting-up",
},
{
label: "First App",
slug: "getting-started/first-ui-app",
},
{
label: "A CLI App",
slug: "getting-started/first-cli-app",
label: "Tutorials",
items: [
{
label: "API, Vector Search & UI",
slug: "getting-started/first-ui-app",
},
{
label: "Data CLI",
slug: "getting-started/first-cli-app",
},
],
},
{
label: "Philosophy",

View File

@@ -3,9 +3,9 @@ title: PocketBase
description: Comparing TrailBase & PocketBase.
---
Firstly, PocketBase is amazing! It based the trail for single-file, SQLite
application bases, is incredibly easy-to-use, and a polished experience. Gani,
the person behind it, is a mad scientist.
Firstly, PocketBase is amazing! It based the trail for single-executable,
SQLite application bases, is incredibly easy-to-use, and a polished
experience. Gani, the person behind it, is a mad scientist.
At the surface-level there are a lot of similarities between PocketBase and
TrailBase. In this comparison, we'll dive a little deeper and have a closer
@@ -49,6 +49,7 @@ Likewise, TrailBase has a few nifty tricks up its sleeve:
being enforced all the way down to the database level[^4].
- TrailBase's JavaScript runtime supports full ES6, TypeScript transpilation,
and is built on V8 making it [~40x faster](/reference/benchmarks/#javascript-performance).
Supporting ES makes it easier to integrate popular JS frameworks for SSR.
- First-class access to all of SQLite's features and capabilities.
- A simple auth UI.
- Stateless JWT auth-tokens for simple, hermetic authentication in other

View File

@@ -6,7 +6,7 @@ import { Code } from "@astrojs/starlight/components";
import { Aside } from "@astrojs/starlight/components";
In this tutorial, we'll set up a database with an IMDB test dataset, spin up
TrailBase and write a simple client CLI application to access the data using
TrailBase and write a simple client CLI application to query the data using
*Record APIs*.
In an effort to demonstrate TrailBase's loose coupling and the possibility of
@@ -161,12 +161,12 @@ version and copy&paste the JSON schema from above.
With the generated types, we can use the TrailBase TypeScript client to write
the following program:
import fillCode from "@root/examples/tutorial/scripts/src/fill.ts?raw";
import fillCode from "@root/examples/data-cli-tutorial/src/fill.ts?raw";
<Code
code={fillCode}
lang="ts"
title={"examples/tutorial/scripts/src/fill.ts"}
title={"examples/data-cli-tutorial/src/fill.ts"}
mark={[]}
/>

View File

@@ -13,7 +13,7 @@ production-ready web app all in ~100 lines of code.
<div class="flex justify-center">
<div class="w-[80%] shadow-lg ">
![screenshot](../../../../../examples/coffeesearch/assets/screenshot.png)
![screenshot](../../../../../examples/coffee-vector-search/assets/screenshot.png)
</div>
</div>
@@ -24,7 +24,7 @@ can be downloaded to follow along by running:
```bash
$ git clone https://github.com/trailbaseio/trailbase.git
$ cd trailbase/examples/coffeesearch
$ cd trailbase/examples/coffee-vector-search
```
import GettingTrailBase from "./_getting_trailbase.md";
@@ -37,15 +37,15 @@ import GettingTrailBase from "./_getting_trailbase.md";
Before building the app, let's import some data. Keeping it simple,
we'll use the `sqlite3` CLI[^1] directly to import
`examples/coffeesearch/arabica_data_cleaned.csv` with the following SQL
`examples/coffee-vector-search/arabica_data_cleaned.csv` with the following SQL
script:
import importScript from "@root/examples/coffeesearch/import.sql?raw";
import importScript from "@root/examples/coffee-vector-search/import.sql?raw";
<Code
code={importScript}
lang="sql"
title={"examples/coffeesearch/import.sql"}
title={"examples/coffee-vector-search/import.sql"}
mark={[]}
/>
@@ -54,7 +54,7 @@ Note that we didn't initialize the vector `embedding`. This is merely because
We'll update the entries later on, adding the embedding as part of our initial
database migrations[^2].
From within the `example/coffeesearch` directory, you can execute the script
From within the `example/coffee-vector-search` directory, you can execute the script
above and import the coffee data by running:
```bash
@@ -91,16 +91,16 @@ Any time you start `trail run`[^3], JavaScript and TypeScript files under
</Aside>
We can use this to register custom HTTP API routes among other things.
Let's have a quick look at `examples/coffeesearch/traildepot/scripts/main.ts`,
Let's have a quick look at `examples/coffee-vector-search/traildepot/scripts/main.ts`,
which defines a `/search` API route we'll later use in our application to
find coffees most closely matching our desired coffee notes:
import handlerCode from "@root/examples/coffeesearch/traildepot/scripts/main.ts?raw";
import handlerCode from "@root/examples/coffee-vector-search/traildepot/scripts/main.ts?raw";
<Code
code={handlerCode}
lang="ts"
title={"examples/coffeesearch/traildepot/scripts/main.ts"}
title={"examples/coffee-vector-search/traildepot/scripts/main.ts"}
mark={[]}
/>
@@ -141,12 +141,12 @@ framework, e.g.: `npm create vite@latest my-project -- --template react`.
Our provided reference implementation, renders 4 numeric input fields to search
for coffee with a certain aroma, flavor, acidity and sweetness score:
import uiCode from "../../../../../examples/coffeesearch/src/App.tsx?raw";
import uiCode from "../../../../../examples/coffee-vector-search/src/App.tsx?raw";
<Code
code={uiCode}
lang="ts"
title={"examples/coffeesearch/src/App.tsx"}
title={"examples/coffee-vector-search/src/App.tsx"}
mark={[]}
/>
@@ -190,7 +190,7 @@ depending on a pyramid of shared libraries or requiring other services to be up
and running like a separate database server.
This makes it very easy to just copy the files over to your server or bundle
everything in a single container.
`examples/coffeesearch/Dockerfile` is an example of how you can both build and
`examples/coffee-vector-search/Dockerfile` is an example of how you can both build and
bundle using Docker. In fact,
```

View File

@@ -103,9 +103,9 @@ import { Duration100kInsertsChart } from "./reference/_benchmarks/benchmarks.tsx
<CardGrid>
<Card title="Simple" icon="heart">
TrailBase is a small, single file, static binary that is incredibly easy
to deploy **consistently** across integration testing, development, pre-prod,
and production environments including edge.
TrailBase is a small static binary that is incredibly easy to deploy
**consistently** across integration testing, development, pre-prod, and
production environments including edge.
Architecturally, TrailBase aims to be a simple, thin abstraction around
standards helping full or piece-meal adoption and avoiding lock-in.

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

@@ -1,5 +1,5 @@
{
"name": "coffeesearch",
"name": "coffee-vector-search",
"private": true,
"version": "0.1.0",
"type": "module",

View File

@@ -1,5 +1,5 @@
TRAILBIN ?= RUST_BACKTRACE=1 cargo run --
DISTDIR := solid-ssr-app/dist
DISTDIR := dist
run: traildepot/scripts/entry-server.js
${TRAILBIN} --data-dir=traildepot run --public-dir=${DISTDIR}/client
@@ -8,9 +8,9 @@ traildepot/scripts/entry-server.js: ${DISTDIR}/server/entry-server.js
cp $< $@
${DISTDIR}/server/entry-server.js:
cd solid-ssr-app; pnpm run build
pnpm run build
clean:
rm -rf solid-ssr-app/dist
rm -rf dist
.PHONY: run clean

View File

@@ -6,7 +6,7 @@ export default [
pluginJs.configs.recommended,
...tseslint.configs.recommended,
{
ignores: ["dist/", "node_modules/"],
ignores: ["dist/", "node_modules/", "traildepot/"],
},
{
files: ["**/*.{js,mjs,cjs,mts,ts,tsx,jsx}"],

View File

@@ -1,5 +1,5 @@
{
"name": "solid-ssr-app",
"name": "collab-clicker-ssr",
"private": true,
"version": "0.0.1",
"type": "module",

View File

@@ -0,0 +1,77 @@
import { createSignal, onMount } from "solid-js"
export type Clicked = {
count: number
};
declare global {
interface Window {
__INITIAL_DATA__: Clicked | null;
}
}
export function App({ initialCount }: { initialCount?: number }) {
const [count, setCount] = createSignal(initialCount ?? 0)
const onClick = () => {
setCount((count) => count + 1);
fetch("/clicked").then(async (response) => {
const clicked = (await response.json()) as Clicked;
if (clicked.count > count()) {
setCount(clicked.count);
}
});
};
onMount(async () => {
const trailbase = await import("trailbase");
const sleep = (ms: number) => new Promise(r => setTimeout(r, ms));
const listen = async () => {
const client = new trailbase.Client(window.location.origin);
const api = client.records("counter");
const reader = (await api.subscribe(1)).getReader();
while (true) {
const { done, value } = await reader.read();
if (done) {
console.log("done");
break;
}
const update = value as { Update?: { value?: number } };
const updatedCount = update.Update?.value;
if (updatedCount && updatedCount > count()) {
setCount(updatedCount);
}
}
};
// Re-connect loop.
while (true) {
await listen().catch(console.error)
await sleep(5000);
}
});
return (
<div class="flex flex-col gap-4 text-neutral-800">
<h1>TrailBase Clicker</h1>
<div class="px-4 py-2">
<button
class="rounded bg-neutral-100 p-2 font-medium hover:scale-110 hover:outline outline-accent-600 active:scale-100 animate-all"
onClick={onClick}
>
clicked {count()} times
</button>
</div>
<p>
Click the button across different tabs, windows or browsers.
</p>
</div>
)
}

View File

@@ -5,7 +5,7 @@ let _template: Promise<string> | null = null;
async function getTemplate(): Promise<string> {
if (_template == null) {
const template = _template = fs.readTextFile('solid-ssr-app/dist/client/index.html');
const template = _template = fs.readTextFile('dist/client/index.html');
return await template;
}
return await _template;

View File

@@ -24,7 +24,7 @@
"paths": {
"@/*": ["./src/*"],
"@bindings/*": ["../../../trailbase-core/bindings/*"]
"@bindings/*": ["../../trailbase-core/bindings/*"]
}
},
"include": [

View File

@@ -0,0 +1,10 @@
read: fill
pnpm run read
fill:
pnpm run fill
clean:
rm -rf traildepot/data
.PHONY: clean read fill

View File

@@ -5,10 +5,10 @@ export default [
pluginJs.configs.recommended,
...tseslint.configs.recommended,
{
ignores: ["dist/", "node_modules/", "types"],
ignores: ["dist/", "node_modules/", "types", "traildepot"],
},
{
files: ["scripts/*.{js,mjs,cjs,mts,ts,tsx,jsx}"],
files: ["src/*.{js,mjs,cjs,mts,ts,tsx,jsx}"],
rules: {
// https://typescript-eslint.io/rules/no-explicit-any/
"@typescript-eslint/no-explicit-any": "warn",

View File

@@ -11,7 +11,7 @@
"paths": {
"@/*": ["./src/*"],
"@schema/*": ["./types/*"],
"@bindings/*": ["../../../trailbase-core/bindings/*"]
"@bindings/*": ["../../trailbase-core/bindings/*"]
}
},
"include": ["src/**/*"],

View File

@@ -1,66 +0,0 @@
import { createSignal, onMount } from 'solid-js'
export type Clicked = {
count: number
};
declare global {
interface Window {
__INITIAL_DATA__: Clicked | null;
}
}
export function App({initialCount }: {initialCount?: number}) {
const [count, setCount] = createSignal(initialCount ?? 0)
const onClick = () => {
setCount((count) => count + 1);
fetch('/clicked').then(async (response) => {
const clicked = (await response.json()) as Clicked;
if (clicked.count > count()) {
setCount(clicked.count);
}
});
};
onMount(async () => {
const trailbase = await import("trailbase");
const client = new trailbase.Client(window.location.origin);
const api = client.records('counter');
const reader = (await api.subscribe(1)).getReader();
while (true) {
const { done, value } = await reader.read();
if (done || !value) {
break;
}
const update = value as { Update?: { value? : number}};
const updatedCount = update.Update?.value;
if (updatedCount && updatedCount > count()) {
setCount(updatedCount);
}
}
});
return (
<div class="flex flex-col gap-4 text-neutral-800">
<h1>TrailBase Clicker</h1>
<div class="px-4 py-2">
<button
class="rounded bg-neutral-100 p-2 font-medium hover:scale-110 hover:outline outline-accent-600 active:scale-100 animate-all"
onClick={onClick}
>
clicked {count()} times
</button>
</div>
<p>
Click the button across different tabs, windows or browsers.
</p>
</div>
)
}

View File

@@ -1,4 +0,0 @@
clean:
rm -rf traildepot/data
.PHONY: clean

View File

@@ -1,12 +0,0 @@
default: types/movie.ts
types/movie.ts: schema/movie.json
pnpm quicktype -s schema $< -o $@
schema/movie.json:
cargo run -- --data-dir=../traildepot schema movies --mode insert > $@
clean:
rm -f types/* schema/*
.PHONY: clean

207
pnpm-lock.yaml generated
View File

@@ -156,7 +156,7 @@ importers:
specifier: ^0.33.5
version: 0.33.5
examples/coffeesearch:
examples/coffee-vector-search:
dependencies:
react:
specifier: ^19.0.0
@@ -170,10 +170,10 @@ importers:
version: 9.18.0
'@types/react':
specifier: ^19.0.7
version: 19.0.7
version: 19.0.8
'@types/react-dom':
specifier: ^19.0.3
version: 19.0.3(@types/react@19.0.7)
version: 19.0.3(@types/react@19.0.8)
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0))
@@ -202,20 +202,14 @@ importers:
specifier: ^6.0.11
version: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0)
examples/ssr/solid-ssr-app:
examples/collab-clicker-ssr:
dependencies:
'@tailwindcss/vite':
specifier: ^4.0.0
version: 4.0.0(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0))
solid-js:
specifier: ^1.9.3
version: 1.9.4
tailwindcss:
specifier: ^3.4.17
version: 3.4.17(ts-node@10.9.2(@types/node@22.10.7)(typescript@5.7.3))
trailbase:
specifier: workspace:*
version: link:../../../trailbase-core/js/client
version: link:../../trailbase-core/js/client
devDependencies:
'@eslint/js':
specifier: ^9.18.0
@@ -241,9 +235,15 @@ importers:
globals:
specifier: ^15.14.0
version: 15.14.0
prettier:
specifier: ^3.4.2
version: 3.4.2
sirv:
specifier: ^3.0.0
version: 3.0.0
tailwindcss:
specifier: ^3.4.17
version: 3.4.17(ts-node@10.9.2(@types/node@22.10.7)(typescript@5.7.3))
typescript-eslint:
specifier: ^8.21.0
version: 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
@@ -257,14 +257,14 @@ importers:
specifier: ^2.11.0
version: 2.11.0(solid-js@1.9.4)(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0))
examples/tutorial/scripts:
examples/data-cli-tutorial:
dependencies:
csv-parse:
specifier: ^5.6.0
version: 5.6.0
trailbase:
specifier: workspace:*
version: link:../../../trailbase-core/js/client
version: link:../../trailbase-core/js/client
devDependencies:
'@eslint/js':
specifier: ^9.18.0
@@ -563,6 +563,12 @@ importers:
trailbase-core/js/runtime:
devDependencies:
'@eslint/js':
specifier: ^9.18.0
version: 9.18.0
eslint:
specifier: ^9.18.0
version: 9.18.0(jiti@2.4.2)
prettier:
specifier: ^3.4.2
version: 3.4.2
@@ -1752,89 +1758,11 @@ packages:
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@tailwindcss/node@4.0.0':
resolution: {integrity: sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g==}
'@tailwindcss/oxide-android-arm64@4.0.0':
resolution: {integrity: sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@tailwindcss/oxide-darwin-arm64@4.0.0':
resolution: {integrity: sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tailwindcss/oxide-darwin-x64@4.0.0':
resolution: {integrity: sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tailwindcss/oxide-freebsd-x64@4.0.0':
resolution: {integrity: sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0':
resolution: {integrity: sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tailwindcss/oxide-linux-arm64-gnu@4.0.0':
resolution: {integrity: sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-arm64-musl@4.0.0':
resolution: {integrity: sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-x64-gnu@4.0.0':
resolution: {integrity: sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-linux-x64-musl@4.0.0':
resolution: {integrity: sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-win32-arm64-msvc@4.0.0':
resolution: {integrity: sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tailwindcss/oxide-win32-x64-msvc@4.0.0':
resolution: {integrity: sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tailwindcss/oxide@4.0.0':
resolution: {integrity: sha512-W3FjpJgy4VV1JiL7iBYDf2n/WkeDg1Il+0Q7eWnqPyvkPPCo/Mbwc5BiaT7dfBNV6tQKAhVE34rU5xl8pSl50w==}
engines: {node: '>= 10'}
'@tailwindcss/typography@0.5.16':
resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==}
peerDependencies:
tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
'@tailwindcss/vite@4.0.0':
resolution: {integrity: sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew==}
peerDependencies:
vite: ^5.2.0 || ^6
'@tanstack/form-core@0.41.3':
resolution: {integrity: sha512-ifGRimfnYgc+SQikx8ngWGhIxs5UHutSwUQ1IPFHZ6PRAfCTEEqDtXqaWZGkuzvf8itoxXdwsR+chEdwiPtsPA==}
@@ -1986,8 +1914,8 @@ packages:
peerDependencies:
'@types/react': ^19.0.0
'@types/react@19.0.7':
resolution: {integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==}
'@types/react@19.0.8':
resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==}
'@types/sax@1.2.7':
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
@@ -2762,10 +2690,6 @@ packages:
end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
enhanced-resolve@5.18.0:
resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@@ -4711,13 +4635,6 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
tailwindcss@4.0.0:
resolution: {integrity: sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==}
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'}
@@ -6773,59 +6690,6 @@ snapshots:
dependencies:
tslib: 2.8.1
'@tailwindcss/node@4.0.0':
dependencies:
enhanced-resolve: 5.18.0
jiti: 2.4.2
tailwindcss: 4.0.0
'@tailwindcss/oxide-android-arm64@4.0.0':
optional: true
'@tailwindcss/oxide-darwin-arm64@4.0.0':
optional: true
'@tailwindcss/oxide-darwin-x64@4.0.0':
optional: true
'@tailwindcss/oxide-freebsd-x64@4.0.0':
optional: true
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0':
optional: true
'@tailwindcss/oxide-linux-arm64-gnu@4.0.0':
optional: true
'@tailwindcss/oxide-linux-arm64-musl@4.0.0':
optional: true
'@tailwindcss/oxide-linux-x64-gnu@4.0.0':
optional: true
'@tailwindcss/oxide-linux-x64-musl@4.0.0':
optional: true
'@tailwindcss/oxide-win32-arm64-msvc@4.0.0':
optional: true
'@tailwindcss/oxide-win32-x64-msvc@4.0.0':
optional: true
'@tailwindcss/oxide@4.0.0':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.0.0
'@tailwindcss/oxide-darwin-arm64': 4.0.0
'@tailwindcss/oxide-darwin-x64': 4.0.0
'@tailwindcss/oxide-freebsd-x64': 4.0.0
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.0
'@tailwindcss/oxide-linux-arm64-gnu': 4.0.0
'@tailwindcss/oxide-linux-arm64-musl': 4.0.0
'@tailwindcss/oxide-linux-x64-gnu': 4.0.0
'@tailwindcss/oxide-linux-x64-musl': 4.0.0
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.0
'@tailwindcss/oxide-win32-x64-msvc': 4.0.0
'@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@16.18.124)(typescript@4.9.4)))':
dependencies:
lodash.castarray: 4.4.0
@@ -6842,14 +6706,6 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.7)(typescript@5.7.3))
'@tailwindcss/vite@4.0.0(vite@6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0))':
dependencies:
'@tailwindcss/node': 4.0.0
'@tailwindcss/oxide': 4.0.0
lightningcss: 1.29.1
tailwindcss: 4.0.0
vite: 6.0.11(@types/node@22.10.7)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0)
'@tanstack/form-core@0.41.3':
dependencies:
'@tanstack/store': 0.7.0
@@ -7002,11 +6858,11 @@ snapshots:
'@types/range-parser@1.2.7': {}
'@types/react-dom@19.0.3(@types/react@19.0.7)':
'@types/react-dom@19.0.3(@types/react@19.0.8)':
dependencies:
'@types/react': 19.0.7
'@types/react': 19.0.8
'@types/react@19.0.7':
'@types/react@19.0.8':
dependencies:
csstype: 3.1.3
@@ -7798,7 +7654,7 @@ snapshots:
compressible@2.0.18:
dependencies:
mime-db: 1.52.0
mime-db: 1.53.0
compression@1.7.5:
dependencies:
@@ -8024,11 +7880,6 @@ snapshots:
dependencies:
once: 1.4.0
enhanced-resolve@5.18.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
entities@4.5.0: {}
es-define-property@1.0.1: {}
@@ -8880,7 +8731,8 @@ snapshots:
jiti@1.21.7: {}
jiti@2.4.2: {}
jiti@2.4.2:
optional: true
js-base64@3.7.7: {}
@@ -9002,6 +8854,7 @@ snapshots:
lightningcss-linux-x64-musl: 1.29.1
lightningcss-win32-arm64-msvc: 1.29.1
lightningcss-win32-x64-msvc: 1.29.1
optional: true
lilconfig@3.1.3: {}
@@ -10696,10 +10549,6 @@ snapshots:
transitivePeerDependencies:
- ts-node
tailwindcss@4.0.0: {}
tapable@2.2.1: {}
tar@6.2.1:
dependencies:
chownr: 2.0.0

View File

@@ -1,13 +1,13 @@
packages:
- 'docs'
- 'docs/examples/record_api_ts'
- 'examples/blog/web'
- 'examples/coffee-vector-search'
- 'examples/collab-clicker-ssr'
- 'examples/data-cli-tutorial'
- 'trailbase-core/js/admin'
- 'trailbase-core/js/auth'
- 'trailbase-core/js/client'
- 'examples/blog/web'
- 'examples/coffeesearch'
- 'examples/tutorial/scripts'
- 'examples/ssr/solid-ssr-app'
- 'trailbase-core/js/runtime'
options:
prefer-workspace-packages: true