From d2f1e994121cad5dba70097b28bd21d60c11e06f Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 28 Jun 2021 21:54:35 +0800 Subject: [PATCH 01/16] wip: components playground --- package.json | 1 + src/admin/api/functions/components.ts | 65 +++++++++++++++++++ src/admin/api/index.ts | 2 + src/admin/app/components/AppHeaderNav.vue | 11 +++- src/admin/app/components/Editor.vue | 15 ++++- src/admin/app/components/Preview.vue | 3 +- src/admin/app/composables/monaco.ts | 5 +- src/admin/app/pages/components.vue | 42 ++++++++++++ src/admin/app/plugins/components.ts | 79 +++++++++++++++++++++++ src/admin/app/plugins/router.ts | 6 ++ src/admin/index.ts | 4 +- yarn.lock | 11 ++++ 12 files changed, 235 insertions(+), 9 deletions(-) create mode 100644 src/admin/api/functions/components.ts create mode 100644 src/admin/app/pages/components.vue create mode 100644 src/admin/app/plugins/components.ts diff --git a/package.json b/package.json index dea4fb37e..83aadf5db 100755 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "defu": "^5.0.0", "detab": "^3.0.0", "directory-tree": "^2.2.9", + "fast-glob": "^3.2.6", "flat": "^5.0.2", "graceful-fs": "^4.2.6", "gray-matter": "^4.0.3", diff --git a/src/admin/api/functions/components.ts b/src/admin/api/functions/components.ts new file mode 100644 index 000000000..29fd4dce2 --- /dev/null +++ b/src/admin/api/functions/components.ts @@ -0,0 +1,65 @@ +import { promises as fs } from 'fs' +import { join, extname } from 'path' +import { createError, Middleware, useBody } from 'h3' +import dirTree from 'directory-tree' +import { FileData, File } from '../../type' +import { normalizeFiles, r } from '../utils' + +export default async function componentsHandler(req) { + const url = req.url + + if (req.method === 'GET') { + // List all files in components/ + if (url === '/') { + const tree = dirTree(r('components')) + return normalizeFiles(tree.children, r('components')) + } + // Read a single content file + try { + const path = join(r('components'), url) + const file = await fs.readFile(path, 'utf-8') + + return { + path: path.replace(r('components'), ''), + extension: extname(path), + raw: file + } + } catch (err) { + return createError({ + statusCode: 404, + statusMessage: 'File not found' + }) + } + } + + // Update changes + if (req.method === 'PUT') { + const { raw } = await useBody(req) + if (raw == null) { + return createError({ + statusCode: 400, + statusMessage: '"raw" key is required' + }) + } + + const path = join(r('components'), url) + + try { + // @ts-ignore + // await fs.stat(path, 'utf-8') + await fs.writeFile(path, raw) + + return { ok: true } + } catch (err) { + return createError({ + statusCode: 404, + statusMessage: 'File not found' + }) + } + } + + return createError({ + statusCode: 400, + statusMessage: 'Bad Request' + }) +} diff --git a/src/admin/api/index.ts b/src/admin/api/index.ts index 830173ecf..72cf02f9c 100644 --- a/src/admin/api/index.ts +++ b/src/admin/api/index.ts @@ -2,11 +2,13 @@ import { createApp } from 'h3' import contentHandler from './functions/content' import previewHandler from './functions/preview' import staticHandler from './functions/static' +import componentsHandler from './functions/components' const app = createApp() app.useAsync('/content', contentHandler) app.useAsync('/preview', previewHandler) app.useAsync('/static', staticHandler) +app.useAsync('/components', componentsHandler) export default app._handle diff --git a/src/admin/app/components/AppHeaderNav.vue b/src/admin/app/components/AppHeaderNav.vue index a63fd1c84..d8b5c50f0 100644 --- a/src/admin/app/components/AppHeaderNav.vue +++ b/src/admin/app/components/AppHeaderNav.vue @@ -9,11 +9,20 @@ Static + + + Components + +