mirror of
https://github.com/trailbaseio/trailbase.git
synced 2026-01-06 09:50:10 -06:00
Clean up examples and tutorials as well as minor doc tweaks.
Also add a reconnect loop to collab clicker.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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={[]}
|
||||
/>
|
||||
|
||||
|
||||
@@ -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 ">
|
||||

|
||||

|
||||
</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,
|
||||
|
||||
```
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
|
Can't render this file because it is too large.
|
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "coffeesearch",
|
||||
"name": "coffee-vector-search",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
@@ -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
|
||||
@@ -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}"],
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "solid-ssr-app",
|
||||
"name": "collab-clicker-ssr",
|
||||
"private": true,
|
||||
"version": "0.0.1",
|
||||
"type": "module",
|
||||
77
examples/collab-clicker-ssr/src/App.tsx
Normal file
77
examples/collab-clicker-ssr/src/App.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@@ -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;
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
"paths": {
|
||||
"@/*": ["./src/*"],
|
||||
"@bindings/*": ["../../../trailbase-core/bindings/*"]
|
||||
"@bindings/*": ["../../trailbase-core/bindings/*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
10
examples/data-cli-tutorial/Makefile
Normal file
10
examples/data-cli-tutorial/Makefile
Normal file
@@ -0,0 +1,10 @@
|
||||
read: fill
|
||||
pnpm run read
|
||||
|
||||
fill:
|
||||
pnpm run fill
|
||||
|
||||
clean:
|
||||
rm -rf traildepot/data
|
||||
|
||||
.PHONY: clean read fill
|
||||
@@ -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",
|
||||
@@ -11,7 +11,7 @@
|
||||
"paths": {
|
||||
"@/*": ["./src/*"],
|
||||
"@schema/*": ["./types/*"],
|
||||
"@bindings/*": ["../../../trailbase-core/bindings/*"]
|
||||
"@bindings/*": ["../../trailbase-core/bindings/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
clean:
|
||||
rm -rf traildepot/data
|
||||
|
||||
.PHONY: clean
|
||||
@@ -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
207
pnpm-lock.yaml
generated
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user