Compare commits
51 Commits
jazz-nodej
...
cojson-sto
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc55e5c8e8 | ||
|
|
4a74ccf399 | ||
|
|
a442315995 | ||
|
|
0d5ee3ed07 | ||
|
|
4e32cae8a7 | ||
|
|
49d721a29b | ||
|
|
2c6d27598d | ||
|
|
e637cb0700 | ||
|
|
c42848ece9 | ||
|
|
841a818dff | ||
|
|
f74881a3fe | ||
|
|
c559054378 | ||
|
|
d6d9c0adcb | ||
|
|
cdf9b5a71c | ||
|
|
4b950bce14 | ||
|
|
8343d8f0fe | ||
|
|
eeb280f17b | ||
|
|
a927334b40 | ||
|
|
be0c1bcda5 | ||
|
|
b861daca60 | ||
|
|
b4cd307eba | ||
|
|
1d0e83d3fa | ||
|
|
be7c4c29a1 | ||
|
|
ffa4db0b61 | ||
|
|
7daf992c51 | ||
|
|
333c583265 | ||
|
|
bfa5e14112 | ||
|
|
dcdf89bba7 | ||
|
|
a6e6939015 | ||
|
|
71aa24054d | ||
|
|
4c88421440 | ||
|
|
64bad01d9a | ||
|
|
4dfa809a77 | ||
|
|
726df167f8 | ||
|
|
2f62cbde13 | ||
|
|
93ef74219d | ||
|
|
495aa81335 | ||
|
|
99caaba328 | ||
|
|
4bfcc787a1 | ||
|
|
7e96eb12dd | ||
|
|
a71eba2eb5 | ||
|
|
b129cf9328 | ||
|
|
a6e31c41b7 | ||
|
|
47746ff9ba | ||
|
|
4e4319a546 | ||
|
|
d1de8baf1d | ||
|
|
d427a2a13c | ||
|
|
1fa6c3987a | ||
|
|
ddf49e532f | ||
|
|
e7733a5428 | ||
|
|
4683cc7ada |
@@ -2,8 +2,8 @@
|
||||
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [],
|
||||
"linked": [
|
||||
"linked": [],
|
||||
"fixed": [
|
||||
[
|
||||
"cojson",
|
||||
"cojson-storage",
|
||||
@@ -27,6 +27,8 @@
|
||||
"jazz-react-native-core",
|
||||
"jazz-react-native",
|
||||
"jazz-react-native-media-images",
|
||||
"jazz-richtext-prosemirror",
|
||||
"jazz-richtext-tiptap",
|
||||
"jazz-run",
|
||||
"jazz-svelte",
|
||||
"jazz-tools",
|
||||
|
||||
1
.github/workflows/e2e-rn-test.yml
vendored
1
.github/workflows/e2e-rn-test.yml
vendored
@@ -38,7 +38,6 @@ jobs:
|
||||
- name: chat-rn-expo App Pre Build
|
||||
working-directory: ./examples/chat-rn-expo
|
||||
run: |
|
||||
pnpm build
|
||||
pnpm expo prebuild --clean
|
||||
|
||||
- name: Install Maestro
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -20,6 +20,9 @@ __screenshots__
|
||||
# Playwright
|
||||
test-results
|
||||
|
||||
# Java
|
||||
.java-version
|
||||
|
||||
.husky
|
||||
|
||||
.vscode/*
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# betterauth
|
||||
|
||||
## 0.1.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-betterauth-server-plugin@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
- jazz-react-auth-betterauth@0.14.18
|
||||
- jazz-betterauth-client-plugin@0.14.18
|
||||
|
||||
## 0.1.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "betterauth",
|
||||
"version": "0.1.20",
|
||||
"version": "0.1.21",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# chat-rn-expo-clerk
|
||||
|
||||
## 1.0.141
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-expo@0.14.18
|
||||
- jazz-react-native-media-images@0.14.18
|
||||
|
||||
## 1.0.140
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "chat-rn-expo-clerk",
|
||||
"main": "index.js",
|
||||
"version": "1.0.140",
|
||||
"version": "1.0.141",
|
||||
"scripts": {
|
||||
"build": "expo export -p ios",
|
||||
"start": "expo start",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# chat-rn-expo
|
||||
|
||||
## 1.0.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-expo@0.14.18
|
||||
|
||||
## 1.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"ios": {
|
||||
"supportsTablet": true,
|
||||
"bundleIdentifier": "com.anonymous.chatrnexpo"
|
||||
"bundleIdentifier": "tools.jazz.chatrnexpo"
|
||||
},
|
||||
"android": {
|
||||
"adaptiveIcon": {
|
||||
@@ -22,7 +22,7 @@
|
||||
"backgroundColor": "#ffffff"
|
||||
},
|
||||
"edgeToEdgeEnabled": true,
|
||||
"package": "com.anonymous.chatrnexpo"
|
||||
"package": "tools.jazz.chatrnexpo"
|
||||
},
|
||||
"web": {
|
||||
"favicon": "./assets/favicon.png"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-rn-expo",
|
||||
"version": "1.0.8",
|
||||
"version": "1.0.9",
|
||||
"main": "index.ts",
|
||||
"scripts": {
|
||||
"build": "expo prebuild",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# fully erased. The tap into the input field hits the middle, and clears all
|
||||
# text to the left. If there's more to the right, it slides left, and thus we
|
||||
# repeat this step. https://maestro.mobile.dev/api-reference/commands/erasetext
|
||||
appId: com.jazz.chatrn
|
||||
appId: tools.jazz.chatrnexpo
|
||||
---
|
||||
- copyTextFrom:
|
||||
id: ${id}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
appId: com.jazz.chatrn
|
||||
appId: tools.jazz.chatrnexpo
|
||||
---
|
||||
- launchApp
|
||||
|
||||
|
||||
@@ -3,14 +3,18 @@
|
||||
# This script is necessary, because unlike ios, the android emulator action
|
||||
# accepts a script, runs it as your tests, then terminates.
|
||||
|
||||
# set -e
|
||||
set -e
|
||||
|
||||
# # build and install the app
|
||||
# echo "Building and installing Android app."
|
||||
# echo "If it fails, its output will be in artifact: android-install.log..."
|
||||
# cd ./android/
|
||||
# ./gradlew installRelease >> ~/output/android-install.log 2>&1
|
||||
# cd ..
|
||||
OUTPUT_FILE=~/output/android-install.log
|
||||
mkdir -p ~/output
|
||||
touch $OUTPUT_FILE
|
||||
|
||||
# build and install the app
|
||||
echo "Building and installing Android app."
|
||||
echo "If it fails, its output will be in artifact: android-install.log..."
|
||||
cd ./android/
|
||||
./gradlew installRelease >> $OUTPUT_FILE 2>&1
|
||||
cd ..
|
||||
|
||||
# run the e2e tests
|
||||
export PATH="$PATH":"$HOME/.maestro/bin"
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# chat-rn
|
||||
|
||||
## 1.0.136
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [0d5ee3e]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- cojson@0.14.18
|
||||
- jazz-react-native@0.14.18
|
||||
- cojson-transport-ws@0.14.18
|
||||
|
||||
## 1.0.135
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -26,7 +26,7 @@ This will set up and launch the app on iOS. For Android, you can skip `pnpm pods
|
||||
This was created using the following command:
|
||||
|
||||
```bash
|
||||
pnpx @react-native-community/cli init chat-rn --version 0.76.7 --install-pods true --skip-git-init true --package-name com.chatrn --directory chat-rn
|
||||
pnpx @react-native-community/cli init chat-rn --version 0.76.9 --install-pods true --skip-git-init true --package-name com.chatrn --directory chat-rn
|
||||
```
|
||||
|
||||
Then change package name in `package.json`, and begin build instructions above.
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
"name": "ChatRN",
|
||||
"displayName": "ChatRN",
|
||||
"android": {
|
||||
"package": "com.anonymous.ChatRN"
|
||||
"package": "tools.jazz.chatrn"
|
||||
},
|
||||
"ios": {
|
||||
"bundleIdentifier": "com.anonymous.ChatRN"
|
||||
"bundleIdentifier": "tools.jazz.chatrn"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -26,7 +26,7 @@ module.exports = makeMetroConfig({
|
||||
resolveRequest: MetroSymlinksResolver(),
|
||||
extraNodeModules,
|
||||
nodeModulesPaths,
|
||||
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
||||
},
|
||||
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
||||
watchFolders,
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-rn",
|
||||
"version": "1.0.135",
|
||||
"version": "1.0.136",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"android": "react-native run-android",
|
||||
@@ -40,10 +40,10 @@
|
||||
"@react-native-community/cli": "15.0.1",
|
||||
"@react-native-community/cli-platform-android": "15.0.1",
|
||||
"@react-native-community/cli-platform-ios": "15.0.1",
|
||||
"@react-native/babel-preset": "0.76.7",
|
||||
"@react-native/eslint-config": "0.76.7",
|
||||
"@react-native/metro-config": "0.76.7",
|
||||
"@react-native/typescript-config": "0.76.7",
|
||||
"@react-native/babel-preset": "0.76.9",
|
||||
"@react-native/eslint-config": "0.76.9",
|
||||
"@react-native/metro-config": "0.76.9",
|
||||
"@react-native/typescript-config": "0.76.9",
|
||||
"@rnx-kit/metro-config": "^2.0.1",
|
||||
"@rnx-kit/metro-resolver-symlinks": "^0.2.1",
|
||||
"@types/react": "^18.3.12",
|
||||
|
||||
@@ -3,7 +3,6 @@ import { useAccount, useCoState } from "jazz-react-native";
|
||||
import { CoPlainText, Group, ID, Loaded, Profile } from "jazz-tools";
|
||||
import { useEffect, useState } from "react";
|
||||
import {
|
||||
Alert,
|
||||
Button,
|
||||
FlatList,
|
||||
KeyboardAvoidingView,
|
||||
@@ -19,6 +18,7 @@ import { Chat, Message } from "./schema";
|
||||
export function ChatScreen({ navigation }: { navigation: any }) {
|
||||
const { me, logOut } = useAccount();
|
||||
const [chatId, setChatId] = useState<string>();
|
||||
const [chatIdInput, setChatIdInput] = useState<string>();
|
||||
const loadedChat = useCoState(Chat, chatId, { resolve: { $each: true } });
|
||||
const [message, setMessage] = useState("");
|
||||
const profile = useCoState(Profile, me._refs.profile?.id, {});
|
||||
@@ -36,10 +36,8 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
||||
<Button
|
||||
onPress={() => {
|
||||
if (loadedChat?.id) {
|
||||
Clipboard.setString(
|
||||
`https://chat.jazz.tools/#/chat/${loadedChat.id}`,
|
||||
);
|
||||
Alert.alert("Copied to clipboard", `Chat ID: ${loadedChat.id}`);
|
||||
Clipboard.setString(loadedChat.id);
|
||||
console.log("Copied to clipboard", `Chat ID: ${loadedChat.id}`);
|
||||
}
|
||||
}}
|
||||
title="Share"
|
||||
@@ -56,27 +54,11 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
||||
};
|
||||
|
||||
const joinChat = () => {
|
||||
Alert.prompt(
|
||||
"Join Chat",
|
||||
"Enter the Chat ID (example: co_zBGEHYvRfGuT2YSBraY3njGjnde)",
|
||||
[
|
||||
{
|
||||
text: "Cancel",
|
||||
style: "cancel",
|
||||
},
|
||||
{
|
||||
text: "Join",
|
||||
onPress: (chatId) => {
|
||||
if (chatId) {
|
||||
setChatId(chatId);
|
||||
} else {
|
||||
Alert.alert("Error", "Chat ID cannot be empty.");
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
"plain-text",
|
||||
);
|
||||
if (chatIdInput) {
|
||||
setChatId(chatIdInput as ID<Chat>);
|
||||
} else {
|
||||
console.warn("Error: Chat ID cannot be empty.");
|
||||
}
|
||||
};
|
||||
|
||||
const sendMessage = () => {
|
||||
@@ -153,6 +135,16 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
||||
<TouchableOpacity onPress={createChat} style={styles.newChatButton}>
|
||||
<Text style={styles.buttonText}>Start new chat</Text>
|
||||
</TouchableOpacity>
|
||||
<Text style={styles.usernameLabel}>Join existing chat</Text>
|
||||
<TextInput
|
||||
style={styles.chatIdInput}
|
||||
placeholder="Chat ID"
|
||||
value={chatIdInput ?? ""}
|
||||
onChangeText={setChatIdInput}
|
||||
textAlignVertical="center"
|
||||
onSubmitEditing={joinChat}
|
||||
testID="chat-id-input"
|
||||
/>
|
||||
<TouchableOpacity onPress={joinChat} style={styles.joinChatButton}>
|
||||
<Text style={styles.buttonText}>Join chat</Text>
|
||||
</TouchableOpacity>
|
||||
@@ -205,27 +197,91 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
flexDirection: "column",
|
||||
height: "100%",
|
||||
},
|
||||
welcomeContainer: {
|
||||
flex: 1,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
padding: 16,
|
||||
},
|
||||
usernameLabel: {
|
||||
fontSize: 16,
|
||||
fontWeight: "bold",
|
||||
marginBottom: 16,
|
||||
},
|
||||
usernameInput: {
|
||||
width: 160,
|
||||
height: 48,
|
||||
borderWidth: 1,
|
||||
borderColor: "#ddd",
|
||||
borderRadius: 8,
|
||||
paddingHorizontal: 8,
|
||||
marginBottom: 24,
|
||||
},
|
||||
chatIdInput: {
|
||||
width: 320,
|
||||
height: 48,
|
||||
borderWidth: 1,
|
||||
borderColor: "#ddd",
|
||||
borderRadius: 8,
|
||||
paddingHorizontal: 8,
|
||||
marginBottom: 24,
|
||||
marginTop: 8,
|
||||
},
|
||||
newChatButton: {
|
||||
backgroundColor: "#3B82F6",
|
||||
padding: 16,
|
||||
borderRadius: 8,
|
||||
marginBottom: 24,
|
||||
},
|
||||
joinChatButton: {
|
||||
backgroundColor: "#10B981",
|
||||
padding: 16,
|
||||
borderRadius: 8,
|
||||
},
|
||||
buttonText: {
|
||||
color: "white",
|
||||
fontSize: 16,
|
||||
fontWeight: "bold",
|
||||
textAlign: "center",
|
||||
},
|
||||
messageList: {
|
||||
flex: 1,
|
||||
},
|
||||
inputContainer: {
|
||||
padding: 12,
|
||||
},
|
||||
inputWrapper: {
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
borderWidth: 1,
|
||||
borderColor: "#ddd",
|
||||
borderRadius: 8,
|
||||
paddingHorizontal: 12,
|
||||
},
|
||||
messageInput: {
|
||||
flex: 1,
|
||||
height: 32,
|
||||
paddingHorizontal: 8,
|
||||
},
|
||||
sendButton: {
|
||||
paddingHorizontal: 16,
|
||||
},
|
||||
messageContainer: {
|
||||
borderRadius: 8,
|
||||
paddingVertical: 4,
|
||||
paddingHorizontal: 6,
|
||||
maxWidth: "80%",
|
||||
flexDirection: "column",
|
||||
alignItems: "flex-start",
|
||||
marginBottom: 8,
|
||||
},
|
||||
myMessage: {
|
||||
backgroundColor: "#e5e7eb", // gray-200
|
||||
alignSelf: "flex-end",
|
||||
textAlign: "right",
|
||||
},
|
||||
otherMessage: {
|
||||
backgroundColor: "#d1d5db", // gray-300
|
||||
alignSelf: "flex-start",
|
||||
},
|
||||
senderName: {
|
||||
fontSize: 12,
|
||||
color: "#6b7280", // gray-500
|
||||
color: "#666",
|
||||
marginBottom: 4,
|
||||
},
|
||||
textRight: {
|
||||
textAlign: "right",
|
||||
@@ -234,92 +290,27 @@ const styles = StyleSheet.create({
|
||||
textAlign: "left",
|
||||
},
|
||||
messageContent: {
|
||||
position: "relative",
|
||||
flexDirection: "row",
|
||||
alignItems: "flex-end",
|
||||
justifyContent: "space-between",
|
||||
backgroundColor: "#f0f0f0",
|
||||
borderRadius: 8,
|
||||
padding: 8,
|
||||
},
|
||||
messageText: {
|
||||
color: "#000000",
|
||||
fontSize: 16,
|
||||
maxWidth: "85%",
|
||||
},
|
||||
timestamp: {
|
||||
fontSize: 10,
|
||||
color: "#6b7280", // gray-500
|
||||
textAlign: "right",
|
||||
marginLeft: 8,
|
||||
color: "#666",
|
||||
marginTop: 4,
|
||||
},
|
||||
timestampOther: {
|
||||
textAlign: "left",
|
||||
marginTop: 8,
|
||||
},
|
||||
timestampMy: {
|
||||
textAlign: "right",
|
||||
marginTop: 4,
|
||||
},
|
||||
welcomeContainer: {
|
||||
flex: 1,
|
||||
flexDirection: "column",
|
||||
height: "100%",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
},
|
||||
usernameLabel: {
|
||||
fontSize: 16,
|
||||
fontWeight: "bold",
|
||||
marginBottom: 24,
|
||||
},
|
||||
usernameInput: {
|
||||
borderRadius: 4,
|
||||
height: 48,
|
||||
padding: 8,
|
||||
marginBottom: 48,
|
||||
width: 160,
|
||||
borderWidth: 1,
|
||||
borderColor: "#e5e7eb", // gray-200
|
||||
},
|
||||
newChatButton: {
|
||||
backgroundColor: "#3b82f6", // blue-500
|
||||
padding: 16,
|
||||
borderRadius: 6,
|
||||
},
|
||||
joinChatButton: {
|
||||
backgroundColor: "#10b981", // green-500
|
||||
padding: 16,
|
||||
borderRadius: 6,
|
||||
marginTop: 16,
|
||||
},
|
||||
buttonText: {
|
||||
color: "white",
|
||||
fontWeight: "600",
|
||||
},
|
||||
messageList: {
|
||||
flex: 1,
|
||||
},
|
||||
inputContainer: {
|
||||
paddingVertical: 16,
|
||||
paddingHorizontal: 10,
|
||||
backgroundColor: "white",
|
||||
borderTopWidth: 1,
|
||||
borderTopColor: "#d1d5db", // gray-300
|
||||
},
|
||||
inputWrapper: {
|
||||
flex: 1,
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
margin: 5,
|
||||
},
|
||||
messageInput: {
|
||||
borderRadius: 20,
|
||||
height: 32,
|
||||
paddingVertical: 0,
|
||||
paddingHorizontal: 8,
|
||||
borderWidth: 1,
|
||||
borderColor: "#e5e7eb", // gray-200
|
||||
flex: 1,
|
||||
},
|
||||
sendButton: {
|
||||
marginLeft: 10,
|
||||
backgroundColor: "#d1d5db", // gray-300
|
||||
avatar: {
|
||||
borderRadius: 16,
|
||||
height: 32,
|
||||
width: 32,
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# chat-vue
|
||||
|
||||
## 0.0.116
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-browser@0.14.18
|
||||
- jazz-vue@0.14.18
|
||||
|
||||
## 0.0.115
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-vue",
|
||||
"version": "0.0.115",
|
||||
"version": "0.0.116",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# jazz-example-chat
|
||||
|
||||
## 0.0.216
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.215
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-chat",
|
||||
"private": true,
|
||||
"version": "0.0.215",
|
||||
"version": "0.0.216",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# minimal-auth-clerk
|
||||
|
||||
## 0.0.115
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
- jazz-react-auth-clerk@0.14.18
|
||||
|
||||
## 0.0.114
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "clerk",
|
||||
"private": true,
|
||||
"version": "0.0.114",
|
||||
"version": "0.0.115",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# file-share-svelte
|
||||
|
||||
## 0.0.100
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-inspector-element@0.14.18
|
||||
- jazz-svelte@0.14.18
|
||||
|
||||
## 0.0.99
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "file-share-svelte",
|
||||
"version": "0.0.99",
|
||||
"version": "0.0.100",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# jazz-tailwind-demo-auth-starter
|
||||
|
||||
## 0.0.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "filestream",
|
||||
"private": true,
|
||||
"version": "0.0.54",
|
||||
"version": "0.0.55",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# form
|
||||
|
||||
## 0.1.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.1.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "form",
|
||||
"private": true,
|
||||
"version": "0.1.55",
|
||||
"version": "0.1.56",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# image-upload
|
||||
|
||||
## 0.0.112
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.111
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "image-upload",
|
||||
"private": true,
|
||||
"version": "0.0.111",
|
||||
"version": "0.0.112",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# jazz-example-inspector
|
||||
|
||||
## 0.0.165
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0d5ee3e]
|
||||
- cojson@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- cojson-transport-ws@0.14.18
|
||||
|
||||
## 0.0.164
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-inspector-app",
|
||||
"private": true,
|
||||
"version": "0.0.164",
|
||||
"version": "0.0.165",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# jazz-nextjs
|
||||
|
||||
## 0.1.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.1.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-nextjs",
|
||||
"version": "0.1.4",
|
||||
"version": "0.1.5",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --turbopack",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# multi-cursors
|
||||
|
||||
## 0.0.108
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.107
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "multi-cursors",
|
||||
"private": true,
|
||||
"version": "0.0.107",
|
||||
"version": "0.0.108",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# multiauth
|
||||
|
||||
## 0.0.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
- jazz-react-auth-clerk@0.14.18
|
||||
|
||||
## 0.0.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "multiauth",
|
||||
"private": true,
|
||||
"version": "0.0.55",
|
||||
"version": "0.0.56",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# jazz-example-musicplayer
|
||||
|
||||
## 0.0.137
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.136
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-music-player",
|
||||
"private": true,
|
||||
"version": "0.0.136",
|
||||
"version": "0.0.137",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# organization
|
||||
|
||||
## 0.0.108
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.107
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "organization",
|
||||
"private": true,
|
||||
"version": "0.0.107",
|
||||
"version": "0.0.108",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# passkey-svelte
|
||||
|
||||
## 0.0.102
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-svelte@0.14.18
|
||||
|
||||
## 0.0.101
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "passkey-svelte",
|
||||
"version": "0.0.101",
|
||||
"version": "0.0.102",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# minimal-auth-passkey
|
||||
|
||||
## 0.0.113
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.112
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "passkey",
|
||||
"private": true,
|
||||
"version": "0.0.112",
|
||||
"version": "0.0.113",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# passphrase
|
||||
|
||||
## 0.0.110
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.109
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "passphrase",
|
||||
"private": true,
|
||||
"version": "0.0.109",
|
||||
"version": "0.0.110",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# jazz-password-manager
|
||||
|
||||
## 0.0.134
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.133
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-password-manager",
|
||||
"private": true,
|
||||
"version": "0.0.133",
|
||||
"version": "0.0.134",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# jazz-example-pets
|
||||
|
||||
## 0.0.232
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.231
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-pets",
|
||||
"private": true,
|
||||
"version": "0.0.231",
|
||||
"version": "0.0.232",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# reactions
|
||||
|
||||
## 0.0.112
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.111
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "reactions",
|
||||
"private": true,
|
||||
"version": "0.0.111",
|
||||
"version": "0.0.112",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# richtext-tiptap
|
||||
|
||||
## 0.1.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
- jazz-richtext-tiptap@0.14.18
|
||||
|
||||
## 0.1.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "richtext-tiptap",
|
||||
"private": true,
|
||||
"version": "0.1.24",
|
||||
"version": "0.1.25",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# richtext
|
||||
|
||||
## 0.0.102
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
- jazz-richtext-prosemirror@0.14.18
|
||||
|
||||
## 0.0.101
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "richtext",
|
||||
"private": true,
|
||||
"version": "0.0.101",
|
||||
"version": "0.0.102",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# todo-vue
|
||||
|
||||
## 0.0.114
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-browser@0.14.18
|
||||
- jazz-vue@0.14.18
|
||||
|
||||
## 0.0.113
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "todo-vue",
|
||||
"version": "0.0.113",
|
||||
"version": "0.0.114",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# jazz-example-todo
|
||||
|
||||
## 0.0.231
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.230
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-todo",
|
||||
"private": true,
|
||||
"version": "0.0.230",
|
||||
"version": "0.0.231",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# version-history
|
||||
|
||||
## 0.0.110
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [4b950bc]
|
||||
- Updated dependencies [d6d9c0a]
|
||||
- Updated dependencies [c559054]
|
||||
- jazz-tools@0.14.18
|
||||
- jazz-inspector@0.14.18
|
||||
- jazz-react@0.14.18
|
||||
|
||||
## 0.0.109
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "version-history",
|
||||
"private": true,
|
||||
"version": "0.0.109",
|
||||
"version": "0.0.110",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -72,7 +72,7 @@ export const team: Array<TeamMember> = [
|
||||
{
|
||||
name: "Emil Sayahi",
|
||||
titles: ["Full-Stack Dev", "Support Dev"],
|
||||
location: "Oxford, Ohio, US",
|
||||
location: "San Francisco, California, US",
|
||||
github: "emmyoh",
|
||||
linkedin: "emil-sayahi",
|
||||
bluesky: "sayahi.bsky.social",
|
||||
|
||||
@@ -17,6 +17,7 @@ export default function Home() {
|
||||
<HeroSection />
|
||||
|
||||
<div className="container flex flex-col gap-12 mt-12 lg:gap-20 lg:mt-20">
|
||||
<SupportedEnvironmentsSection />
|
||||
<HowJazzWorksSection />
|
||||
|
||||
<Testimonial name="Spreadsheet app (stealth)" role="CTO">
|
||||
@@ -51,8 +52,6 @@ export default function Home() {
|
||||
|
||||
<FeaturesSection />
|
||||
|
||||
<SupportedEnvironmentsSection />
|
||||
|
||||
<ComingSoonSection />
|
||||
|
||||
<EarlyAdopterSection />
|
||||
|
||||
@@ -3,7 +3,7 @@ import { ThemeProvider } from "@/components/ThemeProvider";
|
||||
import { JazzFooter } from "@/components/footer";
|
||||
import { marketingCopy } from "@/content/marketingCopy";
|
||||
import { fontClasses } from "@garden-co/design-system/src/fonts";
|
||||
import { Analytics } from "@vercel/analytics/react";
|
||||
import { Analytics } from "@vercel/analytics/next";
|
||||
import { SpeedInsights } from "@vercel/speed-insights/next";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ export function FeaturesSection() {
|
||||
|
||||
<Prose size="sm">
|
||||
or{" "}
|
||||
<Link href="/docs/sync-and-storage#running-your-own">
|
||||
<Link href="/docs/react/sync-and-storage#running-your-own-sync-server">
|
||||
self-host
|
||||
</Link>
|
||||
.
|
||||
|
||||
@@ -1,95 +1,118 @@
|
||||
import { KotlinLogo } from "@/components/icons/KotlinLogo";
|
||||
import { BunLogo } from "@/components/icons/BunLogo";
|
||||
import { CloudflareWorkerLogo } from "@/components/icons/CloudflareWorkerLogo";
|
||||
import { ExpoLogo } from "@/components/icons/ExpoLogo";
|
||||
import { JavascriptLogo } from "@/components/icons/JavascriptLogo";
|
||||
import { NodejsLogo } from "@/components/icons/NodejsLogo";
|
||||
import { ReactLogo } from "@/components/icons/ReactLogo";
|
||||
import { ReactNativeLogo } from "@/components/icons/ReactNativeLogo";
|
||||
import { RustLogo } from "@/components/icons/RustLogo";
|
||||
import { SvelteLogo } from "@/components/icons/SvelteLogo";
|
||||
import { SwiftLogo } from "@/components/icons/SwiftLogo";
|
||||
import { VueLogo } from "@/components/icons/VueLogo";
|
||||
import { Icon } from "@garden-co/design-system/src/components/atoms/Icon";
|
||||
import { GappedGrid } from "@garden-co/design-system/src/components/molecules/GappedGrid";
|
||||
import React from "react";
|
||||
|
||||
export function SupportedEnvironmentsSection() {
|
||||
const supported = [
|
||||
const frameworks = [
|
||||
{
|
||||
name: "Browser (vanilla JS)",
|
||||
icon: (
|
||||
<Icon
|
||||
name="browser"
|
||||
size="3xl"
|
||||
className="text-highlight"
|
||||
height="1em"
|
||||
width="1em"
|
||||
/>
|
||||
),
|
||||
name: "JavaScript",
|
||||
icon: JavascriptLogo,
|
||||
},
|
||||
{
|
||||
name: "React",
|
||||
icon: <ReactLogo />,
|
||||
icon: ReactLogo,
|
||||
},
|
||||
{
|
||||
name: "React Native",
|
||||
icon: <ReactNativeLogo />,
|
||||
icon: ReactNativeLogo,
|
||||
},
|
||||
{
|
||||
name: "Vue",
|
||||
icon: <VueLogo />,
|
||||
name: "Expo",
|
||||
icon: ExpoLogo,
|
||||
},
|
||||
{
|
||||
name: "Svelte",
|
||||
icon: <SvelteLogo />,
|
||||
},
|
||||
{
|
||||
name: "Node.js",
|
||||
icon: <NodejsLogo />,
|
||||
icon: SvelteLogo,
|
||||
},
|
||||
];
|
||||
|
||||
const comingSoon = [
|
||||
const serverWorkers = [
|
||||
{
|
||||
name: "Swift",
|
||||
icon: <SwiftLogo />,
|
||||
name: "Node.js",
|
||||
icon: NodejsLogo,
|
||||
},
|
||||
{
|
||||
name: "Rust",
|
||||
icon: <RustLogo className="text-black dark:text-white" />,
|
||||
name: "Cloudflare Workers",
|
||||
icon: CloudflareWorkerLogo,
|
||||
},
|
||||
{
|
||||
name: "Kotlin",
|
||||
icon: <KotlinLogo />,
|
||||
name: "Bun",
|
||||
icon: BunLogo,
|
||||
},
|
||||
];
|
||||
|
||||
const first = [
|
||||
{
|
||||
name: "JavaScript",
|
||||
icon: JavascriptLogo,
|
||||
},
|
||||
{
|
||||
name: "React",
|
||||
icon: ReactLogo,
|
||||
},
|
||||
{
|
||||
name: "Svelte",
|
||||
icon: SvelteLogo,
|
||||
},
|
||||
{
|
||||
name: "Expo",
|
||||
icon: ExpoLogo,
|
||||
},
|
||||
{
|
||||
name: "React Native",
|
||||
icon: ReactNativeLogo,
|
||||
},
|
||||
];
|
||||
|
||||
const second = [
|
||||
{
|
||||
name: "Node.js",
|
||||
icon: NodejsLogo,
|
||||
},
|
||||
{
|
||||
name: "Cloudflare Workers",
|
||||
icon: CloudflareWorkerLogo,
|
||||
},
|
||||
{
|
||||
name: "Bun",
|
||||
icon: BunLogo,
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3 lg:gap-8">
|
||||
<h2 className="font-semibold tracking-tight font-display text-2xl text-stone-900 lg:text-balance sm:text-4xl dark:text-white">
|
||||
Jazz works with your favorite stack
|
||||
</h2>
|
||||
<div className="flex flex-col gap-6 lg:col-span-2 lg:gap-8">
|
||||
<div className="flex flex-col gap-5 lg:flex-row lg:gap-8">
|
||||
{supported.map((tech) => (
|
||||
<div key={tech.name} className="flex items-center gap-2">
|
||||
<span className="text-xl">{tech.icon}</span>
|
||||
<div className="text-center font-medium text-highlight lg:text-lg">
|
||||
{tech.name}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="flex flex-col gap-3">
|
||||
<p className="text-sm">Coming soon</p>
|
||||
<div className="flex gap-x-5 gap-y-3 flex-wrap">
|
||||
{comingSoon.map((tech) => (
|
||||
<div key={tech.name} className="flex items-center gap-2">
|
||||
<span className="text-xl">{tech.icon}</span>
|
||||
<div className="text-center text-sm text-highlight">
|
||||
{tech.name}
|
||||
<>
|
||||
<h2 className="sr-only">Supported environments</h2>
|
||||
<GappedGrid>
|
||||
{[
|
||||
{
|
||||
label: "Build apps with",
|
||||
items: frameworks,
|
||||
},
|
||||
{
|
||||
label: "Optionally add server workers",
|
||||
items: serverWorkers,
|
||||
},
|
||||
].map(({ label, items }) => (
|
||||
<div className="col-span-2 lg:col-span-3" key={label}>
|
||||
<h3 className="mb-4 text-highlight font-medium">{label}</h3>
|
||||
<div className="flex gap-x-6 gap-y-3 grayscale flex-col lg:flex-row">
|
||||
{items.map(({ name, icon: Icon }) => (
|
||||
<div key={name} className="flex items-center gap-2">
|
||||
<Icon className="size-6" />
|
||||
{name}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</GappedGrid>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
75
homepage/homepage/components/icons/BunLogo.tsx
Normal file
75
homepage/homepage/components/icons/BunLogo.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
export function BunLogo(props: React.SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
width="1em"
|
||||
height="1em"
|
||||
{...props}
|
||||
viewBox="0 0 435 435"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M384.167 143.033C383.348 142.139 382.477 141.246 381.606 140.405C380.735 139.563 379.916 138.617 379.045 137.776C378.174 136.935 377.354 135.989 376.483 135.147C375.613 134.306 374.793 133.36 373.922 132.519C373.051 131.678 372.232 130.731 371.361 129.89C370.49 129.049 369.67 128.103 368.799 127.262C367.929 126.421 367.109 125.474 366.238 124.633C391.647 150.26 406.204 185.123 406.758 221.68C406.758 308.791 320.596 379.657 214.66 379.657C155.34 379.657 102.269 357.419 66.9745 322.565L69.5358 325.193L72.0971 327.822L74.6584 330.45L77.2197 333.079L79.781 335.707L82.3424 338.336L84.9037 340.965C120.147 377.291 174.396 400.686 235.15 400.686C341.086 400.686 427.249 329.819 427.249 242.971C427.249 205.856 411.676 170.686 384.167 143.033Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M393.951 221.68C393.951 301.641 313.68 366.462 214.66 366.462C115.639 366.462 35.3678 301.641 35.3678 221.68C35.3678 172.105 66.1035 128.313 113.334 102.343C160.565 76.3726 189.969 49.7714 214.66 49.7714C239.351 49.7714 260.456 71.4834 315.985 102.343C363.216 128.313 393.951 172.105 393.951 221.68Z"
|
||||
fill="#FBF0DF"
|
||||
/>
|
||||
<path
|
||||
d="M393.951 221.68C393.926 211.408 392.548 201.187 389.853 191.294C375.868 366.356 167.788 374.768 85.9794 322.407C122.755 351.659 168.136 367.196 214.66 366.462C313.526 366.462 393.951 301.536 393.951 221.68Z"
|
||||
fill="#F6DECE"
|
||||
/>
|
||||
<path
|
||||
d="M145.658 92.7223C168.556 78.6332 198.984 52.1897 228.901 52.1372C224.298 50.6105 219.496 49.8127 214.66 49.7714C202.263 49.7714 189.047 56.3429 172.398 66.2263C166.609 69.696 160.616 73.5337 154.264 77.5292C142.328 85.0994 128.651 93.6686 113.283 102.238C64.5155 129.312 35.3678 173.945 35.3678 221.68C35.3678 223.783 35.3678 225.886 35.3678 227.936C66.4109 115.381 122.811 106.811 145.658 92.7223Z"
|
||||
fill="#FFFEFC"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M199.906 63.072C199.978 75.4853 197.439 87.7682 192.461 99.0821C187.484 110.396 180.186 120.474 171.066 128.629C169.632 129.943 170.759 132.466 172.603 131.73C189.866 124.843 213.174 104.235 203.339 62.6514C202.929 60.2857 199.906 60.9166 199.906 63.072ZM211.535 63.072C217.803 73.5675 221.785 85.3299 223.208 97.5527C224.632 109.776 223.463 122.17 219.782 133.886C219.167 135.726 221.37 137.303 222.6 135.778C233.818 121.058 243.602 91.8286 214.301 60.2857C212.815 58.9189 210.51 61.0217 211.535 62.8617V63.072ZM225.673 62.1783C235.489 69.3099 243.7 78.5187 249.753 89.1837C255.807 99.8487 259.561 111.722 260.763 124.002C260.711 124.445 260.827 124.891 261.087 125.248C261.347 125.605 261.731 125.846 262.159 125.92C262.588 125.994 263.027 125.897 263.387 125.647C263.747 125.398 264 125.016 264.093 124.581C268.806 106.233 266.142 74.9531 227.364 58.7086C225.315 57.8674 223.983 60.7063 225.673 61.968V62.1783ZM131.11 116.853C142.785 113.273 153.596 107.209 162.837 99.0574C172.078 90.9054 179.542 80.8474 184.743 69.5383C185.666 67.6457 188.585 68.3817 188.124 70.4846C179.262 112.542 149.602 121.321 131.161 120.165C129.214 120.217 129.266 117.431 131.11 116.853Z"
|
||||
fill="#CCBEA7"
|
||||
/>
|
||||
<path
|
||||
d="M214.66 379.657C108.724 379.657 22.5613 308.791 22.5613 221.68C22.5613 169.109 54.2191 120.059 107.238 90.672C122.606 82.2606 135.771 73.7966 147.502 66.384C153.957 62.2834 160.052 58.4457 165.944 54.8709C183.924 43.936 199.292 36.6286 214.66 36.6286C230.028 36.6286 243.449 42.9371 260.251 53.136C265.374 56.1326 270.496 59.392 275.977 62.9669C288.733 71.0629 303.127 80.2103 322.081 90.672C375.1 120.059 406.758 169.056 406.758 221.68C406.758 308.791 320.596 379.657 214.66 379.657ZM214.66 49.7714C202.263 49.7714 189.047 56.3429 172.398 66.2263C166.609 69.696 160.616 73.5337 154.264 77.5292C142.328 85.0995 128.651 93.6686 113.283 102.238C64.5156 129.312 35.3678 173.945 35.3678 221.68C35.3678 301.536 115.793 366.515 214.66 366.515C313.526 366.515 393.951 301.536 393.951 221.68C393.951 173.945 364.804 129.312 315.985 102.343C296.622 91.8286 281.51 81.9452 269.267 74.1646C263.683 70.6423 258.561 67.3829 253.899 64.4914C238.377 55.0286 227.056 49.7714 214.66 49.7714Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M250.774 260.057C248.473 269.73 243.234 278.401 235.816 284.818C230.246 290.359 223.036 293.837 215.325 294.702C207.383 293.974 199.92 290.487 194.169 284.818C186.826 278.371 181.662 269.703 179.416 260.057C179.341 259.485 179.396 258.902 179.575 258.354C179.753 257.806 180.052 257.308 180.448 256.897C180.843 256.486 181.325 256.173 181.857 255.983C182.388 255.793 182.955 255.73 183.514 255.799H246.727C247.282 255.738 247.843 255.808 248.368 256.002C248.893 256.196 249.368 256.51 249.758 256.92C250.147 257.33 250.441 257.825 250.617 258.369C250.793 258.912 250.847 259.489 250.774 260.057V260.057Z"
|
||||
fill="#B71422"
|
||||
/>
|
||||
<path
|
||||
d="M194.169 285.239C199.908 290.911 207.344 294.431 215.274 295.227C223.186 294.419 230.603 290.901 236.328 285.239C238.16 283.487 239.871 281.607 241.451 279.614C238.295 275.94 234.44 272.967 230.124 270.879C225.807 268.79 221.12 267.63 216.35 267.47C211.246 267.594 206.249 268.989 201.787 271.535C197.325 274.081 193.533 277.701 190.737 282.085C191.915 283.189 192.94 284.24 194.169 285.239Z"
|
||||
fill="#FF6164"
|
||||
/>
|
||||
<path
|
||||
d="M194.989 281.086C197.528 277.717 200.779 274.982 204.497 273.088C208.215 271.195 212.302 270.19 216.453 270.151C224.124 270.383 231.433 273.552 236.943 279.035C238.121 277.721 239.248 276.354 240.324 274.987C233.807 268.618 225.195 264.996 216.196 264.841C211.388 264.884 206.648 266.018 202.317 268.163C197.986 270.308 194.171 273.411 191.147 277.248C192.358 278.598 193.641 279.88 194.989 281.086V281.086Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M215.121 297.856C206.585 297.089 198.552 293.383 192.325 287.342C184.395 280.459 178.814 271.158 176.394 260.793C176.22 259.871 176.25 258.92 176.48 258.01C176.71 257.101 177.136 256.255 177.726 255.536C178.428 254.666 179.314 253.972 180.317 253.508C181.321 253.043 182.414 252.82 183.514 252.855H246.727C247.826 252.831 248.916 253.06 249.917 253.524C250.919 253.987 251.806 254.675 252.516 255.536C253.1 256.258 253.518 257.105 253.74 258.015C253.961 258.925 253.981 259.875 253.796 260.793C251.376 271.158 245.795 280.459 237.865 287.342C231.652 293.373 223.639 297.077 215.121 297.856ZM183.514 258.953C182.694 258.953 182.49 259.321 182.438 259.426C184.604 268.414 189.502 276.461 196.423 282.4C201.484 287.517 208.064 290.755 215.121 291.6C222.159 290.764 228.732 287.567 233.818 282.505C240.718 276.556 245.597 268.511 247.752 259.532C247.64 259.363 247.485 259.23 247.304 259.147C247.124 259.063 246.924 259.033 246.727 259.058L183.514 258.953Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M292.626 263.317C309.177 263.317 322.593 255.22 322.593 245.232C322.593 235.244 309.177 227.147 292.626 227.147C276.076 227.147 262.659 235.244 262.659 245.232C262.659 255.22 276.076 263.317 292.626 263.317Z"
|
||||
fill="#FEBBD0"
|
||||
/>
|
||||
<path
|
||||
d="M137.564 263.317C154.115 263.317 167.532 255.22 167.532 245.232C167.532 235.244 154.115 227.147 137.564 227.147C121.014 227.147 107.597 235.244 107.597 245.232C107.597 255.22 121.014 263.317 137.564 263.317Z"
|
||||
fill="#FEBBD0"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M151.651 237.977C157.236 237.988 162.698 236.298 167.347 233.121C171.995 229.944 175.621 225.424 177.765 220.132C179.909 214.84 180.476 209.014 179.392 203.391C178.309 197.769 175.625 192.603 171.679 188.546C167.734 184.49 162.705 181.726 157.228 180.604C151.751 179.482 146.074 180.053 140.913 182.243C135.753 184.434 131.341 188.147 128.238 192.912C125.134 197.676 123.477 203.279 123.477 209.01C123.477 216.684 126.444 224.044 131.726 229.474C137.008 234.905 144.174 237.963 151.651 237.977V237.977ZM278.539 237.977C284.13 238.019 289.607 236.355 294.276 233.198C298.944 230.04 302.594 225.531 304.762 220.242C306.929 214.953 307.518 209.122 306.452 203.489C305.386 197.856 302.714 192.675 298.775 188.603C294.836 184.531 289.807 181.751 284.326 180.616C278.845 179.482 273.16 180.043 267.99 182.229C262.821 184.415 258.4 188.128 255.29 192.896C252.179 197.664 250.518 203.272 250.518 209.01C250.504 216.661 253.446 224.005 258.698 229.434C263.95 234.864 271.084 237.935 278.539 237.977V237.977Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M142.943 210.85C145.042 210.861 147.098 210.231 148.848 209.042C150.599 207.852 151.966 206.157 152.776 204.169C153.587 202.182 153.804 199.992 153.401 197.877C152.997 195.763 151.991 193.819 150.51 192.292C149.029 190.765 147.14 189.723 145.082 189.299C143.023 188.875 140.889 189.087 138.948 189.909C137.008 190.731 135.349 192.126 134.181 193.917C133.014 195.707 132.39 197.813 132.39 199.968C132.39 202.845 133.5 205.605 135.478 207.644C137.456 209.684 140.14 210.836 142.943 210.85ZM269.83 210.85C271.93 210.861 273.985 210.231 275.735 209.042C277.486 207.852 278.853 206.157 279.664 204.169C280.474 202.182 280.691 199.992 280.288 197.877C279.885 195.763 278.879 193.819 277.398 192.292C275.917 190.765 274.028 189.723 271.969 189.299C269.911 188.875 267.776 189.087 265.836 189.909C263.895 190.731 262.236 192.126 261.068 193.917C259.901 195.707 259.278 197.813 259.278 199.968C259.278 202.827 260.374 205.571 262.329 207.608C264.285 209.644 266.942 210.809 269.728 210.85H269.83Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
133
homepage/homepage/components/icons/CloudflareWorkerLogo.tsx
Normal file
133
homepage/homepage/components/icons/CloudflareWorkerLogo.tsx
Normal file
@@ -0,0 +1,133 @@
|
||||
import React from "react";
|
||||
import type { SVGProps } from "react";
|
||||
|
||||
export function CloudflareWorkerLogo(props: SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 416 375"
|
||||
width="1em"
|
||||
height="1em"
|
||||
{...props}
|
||||
>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-a"
|
||||
x1="50%"
|
||||
x2="25.7%"
|
||||
y1="100%"
|
||||
y2="8.7%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#eb6f07" />
|
||||
<stop offset="100%" stopColor="#fab743" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-b"
|
||||
x1="81%"
|
||||
x2="40.5%"
|
||||
y1="83.7%"
|
||||
y2="29.5%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#d96504" />
|
||||
<stop offset="100%" stopColor="#d96504" stopOpacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-c"
|
||||
x1="42%"
|
||||
x2="84%"
|
||||
y1="8.7%"
|
||||
y2="79.9%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#eb6f07" />
|
||||
<stop offset="100%" stopColor="#eb720a" stopOpacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-d"
|
||||
x1="50%"
|
||||
x2="25.7%"
|
||||
y1="100%"
|
||||
y2="8.7%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#ee6f05" />
|
||||
<stop offset="100%" stopColor="#fab743" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-e"
|
||||
x1="-33.2%"
|
||||
x2="91.7%"
|
||||
y1="100%"
|
||||
y2="0%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#d96504" stopOpacity=".8" />
|
||||
<stop offset="49.8%" stopColor="#d96504" stopOpacity=".2" />
|
||||
<stop offset="100%" stopColor="#d96504" stopOpacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-f"
|
||||
x1="50%"
|
||||
x2="25.7%"
|
||||
y1="100%"
|
||||
y2="8.7%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#ffa95f" />
|
||||
<stop offset="100%" stopColor="#ffebc8" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-g"
|
||||
x1="8.1%"
|
||||
x2="96.5%"
|
||||
y1="1.1%"
|
||||
y2="48.8%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#fff" stopOpacity=".5" />
|
||||
<stop offset="100%" stopColor="#fff" stopOpacity=".1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="CloudflareWorkersLogo--gradient-h"
|
||||
x1="-13.7%"
|
||||
y1="104.2%"
|
||||
y2="46.2%"
|
||||
>
|
||||
<stop offset="0%" stopColor="#fff" stopOpacity=".5" />
|
||||
<stop offset="100%" stopColor="#fff" stopOpacity=".1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-a)"
|
||||
d="M107 5.4l49 88.4-45 81a26 26 0 0 0 0 25.3l45 81.2-49 88.4A52 52 0 0 1 85 349L7 213.5a52.2 52.2 0 0 1 0-52L85 26a52 52 0 0 1 22-20.6z"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-b)"
|
||||
d="M111 174.9a26 26 0 0 0 0 25.2l45 81.2-49 88.4A52 52 0 0 1 85 349L7 213.5C.8 202.8 35.5 190 111 175z"
|
||||
opacity=".7"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-c)"
|
||||
d="M112 14.3l44 79.5-7.3 12.7-38.8-65.7C98.7 22.5 81.6 32 60.2 69l3.2-5.5L85 26a52 52 0 0 1 21.8-20.6l5.1 8.9z"
|
||||
opacity=".5"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-d)"
|
||||
d="M331 26l78 135.5c9.3 16 9.3 36 0 52L331 349a52 52 0 0 1-45 26h-78l97-174.9a26 26 0 0 0 0-25.2L208 0h78a52 52 0 0 1 45 26z"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-e)"
|
||||
d="M282 374.4l-77 .7 93.2-175.8a27 27 0 0 0 0-25.4L205 0h17.6l97.8 173.1a27 27 0 0 1-.1 26.8 15624 15624 0 0 0-62.7 110c-19 33.4-10.8 54.9 24.4 64.5z"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-f)"
|
||||
d="M130 375c-8 0-16-1.9-23-5.3l96.2-173.5c3-5.4 3-12 0-17.4L107 5.4A52 52 0 0 1 130 0h78l97 174.9a26 26 0 0 1 0 25.2L208 375h-78z"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-g)"
|
||||
d="M298.2 178.8L199 0h9l97 174.9a26 26 0 0 1 0 25.2L208 375h-9l99.2-178.8c3-5.4 3-12 0-17.4z"
|
||||
opacity=".6"
|
||||
/>
|
||||
<path
|
||||
fill="url(#CloudflareWorkersLogo--gradient-h)"
|
||||
d="M203.2 178.8L107 5.4c3-1.6 6.6-2.8 10-3.8 21.2 38.1 52.5 95.9 94 173.3a26 26 0 0 1 0 25.2L115.5 373c-3.4-1-5.2-1.7-8.4-3.2l96-173.5c3-5.4 3-12 0-17.4z"
|
||||
opacity=".6"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
20
homepage/homepage/components/icons/ExpoLogo.tsx
Normal file
20
homepage/homepage/components/icons/ExpoLogo.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import React from "react";
|
||||
import type { SVGProps } from "react";
|
||||
|
||||
export function ExpoLogo(props: SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
width="1em"
|
||||
height="1em"
|
||||
{...props}
|
||||
viewBox="0 0 24 22"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M11.39 8.269c.19-.277.397-.312.565-.312.168 0 .447.035.637.312 1.49 2.03 3.95 6.075 5.765 9.06 1.184 1.945 2.093 3.44 2.28 3.63.7.714 1.66.269 2.218-.541.549-.797.701-1.357.701-1.954 0-.407-7.958-15.087-8.759-16.309C14.027.98 13.775.683 12.457.683h-.988c-1.315 0-1.505.297-2.276 1.472C8.392 3.377.433 18.057.433 18.463c0 .598.153 1.158.703 1.955.558.81 1.518 1.255 2.218.54.186-.19 1.095-1.684 2.279-3.63 1.815-2.984 4.267-7.029 5.758-9.06z"
|
||||
fill="#000"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
15
homepage/homepage/components/icons/JavascriptLogo.tsx
Normal file
15
homepage/homepage/components/icons/JavascriptLogo.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
export function JavascriptLogo(props: React.SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
width="1em"
|
||||
height="1em"
|
||||
{...props}
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 256 256"
|
||||
preserveAspectRatio="xMinYMin meet"
|
||||
>
|
||||
<path d="M0 0h256v256H0V0z" fill="#F7DF1E" />
|
||||
<path d="M67.312 213.932l19.59-11.856c3.78 6.701 7.218 12.371 15.465 12.371 7.905 0 12.89-3.092 12.89-15.12v-81.798h24.057v82.138c0 24.917-14.606 36.259-35.916 36.259-19.245 0-30.416-9.967-36.087-21.996M152.381 211.354l19.588-11.341c5.157 8.421 11.859 14.607 23.715 14.607 9.969 0 16.325-4.984 16.325-11.858 0-8.248-6.53-11.17-17.528-15.98l-6.013-2.58c-17.357-7.387-28.87-16.667-28.87-36.257 0-18.044 13.747-31.792 35.228-31.792 15.294 0 26.292 5.328 34.196 19.247L210.29 147.43c-4.125-7.389-8.591-10.31-15.465-10.31-7.046 0-11.514 4.468-11.514 10.31 0 7.217 4.468 10.14 14.778 14.608l6.014 2.577c20.45 8.765 31.963 17.7 31.963 37.804 0 21.654-17.012 33.51-39.867 33.51-22.339 0-36.774-10.654-43.819-24.574" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import React from "react";
|
||||
import type { SVGProps } from "react";
|
||||
|
||||
export function KotlinLogo(props: SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 128 128"
|
||||
{...props}
|
||||
>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="deviconKotlin0"
|
||||
x1={500.003}
|
||||
x2={-0.097}
|
||||
y1={579.106}
|
||||
y2={1079.206}
|
||||
gradientTransform="translate(15.534 -96.774)scale(.1939)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset={0.003} stopColor="#e44857"></stop>
|
||||
<stop offset={0.469} stopColor="#c711e1"></stop>
|
||||
<stop offset={1} stopColor="#7f52ff"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path
|
||||
fill="url(#deviconKotlin0)"
|
||||
d="M112.484 112.484H15.516V15.516h96.968L64 64Zm0 0"
|
||||
></path>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,22 +0,0 @@
|
||||
import React from "react";
|
||||
import type { SVGProps } from "react";
|
||||
|
||||
export function SwiftLogo(props: SVGProps<SVGSVGElement>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 256 256"
|
||||
{...props}
|
||||
>
|
||||
<g fill="none">
|
||||
<rect width={256} height={256} fill="#f05138" rx={60}></rect>
|
||||
<path
|
||||
fill="#fff"
|
||||
d="m202.677 158.04l.724-2.896c10.616-42.224-15.201-92.41-59.114-118.71c19.302 26.058 27.747 57.666 20.267 85.172c-.724 2.413-1.448 4.826-2.413 7.239c-.965-.724-2.171-1.448-3.86-2.172c0 0-43.672-27.024-90.963-74.556c-1.207-1.206 25.334 37.881 55.253 69.489c-14.235-7.962-53.564-36.675-78.658-59.355c3.137 5.067 6.756 10.134 10.617 14.718c20.75 26.541 48.015 59.114 80.588 84.207c-22.922 13.995-55.254 15.201-87.344 0c-7.962-3.619-15.442-8.203-22.44-13.27c13.512 21.715 34.504 40.535 60.08 51.634c30.401 13.029 60.803 12.306 83.242.241c0 0 .241 0 .241-.241c.965-.482 1.931-1.206 2.896-1.689c10.857-5.549 32.09-11.099 43.672 11.099c3.378 5.067 9.41-23.887-12.788-50.91"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
export const metadata = {
|
||||
export const metadata = {
|
||||
description: "Learn about Jazz's authentication states: anonymous, guest, and fully authenticated."
|
||||
};
|
||||
|
||||
@@ -77,24 +77,26 @@ This example from our [music player example app](https://github.com/garden-co/ja
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Account, Group, CoMap, coField, CoList } from "jazz-tools";
|
||||
import { co, z, Group } from "jazz-tools";
|
||||
|
||||
class MusicTrack extends CoMap {
|
||||
title = coField.string;
|
||||
duration = coField.number;
|
||||
isExampleTrack = coField.optional.boolean;
|
||||
}
|
||||
class ListOfTracks extends CoList.Of(coField.ref(MusicTrack)) {}
|
||||
class Playlist extends CoMap {
|
||||
title = coField.string;
|
||||
tracks = coField.ref(ListOfTracks);
|
||||
}
|
||||
class MusicaAccountRoot extends CoMap {
|
||||
rootPlaylist = coField.ref(Playlist);
|
||||
}
|
||||
class MusicaAccount extends Account {
|
||||
root = coField.ref(MusicaAccountRoot);
|
||||
}
|
||||
const MusicTrack = co.map({
|
||||
title: z.string(),
|
||||
duration: z.number(),
|
||||
isExampleTrack: z.boolean().optional(),
|
||||
});
|
||||
const Playlist = co.map({
|
||||
title: z.string(),
|
||||
tracks: co.list(MusicTrack),
|
||||
});
|
||||
const MusicaAccountRoot = co.map({
|
||||
rootPlaylist: Playlist,
|
||||
});
|
||||
|
||||
const MusicaAccount = co.account({
|
||||
root: MusicaAccountRoot,
|
||||
profile: co.profile({}),
|
||||
});
|
||||
type MusicaAccount = co.loaded<typeof MusicaAccount>
|
||||
|
||||
// ---cut---
|
||||
export async function onAnonymousAccountDiscarded(
|
||||
|
||||
@@ -68,8 +68,8 @@ Let's write the form component that will be used for both create and update.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import * as React from "react";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
export const BubbleTeaOrder = co.map({
|
||||
name: z.string(),
|
||||
@@ -84,7 +84,7 @@ export function OrderForm({
|
||||
order,
|
||||
onSave,
|
||||
}: {
|
||||
order: Loaded<typeof BubbleTeaOrder> | Loaded<typeof DraftBubbleTeaOrder>;
|
||||
order: co.loaded<typeof BubbleTeaOrder> | co.loaded<typeof DraftBubbleTeaOrder>;
|
||||
onSave?: (e: React.FormEvent<HTMLFormElement>) => void;
|
||||
}) {
|
||||
return (
|
||||
@@ -112,7 +112,7 @@ To make the edit form, simply pass the `BubbleTeaOrder`.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { useCoState } from "jazz-react";
|
||||
import * as React from "react";
|
||||
|
||||
@@ -128,7 +128,7 @@ export function OrderForm({
|
||||
order,
|
||||
onSave,
|
||||
}: {
|
||||
order: Loaded<typeof BubbleTeaOrder> | Loaded<typeof DraftBubbleTeaOrder>;
|
||||
order: co.loaded<typeof BubbleTeaOrder> | co.loaded<typeof DraftBubbleTeaOrder>;
|
||||
onSave?: (e: React.FormEvent<HTMLFormElement>) => void;
|
||||
}) {
|
||||
return (
|
||||
@@ -170,7 +170,7 @@ Here's how that looks like:
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { useCoState, useAccount } from "jazz-react";
|
||||
import * as React from "react";
|
||||
import { useState, useEffect } from "react";
|
||||
@@ -196,7 +196,7 @@ export function OrderForm({
|
||||
order,
|
||||
onSave,
|
||||
}: {
|
||||
order: Loaded<typeof BubbleTeaOrder> | Loaded<typeof DraftBubbleTeaOrder>;
|
||||
order: co.loaded<typeof BubbleTeaOrder> | co.loaded<typeof DraftBubbleTeaOrder>;
|
||||
onSave?: (e: React.FormEvent<HTMLFormElement>) => void;
|
||||
}) {
|
||||
return (
|
||||
@@ -219,7 +219,7 @@ export function OrderForm({
|
||||
// CreateOrder.tsx
|
||||
export function CreateOrder() {
|
||||
const { me } = useAccount();
|
||||
const [draft, setDraft] = useState<Loaded<typeof DraftBubbleTeaOrder>>();
|
||||
const [draft, setDraft] = useState<co.loaded<typeof DraftBubbleTeaOrder>>();
|
||||
|
||||
useEffect(() => {
|
||||
setDraft(DraftBubbleTeaOrder.create({}));
|
||||
@@ -229,7 +229,7 @@ export function CreateOrder() {
|
||||
e.preventDefault();
|
||||
if (!draft || !draft.name) return;
|
||||
|
||||
const order = draft as Loaded<typeof BubbleTeaOrder>; // TODO: this should narrow correctly
|
||||
const order = draft as co.loaded<typeof BubbleTeaOrder>; // TODO: this should narrow correctly
|
||||
|
||||
console.log("Order created:", order);
|
||||
};
|
||||
@@ -249,13 +249,13 @@ Update the schema to include a `validate` helper.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Loaded, CoMap } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
// ---cut---
|
||||
// schema.ts
|
||||
export const DraftBubbleTeaOrder = co.map({
|
||||
name: z.optional(z.string()),
|
||||
}).withHelpers((Self) => ({ // [!code ++:11]
|
||||
validate(draft: Loaded<typeof Self>) {
|
||||
validate(draft: co.loaded<typeof Self>) {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!draft.name) {
|
||||
@@ -272,7 +272,7 @@ Then perform the validation on submit.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { useCoState, useAccount } from "jazz-react";
|
||||
import * as React from "react";
|
||||
import { useState, useEffect } from "react";
|
||||
@@ -284,7 +284,7 @@ export const BubbleTeaOrder = co.map({
|
||||
export const DraftBubbleTeaOrder = co.map({
|
||||
name: z.optional(z.string()),
|
||||
}).withHelpers((Self) => ({
|
||||
validate(draft: Loaded<typeof Self>) {
|
||||
validate(draft: co.loaded<typeof Self>) {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!draft.name) {
|
||||
@@ -308,7 +308,7 @@ export function OrderForm({
|
||||
order,
|
||||
onSave,
|
||||
}: {
|
||||
order: Loaded<typeof BubbleTeaOrder> | Loaded<typeof DraftBubbleTeaOrder>;
|
||||
order: co.loaded<typeof BubbleTeaOrder> | co.loaded<typeof DraftBubbleTeaOrder>;
|
||||
onSave?: (e: React.FormEvent<HTMLFormElement>) => void;
|
||||
}) {
|
||||
return (
|
||||
@@ -331,7 +331,7 @@ export function OrderForm({
|
||||
// CreateOrder.tsx
|
||||
export function CreateOrder() {
|
||||
const { me } = useAccount();
|
||||
const [draft, setDraft] = useState<Loaded<typeof DraftBubbleTeaOrder>>();
|
||||
const [draft, setDraft] = useState<co.loaded<typeof DraftBubbleTeaOrder>>();
|
||||
|
||||
useEffect(() => {
|
||||
setDraft(DraftBubbleTeaOrder.create({}));
|
||||
@@ -347,7 +347,7 @@ export function CreateOrder() {
|
||||
return;
|
||||
}
|
||||
|
||||
const order = draft as Loaded<typeof BubbleTeaOrder>;
|
||||
const order = draft as co.loaded<typeof BubbleTeaOrder>;
|
||||
|
||||
console.log("Order created:", order);
|
||||
};
|
||||
@@ -367,7 +367,7 @@ By storing the draft in the user's account, they can come back to it anytime wit
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Loaded, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
// ---cut---
|
||||
// schema.ts
|
||||
export const BubbleTeaOrder = co.map({
|
||||
@@ -400,7 +400,7 @@ Let's not forget to update the `AccountSchema`.
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
// @filename: schema.tsx
|
||||
import { co, z, Loaded, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
export const BubbleTeaOrder = co.map({
|
||||
name: z.string(),
|
||||
});
|
||||
@@ -427,7 +427,6 @@ export const JazzAccount = co.account({
|
||||
// @filename: App.tsx
|
||||
import * as React from "react";
|
||||
// ---cut---
|
||||
import { Loaded } from "jazz-tools"
|
||||
import { JazzProvider } from "jazz-react";
|
||||
import { JazzAccount } from "./schema"; // [!code ++]
|
||||
|
||||
@@ -449,7 +448,7 @@ Instead of creating a new draft every time we use the create form, let's use the
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
// @filename: schema.ts
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
export const BubbleTeaOrder = co.map({
|
||||
name: z.string(),
|
||||
@@ -458,7 +457,7 @@ export const BubbleTeaOrder = co.map({
|
||||
export const DraftBubbleTeaOrder = co.map({
|
||||
name: z.optional(z.string()),
|
||||
}).withHelpers((Self) => ({
|
||||
validate(draft: Loaded<typeof Self>) {
|
||||
validate(draft: co.loaded<typeof Self>) {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!draft.name) {
|
||||
@@ -488,13 +487,13 @@ export const JazzAccount = co.account({
|
||||
import * as React from "react";
|
||||
import { useCoState, useAccount } from "jazz-react";
|
||||
import { BubbleTeaOrder, DraftBubbleTeaOrder, JazzAccount } from "schema";
|
||||
import { Loaded } from "jazz-tools";
|
||||
import { co } from "jazz-tools";
|
||||
|
||||
export function OrderForm({
|
||||
order,
|
||||
onSave,
|
||||
}: {
|
||||
order: Loaded<typeof BubbleTeaOrder> | Loaded<typeof DraftBubbleTeaOrder>;
|
||||
order: co.loaded<typeof BubbleTeaOrder> | co.loaded<typeof DraftBubbleTeaOrder>;
|
||||
onSave?: (e: React.FormEvent<HTMLFormElement>) => void;
|
||||
}) {
|
||||
return (
|
||||
@@ -535,7 +534,7 @@ export function CreateOrder() {
|
||||
return;
|
||||
}
|
||||
|
||||
const order = draft as Loaded<typeof BubbleTeaOrder>;
|
||||
const order = draft as co.loaded<typeof BubbleTeaOrder>;
|
||||
console.log("Order created:", order);
|
||||
|
||||
// create a new empty draft
|
||||
@@ -576,13 +575,13 @@ Simply add a `hasChanges` helper to your schema.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
// ---cut---
|
||||
// schema.ts
|
||||
export const DraftBubbleTeaOrder = co.map({
|
||||
name: z.optional(z.string()),
|
||||
}).withHelpers((Self) => ({
|
||||
validate(draft: Loaded<typeof Self>) {
|
||||
validate(draft: co.loaded<typeof Self>) {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!draft.name) {
|
||||
@@ -592,7 +591,7 @@ export const DraftBubbleTeaOrder = co.map({
|
||||
return { errors };
|
||||
},
|
||||
|
||||
hasChanges(draft?: Loaded<typeof Self>) { // [!code ++:3]
|
||||
hasChanges(draft?: co.loaded<typeof Self>) { // [!code ++:3]
|
||||
return draft ? Object.keys(draft._edits).length : false;
|
||||
},
|
||||
}));
|
||||
@@ -603,7 +602,7 @@ In the UI, you can choose how you want to show the draft indicator.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { useCoState, useAccount } from "jazz-react";
|
||||
import * as React from "react";
|
||||
|
||||
@@ -614,7 +613,7 @@ export const BubbleTeaOrder = co.map({
|
||||
export const DraftBubbleTeaOrder = co.map({
|
||||
name: z.optional(z.string()),
|
||||
}).withHelpers((Self) => ({
|
||||
validate(draft: Loaded<typeof Self>) {
|
||||
validate(draft: co.loaded<typeof Self>) {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!draft.name) {
|
||||
@@ -624,7 +623,7 @@ export const DraftBubbleTeaOrder = co.map({
|
||||
return { errors };
|
||||
},
|
||||
|
||||
hasChanges(draft?: Loaded<typeof Self>) { // [!code ++:3]
|
||||
hasChanges(draft?: co.loaded<typeof Self>) { // [!code ++:3]
|
||||
return draft ? Object.keys(draft._edits).length : false;
|
||||
},
|
||||
}));
|
||||
@@ -682,7 +681,7 @@ how to handle single-select, multi-select, date, and boolean inputs.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
export const BubbleTeaAddOnTypes = [
|
||||
"Pearl",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export const metadata = {
|
||||
export const metadata = {
|
||||
description: "Manage permissions of CoValues using Groups. Learn how to add members to a Group, check permissions, and more."
|
||||
};
|
||||
|
||||
@@ -34,16 +34,14 @@ You can add group members by ID by using `Account.load` and `Group.addMember`.
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { ID } from "jazz-tools";
|
||||
|
||||
const bobsID = "co_z123" as ID<Account>;
|
||||
const bobsID = "co_z123";
|
||||
|
||||
// ---cut---
|
||||
import { Group, Account } from "jazz-tools";
|
||||
import { Group, co } from "jazz-tools";
|
||||
|
||||
const group = Group.create();
|
||||
|
||||
const bob = await Account.load(bobsID);
|
||||
const bob = await co.account().load(bobsID);
|
||||
|
||||
if (bob) {
|
||||
group.addMember(bob, "writer");
|
||||
@@ -55,14 +53,14 @@ if (bob) {
|
||||
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
const bobsID = "co_z123" as ID<Account>;
|
||||
const bobsID = "co_z123";
|
||||
|
||||
const group = Group.create();
|
||||
|
||||
// ---cut---
|
||||
import { Group, Account, ID } from "jazz-tools";
|
||||
import { co, Group } from "jazz-tools";
|
||||
|
||||
const bob = await Account.load(bobsID as ID<Account>);
|
||||
const bob = await co.account().load(bobsID);
|
||||
|
||||
if (bob) {
|
||||
group.addMember(bob, "writer");
|
||||
@@ -76,7 +74,7 @@ To change a member's role, use the `addMember` method.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, Account, ID } from "jazz-tools";
|
||||
import { Group } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const bob = await createJazzTestAccount();
|
||||
const group = Group.create();
|
||||
@@ -95,7 +93,7 @@ To remove a member, use the `removeMember` method.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, Account, ID } from "jazz-tools";
|
||||
import { Group } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const bob = await createJazzTestAccount();
|
||||
const group = Group.create();
|
||||
@@ -133,7 +131,7 @@ const newValue = MyCoMap.create(
|
||||
```
|
||||
</CodeGroup>
|
||||
|
||||
Because `._owner` can be an `Account` or a `Group`, in cases where you specifically need to use `Group` methods (such as for adding members or getting your own role), you can cast it to assert it to be a Group:
|
||||
Because `._owner` can be an `co.account` or a `Group`, in cases where you specifically need to use `Group` methods (such as for adding members or getting your own role), you can cast it to assert it to be a Group:
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
@@ -166,14 +164,14 @@ You can check the permissions of an account on a CoValue by using the `canRead`,
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
const MyCoMap = co.map({
|
||||
color: z.string(),
|
||||
});
|
||||
// ---cut---
|
||||
const value = await MyCoMap.create({ color: "red"})
|
||||
const me = Account.getMe();
|
||||
const me = await co.account().getMe();
|
||||
|
||||
if (me.canAdmin(value)) {
|
||||
console.log("I can share value with others");
|
||||
@@ -191,7 +189,7 @@ To check the permissions of another account, you need to load it first:
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
|
||||
const MyCoMap = co.map({
|
||||
@@ -201,7 +199,7 @@ const account = await createJazzTestAccount();
|
||||
const accountID = account.id;
|
||||
// ---cut---
|
||||
const value = await MyCoMap.create({ color: "red"})
|
||||
const bob = await Account.load(accountID);
|
||||
const bob = await co.account().load(accountID);
|
||||
|
||||
if (bob) {
|
||||
if (bob.canAdmin(value)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export const metadata = {
|
||||
export const metadata = {
|
||||
description: "Share CoValues in Jazz through public sharing and invite links. Enable collaboration by granting access to everyone or specific users with different permission levels."
|
||||
};
|
||||
|
||||
@@ -86,10 +86,10 @@ Create the data models.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Account } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
// ---cut---
|
||||
const JoinRequest = co.map({
|
||||
account: Account,
|
||||
account: co.account,
|
||||
status: z.literal(["pending", "approved", "rejected"]),
|
||||
});
|
||||
|
||||
@@ -101,15 +101,16 @@ Set up the request system with appropriate access controls.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Account, Group, Loaded } from "jazz-tools";
|
||||
import { createInviteLink } from "jazz-react";
|
||||
import { co, z, Group } from "jazz-tools";
|
||||
|
||||
const JoinRequest = co.map({
|
||||
account: Account,
|
||||
account: co.account(),
|
||||
status: z.literal(["pending", "approved", "rejected"]),
|
||||
});
|
||||
|
||||
const RequestsList = co.list(JoinRequest);
|
||||
const Account = co.account();
|
||||
type Account = co.loaded<typeof Account>;
|
||||
|
||||
// ---cut-before---
|
||||
function createRequestsToJoin() {
|
||||
@@ -120,7 +121,7 @@ function createRequestsToJoin() {
|
||||
}
|
||||
|
||||
async function sendJoinRequest(
|
||||
requestsList: Loaded<typeof RequestsList>,
|
||||
requestsList: co.loaded<typeof RequestsList>,
|
||||
account: Account,
|
||||
) {
|
||||
const request = JoinRequest.create(
|
||||
@@ -142,7 +143,10 @@ Using the write-only access users can submit requests that only administrators c
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, ID, Account, Group, Loaded } from "jazz-tools";
|
||||
import { co, z, Group, } from "jazz-tools";
|
||||
|
||||
const Account = co.account();
|
||||
type Account = co.loaded<typeof Account>;
|
||||
|
||||
const JoinRequest = co.map({
|
||||
account: Account,
|
||||
@@ -158,7 +162,7 @@ const RequestsToJoin = co.map({
|
||||
|
||||
// ---cut-before---
|
||||
async function approveJoinRequest(
|
||||
joinRequest: Loaded<typeof JoinRequest, { account: true }>,
|
||||
joinRequest: co.loaded<typeof JoinRequest, { account: true }>,
|
||||
targetGroup: Group,
|
||||
) {
|
||||
const account = await Account.load(joinRequest._refs.account.id);
|
||||
|
||||
@@ -108,8 +108,8 @@ module.exports = makeMetroConfig({
|
||||
resolveRequest: MetroSymlinksResolver(),
|
||||
extraNodeModules,
|
||||
nodeModulesPaths,
|
||||
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
||||
},
|
||||
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
||||
watchFolders,
|
||||
});
|
||||
```
|
||||
|
||||
@@ -43,8 +43,9 @@ You can use `startWorker` from `jazz-nodejs` to start a Server Worker. Similarly
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Account } from "jazz-tools";
|
||||
class MyWorkerAccount extends Account {}
|
||||
import { co } from "jazz-tools";
|
||||
const MyWorkerAccount = co.account();
|
||||
type MyWorkerAccount = co.loaded<typeof MyWorkerAccount>;
|
||||
// ---cut---
|
||||
import { startWorker } from 'jazz-nodejs';
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ To use per-user data in your app, you typically use `useAccount` somewhere in a
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import * as React from "react";
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
const Chat = co.map({});
|
||||
|
||||
@@ -124,8 +124,8 @@ const MyAppAccount = co.account({
|
||||
profile: MyAppProfile,
|
||||
});
|
||||
|
||||
class ChatPreview extends React.Component<{ chat: Loaded<typeof Chat> }> {};
|
||||
class ContactPreview extends React.Component<{ contact: Loaded<typeof MyAppAccount> }> {};
|
||||
class ChatPreview extends React.Component<{ chat: co.loaded<typeof Chat> }> {};
|
||||
class ContactPreview extends React.Component<{ contact: co.loaded<typeof MyAppAccount> }> {};
|
||||
// ---cut---
|
||||
import { useAccount } from "jazz-react";
|
||||
|
||||
|
||||
@@ -386,7 +386,7 @@ You should define helper methods of CoValue schemas separately, in standalone fu
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
function differenceInYears(date1: Date, date2: Date) {
|
||||
const diffTime = Math.abs(date1.getTime() - date2.getTime());
|
||||
return Math.ceil(diffTime / (1000 * 60 * 60 * 24 * 365.25));
|
||||
|
||||
@@ -76,7 +76,7 @@ To retrieve entries from a session:
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -103,7 +103,7 @@ For convenience, you can also access the latest entry from the current session w
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -132,7 +132,7 @@ To retrieve entries from a specific account (with entries from all sessions comb
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -159,7 +159,7 @@ For convenience, you can also access the latest entry from the current account w
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -190,7 +190,7 @@ To retrieve all entries from a CoFeed:
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -228,7 +228,7 @@ To retrieve the latest entry from a CoFeed, ie. the last update:
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z, SessionID } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -264,7 +264,7 @@ CoFeeds are append-only; you can add new items, but not modify existing ones. Th
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -295,7 +295,7 @@ Each entry is automatically added to the current session's feed. When a user has
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -338,7 +338,7 @@ The `by` property is the account that made the entry.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -366,7 +366,7 @@ The `madeAt` property is a timestamp of when the entry was added to the feed.
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { Group, co, z, ID, Account, SessionID } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
|
||||
@@ -262,11 +262,11 @@ const Task = co.map({
|
||||
});
|
||||
|
||||
// ---cut---
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
const ListOfTasks = co.list(Task);
|
||||
|
||||
// React example
|
||||
function TaskList({ tasks }: { tasks: Loaded<typeof ListOfTasks> }) {
|
||||
function TaskList({ tasks }: { tasks: co.loaded<typeof ListOfTasks> }) {
|
||||
return (
|
||||
<ul>
|
||||
{tasks.map(task => (
|
||||
|
||||
@@ -325,7 +325,7 @@ You should define helper methods of CoValue schemas separately, in standalone fu
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
// ---cut---
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
const Project = co.map({
|
||||
name: z.string(),
|
||||
|
||||
@@ -8,8 +8,8 @@ export const metadata = {
|
||||
|
||||
Jazz provides two CoValue types for collaborative text editing, collectively referred to as "CoText" values:
|
||||
|
||||
- **co.plainText()** for simple text editing without formatting
|
||||
- **co.richText()** for rich text with HTML-based formatting (extends co.plainText())
|
||||
- **`co.plainText()`** for simple text editing without formatting
|
||||
- **`co.richText()`** for rich text with HTML-based formatting (extends `co.plainText()`)
|
||||
|
||||
Both types enable real-time collaborative editing of text content while maintaining consistency across multiple users.
|
||||
|
||||
@@ -33,7 +33,7 @@ console.log(note.toString()); // "Meeting notes for Tuesday"
|
||||
|
||||
For a full example of CoTexts in action, see [our Richtext example app](https://github.com/garden-co/jazz/tree/main/examples/richtext), which shows plain text and rich text editing.
|
||||
|
||||
## co.plainText() vs z.string()
|
||||
## `co.plainText()` vs `z.string()`
|
||||
|
||||
While `z.string()` is perfect for simple text fields, `co.plainText()` is the right choice when you need:
|
||||
|
||||
@@ -288,7 +288,7 @@ function updateText(e) {
|
||||
<CodeGroup>
|
||||
```svelte twoslash
|
||||
<script lang="ts">
|
||||
import { co, Account } from "jazz-tools";
|
||||
import { co } from "jazz-tools";
|
||||
import { createJazzTestAccount } from 'jazz-tools/testing';
|
||||
const me = await createJazzTestAccount();
|
||||
|
||||
@@ -305,13 +305,13 @@ const note = co.plainText().create("", { owner: me });
|
||||
|
||||
## Using Rich Text with ProseMirror
|
||||
|
||||
Jazz provides a dedicated plugin for integrating co.richText() with the popular ProseMirror editor. This plugin, [`jazz-richtext-prosemirror`](https://www.npmjs.com/package/jazz-richtext-prosemirror), enables bidirectional synchronization between your co.richText() instances and ProseMirror editors.
|
||||
Jazz provides a dedicated plugin for integrating `co.richText()` with the popular ProseMirror editor. This plugin, [`jazz-richtext-prosemirror`](https://www.npmjs.com/package/jazz-richtext-prosemirror), enables bidirectional synchronization between your co.richText() instances and ProseMirror editors.
|
||||
|
||||
### ProseMirror Plugin Features
|
||||
|
||||
- **Bidirectional Sync**: Changes in the editor automatically update the co.richText() and vice versa
|
||||
- **Bidirectional Sync**: Changes in the editor automatically update the `co.richText()` and vice versa
|
||||
- **Real-time Collaboration**: Multiple users can edit the same document simultaneously
|
||||
- **HTML Conversion**: Automatically converts between HTML (used by co.richText()) and ProseMirror's document model
|
||||
- **HTML Conversion**: Automatically converts between HTML (used by `co.richText()`) and ProseMirror's document model
|
||||
|
||||
### Installation
|
||||
|
||||
|
||||
@@ -137,10 +137,10 @@ For a complete progressive loading experience, use the `ProgressiveImg` componen
|
||||
import * as React from "react";
|
||||
// ---cut---
|
||||
import { ProgressiveImg } from "jazz-react";
|
||||
import { Loaded, co } from "jazz-tools";
|
||||
import { co } from "jazz-tools";
|
||||
const Image = co.image();
|
||||
|
||||
function GalleryView({ image }: { image: Loaded<typeof Image> }) {
|
||||
function GalleryView({ image }: { image: co.loaded<typeof Image> }) {
|
||||
return (
|
||||
<div className="image-container">
|
||||
<ProgressiveImg
|
||||
@@ -174,12 +174,12 @@ For more control over image loading, you can implement your own progressive imag
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import * as React from "react";
|
||||
import { Loaded, co } from "jazz-tools";
|
||||
import { co } from "jazz-tools";
|
||||
const Image = co.image();
|
||||
// ---cut---
|
||||
import { useProgressiveImg } from "jazz-react";
|
||||
|
||||
function CustomImageComponent({ image }: { image: Loaded<typeof Image> }) {
|
||||
function CustomImageComponent({ image }: { image: co.loaded<typeof Image> }) {
|
||||
const {
|
||||
src, // Data URI containing the image data as a base64 string,
|
||||
// or a placeholder image URI
|
||||
|
||||
@@ -87,7 +87,7 @@ Jazz provides a `useCoState` hook that provides a convenient way to subscribe to
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import React from "react";
|
||||
import { co, z, ID, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
|
||||
const Task = co.map({
|
||||
title: z.string(),
|
||||
@@ -122,7 +122,7 @@ function GardenPlanner({ projectId }: { projectId: string }) {
|
||||
);
|
||||
}
|
||||
|
||||
function TaskList({ tasks }: { tasks: Loaded<typeof Task>[] }) {
|
||||
function TaskList({ tasks }: { tasks: co.loaded<typeof Task>[] }) {
|
||||
return (
|
||||
<ul>
|
||||
{tasks.map((task) => (
|
||||
@@ -220,14 +220,14 @@ This allows you to handle loading, error, and success states in your application
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { co, z, Loaded } from "jazz-tools";
|
||||
import { co, z } from "jazz-tools";
|
||||
const Task = co.map({
|
||||
title: z.string(),
|
||||
});
|
||||
|
||||
const taskId = "co_123";
|
||||
// ---cut-before---
|
||||
Task.subscribe(taskId, {}, (task: Loaded<typeof Task>) => {
|
||||
Task.subscribe(taskId, {}, (task: co.loaded<typeof Task>) => {
|
||||
if (task === undefined) {
|
||||
console.log("Task is loading...");
|
||||
} else if (task === null) {
|
||||
@@ -644,16 +644,16 @@ console.log(friends?.[0]?.dog); // => null
|
||||
```
|
||||
</CodeGroup>
|
||||
|
||||
## Type Safety with Loaded Type
|
||||
## Type Safety with `co.loaded` Type
|
||||
|
||||
Jazz provides the `Loaded` type to help you define and enforce the structure of deeply loaded data in your application. This makes it easier to ensure that components receive the data they expect with proper TypeScript validation.
|
||||
Jazz provides the `co.loaded` type to help you define and enforce the structure of deeply loaded data in your application. This makes it easier to ensure that components receive the data they expect with proper TypeScript validation.
|
||||
|
||||
The `Loaded` type is especially useful when passing data between components, as it guarantees that all necessary nested data has been loaded:
|
||||
The `co.loaded` type is especially useful when passing data between components, as it guarantees that all necessary nested data has been loaded:
|
||||
|
||||
<ContentByFramework framework="react">
|
||||
<CodeGroup>
|
||||
```tsx twoslash
|
||||
import { CoListSchema, Loaded, co, z } from "jazz-tools";
|
||||
import { CoListSchema, co, z } from "jazz-tools";
|
||||
import React from "react";
|
||||
|
||||
const TeamMember = co.map({
|
||||
@@ -676,7 +676,7 @@ const Project = co.map({
|
||||
|
||||
// ---cut-before---
|
||||
// Define a type that includes loaded nested data
|
||||
type ProjectWithTasks = Loaded<
|
||||
type ProjectWithTasks = co.loaded<
|
||||
typeof Project,
|
||||
{
|
||||
tasks: { $each: true };
|
||||
@@ -696,7 +696,7 @@ function TaskList({ project }: { project: ProjectWithTasks }) {
|
||||
}
|
||||
|
||||
// For more complex resolutions
|
||||
type FullyLoadedProject = Loaded<
|
||||
type FullyLoadedProject = co.loaded<
|
||||
typeof Project,
|
||||
{
|
||||
tasks: {
|
||||
@@ -727,7 +727,7 @@ function processProject(project: FullyLoadedProject) {
|
||||
<ContentByFramework framework="vanilla">
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { CoListSchema, Loaded, co, z } from "jazz-tools";
|
||||
import { CoListSchema, co, z } from "jazz-tools";
|
||||
|
||||
const TeamMember = co.map({
|
||||
name: z.string(),
|
||||
@@ -749,7 +749,7 @@ const Project = co.map({
|
||||
|
||||
// ---cut-before---
|
||||
// Define a type that includes loaded nested data
|
||||
type ProjectWithTasks = Loaded<
|
||||
type ProjectWithTasks = co.loaded<
|
||||
typeof Project,
|
||||
{
|
||||
tasks: { $each: true };
|
||||
@@ -763,7 +763,7 @@ async function taskList({ project }: { project: ProjectWithTasks }) {
|
||||
}
|
||||
|
||||
// For more complex resolutions
|
||||
type FullyLoadedProject = Loaded<
|
||||
type FullyLoadedProject = co.loaded<
|
||||
typeof Project,
|
||||
{
|
||||
tasks: {
|
||||
@@ -791,7 +791,7 @@ function processProject(project: FullyLoadedProject) {
|
||||
</CodeGroup>
|
||||
</ContentByFramework>
|
||||
|
||||
Using the `Loaded` type helps catch errors at compile time rather than runtime, ensuring that your components and functions receive data with the proper resolution depth. This is especially useful for larger applications where data is passed between many components.
|
||||
Using the `co.loaded` type helps catch errors at compile time rather than runtime, ensuring that your components and functions receive data with the proper resolution depth. This is especially useful for larger applications where data is passed between many components.
|
||||
|
||||
## Ensuring Data is Loaded
|
||||
|
||||
@@ -799,7 +799,7 @@ Sometimes you need to make sure data is loaded before proceeding with an operati
|
||||
|
||||
<CodeGroup>
|
||||
```ts twoslash
|
||||
import { CoListSchema, Loaded, co, z } from "jazz-tools";
|
||||
import { CoListSchema, co, z } from "jazz-tools";
|
||||
|
||||
const TeamMember = co.map({
|
||||
name: z.string(),
|
||||
@@ -851,4 +851,4 @@ async function completeAllTasks(projectId: string) {
|
||||
2. **Use framework integrations**: They handle subscription lifecycle automatically
|
||||
3. **Clean up subscriptions**: Always store and call the unsubscribe function when you're done
|
||||
4. **Handle all loading states**: Check for undefined (loading), null (not found), and success states
|
||||
5. **Use the Loaded type**: Add compile-time type safety for components that require specific resolution patterns
|
||||
5. **Use the `co.loaded` type**: Add compile-time type safety for components that require specific resolution patterns
|
||||
|
||||
@@ -27,14 +27,14 @@ export const frameworkNames: Record<
|
||||
label: "React Native (Expo)",
|
||||
experimental: false,
|
||||
},
|
||||
[Framework.Svelte]: {
|
||||
label: "Svelte",
|
||||
experimental: false,
|
||||
},
|
||||
[Framework.Vanilla]: {
|
||||
label: "VanillaJS",
|
||||
experimental: false,
|
||||
},
|
||||
[Framework.Svelte]: {
|
||||
label: "Svelte",
|
||||
experimental: true,
|
||||
},
|
||||
[Framework.Vue]: {
|
||||
label: "Vue",
|
||||
experimental: true,
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"playwright": "^1.50.1",
|
||||
"turbo": "^2.3.1",
|
||||
"typedoc": "^0.25.13",
|
||||
"vitest": "catalog:"
|
||||
"vitest": "catalog:",
|
||||
"yalc": "^1.0.0-pre.53"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "turbo dev",
|
||||
@@ -37,7 +38,8 @@
|
||||
"changeset-version": "changeset version && pnpm i --no-frozen-lockfile",
|
||||
"release": "turbo run build --filter='./packages/*' && pnpm changeset publish && git push --follow-tags",
|
||||
"clean": "rm -rf ./packages/*/dist && rm -rf ./packages/*/node_modules && rm -rf ./examples/*/node_modules && rm -rf ./examples/*/dist",
|
||||
"check-catalog-deps": "node scripts/check-catalog-deps.js"
|
||||
"check-catalog-deps": "node scripts/check-catalog-deps.js",
|
||||
"yalc:all": "for d in packages/*/; do echo $d; cd $d; pnpm yalc push --replace --sig; cd '../../'; done"
|
||||
},
|
||||
"version": "0.0.0",
|
||||
"pnpm": {
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# cojson-storage-indexeddb
|
||||
|
||||
## 0.14.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0d5ee3e]
|
||||
- Updated dependencies [be7c4c2]
|
||||
- cojson@0.14.18
|
||||
- cojson-storage@0.14.18
|
||||
|
||||
## 0.14.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cojson-storage-indexeddb",
|
||||
"version": "0.14.16",
|
||||
"version": "0.14.18",
|
||||
"main": "dist/index.js",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# cojson-storage-sqlite
|
||||
|
||||
## 0.14.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0d5ee3e]
|
||||
- Updated dependencies [be7c4c2]
|
||||
- cojson@0.14.18
|
||||
- cojson-storage@0.14.18
|
||||
|
||||
## 0.14.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "cojson-storage-sqlite",
|
||||
"type": "module",
|
||||
"version": "0.14.16",
|
||||
"version": "0.14.18",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^11.7.0",
|
||||
"cojson": "workspace:0.14.16",
|
||||
"cojson": "workspace:0.14.18",
|
||||
"cojson-storage": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user