From 06f84cceed6c0368d1a585db62868f0e0fb29a51 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sun, 17 Nov 2024 21:44:42 +0100 Subject: [PATCH] cleanup --- .gitignore | 2 + Cargo.toml | 2 +- api/.gitignore | 6 - api/api/api.ts | 72 ------- api/api/links.ts | 40 ---- api/bun.lockb | Bin 41683 -> 0 bytes api/encore.app | 4 - api/package.json | 20 -- api/readme.md | 1 - api/tsconfig.json | 31 --- cli/readme.md | 5 - readme.md | 2 - scripts/past-seed.ts | 88 -------- scripts/run.ts | 89 -------- scripts/seed.ts | 493 ------------------------------------------- web/.env.example | 12 -- web/readme.md | 94 --------- 17 files changed, 3 insertions(+), 958 deletions(-) delete mode 100644 api/.gitignore delete mode 100644 api/api/api.ts delete mode 100644 api/api/links.ts delete mode 100755 api/bun.lockb delete mode 100644 api/encore.app delete mode 100644 api/package.json delete mode 100644 api/readme.md delete mode 100644 api/tsconfig.json delete mode 100644 cli/readme.md delete mode 100644 scripts/past-seed.ts delete mode 100644 scripts/run.ts delete mode 100644 scripts/seed.ts delete mode 100644 web/.env.example delete mode 100644 web/readme.md diff --git a/.gitignore b/.gitignore index 57eb44ea..a22fad3a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ private private.* private-* past.* +past-* +scripts/run.ts diff --git a/Cargo.toml b/Cargo.toml index afcd1afe..42a8caf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,6 @@ resolver = "2" authors = ["Alice Carroll "] edition = "2021" license-file = "license" -repository = "https://github.com/learn-anything/learn-anything.xyz" +repository = "https://github.com/learn-anything/learn-anything" rust-version = "1.80" version = "0.1.0" diff --git a/api/.gitignore b/api/.gitignore deleted file mode 100644 index 30a613ef..00000000 --- a/api/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.encore -encore.gen.go -encore.gen.cue -/.encore -node_modules -/encore.gen diff --git a/api/api/api.ts b/api/api/api.ts deleted file mode 100644 index f3aacecb..00000000 --- a/api/api/api.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { api, APIError } from "encore.dev/api" -// import { startWorker } from "jazz-nodejs" -// import { ID } from "jazz-tools" -import { secret } from "encore.dev/config" -import log from "encore.dev/log" - -const jazzWorkerAccountId = secret("jazzWorkerAccountId") -const jazzWorkerSecret = secret("jazzWorkerSecret") -const jazzPublicGlobalGroup = secret("jazzPublicGlobalGroup") - -export const testRoute = api( - { expose: true, method: "GET", path: "/test" }, - async ({}: {}): Promise => { - console.log(jazzPublicGlobalGroup(), "group") - log.info("better logs from encore") - } -) - -// return all content for GlobalTopic -export const getTopic = api( - { expose: true, method: "GET", path: "/topic/:topic" }, - async ({ - topic - }: { - topic: string - // TODO: can return type be inferred like Elysia? - }): Promise<{ - links: { - label: string - url: string - }[] - }> => { - // const { worker } = await startWorker({ - // accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - // accountSecret: JAZZ_WORKER_SECRET - // }) - - // TODO: how to get the import from outside this package? - // const globalGroupId = process.env.JAZZ_PUBLIC_GLOBAL_GROUP as ID - // const globalGroup = await PublicGlobalGroup.load(globalGroupId, worker, { - // root: { - // topics: [ - // { - // latestGlobalGuide: { - // sections: [ - // { - // links: [{}] - // } - // ] - // } - // } - // ], - // forceGraphs: [ - // { - // connections: [{}] - // } - // ] - // } - // }) - // if (!globalGroup) throw APIError.notFound("GlobalGroup not found") - - // const globalGroupId = process.env.JAZZ_PUBLIC_GLOBAL_GROUP as ID - // console.log(globalGroupId) - // console.log(worker) - // console.log("runs..") - - const topicContent = { - links: [] - } - return topicContent - } -) diff --git a/api/api/links.ts b/api/api/links.ts deleted file mode 100644 index 9c17de3d..00000000 --- a/api/api/links.ts +++ /dev/null @@ -1,40 +0,0 @@ -// TODO: not sure if `links` should be separate service -// it is responsible for adding and getting links into LA from API - -import { api, APIError } from "encore.dev/api" -// import { startWorker } from "jazz-nodejs" -import { secret } from "encore.dev/config" - -const jazzWorkerSecret = secret("jazzWorkerSecret") - -export const addPersonalLink = api( - { expose: true, method: "POST", path: "/save-link" }, - async ({ url }: { url: string }): Promise => { - // const { worker } = await startWorker({ - // accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - // accountSecret: JAZZ_WORKER_SECRET - // }) - } -) - -export const getLinkDetails = api( - { expose: true, method: "GET", path: "/global-link-details/:url" }, - async ({ - url - }: { - url: string - }): Promise<{ - title: string - summary?: string - }> => { - // const { worker } = await startWorker({ - // accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - // accountSecret: JAZZ_WORKER_SECRET - // }) - - return { - title: "Jazz", - summary: "Jazz is local first framework for building web apps" - } - } -) diff --git a/api/bun.lockb b/api/bun.lockb deleted file mode 100755 index 6408494b86e43185254e2e6b70d6e058b790a734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41683 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 CLI for interfacing with LA - -Will be modelled after [Encore's Go CLI](https://github.com/encoredev/encore/tree/main/cli/cmd/encore). diff --git a/readme.md b/readme.md index 6b1e8fab..558f92a5 100644 --- a/readme.md +++ b/readme.md @@ -4,8 +4,6 @@ ### Files -- [lib](lib) - shared functions -- [scripts](scripts) - utility scripts - [web](web) - website hosted on [learn-anything.xyz](https://learn-anything.xyz) (using [React](https://react.dev/), [TanStack Start](https://tanstack.com/start/latest), [Jazz](https://jazz.tools/)) ## Setup diff --git a/scripts/past-seed.ts b/scripts/past-seed.ts deleted file mode 100644 index d821546e..00000000 --- a/scripts/past-seed.ts +++ /dev/null @@ -1,88 +0,0 @@ -// @ts-nocheck -async function devSeed() { - const { worker } = await startWorker({ - accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - accountSecret: JAZZ_WORKER_SECRET - }) - const user = (await ( - await LaAccount.createAs(worker, { - creationProps: { name: "nikiv" } - }) - ).ensureLoaded({ root: { personalLinks: [], pages: [], todos: [] } }))! - const globalLinksGroup = Group.create({ owner: worker }) - globalLinksGroup.addMember("everyone", "reader") - const globalLink1 = GlobalLink.create({ url: "https://google.com" }, { owner: globalLinksGroup }) - const globalLink2 = GlobalLink.create({ url: "https://jazz.tools" }, { owner: globalLinksGroup }) - // TODO: make note: optional - const personalLink1 = PersonalLink.create( - { globalLink: globalLink1, type: "personalLink", note: "" }, - { owner: user } - ) - const personalLink2 = PersonalLink.create( - { globalLink: globalLink2, type: "personalLink", note: "Great framework" }, - { owner: user } - ) - user.root.personalLinks.push(personalLink1) - user.root.personalLinks.push(personalLink2) - const pageOneTitle = "Physics" - const pageTwoTitle = "Karabiner" - const page1 = PersonalPage.create( - { title: pageOneTitle, slug: generateUniqueSlug(pageOneTitle), content: "Physics is great" }, - { owner: user } - ) - const page2 = PersonalPage.create( - { title: pageTwoTitle, slug: generateUniqueSlug(pageTwoTitle), content: "Karabiner is great" }, - { owner: user } - ) - user.root.personalPages?.push(page1) - user.root.personalPages?.push(page2) - const page1 = Page.create({ title: "Physics", content: "Physics is great" }, { owner: user }) - const page2 = Page.create({ title: "Karabiner", content: "Karabiner is great" }, { owner: user }) - user.root.pages.push(page1) - user.root.pages.push(page2) - const credentials = { - accountID: user.id, - accountSecret: (user._raw as RawControlledAccount).agentSecret - } - await Bun.write( - "./web/.env", - `VITE_SEED_ACCOUNTS='${JSON.stringify({ - nikiv: credentials - })}'` - ) - await Bun.write( - "./.env", - `VITE_SEED_ACCOUNTS='${JSON.stringify({ - nikiv: credentials - })}'` - ) -} -const globalLink = GlobalLink.create( - { - url: "https://google.com", - urlTitle: "Google", - protocol: "https" - }, - { owner: globalGroup } -) -const user = (await ( - await LaAccount.createAs(worker, { - creationProps: { name: "nikiv" } - }) -).ensureLoaded({ root: { personalLinks: [], pages: [], todos: [] } }))! -console.log(process.env.JAZZ_GLOBAL_GROUP!, "group") -console.log(worker) -// TODO: type err -console.log(globalGroup, "group") -return -const currentFilePath = import.meta.path -const connectionsFilePath = `${currentFilePath.replace("seed.ts", "/seed/connections.json")}` -const file = Bun.file(connectionsFilePath) -const fileContent = await file.text() -const topicsWithConnections = JSON.parse(fileContent) -// let topicsWithConnections = JSON.stringify(obj, null, 2) -console.log(topicsWithConnections) -// TODO: type err -topicsWithConnections.map(topic => { - const globalTopic = GlobalTopic.create({ name: topic.name, description: topic.description }, { owner: globalGroup }) -}) diff --git a/scripts/run.ts b/scripts/run.ts deleted file mode 100644 index efc864bc..00000000 --- a/scripts/run.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { getEnvOrThrow } from "@/lib/utils" -import { PublicGlobalGroup } from "@/web/lib/schema/master/public-group" -import { startWorker } from "jazz-nodejs" -import { ID } from "jazz-tools" - -const JAZZ_WORKER_SECRET = getEnvOrThrow("JAZZ_WORKER_SECRET") - -async function run() { - try { - await readJazz() - } catch (err) { - console.log(err, "err") - } -} - -async function readJazz() { - const { worker } = await startWorker({ - accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - accountSecret: JAZZ_WORKER_SECRET - }) - - const globalGroupId = process.env.JAZZ_PUBLIC_GLOBAL_GROUP as ID - const globalGroup = await PublicGlobalGroup.load(globalGroupId, worker, { - root: { - topics: [ - { - latestGlobalGuide: { - sections: [ - { - links: [{}] - } - ] - } - } - ], - forceGraphs: [ - { - connections: [{}] - } - ] - } - }) - - if (!globalGroup) return // TODO: err - - // wait 10 seconds - await new Promise(resolve => setTimeout(resolve, 10000)) - - /* - * Log forceGraphs - */ - const asJsonForceGraphs = globalGroup.root.forceGraphs.map(node => { - console.log({ node }, "node") - return { - name: node.name, - prettyName: node.prettyName, - connections: node.connections?.map(connection => { - return { - name: connection?.name - } - }) - } - }) - - const asJson = globalGroup.root.topics?.map(node => { - return { - name: node.name, - prettyName: node.prettyName, - latestGlobalGuide: { - sections: node.latestGlobalGuide.sections.map(section => { - return { - title: section?.title, - links: section?.links?.map(link => { - return { - title: link?.title, - url: link?.url - } - }) - } - }) - } - } - }) - - console.log({ asJsonForceGraphs }, "asJsonForceGraphs") - console.log({ asJson }, "asJson") -} - -await run() diff --git a/scripts/seed.ts b/scripts/seed.ts deleted file mode 100644 index 0145fa48..00000000 --- a/scripts/seed.ts +++ /dev/null @@ -1,493 +0,0 @@ -import { getEnvOrThrow } from "@/lib/utils" -import { Connection, ForceGraph, ListOfConnections, ListOfForceGraphs } from "@/web/lib/schema/master/force-graph" -import { PublicGlobalGroup, PublicGlobalGroupRoot } from "@/web/lib/schema/master/public-group" -import { - LatestGlobalGuide, - Link, - ListOfLinks, - ListOfSections, - ListOfTopics, - Section, - Topic -} from "@/web/lib/schema/master/topic" -import fs from "fs/promises" -import { startWorker } from "jazz-nodejs" -import { ID } from "jazz-tools" -import { appendFile } from "node:fs/promises" -import path from "path" - -// Define interfaces for JSON data structures -interface LinkJson { - id?: ID - title: string - url: string -} - -interface SectionJson { - title: string - links: LinkJson[] -} - -interface TopicJson { - name: string - prettyName: string - latestGlobalGuide: { - sections: SectionJson[] - } | null -} - -// Get the Jazz worker secret from environment variables -const JAZZ_WORKER_SECRET = getEnvOrThrow("JAZZ_WORKER_SECRET") - -/** - * Manages links, handling deduplication and tracking duplicates. - */ -class LinkManager { - private links: Map = new Map() - private duplicateCount: number = 0 - - /** - * Adds a link to the manager, tracking duplicates. - * @param link - The link to add. - */ - addLink(link: LinkJson) { - const key = link.url - if (this.links.has(key)) { - this.duplicateCount++ - } else { - this.links.set(key, link) - } - } - - /** - * Gets all unique links. - * @returns An array of unique links. - */ - getAllLinks() { - return Array.from(this.links.values()) - } - - /** - * Gets the count of duplicate links. - * @returns The number of duplicate links. - */ - getDuplicateCount() { - return this.duplicateCount - } -} - -/** - * Starts a Jazz worker. - * @returns A Promise that resolves to the started worker. - */ -async function startJazzWorker() { - const { worker } = await startWorker({ - accountID: "co_zhvp7ryXJzDvQagX61F6RCZFJB9", - accountSecret: JAZZ_WORKER_SECRET - }) - return worker -} - -/** - * Sets up the global and admin groups. - */ -async function setup() { - console.log("Starting setup") - - const worker = await startJazzWorker() - - /* - * Create global group - */ - const publicGlobalGroup = PublicGlobalGroup.create({ owner: worker }) - publicGlobalGroup.root = PublicGlobalGroupRoot.create( - { - topics: ListOfTopics.create([], { owner: publicGlobalGroup }), - forceGraphs: ListOfForceGraphs.create([], { owner: publicGlobalGroup }) - }, - { owner: publicGlobalGroup } - ) - publicGlobalGroup.addMember("everyone", "reader") - await appendFile("./.env", `\nJAZZ_PUBLIC_GLOBAL_GROUP=${JSON.stringify(publicGlobalGroup.id)}`) - - /* - * Create admin group - */ - // const user = (await await LaAccount.createAs(worker, { - // creationProps: { name: "nikiv" } - // }))! - // const adminGlobalGroup = Group.create({ owner: worker }) - // adminGlobalGroup.addMember(user, "admin") - // await appendFile("./.env", `\nJAZZ_ADMIN_GLOBAL_GROUP=${JSON.stringify(adminGlobalGroup.id)}`) - - console.log("Setup completed successfully", publicGlobalGroup.id) -} - -/** - * Loads the global group. - * @returns A Promise that resolves to the loaded global group. - * @throws Error if the global group fails to load. - */ -async function loadGlobalGroup() { - const worker = await startJazzWorker() - - const globalGroupId = getEnvOrThrow("JAZZ_PUBLIC_GLOBAL_GROUP") as ID - - const globalGroup = await PublicGlobalGroup.load(globalGroupId, worker, { - root: { - topics: [{ latestGlobalGuide: { sections: [] } }], - forceGraphs: [{ connections: [] }] - } - }) - - if (!globalGroup) throw new Error("Failed to load global group") - - return globalGroup -} - -/** - * Processes JSON files to extract link and topic data. - * @returns A Promise that resolves to a tuple containing a LinkManager and an array of TopicJson. - */ -async function processJsonFiles(): Promise<[LinkManager, TopicJson[]]> { - const directory = path.join(__dirname, "..", "private", "data", "edgedb", "topics") - - const linkManager = new LinkManager() - const processedData: TopicJson[] = [] - - let files = await fs.readdir(directory) - files.sort((a, b) => a.localeCompare(b)) // sort files alphabetically - - files = files.slice(0, 1) // get only 1 file for testing - - for (const file of files) { - if (path.extname(file) === ".json") { - const filePath = path.join(directory, file) - try { - const data = JSON.parse(await fs.readFile(filePath, "utf-8")) as TopicJson - if (data.latestGlobalGuide) { - for (const section of data.latestGlobalGuide.sections) { - for (const link of section.links) { - linkManager.addLink(link) - } - } - } - processedData.push(data) - } catch (error) { - console.error(`Error processing file ${file}:`, error) - } - } - } - - return [linkManager, processedData] -} - -/** - * Creates a simple progress bar string. - * @param progress - Current progress (0-100). - * @param total - Total width of the progress bar. - * @returns A string representing the progress bar. - */ -function createProgressBar(progress: number, total: number = 30): string { - const filledWidth = Math.round((progress / 100) * total) - const emptyWidth = total - filledWidth - return `[${"=".repeat(filledWidth)}${" ".repeat(emptyWidth)}]` -} - -/** - * Updates the progress display in the terminal. - * @param message - The message to display. - * @param current - Current progress value. - * @param total - Total progress value. - */ -function updateProgress(message: string, current: number, total: number) { - const percentage = Math.round((current / total) * 100) - const progressBar = createProgressBar(percentage) - process.stdout.write(`\r${message} ${progressBar} ${percentage}% (${current}/${total})`) -} - -async function insertLinksInBatch(links: LinkJson[], chunkSize: number = 100) { - const globalGroup = await loadGlobalGroup() - const allCreatedLinks: Link[] = [] - const totalLinks = links.length - - for (let i = 0; i < totalLinks; i += chunkSize) { - const chunk = links.slice(i, i + chunkSize) - const rows = chunk.map(link => - Link.create( - { - title: link.title, - url: link.url - }, - { owner: globalGroup } - ) - ) - allCreatedLinks.push(...rows) - - updateProgress("Processing links:", i + chunk.length, totalLinks) - - // Add a small delay between chunks to avoid overwhelming the system - await new Promise(resolve => setTimeout(resolve, 1000)) - } - - console.log("\nFinished processing links") - return allCreatedLinks -} - -async function saveProcessedData(linkLists: Link[], topics: TopicJson[], chunkSize: number = 10) { - const globalGroup = await loadGlobalGroup() - const totalTopics = topics.length - - for (let i = 0; i < totalTopics; i += chunkSize) { - const topicChunk = topics.slice(i, i + chunkSize) - - topicChunk.forEach(topic => { - const topicModel = Topic.create( - { - name: topic.name, - prettyName: topic.prettyName, - latestGlobalGuide: LatestGlobalGuide.create( - { - sections: ListOfSections.create([], { owner: globalGroup }) - }, - { owner: globalGroup } - ) - }, - { owner: globalGroup } - ) - - if (!topic.latestGlobalGuide) { - console.error("No sections found in", topic.name) - return - } - - topic.latestGlobalGuide.sections.map(section => { - const sectionModel = Section.create( - { - title: section.title, - links: ListOfLinks.create([], { owner: globalGroup }) - }, - { owner: globalGroup } - ) - - section.links.map(link => { - const linkModel = linkLists.find(l => l.url === link.url) - if (linkModel) { - sectionModel.links?.push(linkModel) - } - }) - - topicModel.latestGlobalGuide?.sections?.push(sectionModel) - }) - - globalGroup.root.topics?.push(topicModel) - }) - - updateProgress("Processing topics:", i + topicChunk.length, totalTopics) - - // Add a small delay between chunks to avoid overwhelming the system - await new Promise(resolve => setTimeout(resolve, 1000)) - } - - console.log("\nFinished processing topics") -} - -/** - * Seeds production data. - */ -async function prodSeed() { - console.log("Starting to seed data") - - const [linkManager, processedData] = await processJsonFiles() - - console.log(`Collected ${linkManager.getAllLinks().length} unique links.`) - console.log(`Found ${linkManager.getDuplicateCount()} duplicate links.`) - - console.log("\nInserting links:") - const insertedLinks = await insertLinksInBatch(linkManager.getAllLinks(), 100) - - console.log("\nSaving processed data:") - await saveProcessedData(insertedLinks, processedData, 10) - - console.log("\nFinished seeding data") -} - -interface ForceGraphJson { - name: string - prettyName: string - connections: string[] -} - -/** - * Manages links, handling deduplication and tracking duplicates. - */ -class ConnectionManager { - private connections: Map = new Map() - private duplicateCount: number = 0 - - /** - * Adds a connection to the manager, tracking duplicates. - * @param connection - The connection to add. - */ - addConnection(connection: string) { - if (this.connections.has(connection)) { - this.duplicateCount++ - } else { - this.connections.set(connection, connection) - } - } - - /** - * Gets all unique connections. - * @returns An array of unique connections. - */ - getAllConnections() { - return Array.from(this.connections.values()) - } - - /** - * Gets the count of duplicate connections. - * @returns The number of duplicate connections. - */ - getDuplicateCount() { - return this.duplicateCount - } -} - -/** - * Inserts connections in batch. - * @param connections - An array of string objects to insert. - * @returns A Promise that resolves to an array of created Connection models. - */ -async function insertConnectionsInBatch(connections: string[]) { - const globalGroup = await loadGlobalGroup() - const rows = [] - - for (const connection of connections) { - const connectionModel = Connection.create( - { - name: connection - }, - { owner: globalGroup } - ) - rows.push(connectionModel) - } - - return rows -} - -/** - * Saves force graph data to the global group. - * @param connectionLists - An array of Connection models. - * @param forceGraphs - An array of ForceGraphJson objects. - */ -async function saveForceGraph(connectionLists: Connection[], forceGraphs: ForceGraphJson[]) { - const globalGroup = await loadGlobalGroup() - - forceGraphs.map(forceGraph => { - const forceGraphModel = ForceGraph.create( - { - name: forceGraph.name, - prettyName: forceGraph.prettyName, - connections: ListOfConnections.create([], { owner: globalGroup }) - }, - { owner: globalGroup } - ) - - forceGraph.connections.map(connection => { - const connectionModel = connectionLists.find(c => c.name === connection) - if (connectionModel) { - forceGraphModel.connections?.push(connectionModel) - } - }) - - globalGroup.root.forceGraphs?.push(forceGraphModel) - }) -} - -async function forceGraphSeed() { - console.log("Starting to seed force graph data") - - const directory = path.join(__dirname, "..", "private", "data", "edgedb") - - const connectionManager = new ConnectionManager() - const processedData: ForceGraphJson[] = [] - - const files = await fs.readdir(directory) - const file = files.find(file => file === "force-graphs.json") - - if (!file) { - console.error("No force-graphs.json file found") - return - } - - const filePath = path.join(directory, file) - - try { - const forceGraphs = JSON.parse(await fs.readFile(filePath, "utf-8")) as ForceGraphJson[] - - for (const forceGraph of forceGraphs) { - if (forceGraph.connections.length) { - for (const connection of forceGraph.connections) { - connectionManager.addConnection(connection) - } - } - - processedData.push(forceGraph) - } - } catch (error) { - console.error(`Error processing file ${file}:`, error) - } - - console.log(`Collected ${connectionManager.getAllConnections().length} unique connections.`) - console.log(`Found ${connectionManager.getDuplicateCount()} duplicate connections.`) - - const insertedConnections = await insertConnectionsInBatch(connectionManager.getAllConnections()) - await saveForceGraph(insertedConnections, processedData) - - // wait 3 seconds before finishing - await new Promise(resolve => setTimeout(resolve, 3000)) - console.log("Finished seeding force graph data") -} - -/** - * Performs a full production rebuild. - */ -async function fullProdRebuild() { - await prodSeed() - await forceGraphSeed() -} - -/** - * Main seed function to handle different commands. - */ -async function seed() { - const args = Bun.argv - const command = args[2] - try { - switch (command) { - case undefined: - console.log("No command provided") - break - case "setup": - await setup() - break - case "prod": - await prodSeed() - break - case "fullProdRebuild": - await fullProdRebuild() - break - case "forceGraph": - await forceGraphSeed() - break - default: - console.log("Unknown command") - break - } - } catch (err) { - console.error("Error occurred:", err) - } -} - -await seed() diff --git a/web/.env.example b/web/.env.example deleted file mode 100644 index c95589ba..00000000 --- a/web/.env.example +++ /dev/null @@ -1,12 +0,0 @@ -VITE_APP_NAME="Learn Anything" -VITE_APP_URL=http://localhost:3000 - -VITE_CLERK_PUBLISHABLE_KEY= -CLERK_SECRET_KEY= -VITE_CLERK_SIGN_IN_URL=/sign-in -VITE_CLERK_SIGN_UP_URL=/sign-up - -VITE_JAZZ_PEER_URL="wss://mesh.jazz.tools/?key=example@gmail.com" -VITE_JAZZ_GLOBAL_GROUP_ID="" - -RONIN_TOKEN= \ No newline at end of file diff --git a/web/readme.md b/web/readme.md deleted file mode 100644 index 80e3a1fd..00000000 --- a/web/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -## Below is TanStack Start Clerk - -Gotten from [here](https://github.com/TanStack/router/tree/main/examples/react/start-clerk-basic). - -To make it work: - -``` -bun i -bun dev -``` - -And have this in `.env`: - - - -You can get those keys from [Clerk](https://clerk.com/). - -``` -CLERK_PUBLISHABLE_KEY= -CLERK_SECRET_KEY= -``` - -# Welcome to TanStack.com! - -This site is built with TanStack Router! - -- [TanStack Router Docs](https://tanstack.com/router) - -It's deployed automagically with Vercel! - -- [Vercel](https://vercel.com/) - -## Development - -From your terminal: - -```sh -pnpm install -pnpm dev -``` - -This starts your app in development mode, rebuilding assets on file changes. - -## Editing and previewing the docs of TanStack projects locally - -The documentations for all TanStack projects except for `React Charts` are hosted on [https://tanstack.com](https://tanstack.com), powered by this TanStack Router app. -In production, the markdown doc pages are fetched from the GitHub repos of the projects, but in development they are read from the local file system. - -Follow these steps if you want to edit the doc pages of a project (in these steps we'll assume it's [`TanStack/form`](https://github.com/tanstack/form)) and preview them locally : - -1. Create a new directory called `tanstack`. - -```sh -mkdir tanstack -``` - -2. Enter the directory and clone this repo and the repo of the project there. - -```sh -cd tanstack -git clone git@github.com:TanStack/tanstack.com.git -git clone git@github.com:TanStack/form.git -``` - -> [!NOTE] -> Your `tanstack` directory should look like this: -> -> ``` -> tanstack/ -> | -> +-- form/ -> | -> +-- tanstack.com/ -> ``` - -> [!WARNING] -> Make sure the name of the directory in your local file system matches the name of the project's repo. For example, `tanstack/form` must be cloned into `form` (this is the default) instead of `some-other-name`, because that way, the doc pages won't be found. - -3. Enter the `tanstack/tanstack.com` directory, install the dependencies and run the app in dev mode: - -```sh -cd tanstack.com -pnpm i -# The app will run on https://localhost:3000 by default -pnpm dev -``` - -4. Now you can visit http://localhost:3000/form/latest/docs/overview in the browser and see the changes you make in `tanstack/form/docs`. - -> [!NOTE] -> The updated pages need to be manually reloaded in the browser. - -> [!WARNING] -> You will need to update the `docs/config.json` file (in the project's repo) if you add a new doc page!