UNPKG

@reliverse/rse

Version:

@reliverse/rse is your all-in-one companion for bootstrapping and improving any kind of projects (especially web apps built with frameworks like Next.js) — whether you're kicking off something new or upgrading an existing app. It is also a little AI-power

997 lines (996 loc) 26.3 kB
export const DLER_TPL_BACKEND = { name: "backend", description: "Template generated from 21 files", updatedAt: "2025-06-17T20:33:59.618Z", config: { files: { "backend/convex/packages/backend/convex/healthCheck.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "4e85265190" }, content: `import { query } from "./_generated/server"; export const get = query({ handler: async () => { return "OK"; } }) `, type: "text" }, "backend/convex/packages/backend/convex/README.md": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "d261559702" }, content: `# Welcome to your Convex functions directory! Write your Convex functions here. See https://docs.convex.dev/functions for more. A query function that takes two arguments looks like: \`\`\`ts // functions.js import { query } from "./_generated/server"; import { v } from "convex/values"; export const myQueryFunction = query({ // Validators for arguments. args: { first: v.number(), second: v.string(), }, // Function implementation. handler: async (ctx, args) => { // Read the database as many times as you need here. // See https://docs.convex.dev/database/reading-data. const documents = await ctx.db.query("tablename").collect(); // Arguments passed from the client are properties of the args object. console.log(args.first, args.second); // Write arbitrary JavaScript here: filter, aggregate, build derived data, // remove non-public properties, or create new objects. return documents; }, }); \`\`\` Using this query function in a React component looks like: \`\`\`ts const data = useQuery(api.functions.myQueryFunction, { first: 10, second: "hello", }); \`\`\` A mutation function looks like: \`\`\`ts // functions.js import { mutation } from "./_generated/server"; import { v } from "convex/values"; export const myMutationFunction = mutation({ // Validators for arguments. args: { first: v.string(), second: v.string(), }, // Function implementation. handler: async (ctx, args) => { // Insert or modify documents in the database here. // Mutations can also read from the database like queries. // See https://docs.convex.dev/database/writing-data. const message = { body: args.first, author: args.second }; const id = await ctx.db.insert("messages", message); // Optionally, return a value from your mutation. return await ctx.db.get(id); }, }); \`\`\` Using this mutation function in a React component looks like: \`\`\`ts const mutation = useMutation(api.functions.myMutationFunction); function handleButtonPress() { // fire and forget, the most common way to use mutations mutation({ first: "Hello!", second: "me" }); // OR // use the result once the mutation has completed mutation({ first: "Hello!", second: "me" }).then((result) => console.log(result), ); } \`\`\` Use the Convex CLI to push your functions to a deployment. See everything the Convex CLI can do by running \`npx convex -h\` in your project root directory. To learn more, launch the docs with \`npx convex docs\`. `, type: "text" }, "backend/convex/packages/backend/convex/schema.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "8415cc5ad3" }, content: `import { defineSchema, defineTable } from "convex/server"; import { v } from "convex/values"; export default defineSchema({ todos: defineTable({ text: v.string(), completed: v.boolean(), }), }); `, type: "text" }, "backend/convex/packages/backend/convex/todos.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "0e64275cf0" }, content: `import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; export const getAll = query({ handler: async (ctx) => { return await ctx.db.query("todos").collect(); }, }); export const create = mutation({ args: { text: v.string(), }, handler: async (ctx, args) => { const newTodoId = await ctx.db.insert("todos", { text: args.text, completed: false, }); return await ctx.db.get(newTodoId); }, }); export const toggle = mutation({ args: { id: v.id("todos"), completed: v.boolean(), }, handler: async (ctx, args) => { await ctx.db.patch(args.id, { completed: args.completed }); return { success: true }; }, }); export const deleteTodo = mutation({ args: { id: v.id("todos"), }, handler: async (ctx, args) => { await ctx.db.delete(args.id); return { success: true }; }, }); `, type: "text" }, "backend/convex/packages/backend/convex/tsconfig.json": { jsonComments: { "2": " /* This TypeScript project config describes the environment that", "7": " /* These settings are not required by Convex and can be modified. */", "15": " /* These compiler options are required by Convex */" }, metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "3f3d4096f8" }, content: { compilerOptions: { allowJs: true, strict: true, moduleResolution: "Bundler", jsx: "react-jsx", skipLibCheck: true, allowSyntheticDefaultImports: true, target: "ESNext", lib: ["ES2021", "dom"], forceConsistentCasingInFileNames: true, module: "ESNext", isolatedModules: true, noEmit: true }, include: ["./**/*"], exclude: ["./_generated"] }, type: "json" }, "backend/convex/packages/backend/package.json.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "a31c4f0f85" }, content: `{ "name": "@{{projectName}}/backend", "version": "1.0.0", "scripts": { "dev": "convex dev", "setup": "convex dev --configure --until-success" }, "author": "", "license": "ISC", "description": "", "devDependencies": { "typescript": "^5.8.3" }, "dependencies": { "convex": "^1.23.0" } } `, type: "text" }, "backend/convex/packages/backend/_gitignore": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "5e859410e4" }, content: ` .env.local `, type: "text" }, "backend/server/elysia/src/index.ts.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "7b173395c4" }, content: `import "dotenv/config"; {{#if (eq runtime "node")}} import { node } from "@elysiajs/node"; {{/if}} import { Elysia } from "elysia"; import { cors } from "@elysiajs/cors"; {{#if (eq api "trpc")}} import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; {{/if}} {{#if (eq api "orpc")}} import { RPCHandler } from "@orpc/server/fetch"; import { appRouter } from "./routers"; import { createContext } from "./lib/context"; {{/if}} {{#if auth}} import { auth } from "./lib/auth"; {{/if}} {{#if (eq api "orpc")}} const handler = new RPCHandler(appRouter); {{/if}} {{#if (eq runtime "node")}} const app = new Elysia({ adapter: node() }) {{else}} const app = new Elysia() {{/if}} .use( cors({ origin: process.env.CORS_ORIGIN || "", methods: ["GET", "POST", "OPTIONS"], {{#if auth}} allowedHeaders: ["Content-Type", "Authorization"], credentials: true, {{/if}} }), ) {{#if auth}} .all("/api/auth/*", async (context) => { const { request } = context; if (["POST", "GET"].includes(request.method)) { return auth.handler(request); } context.error(405); }) {{/if}} {{#if (eq api "orpc")}} .all('/rpc*', async (context) => { const { response } = await handler.handle(context.request, { prefix: '/rpc', context: await createContext({ context }) }) return response ?? new Response('Not Found', { status: 404 }) }) {{/if}} {{#if (eq api "trpc")}} .all("/trpc/*", async (context) => { const res = await fetchRequestHandler({ endpoint: "/trpc", router: appRouter, req: context.request, createContext: () => createContext({ context }), }); return res; }) {{/if}} .get("/", () => "OK") .listen(3000, () => { console.log("Server is running on http://localhost:3000"); }); `, type: "text" }, "backend/server/express/src/index.ts.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "7d15f582c5" }, content: `import "dotenv/config"; {{#if (eq api "trpc")}} import { createExpressMiddleware } from "@trpc/server/adapters/express"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; {{/if}} {{#if (eq api "orpc")}} import { RPCHandler } from "@orpc/server/node"; import { appRouter } from "./routers"; {{#if auth}} import { createContext } from "./lib/context"; {{/if}} {{/if}} import cors from "cors"; import express from "express"; {{#if (includes examples "ai")}} import { streamText } from "ai"; import { google } from "@ai-sdk/google"; {{/if}} {{#if auth}} import { auth } from "./lib/auth"; import { toNodeHandler } from "better-auth/node"; {{/if}} const app = express(); app.use( cors({ origin: process.env.CORS_ORIGIN || "", methods: ["GET", "POST", "OPTIONS"], {{#if auth}} allowedHeaders: ["Content-Type", "Authorization"], credentials: true, {{/if}} }) ); {{#if auth}} app.all("/api/auth{/*path}", toNodeHandler(auth)); {{/if}} {{#if (eq api "trpc")}} app.use( "/trpc", createExpressMiddleware({ router: appRouter, createContext }) ); {{/if}} {{#if (eq api "orpc")}} const handler = new RPCHandler(appRouter); app.use('/rpc{*path}', async (req, res, next) => { const { matched } = await handler.handle(req, res, { prefix: '/rpc', {{#if auth}} context: await createContext({ req }), {{else}} context: {}, {{/if}} }); if (matched) return; next(); }); {{/if}} app.use(express.json()) {{#if (includes examples "ai")}} app.post("/ai", async (req, res) => { const { messages = [] } = req.body || {}; const result = streamText({ model: google("gemini-1.5-flash"), messages, }); result.pipeDataStreamToResponse(res); }); {{/if}} app.get("/", (_req, res) => { res.status(200).send("OK"); }); const port = process.env.PORT || 3000; app.listen(port, () => { console.log(\`Server is running on port \${port}\`); }); `, type: "text" }, "backend/server/fastify/src/index.ts.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "202aee9233" }, content: `import "dotenv/config"; import Fastify from "fastify"; import fastifyCors from "@fastify/cors"; {{#if (eq api "trpc")}} import { fastifyTRPCPlugin, type FastifyTRPCPluginOptions } from "@trpc/server/adapters/fastify"; import { createContext } from "./lib/context"; import { appRouter, type AppRouter } from "./routers/index"; {{/if}} {{#if (eq api "orpc")}} import { RPCHandler } from "@orpc/server/node"; import { CORSPlugin } from "@orpc/server/plugins"; import { appRouter } from "./routers/index"; import { createServer } from "node:http"; {{#if auth}} import { createContext } from "./lib/context"; {{/if}} {{/if}} {{#if (includes examples "ai")}} import type { FastifyRequest, FastifyReply } from "fastify"; import { streamText, type Message } from "ai"; import { google } from "@ai-sdk/google"; {{/if}} {{#if auth}} import { auth } from "./lib/auth"; {{/if}} const baseCorsConfig = { origin: process.env.CORS_ORIGIN || "", methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], allowedHeaders: [ "Content-Type", "Authorization", "X-Requested-With" ], credentials: true, maxAge: 86400, }; {{#if (eq api "orpc")}} const handler = new RPCHandler(appRouter, { plugins: [ new CORSPlugin({ origin: process.env.CORS_ORIGIN, credentials: true, allowHeaders: ["Content-Type", "Authorization"], }), ], }); const fastify = Fastify({ logger: true, serverFactory: (fastifyHandler) => { const server = createServer(async (req, res) => { const { matched } = await handler.handle(req, res, { context: await createContext(req.headers), prefix: "/rpc", }); if (matched) { return; } fastifyHandler(req, res); }); return server; }, }); {{else}} const fastify = Fastify({ logger: true, }); {{/if}} fastify.register(fastifyCors, baseCorsConfig); {{#if auth}} fastify.route({ method: ["GET", "POST"], url: "/api/auth/*", async handler(request, reply) { try { const url = new URL(request.url, \`http://\${request.headers.host}\`); const headers = new Headers(); Object.entries(request.headers).forEach(([key, value]) => { if (value) headers.append(key, value.toString()); }); const req = new Request(url.toString(), { method: request.method, headers, body: request.body ? JSON.stringify(request.body) : undefined, }); const response = await auth.handler(req); reply.status(response.status); response.headers.forEach((value, key) => reply.header(key, value)); reply.send(response.body ? await response.text() : null); } catch (error) { fastify.log.error("Authentication Error:", error); reply.status(500).send({ error: "Internal authentication error", code: "AUTH_FAILURE" }); } } }); {{/if}} {{#if (eq api "trpc")}} fastify.register(fastifyTRPCPlugin, { prefix: "/trpc", trpcOptions: { router: appRouter, createContext, onError({ path, error }) { console.error(\`Error in tRPC handler on path '\${path}':\`, error); }, } satisfies FastifyTRPCPluginOptions<AppRouter>["trpcOptions"], }); {{/if}} {{#if (includes examples "ai")}} interface AiRequestBody { id?: string; messages: Message[]; } fastify.post('/ai', async function (request, reply) { const { messages } = request.body as AiRequestBody; const result = streamText({ model: google('gemini-1.5-flash'), messages, }); reply.header('X-Vercel-AI-Data-Stream', 'v1'); reply.header('Content-Type', 'text/plain; charset=utf-8'); return reply.send(result.toDataStream()); }); {{/if}} fastify.get('/', async () => { return 'OK' }) fastify.listen({ port: 3000 }, (err) => { if (err) { fastify.log.error(err); process.exit(1); } console.log("Server running on port 3000"); }); `, type: "text" }, "backend/server/hono/src/index.ts.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "db661b84bf" }, content: `{{#if (or (eq runtime "bun") (eq runtime "node"))}} import "dotenv/config"; {{/if}} {{#if (eq runtime "workers")}} import { env } from "cloudflare:workers"; {{/if}} {{#if (eq api "orpc")}} import { RPCHandler } from "@orpc/server/fetch"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; {{/if}} {{#if (eq api "trpc")}} import { trpcServer } from "@hono/trpc-server"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; {{/if}} {{#if auth}} import { auth } from "./lib/auth"; {{/if}} import { Hono } from "hono"; import { cors } from "hono/cors"; import { logger } from "hono/logger"; {{#if (and (includes examples "ai") (or (eq runtime "bun") (eq runtime "node")))}} import { streamText } from "ai"; import { google } from "@ai-sdk/google"; import { stream } from "hono/streaming"; {{/if}} {{#if (and (includes examples "ai") (eq runtime "workers"))}} import { streamText } from "ai"; import { stream } from "hono/streaming"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; {{/if}} const app = new Hono(); app.use(logger()); app.use("/*", cors({ {{#if (or (eq runtime "bun") (eq runtime "node"))}} origin: process.env.CORS_ORIGIN || "", {{/if}} {{#if (eq runtime "workers")}} origin: env.CORS_ORIGIN || "", {{/if}} allowMethods: ["GET", "POST", "OPTIONS"], {{#if auth}} allowHeaders: ["Content-Type", "Authorization"], credentials: true, {{/if}} })); {{#if auth}} app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw)); {{/if}} {{#if (eq api "orpc")}} const handler = new RPCHandler(appRouter); app.use("/rpc/*", async (c, next) => { const context = await createContext({ context: c }); const { matched, response } = await handler.handle(c.req.raw, { prefix: "/rpc", context: context, }); if (matched) { return c.newResponse(response.body, response); } await next(); }); {{/if}} {{#if (eq api "trpc")}} app.use("/trpc/*", trpcServer({ router: appRouter, createContext: (_opts, context) => { return createContext({ context }); }, })); {{/if}} {{#if (and (includes examples "ai") (or (eq runtime "bun") (eq runtime "node")))}} app.post("/ai", async (c) => { const body = await c.req.json(); const messages = body.messages || []; const result = streamText({ model: google("gemini-1.5-flash"), messages, }); c.header("X-Vercel-AI-Data-Stream", "v1"); c.header("Content-Type", "text/plain; charset=utf-8"); return stream(c, (stream) => stream.pipe(result.toDataStream())); }); {{/if}} {{#if (and (includes examples "ai") (eq runtime "workers"))}} app.post("/ai", async (c) => { const body = await c.req.json(); const messages = body.messages || []; const google = createGoogleGenerativeAI({ apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY, }); const result = streamText({ model: google("gemini-1.5-flash"), messages, }); c.header("X-Vercel-AI-Data-Stream", "v1"); c.header("Content-Type", "text/plain; charset=utf-8"); return stream(c, (stream) => stream.pipe(result.toDataStream())); }); {{/if}} app.get("/", (c) => { return c.text("OK"); }); {{#if (eq runtime "node")}} import { serve } from "@hono/node-server"; serve({ fetch: app.fetch, port: 3000, }, (info) => { console.log(\`Server is running on http://localhost:\${info.port}\`); }); {{else}} {{#if (eq runtime "bun")}} export default app; {{/if}} {{#if (eq runtime "workers")}} export default app; {{/if}} {{/if}} `, type: "text" }, "backend/server/next/next-env.d.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "f75a118439" }, content: `/// <reference types="next" /> /// <reference types="next/image-types/global" /> // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. `, type: "text" }, "backend/server/next/next.config.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "89327ac52f" }, content: `import type { NextConfig } from "next"; const nextConfig: NextConfig = { /* config options here */ }; export default nextConfig; `, type: "text" }, "backend/server/next/package.json.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "0b109deaf9" }, content: `{ "name": "server", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev --turbopack", "build": "next build", "start": "next start" }, "dependencies": { "next": "15.3.0", "dotenv": "^16.5.0" }, {{#if (eq dbSetup 'supabase')}} "trustedDependencies": [ "supabase" ], {{/if}} "devDependencies": { "@types/node": "^20", "@types/react": "^19", "typescript": "^5" } } `, type: "text" }, "backend/server/next/src/app/route.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "e40f5d7501" }, content: `import { NextResponse } from "next/server"; export async function GET() { return NextResponse.json({ message: "OK" }); } `, type: "text" }, "backend/server/next/src/middleware.ts": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "d71ca4997c" }, content: `import { NextResponse } from "next/server"; export function middleware() { const res = NextResponse.next() res.headers.append('Access-Control-Allow-Credentials', "true") res.headers.append('Access-Control-Allow-Origin', process.env.CORS_ORIGIN || "") res.headers.append('Access-Control-Allow-Methods', 'GET,POST,OPTIONS') res.headers.append( 'Access-Control-Allow-Headers', 'Content-Type, Authorization' ) return res } export const config = { matcher: '/:path*', } `, type: "text" }, "backend/server/next/tsconfig.json.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "e47257abfb" }, content: `{ "compilerOptions": { "target": "ES2017", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", {{#unless (or (eq backend "convex") (eq backend "none"))}} "composite": true, {{/unless}} "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": ["./src/*"] {{#if (eq orm 'prisma')}}, "prisma": ["node_modules/prisma"] {{/if}} }, }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } `, type: "text" }, "backend/server/server-base/package.json.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "1cd020a140" }, content: `{ "name": "server", "main": "src/index.ts", "type": "module", "scripts": { "build": "tsc && tsc-alias", "check-types": "tsc --noEmit", "compile": "bun build --compile --minify --sourcemap --bytecode ./src/index.ts --outfile server" }, {{#if (eq orm 'prisma')}} "prisma": { "schema": "./schema" }, {{/if}} "dependencies": { "dotenv": "^16.4.7", "zod": "^3.25.16" }, {{#if (eq dbSetup 'supabase')}} "trustedDependencies": [ "supabase" ], {{/if}} "devDependencies": { "tsc-alias": "^1.8.11", "typescript": "^5.8.2" } } `, type: "text" }, "backend/server/server-base/src/routers/index.ts.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "2a92c7eab7" }, content: `{{#if (eq api "orpc")}} import { {{#if auth}}protectedProcedure, {{/if}}publicProcedure } from "../lib/orpc"; {{#if (includes examples "todo")}} import { todoRouter } from "./todo"; {{/if}} export const appRouter = { healthCheck: publicProcedure.handler(() => { return "OK"; }), {{#if auth}} privateData: protectedProcedure.handler(({ context }) => { return { message: "This is private", user: context.session?.user, }; }), {{/if}} {{#if (includes examples "todo")}} todo: todoRouter, {{/if}} }; export type AppRouter = typeof appRouter; {{else if (eq api "trpc")}} import { {{#if auth}}protectedProcedure, {{/if}}publicProcedure, router, } from "../lib/trpc"; {{#if (includes examples "todo")}} import { todoRouter } from "./todo"; {{/if}} export const appRouter = router({ healthCheck: publicProcedure.query(() => { return "OK"; }), {{#if auth}} privateData: protectedProcedure.query(({ ctx }) => { return { message: "This is private", user: ctx.session.user, }; }), {{/if}} {{#if (includes examples "todo")}} todo: todoRouter, {{/if}} }); export type AppRouter = typeof appRouter; {{else}} export const appRouter = {}; export type AppRouter = typeof appRouter; {{/if}} `, type: "text" }, "backend/server/server-base/tsconfig.json.hbs": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "e8e301561a" }, content: `{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "moduleResolution": "bundler", "verbatimModuleSyntax": true, "strict": true, "skipLibCheck": true, "baseUrl": "./", "paths": { "@/*": ["./src/*"] {{#if (eq orm "prisma")}}, "prisma": ["node_modules/prisma"] {{/if}} }, "outDir": "./dist", "types": [ {{#if (eq runtime "node")}} "node" {{else if (eq runtime "bun")}} "bun" {{else if (eq runtime "workers")}} "./worker-configuration", "node" {{else}} "node", "bun" {{/if}} ], {{#unless (or (eq backend "convex") (eq backend "none"))}} "composite": true, {{/unless}} "jsx": "react-jsx"{{#if (eq backend "hono")}}, "jsxImportSource": "hono/jsx"{{/if}} }, "tsc-alias": { "resolveFullPaths": true } } `, type: "text" }, "backend/server/server-base/_gitignore": { metadata: { updatedAt: "2025-06-17T06:06:35.000Z", updatedHash: "22473bb619" }, content: `# prod dist/ /build /out/ # dev .yarn/ !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/versions .vscode/* !.vscode/launch.json !.vscode/*.code-snippets .idea/workspace.xml .idea/usage.statistics.xml .idea/shelf .wrangler /.next/ .vercel # deps node_modules/ /node_modules /.pnp .pnp.* # env .env* .env.production !.env.example .dev.vars # logs logs/ *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* # misc .DS_Store *.pem # local db *.db* # typescript *.tsbuildinfo next-env.d.ts `, type: "text" } } } };