diff --git a/.gitignore b/.gitignore index f005dfa..9c38b7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,3 @@ node_modules -.DS_Store -dist -*.local -.vite-inspect -.remote-assets -components.d.ts -.slides.md.swp \ No newline at end of file +program \ No newline at end of file diff --git a/agent/apps/meilisearch.ts b/agent/apps/meilisearch.ts new file mode 100644 index 0000000..971e135 --- /dev/null +++ b/agent/apps/meilisearch.ts @@ -0,0 +1,132 @@ +import os from "node:os"; +import fs from "node:fs"; +import path from "node:path"; +import https from "node:https"; +import { pipeline } from "node:stream/promises"; +import { createWriteStream, createReadStream } from "node:fs"; +import { createGunzip } from "node:zlib"; +import { extract } from "tar"; + +const base = "https://api.github.com/repos/meilisearch/meilisearch/releases/latest"; +const program = 'program'; +const proxy = 'https://gh-proxy.org/'; +const directory = program + '/' + 'meilisearch'; + +// 获取平台和架构对应的文件名 +function getPlatformFileName(): string { + const platform = os.platform(); + const arch = os.arch(); + + if (platform === 'darwin') { + return arch === 'arm64' ? 'meilisearch-macos-apple-silicon' : 'meilisearch-macos-amd64'; + } else if (platform === 'linux') { + return arch === 'arm64' ? 'meilisearch-linux-aarch64' : 'meilisearch-linux-amd64'; + } else if (platform === 'win32') { + return 'meilisearch-windows-amd64.exe'; + } + + throw new Error(`Unsupported platform: ${platform}-${arch}`); +} + +// 下载文件 +async function downloadFile(url: string, dest: string): Promise { + return new Promise((resolve, reject) => { + https.get(url, { + headers: { + 'User-Agent': 'meilisearch-installer' + } + }, (response) => { + if (response.statusCode === 302 || response.statusCode === 301) { + // 处理重定向 + downloadFile(response.headers.location!, dest).then(resolve).catch(reject); + return; + } + + if (response.statusCode !== 200) { + reject(new Error(`Failed to download: ${response.statusCode}`)); + return; + } + + const fileStream = createWriteStream(dest); + response.pipe(fileStream); + + fileStream.on('finish', () => { + fileStream.close(); + resolve(); + }); + + fileStream.on('error', reject); + }).on('error', reject); + }); +} + +// 主函数 +export async function download() { + try { + console.log('正在获取最新版本信息...'); + + // 获取 latest release 信息 + const releaseData = await new Promise((resolve, reject) => { + https.get(proxy + base, { + headers: { + 'User-Agent': 'meilisearch-installer' + } + }, (response) => { + let data = ''; + response.on('data', chunk => data += chunk); + response.on('end', () => resolve(JSON.parse(data))); + response.on('error', reject); + }).on('error', reject); + }); + + const version = releaseData.tag_name; + console.log(`最新版本: ${version}`); + + const fileName = getPlatformFileName(); + console.log(`平台文件: ${fileName}`); + + // 查找对应的 asset + const asset = releaseData.assets.find((a: any) => a.name === fileName); + if (!asset) { + throw new Error(`找不到对应的文件: ${fileName}`); + } + + // 创建目录 + if (!fs.existsSync(directory)) { + fs.mkdirSync(directory, { recursive: true }); + } + + const downloadPath = path.join(directory, fileName); + + // 下载文件 + console.log('正在下载...'); + await downloadFile(asset.browser_download_url, downloadPath); + console.log(`下载完成: ${downloadPath}`); + + // 确定最终文件名 + const finalFileName = os.platform() === 'win32' ? 'meilisearch.exe' : 'meilisearch'; + const finalPath = path.join(directory, finalFileName); + + // 重命名为统一的可执行文件名 + if (downloadPath !== finalPath) { + fs.renameSync(downloadPath, finalPath); + console.log(`重命名为: ${finalFileName}`); + } + + // 给可执行文件添加执行权限(非 Windows) + if (os.platform() !== 'win32') { + fs.chmodSync(finalPath, 0o755); + console.log('已添加执行权限'); + } + + console.log('安装完成!'); + } catch (error) { + console.error('安装失败:', error); + process.exit(1); + } +} + +// 如果直接运行此文件 +if (require.main === module) { + download(); +} diff --git a/agent/apps/nocodb.ts b/agent/apps/nocodb.ts new file mode 100644 index 0000000..443ab7f --- /dev/null +++ b/agent/apps/nocodb.ts @@ -0,0 +1,151 @@ +import os from "node:os"; +import fs from "node:fs"; +import path from "node:path"; +import https from "node:https"; +import { pipeline } from "node:stream/promises"; +import { createWriteStream, createReadStream } from "node:fs"; +import { createGunzip } from "node:zlib"; +import { extract } from "tar"; + +const base = "https://api.github.com/repos/nocodb/nocodb/releases/latest"; +const program = 'program'; +const proxy = 'https://gh-proxy.org/'; +const directory = program + '/' + 'nocodb'; + +// 获取平台和架构对应的文件名 +function getPlatformFileName(): string { + const platform = os.platform(); + const arch = os.arch(); + + if (platform === 'darwin') { + return arch === 'arm64' ? 'Noco-macos-arm64' : 'Noco-macos-x64'; + } else if (platform === 'linux') { + return arch === 'arm64' ? 'Noco-linux-arm64' : 'Noco-linux-x64'; + } else if (platform === 'win32') { + return arch === 'arm64' ? 'Noco-win-arm64.exe' : 'Noco-win-x64.exe'; + } + + throw new Error(`Unsupported platform: ${platform}-${arch}`); +} + +// 下载文件 +async function downloadFile(url: string, dest: string): Promise { + return new Promise((resolve, reject) => { + https.get(url, { + headers: { + 'User-Agent': 'nocodb-installer' + } + }, (response) => { + if (response.statusCode === 302 || response.statusCode === 301) { + // 处理重定向 + downloadFile(response.headers.location!, dest).then(resolve).catch(reject); + return; + } + + if (response.statusCode !== 200) { + reject(new Error(`Failed to download: ${response.statusCode}`)); + return; + } + + const fileStream = createWriteStream(dest); + response.pipe(fileStream); + + fileStream.on('finish', () => { + fileStream.close(); + resolve(); + }); + + fileStream.on('error', reject); + }).on('error', reject); + }); +} + +// 解压 tar.gz 文件 +async function extractTarGz(filePath: string, destDir: string): Promise { + await pipeline( + createReadStream(filePath), + createGunzip(), + extract({ cwd: destDir }) + ); +} + +// 主函数 +export async function download() { + try { + console.log('正在获取最新版本信息...'); + + // 获取 latest release 信息 + const releaseData = await new Promise((resolve, reject) => { + https.get(proxy+base, { + headers: { + 'User-Agent': 'nocodb-installer' + } + }, (response) => { + let data = ''; + response.on('data', chunk => data += chunk); + response.on('end', () => resolve(JSON.parse(data))); + response.on('error', reject); + }).on('error', reject); + }); + + const version = releaseData.tag_name; + console.log(`最新版本: ${version}`); + + const fileName = getPlatformFileName(); + console.log(`平台文件: ${fileName}`); + + // 查找对应的 asset + const asset = releaseData.assets.find((a: any) => a.name === fileName); + if (!asset) { + throw new Error(`找不到对应的文件: ${fileName}`); + } + + // 创建目录 + if (!fs.existsSync(directory)) { + fs.mkdirSync(directory, { recursive: true }); + } + + const downloadPath = path.join(directory, fileName); + + // 下载文件 + console.log('正在下载...'); + await downloadFile(asset.browser_download_url, downloadPath); + console.log(`下载完成: ${downloadPath}`); + + // 确定最终文件名 + const finalFileName = os.platform() === 'win32' ? 'nocodb.exe' : 'nocodb'; + const finalPath = path.join(directory, finalFileName); + + // 如果是 tar.gz 文件,进行解压 + if (fileName === 'nocodb.tar.gz') { + console.log('正在解压...'); + await extractTarGz(downloadPath, directory); + console.log('解压完成'); + + // 删除压缩包 + fs.unlinkSync(downloadPath); + } else { + // 重命名为统一的可执行文件名 + if (downloadPath !== finalPath) { + fs.renameSync(downloadPath, finalPath); + console.log(`重命名为: ${finalFileName}`); + } + + // 给可执行文件添加执行权限(非 Windows) + if (os.platform() !== 'win32') { + fs.chmodSync(finalPath, 0o755); + console.log('已添加执行权限'); + } + } + + console.log('安装完成!'); + } catch (error) { + console.error('安装失败:', error); + process.exit(1); + } +} + +// 如果直接运行此文件 +if (require.main === module) { + download(); +} diff --git a/agent/apps/pocketbase.ts b/agent/apps/pocketbase.ts new file mode 100644 index 0000000..f89de19 --- /dev/null +++ b/agent/apps/pocketbase.ts @@ -0,0 +1,170 @@ +import os from "node:os"; +import fs from "node:fs"; +import path from "node:path"; +import https from "node:https"; +import { pipeline } from "node:stream/promises"; +import { createWriteStream, createReadStream } from "node:fs"; +import { createGunzip } from "node:zlib"; +import { extract } from "tar"; + +const base = "https://api.github.com/repos/pocketbase/pocketbase/releases/latest"; +const proxy = 'https://gh-proxy.org/'; +const program = 'program'; +const directory = program + '/' + 'pocketbase'; + +// 获取系统平台和架构 +function getPlatformInfo() { + const platform = os.platform(); // 'darwin', 'linux', 'win32' + const arch = os.arch(); // 'x64', 'arm64', etc. + + let platformName = ''; + let archName = ''; + + // 映射平台名称 + switch (platform) { + case 'darwin': + platformName = 'darwin'; + break; + case 'linux': + platformName = 'linux'; + break; + case 'win32': + platformName = 'windows'; + break; + default: + throw new Error(`Unsupported platform: ${platform}`); + } + + // 映射架构名称 + switch (arch) { + case 'x64': + archName = 'amd64'; + break; + case 'arm64': + archName = 'arm64'; + break; + default: + throw new Error(`Unsupported architecture: ${arch}`); + } + + return { platformName, archName }; +} + +// 下载文件 +async function downloadFile(url: string, destPath: string): Promise { + return new Promise((resolve, reject) => { + https.get(url, (response) => { + // 处理重定向 + if (response.statusCode === 302 || response.statusCode === 301) { + const redirectUrl = response.headers.location; + if (redirectUrl) { + downloadFile(redirectUrl, destPath).then(resolve).catch(reject); + return; + } + } + + if (response.statusCode !== 200) { + reject(new Error(`Failed to download: ${response.statusCode}`)); + return; + } + + const fileStream = createWriteStream(destPath); + response.pipe(fileStream); + + fileStream.on('finish', () => { + fileStream.close(); + resolve(); + }); + + fileStream.on('error', reject); + }).on('error', reject); + }); +} + +// 解压 zip 文件 (Windows) +async function extractZip(zipPath: string, destDir: string): Promise { + const AdmZip = require('adm-zip'); + const zip = new AdmZip(zipPath); + zip.extractAllTo(destDir, true); +} + +// 提取 tar.gz 文件 (Linux/macOS) +export async function extractTarGz(tarGzPath: string, destDir: string): Promise { + await fs.promises.mkdir(destDir, { recursive: true }); + + await pipeline( + createReadStream(tarGzPath), + createGunzip(), + extract({ cwd: destDir }) + ); +} + +// 主函数:下载并解压 PocketBase +export async function download(): Promise { + try { + const { platformName, archName } = getPlatformInfo(); + + console.log(`检测到系统: ${platformName} ${archName}`); + + // 获取最新版本信息 + const response = await fetch(base); + if (!response.ok) { + throw new Error(`Failed to fetch release info: ${response.status}`); + } + + const releaseData = await response.json(); + const tagName = releaseData.tag_name.replace(/^v/, ''); + const assets = releaseData.assets; + + // 查找匹配的资源文件 + const fileExtension = '.zip'; + const assetPattern = `pocketbase_${tagName}_${platformName}_${archName}${fileExtension}`; + + const asset = assets.find((a: any) => a.name.includes(assetPattern)); + + if (!asset) { + throw new Error(`No matching asset found for ${platformName} ${archName}`); + } + + console.log(`找到资源: ${asset.name}`); + console.log(`下载链接: ${asset.browser_download_url}`); + + // 创建目录 + await fs.promises.mkdir(directory, { recursive: true }); + + const downloadPath = path.join(directory, asset.name); + + // 下载文件 + console.log('开始下载...'); + await downloadFile(asset.browser_download_url, downloadPath); + console.log('下载完成'); + + // 解压文件 + console.log('开始解压...'); + await extractZip(downloadPath, directory); + + console.log('解压完成'); + + // 给可执行文件添加执行权限(非 Windows) + if (os.platform() !== 'win32') { + const finalPath = path.join(directory, 'pocketbase'); + fs.chmodSync(finalPath, 0o755); + console.log('已添加执行权限'); + } + + // 删除压缩包 + await fs.promises.unlink(downloadPath); + console.log('清理完成'); + + console.log(`PocketBase 已安装到: ${path.resolve(directory)}`); + } catch (error) { + console.error('下载或解压失败:', error); + throw error; + } +} + +// 如果直接运行此文件 +if (require.main === module) { + download(); +} + diff --git a/agent/main.ts b/agent/main.ts new file mode 100644 index 0000000..0c2bdbc --- /dev/null +++ b/agent/main.ts @@ -0,0 +1,36 @@ +// import { downloadAndExtractPocketBase } from './apps/pocketbase'; + +// // 下载并解压 PocketBase +// downloadAndExtractPocketBase() +// .then(() => { +// console.log('✅ PocketBase 安装成功'); +// }) +// .catch((error) => { +// console.error('❌ 安装失败:', error); +// process.exit(1); +// }); + +// import { download } from './apps/nocodb'; + +// // 下载 NocoDB +// download() +// .then(() => { +// console.log('✅ NocoDB 安装成功'); +// }) +// .catch((error) => { +// console.error('❌ 安装失败:', error); +// process.exit(1); +// }); + + +import { download } from "./apps/meilisearch"; + +// 下载 MeiliSearch +download() + .then(() => { + console.log('✅ MeiliSearch 安装成功'); + }) + .catch((error) => { + console.error('❌ 安装失败:', error); + process.exit(1); + }); \ No newline at end of file diff --git a/package.json b/package.json index b2f4952..11e6952 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,20 @@ { - "name": "@kevisual/slidev-template", - "type": "module", - "basename": "/root/slidev-template", - "version": "0.0.1", + "name": "app-db-agent", + "version": "1.0.0", + "description": "", + "main": "index.js", "scripts": { - "build": "slidev build --base /root/slidev-template/", - "dev": "slidev --open", - "pub": "ev deploy ./dist -k slidev-template -v 0.0.1 -u", - "export": "slidev export" - }, - "dependencies": { - "@slidev/cli": "^52.8.0", - "@slidev/theme-default": "latest", - "vue": "^3.5.24" + "test": "echo \"Error: no test specified\" && exit 1" }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.19.0", "devDependencies": { - "playwright-chromium": "^1.56.1" + "@kevisual/router": "^0.0.33", + "@types/node": "^24.10.1", + "@types/tar": "^6.1.13", + "adm-zip": "^0.5.16", + "tar": "^7.5.2" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..48e54e4 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,271 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@kevisual/router': + specifier: ^0.0.33 + version: 0.0.33 + '@types/node': + specifier: ^24.10.1 + version: 24.10.1 + '@types/tar': + specifier: ^6.1.13 + version: 6.1.13 + adm-zip: + specifier: ^0.5.16 + version: 0.5.16 + tar: + specifier: ^7.5.2 + version: 7.5.2 + +packages: + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@kevisual/router@0.0.33': + resolution: {integrity: sha512-9z7TkSzCIGbXn9SuHPBdZpGwHlAuwA8iN5jNAZBUvbEvBRkBxlrbdCSe9fBYiAHueLm2AceFNrW74uulOiAkqA==} + + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + + '@types/tar@6.1.13': + resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + selfsigned@4.0.0: + resolution: {integrity: sha512-eP/1BEUCziBF/7p96ergE2JlGOMsGj9kIe77pD99G3ValgxDFwHA2oNCYW4rjlmYp8LXc684ypH0836GjSKw0A==} + engines: {node: '>=10'} + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + +snapshots: + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@kevisual/router@0.0.33': + dependencies: + path-to-regexp: 8.3.0 + selfsigned: 4.0.0 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + + '@types/tar@6.1.13': + dependencies: + '@types/node': 24.10.1 + minipass: 4.2.8 + + adm-zip@0.5.16: {} + + chownr@3.0.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + depd@2.0.0: {} + + ee-first@1.1.1: {} + + encodeurl@2.0.0: {} + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + fresh@2.0.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + inherits@2.0.4: {} + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + minipass@4.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + ms@2.1.3: {} + + node-forge@1.3.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + path-to-regexp@8.3.0: {} + + range-parser@1.2.1: {} + + selfsigned@4.0.0: + dependencies: + node-forge: 1.3.1 + + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + statuses@2.0.2: {} + + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + toidentifier@1.0.1: {} + + undici-types@7.16.0: {} + + yallist@5.0.0: {} diff --git a/slide/.gitignore b/slide/.gitignore new file mode 100644 index 0000000..f005dfa --- /dev/null +++ b/slide/.gitignore @@ -0,0 +1,9 @@ +node_modules +.DS_Store +dist +*.local +.vite-inspect +.remote-assets +components.d.ts + +.slides.md.swp \ No newline at end of file diff --git a/bun.lock b/slide/bun.lock similarity index 100% rename from bun.lock rename to slide/bun.lock diff --git a/components/Counter.vue b/slide/components/Counter.vue similarity index 100% rename from components/Counter.vue rename to slide/components/Counter.vue diff --git a/slide/package.json b/slide/package.json new file mode 100644 index 0000000..b2f4952 --- /dev/null +++ b/slide/package.json @@ -0,0 +1,20 @@ +{ + "name": "@kevisual/slidev-template", + "type": "module", + "basename": "/root/slidev-template", + "version": "0.0.1", + "scripts": { + "build": "slidev build --base /root/slidev-template/", + "dev": "slidev --open", + "pub": "ev deploy ./dist -k slidev-template -v 0.0.1 -u", + "export": "slidev export" + }, + "dependencies": { + "@slidev/cli": "^52.8.0", + "@slidev/theme-default": "latest", + "vue": "^3.5.24" + }, + "devDependencies": { + "playwright-chromium": "^1.56.1" + } +} \ No newline at end of file diff --git a/pages/contents.md b/slide/pages/contents.md similarity index 100% rename from pages/contents.md rename to slide/pages/contents.md diff --git a/slides.md b/slide/slides.md similarity index 100% rename from slides.md rename to slide/slides.md diff --git a/snippets/external.ts b/slide/snippets/external.ts similarity index 100% rename from snippets/external.ts rename to slide/snippets/external.ts