From 48624848576e044ada13eeb348f1800b00c9a136 Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Tue, 4 Feb 2025 10:06:51 -0500 Subject: [PATCH] test: remove build commad and its tests from cli app --- README.md | 5 +- apps/cli/__tests__/build-extension.test.ts | 81 -------- apps/cli/cli.ts | 13 +- apps/cli/mod.ts | 3 - apps/cli/src/commands/build.ts | 20 -- apps/cli/src/utils.ts | 185 ------------------ .../permissions/autogenerated/reference.md | 2 + 7 files changed, 5 insertions(+), 304 deletions(-) delete mode 100644 apps/cli/__tests__/build-extension.test.ts delete mode 100644 apps/cli/src/commands/build.ts delete mode 100644 apps/cli/src/utils.ts diff --git a/README.md b/README.md index 16550ae..f61328c 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,7 @@ ![GitHub last commit](https://img.shields.io/github/last-commit/kunkunsh/kunkun) [![YouTube badge][]][YouTube link] - - -Discord - +[![](https://dcbadge.limes.pink/api/server/7dzw3TYeTU)](https://discord.gg/7dzw3TYeTU) - Website: https://kunkun.sh/ - Documentation: https://docs.kunkun.sh/ diff --git a/apps/cli/__tests__/build-extension.test.ts b/apps/cli/__tests__/build-extension.test.ts deleted file mode 100644 index 1c45892..0000000 --- a/apps/cli/__tests__/build-extension.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import os from "os" -import path from "path" -import { getRootDir } from "@/constants" -import type { BuildResult } from "@/types" -import { buildWithDockerAndValidate } from "@/utils" -import { $ } from "bun" -import { afterAll, expect, test } from "bun:test" -import fs from "fs-extra" -import { verifyCmd } from "../src/commands/verify" - -const rootDir = getRootDir() -const createKKDir = path.join(rootDir, "../create-kunkun") - -const createKKDistDir = path.join(createKKDir, "dist") -const createKKIndexjsPath = path.join(createKKDistDir, "index.mjs") -const testDir = path.join(os.tmpdir(), "kunkun-cli-test") -console.log("Test Dir: ", testDir) -const templateNames = ["react", "vue", "nuxt", "svelte", "sveltekit", "next", "template"] -if (fs.existsSync(testDir)) { - fs.rmdirSync(testDir, { recursive: true }) -} -fs.mkdirpSync(testDir) -const testTemplateDirs: string[] = [] -for (const templateName of templateNames) { - const folderName = `${templateName}-ext` - await $`node ${createKKIndexjsPath} --outdir ${testDir} --name ${folderName} --template ${templateName}` - const templateDir = path.join(testDir, folderName) - console.log("templateDir", templateDir) - await $`pnpm install`.cwd(templateDir).quiet() - await $`pnpm build`.cwd(templateDir).quiet() - testTemplateDirs.push(templateDir) -} - -test("Build And Verify", async () => { - for (const templateDir of testTemplateDirs) { - expect(verifyCmd(templateDir, false)).toBeTrue() - } -}) - -const testDirDocker = path.join(os.tmpdir(), "kunkun-cli-test-docker") -if (fs.existsSync(testDirDocker)) { - fs.rmdirSync(testDirDocker, { recursive: true }) -} -fs.mkdirpSync(testDirDocker) - -const templateData: Record = {} - -await Promise.all( - templateNames.map(async (templateName) => { - const folderName = `${templateName}-ext` - await $`node ${createKKIndexjsPath} --outdir ${testDirDocker} --name ${folderName} --template ${templateName}` - const templateDir = path.join(testDirDocker, folderName) - console.log("templateDir:", templateDir) - - const buildResult = await buildWithDockerAndValidate(templateDir) - templateData[templateName] = { - dir: templateDir, - buildResult - } - }) -) -console.log(templateData) - -test("Template Exist", () => { - Object.entries(templateData).forEach(async ([templateName, { dir }]) => { - console.log("Expect dir exist: ", dir) - expect(fs.existsSync(dir)).toBeTrue() - }) -}) - -test("Build Result Tarball Exist", () => { - Object.entries(templateData).forEach(async ([templateName, { buildResult, dir }]) => { - const expectedTarballPath = path.join(dir, buildResult.tarballFilename) - expect(fs.existsSync(expectedTarballPath)).toBeTrue() - }) -}) - -afterAll(() => { - fs.rmdirSync(testDir, { recursive: true }) - fs.rmdirSync(testDirDocker, { recursive: true }) -}) diff --git a/apps/cli/cli.ts b/apps/cli/cli.ts index ff15b09..fc1ec3f 100644 --- a/apps/cli/cli.ts +++ b/apps/cli/cli.ts @@ -1,8 +1,8 @@ #!/usr/bin/env node import fs from "fs" import path from "path" -import { buildCmd, verifyCmd } from "@/commands" -import { getDockerFolder, NODE_ENV } from "@/constants" +import { verifyCmd } from "@/commands" +import { NODE_ENV } from "@/constants" import logger from "@/logger" import { program } from "commander" import { version } from "./package.json" @@ -39,13 +39,4 @@ program } }) -program - .command("build [project_path]") - .option("--entrypoint [path]", "Use custom entrypoint.sh (for debug purpose)") - .description("Build extension with docker and validate (You must have docker installed)") - .action((projectPath: string | undefined, opts: { entrypoint?: string }) => { - logger.info("cwd:", cwd) - buildCmd(computeProjectDir(projectPath), opts.entrypoint) - }) - program.parse() diff --git a/apps/cli/mod.ts b/apps/cli/mod.ts index 69d98b6..e596e95 100644 --- a/apps/cli/mod.ts +++ b/apps/cli/mod.ts @@ -1,9 +1,6 @@ -export { buildWithDocker, buildWithDockerAndValidate } from "@/utils" -export type { BuildResult } from "@/types" export { verifyCustomUiCommand, verifyTemplateUiCommand, verifySingleProject, verifyCmd } from "@/commands/verify" -export { buildCmd } from "@/commands/build" diff --git a/apps/cli/src/commands/build.ts b/apps/cli/src/commands/build.ts deleted file mode 100644 index 9da291d..0000000 --- a/apps/cli/src/commands/build.ts +++ /dev/null @@ -1,20 +0,0 @@ -import fs from "fs" -import path from "path" -import { getRootDir } from "@/constants" -import { buildWithDockerAndValidate } from "@/utils" - -export async function buildCmd(projectPath: string, entrypoint?: string) { - const rootDir = getRootDir() - const entrypointPath = entrypoint - ? fs.existsSync(entrypoint) - ? entrypoint - : path.join(rootDir, entrypoint) - : undefined - const buildResult = await buildWithDockerAndValidate( - projectPath, - entrypointPath && fs.existsSync(entrypointPath) ? entrypointPath : undefined - ) - console.log(buildResult) -} - -export default buildCmd diff --git a/apps/cli/src/utils.ts b/apps/cli/src/utils.ts deleted file mode 100644 index 328cf3b..0000000 --- a/apps/cli/src/utils.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { exec, spawn } from "child_process" -import crypto from "crypto" -import path from "path" -import { ExtPackageJson } from "@kksh/api/models" -import fs from "fs-extra" -import * as v from "valibot" -import { getDockerEntrypoint } from "./constants" -import logger from "./logger" -import type { BuildResult } from "./types" - -/** - * Package Name can be scoped or not - * Use regex to extract package name - * @param packageName - * @param version - */ -export function computeTarballName(packageName: string, version: string): string { - const scoped = packageName.startsWith("@") - if (scoped) { - const [scope, name] = packageName.split("/") - return `${scope.substring(1)}-${name}-${version}.tgz` - } else { - return `${packageName}-${version}.tgz` - } -} - -export function computeFileHash(filePath: string, algorithm: string): Promise { - return new Promise((resolve, reject) => { - const hash = crypto.createHash(algorithm) - const stream = fs.createReadStream(filePath) - - stream.on("data", (data) => { - // @ts-ignore - hash.update(data) - }) - - stream.on("end", () => { - const shasum = hash.digest("hex") - resolve(shasum) - }) - - stream.on("error", (err) => { - reject(err) - }) - }) -} - -export function computeFileSha1(filePath: string): Promise { - return computeFileHash(filePath, "sha1") -} - -export function computeFileSha512(filePath: string): Promise { - return computeFileHash(filePath, "sha512") -} - -export function computeHash(buffer: Buffer, algorithm: "sha1" | "sha256" | "sha512") { - const hash = crypto.createHash(algorithm) - // @ts-ignore - hash.update(buffer) - return hash.digest("hex") -} - -/** - * Docker is used to build each individual extension for safety - * Packages could potentially modify other extensions if they share environment. - * There is also a possibility of leaking environment variables. - * docker run -v $(pwd)/scripts/docker/entrypoint.sh:/entrypoint.sh \ - * -v $(pwd)/extensions/$ext:/workspace \ - * -w /workspace --rm \ - * --platform=linux/amd64 \ - * node:20 /entrypoint.sh - * @param extPath - * @returns shasum of the tarball parsed from stderr output - */ -export function buildWithDocker( - extPath: string, - entrypoint?: string -): Promise<{ - stderrShasum: string - stderrTarballFilename: string - pkg: ExtPackageJson -}> { - logger.info(`Building ${extPath}`) - return new Promise((resolve, reject) => { - const pkg = v.parse(ExtPackageJson, fs.readJsonSync(path.join(extPath, "package.json"))) - const dockerEntrypoint = entrypoint ? entrypoint : getDockerEntrypoint() - logger.info("Docker Entrypoint", dockerEntrypoint) - const dockerCmd = ` - run -v ${dockerEntrypoint}:/entrypoint.sh -v ${extPath}:/workspace -w /workspace --rm huakunshen/kunkun-ext-builder:latest /entrypoint.sh` - logger.info("dockerCmd", dockerCmd) - const args = dockerCmd - .split(" ") - .filter((arg) => arg.length > 0) - .filter((arg) => arg !== "\n") - const subprocess = spawn("docker", args) - let stderrShasum = "" - let stderrTarballFilename = "" - subprocess.stdout.on("data", (data) => { - console.log(`stdout: ${data}`) - }) - subprocess.stderr.on("data", (data) => { - const dataStr = data.toString() - console.error(`stderr: ${dataStr}`) - // if (data instanceof String) { - if (dataStr.includes("npm notice shasum")) { - console.log("shasum found") - const shasumMatch = dataStr.match(/npm notice shasum:\s+([a-f0-9]+)/) - - if (shasumMatch) { - stderrShasum = shasumMatch[1] - console.log("Parsed shasum:", stderrShasum) - } - } - - if (dataStr.includes("npm notice filename:")) { - const tarballFilename = dataStr.match(/npm notice filename:\s+([^\s]+)/) - if (tarballFilename) { - stderrTarballFilename = tarballFilename[1] - console.log("Parsed tarball:", stderrTarballFilename) - } - } else if (dataStr.includes("filename:")) { - const tarballFilename = dataStr.match(/filename:\s+([^\s]+)/) - if (tarballFilename) { - stderrTarballFilename = tarballFilename[1] - console.log("Parsed tarball:", stderrTarballFilename) - } - } - // } else { - // console.error("data is not string"); - // } - }) - subprocess.on("close", (code) => { - console.log(`child process exited with code ${code}`) - if (stderrShasum.trim().length === 0 || stderrTarballFilename.trim().length === 0) { - return reject("shasum or tarball filename not found") - } - if (code !== 0) { - return reject(`child process exited with code ${code}`) - } else { - return resolve({ stderrShasum, stderrTarballFilename, pkg }) - } - }) - }) -} - -/** - * Use this function to build an extension with docker and validate the tarball - * If this passes, the tarball is ready to be inserted into the database - * @param extPath Extension Path - * @returns - */ -export function buildWithDockerAndValidate( - extPath: string, - entrypoint?: string -): Promise { - return buildWithDocker(extPath, entrypoint) - .then((res) => { - const parsedTarballPath = path.join(extPath, res.stderrTarballFilename) - if (!fs.existsSync(parsedTarballPath)) { - console.error(`Tarball not found: ${parsedTarballPath}`) - process.exit(1) - } - return computeFileSha1(parsedTarballPath).then((computedShasum) => { - if (computedShasum !== res.stderrShasum) { - console.error( - `Shasum mismatch: Computed(${computedShasum}) !== Output from docker(${res.stderrShasum})` - ) - process.exit(1) - } else { - console.log("Shasum matches") - } - return { - shasum: computedShasum, - tarballFilename: res.stderrTarballFilename, - tarballPath: parsedTarballPath, - extPath: extPath, - pkg: res.pkg - } - }) - }) - .catch((err) => { - console.error(err) - process.exit(1) - }) -} diff --git a/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md b/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md index 7020b75..19f9805 100644 --- a/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md +++ b/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md @@ -1,3 +1,4 @@ + ## Permission Table @@ -6,6 +7,7 @@ +
Description