From db58715d84c1e31f460bd584675bebac1d97cd03 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Tue, 2 Apr 2024 15:38:35 +1300 Subject: [PATCH 1/3] auto-create products dir on workspace open --- apps/studio/src/api.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/studio/src/api.ts b/apps/studio/src/api.ts index 1633832c..cce597fc 100644 --- a/apps/studio/src/api.ts +++ b/apps/studio/src/api.ts @@ -58,8 +58,14 @@ export const router = t.router({ .input(z.object({ workspace: workspaceConfigSchema })) .mutation(async function addWorkspace(opts) { const { workspace } = opts.input + + const workspacePath = workspace.path + const workspaceProductsPath = join(workspacePath, 'products') + await mkdir(workspaceProductsPath, { recursive: true }) + const config = await loadAppConfig() config.workspaces.push(workspace) + await saveAppConfig(config) }), removeWorkspace: t.procedure From 35d45d249f0d4fbdd22ffc821546e9a483c13c6f Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Wed, 3 Apr 2024 17:08:54 +1300 Subject: [PATCH 2/3] add TODOs --- apps/studio/src/api.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/studio/src/api.ts b/apps/studio/src/api.ts index cce597fc..2b781165 100644 --- a/apps/studio/src/api.ts +++ b/apps/studio/src/api.ts @@ -63,6 +63,10 @@ export const router = t.router({ const workspaceProductsPath = join(workspacePath, 'products') await mkdir(workspaceProductsPath, { recursive: true }) + // TODO create villagekit.toml file + // [workspace] + // products = "products/*" + const config = await loadAppConfig() config.workspaces.push(workspace) @@ -81,6 +85,9 @@ export const router = t.router({ .output(z.array(productIndexSchema)) .query(async function listProduct(opts) { const { workspacePath } = opts.input + + // TODO lookup villagekit.toml to get workspace products path matcher + const workspaceProductsPath = join(workspacePath, 'products') const products = [] const dirEntries = await readdir(workspaceProductsPath) @@ -93,6 +100,9 @@ export const router = t.router({ } return products }), + + // TODO createProduct({ productPath, productMeta }) + getProductMeta: t.procedure .input(z.object({ productPath: productPathSchema })) .query(async function getProductMeta(opts) { @@ -103,7 +113,6 @@ export const router = t.router({ const productMeta = productMetaFile.product return productMeta }), - getProductFile: t.procedure .input(z.object({ productPath: productPathSchema, filePath: pathSchema })) .query(async function getProductFile(opts) { @@ -112,6 +121,13 @@ export const router = t.router({ const fileData = await readFile(productFilePath, 'utf8') return fileData }), + putProductFile: t.procedure + .input(z.object({ productPath: productPathSchema, filePath: pathSchema, fileData: z.string() })) + .query(async function putProductFile(opts) { + const { productPath, filePath, fileData } = opts.input + const productFilePath = join(productPath, filePath) + await writeFile(productFilePath, fileData, 'utf8') + }), }) export type Router = typeof router From 5819d8329047e7df40af1dddb8decd17799ad58c Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Sat, 6 Apr 2024 11:25:27 +1300 Subject: [PATCH 3/3] partial commit --- apps/studio/src/api.ts | 11 ++++++++++- apps/studio/src/context/product.tsx | 30 ++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/apps/studio/src/api.ts b/apps/studio/src/api.ts index 2b781165..af39e931 100644 --- a/apps/studio/src/api.ts +++ b/apps/studio/src/api.ts @@ -113,6 +113,15 @@ export const router = t.router({ const productMeta = productMetaFile.product return productMeta }), + putProductMeta: t.procedure + .input(z.object({ productPath: productPathSchema, productMeta: productMetaSchema })) + .mutation(async function getProductMeta(opts) { + const { productPath, productMeta } = opts.input + const productMetaPath = join(productPath, 'villagekit.toml') + const productMetaFile = { product: productMeta } + await writeTomlFile(productMetaPath, productMetaFile) + }), + getProductFile: t.procedure .input(z.object({ productPath: productPathSchema, filePath: pathSchema })) .query(async function getProductFile(opts) { @@ -123,7 +132,7 @@ export const router = t.router({ }), putProductFile: t.procedure .input(z.object({ productPath: productPathSchema, filePath: pathSchema, fileData: z.string() })) - .query(async function putProductFile(opts) { + .mutation(async function putProductFile(opts) { const { productPath, filePath, fileData } = opts.input const productFilePath = join(productPath, filePath) await writeFile(productFilePath, fileData, 'utf8') diff --git a/apps/studio/src/context/product.tsx b/apps/studio/src/context/product.tsx index ff9581cd..54f6ee81 100644 --- a/apps/studio/src/context/product.tsx +++ b/apps/studio/src/context/product.tsx @@ -5,7 +5,7 @@ import { type ProductModule, } from '@villagekit/product' import { ProductKit } from '@villagekit/product-kit' -import { type PropsWithChildren, useEffect } from 'react' +import { type PropsWithChildren, useCallback, useEffect } from 'react' import { useEditorContext } from './editor' export type ProductOptions = { @@ -55,6 +55,11 @@ function useProductEntry(options: ProductOptions): ProductEntry { setEditorCode(productExportsQuery.data) }, [productExportsQuery.isSuccess, productExportsQuery.data, setEditorCode]) + const putProductMetaMutation = client.putProductMeta.useMutation() + const putProductFileMutation = client.putProductFile.useMutation() + + const createProduct = useCallback((productName: string) => {}, []) + if (!productMetaQuery.isSuccess) return null if (!productExportsQuery.isSuccess) return null @@ -63,3 +68,26 @@ function useProductEntry(options: ProductOptions): ProductEntry { code: editorCode, } } + +/* + + putProductMeta: t.procedure + .input(z.object({ productPath: productPathSchema, productMeta: productMetaSchema })) + .mutation(async function getProductMeta(opts) { + const { productPath, productMeta } = opts.input + const productMetaPath = join(productPath, 'villagekit.toml') + const productMetaFile = { product: productMeta } + await writeTomlFile(productMetaPath, productMetaFile) + }), + + getProductFile: t.procedure + .input(z.object({ productPath: productPathSchema, filePath: pathSchema })) + .query(async function getProductFile(opts) { + const { productPath, filePath } = opts.input + const productFilePath = join(productPath, filePath) + const fileData = await readFile(productFilePath, 'utf8') + return fileData + }), + putProductFile: t.procedure + .input(z.object({ productPath: productPathSchema, filePath: pathSchema, fileData: z.string() })) +*/