diff --git a/bun.lockb b/bun.lockb index 454367e..b066ad4 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index a6d5cad..d810455 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "next-gdrive-index", - "version": "2.0.4", + "version": "2.4.2", "private": true, "scripts": { "dev": "next dev -p 3000", @@ -10,7 +10,8 @@ "lint": "next lint", "lint:fix": "next lint --fix", "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json}\" --cache", - "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json}\" --cache" + "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json}\" --cache", + "cli": "node ./scripts/cli.mjs" }, "dependencies": { "@hookform/resolvers": "^3.10.0", @@ -88,12 +89,16 @@ "@typescript-eslint/eslint-plugin": "^8.1.0", "@typescript-eslint/parser": "^8.1.0", "autoprefixer": "^10.4.19", + "chalk": "^5.4.1", + "commander": "^13.1.0", "encoding": "^0.1.13", "eslint": "^8.57.0", "eslint-config-next": "^15.0.1", + "ora": "^8.2.0", "postcss": "^8.4.38", "prettier": "3.0.0", "prettier-plugin-tailwindcss": "0.5.12", + "prompts": "^2.4.2", "tailwindcss": "^3.4.1", "typescript": "^5.5.3" } diff --git a/src/app/api/internal/check/route.ts b/src/app/api/internal/check/route.ts new file mode 100644 index 0000000..1e772c4 --- /dev/null +++ b/src/app/api/internal/check/route.ts @@ -0,0 +1,32 @@ +import { NextResponse } from "next/server"; + +import { encryptionService } from "~/lib/utils.server"; + +import config from "~/config/gIndex.config"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + try { + if (process.env.NODE_ENV !== "development") { + throw new Error("This route is only available in development environment"); + } + + const rootId = await encryptionService.decrypt(config.apiConfig.rootFolder); + const sharedDriveId = config.apiConfig.sharedDrive + ? await encryptionService.decrypt(config.apiConfig.sharedDrive) + : undefined; + + return NextResponse.json( + { + rootId, + sharedDriveId, + }, + { status: 200 }, + ); + } catch (error) { + const e = error as Error; + console.error(e); + return new Response(e.message, { status: 500 }); + } +} diff --git a/src/app/api/test/fileSize/route.ts b/src/app/api/test/fileSize/route.ts deleted file mode 100644 index 2f5ad7f..0000000 --- a/src/app/api/test/fileSize/route.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { type NextRequest, NextResponse } from "next/server"; -import stream from "stream"; -import { promisify } from "util"; - -import { gdrive } from "~/lib/utils.server"; - -const pipeline = promisify(stream.pipeline); -const fileId = "1KvMU9sy8fQKKmVKU5xf_u3Y2JZefe0kt"; - -export async function GET(request: NextRequest) { - try { - const start = Date.now(); - console.log("Fetching metadata", Date.now() - start); - const meta = await gdrive.files.get({ - fileId, - fields: "size,mimeType,name", - supportsAllDrives: true, - }); - const { data: metadata } = meta; - - console.log("Fetching file", Date.now() - start); - // const data = await gdrive.files.get( - // { - // fileId: fileId, - // alt: "media", - // acknowledgeAbuse: true, - // }, - // { - // responseType: "stream", - // }, - // ); - - console.log("Setting headers", Date.now() - start); - const headers = new Headers(); - headers.set("Content-Type", metadata.mimeType ?? "application/octet-stream"); - if (metadata.size) headers.set("Content-Length", metadata.size.toString()); - headers.set("Content-Disposition", `attachment; filename="${metadata.name}"`); - - // console.log("Streaming file", Date.now() - start); - // const contentStream = data.data; - // const webStream = new ReadableStream({ - // async start(controller) { - // contentStream.on("data", (chunk) => { - // controller.enqueue(chunk); - // }); - // contentStream.on("end", () => { - // controller.close(); - // }); - // contentStream.on("error", (err) => { - // console.error(err); - // controller.error(err); - // }); - // }, - // cancel() { - // contentStream.destroy(); - // }, - // }); - - // console.log("Returning response", Date.now() - start); - return new Response( - new ReadableStream({ - async start(controller) { - try { - gdrive.files.get( - { - fileId: fileId, - alt: "media", - acknowledgeAbuse: true, - supportsAllDrives: true, - }, - { - responseType: "stream", - }, - (err, res) => { - if (err) throw err; - res?.data - .on("data", (chunk) => { - controller.enqueue(chunk); - }) - .on("end", () => { - controller.close(); - }) - .on("error", (err) => { - console.error(err); - controller.error(err); - }); - }, - ); - } catch (error) { - controller.error(error); - console.error(error); - } - }, - }), - { - headers, - }, - ); - } catch (error) { - const e = error as Error; - console.error(e); - return NextResponse.json( - { - error: e.message, - }, - { - status: 500, - }, - ); - } -} diff --git a/src/components/internal/ConfiguratorPage.Site.tsx b/src/components/internal/ConfiguratorPage.Site.tsx index 0bd68eb..57f70b1 100644 --- a/src/components/internal/ConfiguratorPage.Site.tsx +++ b/src/components/internal/ConfiguratorPage.Site.tsx @@ -906,6 +906,7 @@ function FooterField({ form, onResetField }: FormProps) { onClick={() => { setContent(formatFooterContent(form.watch("site.footer"), form.getValues("site"))); }} + type='button' > Reload Preview diff --git a/src/components/layout/Navbar.tsx b/src/components/layout/Navbar.tsx index 7a3681b..f6858f0 100644 --- a/src/components/layout/Navbar.tsx +++ b/src/components/layout/Navbar.tsx @@ -256,7 +256,7 @@ export default function Navbar() { className='mx-2 my-auto h-6' /> - {!!config.showGuideButton && ( + {!!config.showGuideButton ? (