From 9734f32c77e8c936d1943edbe9050727ea536d29 Mon Sep 17 00:00:00 2001 From: AmirHossein Sakhravi Date: Mon, 3 Feb 2025 10:39:16 +0330 Subject: [PATCH] chore: ci (#317) --- .eslintrc | 34 ++++++++++++++++++- .github/workflows/lint-check.yml | 33 ++++++++++++++++++ e2e/publish.test.mts | 11 +++--- package.json | 1 + packages/backend/objects.ts | 7 +--- packages/backend/script/ci.ts | 14 ++++---- packages/backend/script/octokit.ts | 2 +- packages/backend/script/update-webhook-url.ts | 2 +- packages/backend/server/middleware/cors.ts | 2 +- packages/backend/server/octokit.ts | 22 ++++++------ packages/backend/server/plugins/error.ts | 2 +- .../[npmOrg]/[packageAndRefOrSha].get.ts | 2 +- .../[repo]/[packageAndRefOrSha].get.ts | 13 ++++--- .../server/routes/[owner]/[repo]/index.get.ts | 2 +- .../server/routes/[packageAndRefOrSha].get.ts | 2 +- .../server/routes/multipart/complete.post.ts | 6 +--- .../server/routes/multipart/upload.put.ts | 6 +--- .../backend/server/routes/publish.post.ts | 32 +++++++++-------- .../backend/server/routes/rm/stale.post.ts | 2 +- packages/backend/server/routes/stats.get.ts | 6 ++-- .../backend/server/routes/webhook.post.ts | 21 +++++++----- packages/backend/server/utils/bucket.ts | 2 +- packages/backend/server/utils/markdown.ts | 8 ++--- packages/backend/server/utils/octokit.ts | 4 +-- packages/backend/server/utils/template.ts | 3 ++ packages/cli/environments.ts | 1 + packages/cli/index.ts | 28 +++++++-------- packages/utils/index.ts | 2 +- templates/example-2/src/utils.js | 1 - 29 files changed, 168 insertions(+), 103 deletions(-) create mode 100644 .github/workflows/lint-check.yml delete mode 100644 templates/example-2/src/utils.js diff --git a/.eslintrc b/.eslintrc index 1c5ad4b3..e2ae2494 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,35 @@ { - "extends": ["eslint-config-unjs"] + "extends": ["eslint-config-unjs"], + "rules": { + "unicorn/no-null": "off", + "require-await": "error", + "unicorn/filename-case": "off", + "unicorn/no-process-exit": "error", + "unicorn/prefer-ternary": "error", + "unicorn/prefer-top-level-await": "off", + "no-useless-constructor": "error", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + }, + ], + "@typescript-eslint/no-namespace": "error", + "camelcase": "off", + "unicorn/prefer-code-point": "error", + "unicorn/prefer-string-slice": "off", + "unicorn/prefer-at": "off", + "unicorn/explicit-length-check": "off", + "unicorn/prefer-set-has": "off", + "no-empty": [ + "error", + { + "allowEmptyCatch": true, + }, + ], + "prefer-const": "error", + "unicorn/no-empty-file": "error", + "@typescript-eslint/no-non-null-assertion": "off", + }, } diff --git a/.github/workflows/lint-check.yml b/.github/workflows/lint-check.yml new file mode 100644 index 00000000..67d7fdf3 --- /dev/null +++ b/.github/workflows/lint-check.yml @@ -0,0 +1,33 @@ +name: CI Linting + +on: + pull_request: + +jobs: + linting: + name: Run Linting + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Enable Corepack + run: corepack enable + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Lint JavaScript + run: pnpm run lint:js + + - name: Check formatting + run: pnpm run lint:format + + - name: Type checking + run: pnpm run lint:types diff --git a/e2e/publish.test.mts b/e2e/publish.test.mts index 1bb2a545..2e58a571 100644 --- a/e2e/publish.test.mts +++ b/e2e/publish.test.mts @@ -1,7 +1,8 @@ -import { exec } from "child_process"; -import { platform } from "os"; -import wp from "wait-port"; +/* eslint-disable unicorn/no-process-exit */ +import { exec } from "node:child_process"; +import { platform } from "node:os"; import assert from "node:assert"; +import wp from "wait-port"; import ezSpawn from "@jsdevtools/ez-spawn"; import pushWorkflowRunInProgressFixture from "./fixtures/workflow_run.in_progress.json" with { type: "json" }; import prWorkflowRunRequestedFixture from "./fixtures/pr.workflow_run.requested.json" with { type: "json" }; @@ -246,8 +247,8 @@ async function killPort() { killSignal: "SIGINT", }); } - } catch (e) { - console.error(e); + } catch (error) { + console.error(error); c.abort(); process.exit(1); } finally { diff --git a/package.json b/package.json index 581e1f53..ddbab6c6 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "lint": "pnpm run \"/lint:.*/\"", "lint:js": "eslint --cache .", "lint:format": "prettier --check --cache .", + "lint:fix": "prettier --write --cache .", "lint:types": "pnpm -r --parallel run typecheck", "release": "tsx script/release.ts", "test": "tsx e2e/publish.test.mts", diff --git a/packages/backend/objects.ts b/packages/backend/objects.ts index be7f9317..7bcb4489 100644 --- a/packages/backend/objects.ts +++ b/packages/backend/objects.ts @@ -1,10 +1,5 @@ -import { DurableObjectState } from "@cloudflare/workers-types"; -import type { Env } from "nitro-cloudflare-dev"; - export class Workflows { - constructor(state: DurableObjectState, env: Env) {} - - async fetch(request: Request) { + fetch() { return new Response("Hello World"); } } diff --git a/packages/backend/script/ci.ts b/packages/backend/script/ci.ts index 646397c4..84356d8a 100644 --- a/packages/backend/script/ci.ts +++ b/packages/backend/script/ci.ts @@ -1,9 +1,11 @@ -import fs from "fs/promises"; +import fs from "node:fs/promises"; if (process.env.CI) { - const content = Object.entries(process.env) - .filter(([k]) => k.startsWith("NITRO")) - .map(([k, v]) => `${k}="${v}"`) - .concat(["NITRO_TEST=true", "GITHUB_TOKEN=" + process.env.GITHUB_TOKEN!]) - .join("\n"); + const content = [ + ...Object.entries(process.env) + .filter(([k]) => k.startsWith("NITRO")) + .map(([k, v]) => `${k}="${v}"`), + "NITRO_TEST=true", + "GITHUB_TOKEN=" + process.env.GITHUB_TOKEN!, + ].join("\n"); await fs.writeFile(".dev.vars", content); } diff --git a/packages/backend/script/octokit.ts b/packages/backend/script/octokit.ts index 9b06450f..ee5d7969 100644 --- a/packages/backend/script/octokit.ts +++ b/packages/backend/script/octokit.ts @@ -1,5 +1,5 @@ -import esbuild from "esbuild"; import { fileURLToPath } from "node:url"; +import esbuild from "esbuild"; import { polyfillNode } from "esbuild-plugin-polyfill-node"; await esbuild.build({ diff --git a/packages/backend/script/update-webhook-url.ts b/packages/backend/script/update-webhook-url.ts index 407b592f..8e8dccea 100644 --- a/packages/backend/script/update-webhook-url.ts +++ b/packages/backend/script/update-webhook-url.ts @@ -26,7 +26,7 @@ const octokit = new Octokit({ auth: jwtToken, }); -let { +const { data: { url }, } = await octokit.request("GET /app/hook/config"); diff --git a/packages/backend/server/middleware/cors.ts b/packages/backend/server/middleware/cors.ts index 8dd1fa30..adef7a37 100644 --- a/packages/backend/server/middleware/cors.ts +++ b/packages/backend/server/middleware/cors.ts @@ -1,5 +1,5 @@ export default defineEventHandler((event) => { if (handleCors(event, {})) { - return; + console.log("CORS was successfully handled"); } }); diff --git a/packages/backend/server/octokit.ts b/packages/backend/server/octokit.ts index c2239b35..afc25e82 100644 --- a/packages/backend/server/octokit.ts +++ b/packages/backend/server/octokit.ts @@ -27,6 +27,12 @@ import { createAppAuth } from "@octokit/auth-app"; import { OAuthApp } from "@octokit/oauth-app"; import { Webhooks, type EmitterWebhookEvent } from "@octokit/webhooks"; +import type { Octokit } from "@octokit/core"; +import { createUnauthenticatedAuth } from "@octokit/auth-unauthenticated"; + +// https://github.com/octokit/app.js/blob/main/src/types.ts +import type { Endpoints } from "@octokit/types"; + type Constructor = new (...args: any[]) => T; type OctokitType = @@ -64,6 +70,7 @@ export class App { clientType: "github-app"; Octokit: OctokitClassType; }>; + log: { debug: (message: string, additionalInfo?: object) => void; info: (message: string, additionalInfo?: object) => void; @@ -136,9 +143,6 @@ export class App { } } -import type { Octokit } from "@octokit/core"; -import { createUnauthenticatedAuth } from "@octokit/auth-unauthenticated"; - export function webhooks( appOctokit: Octokit, options: Required["webhooks"], @@ -173,11 +177,10 @@ export function webhooks( return new auth.octokit.constructor({ ...auth.octokitOptions, authStrategy: createAppAuth, - ...{ - auth: { - ...auth, - installationId, - }, + + auth: { + ...auth, + installationId, }, }); }, @@ -201,9 +204,6 @@ export function webhooks( }); } -// https://github.com/octokit/app.js/blob/main/src/types.ts -import type { Endpoints } from "@octokit/types"; - export type Options = { appId?: number | string; privateKey?: string; diff --git a/packages/backend/server/plugins/error.ts b/packages/backend/server/plugins/error.ts index d674cb20..a44c651a 100644 --- a/packages/backend/server/plugins/error.ts +++ b/packages/backend/server/plugins/error.ts @@ -1,5 +1,5 @@ export default defineNitroPlugin((nitro) => { - nitro.hooks.hook("error", async (error, { event }) => { + nitro.hooks.hook("error", (error, { event }) => { console.error(`${event?.path} Application error:`, error); }); }); diff --git a/packages/backend/server/routes/[owner]/[repo]/[npmOrg]/[packageAndRefOrSha].get.ts b/packages/backend/server/routes/[owner]/[repo]/[npmOrg]/[packageAndRefOrSha].get.ts index 038215e3..db3e6b30 100644 --- a/packages/backend/server/routes/[owner]/[repo]/[npmOrg]/[packageAndRefOrSha].get.ts +++ b/packages/backend/server/routes/[owner]/[repo]/[npmOrg]/[packageAndRefOrSha].get.ts @@ -5,7 +5,7 @@ type Params = Omit & { packageAndRefOrSha: string; }; -export default eventHandler(async (event) => { +export default eventHandler((event) => { const params = getRouterParams(event) as Params; const [noScopePackageName, refOrSha] = params.packageAndRefOrSha.split("@"); const packageName = params.npmOrg + "/" + noScopePackageName; diff --git a/packages/backend/server/routes/[owner]/[repo]/[packageAndRefOrSha].get.ts b/packages/backend/server/routes/[owner]/[repo]/[packageAndRefOrSha].get.ts index b081cb4b..f2a17b0c 100644 --- a/packages/backend/server/routes/[owner]/[repo]/[packageAndRefOrSha].get.ts +++ b/packages/backend/server/routes/[owner]/[repo]/[packageAndRefOrSha].get.ts @@ -1,6 +1,6 @@ -import { WorkflowData } from "../../../types"; import { abbreviateCommitHash } from "@pkg-pr-new/utils"; import { normalizeKey } from "unstorage"; +import { WorkflowData } from "../../../types"; type Params = Omit & { packageAndRefOrSha: string; @@ -8,6 +8,7 @@ type Params = Omit & { export default eventHandler(async (event) => { const params = getRouterParams(event) as Params; + // eslint-disable-next-line prefer-const let [encodedPackageName, longerRefOrSha] = params.packageAndRefOrSha.split("@"); const packageName = decodeURIComponent(encodedPackageName); @@ -17,7 +18,7 @@ export default eventHandler(async (event) => { ? abbreviateCommitHash(longerRefOrSha) : longerRefOrSha; - let base = `${params.owner}:${params.repo}:${refOrSha}`; + const base = `${params.owner}:${params.repo}:${refOrSha}`; let packageKey = `${base}:${packageName}`; const cursorKey = base; @@ -48,7 +49,9 @@ export default eventHandler(async (event) => { // https://github.com/unjs/unstorage/blob/e42c01d0c22092f394f57e3ec114371fc8dcf6dd/src/drivers/utils/index.ts#L14-L19 const [keySha, ...keyPackageNameParts] = trimmedKey.split(":").slice(2); const keyPackageName = keyPackageNameParts.join(":"); - if (keyPackageName !== normalizeKey(packageName)) continue; + if (keyPackageName !== normalizeKey(packageName)) { + continue; + } if (keySha.startsWith(longerRefOrSha)) { packageKey = trimmedKey; @@ -81,8 +84,8 @@ export default eventHandler(async (event) => { }); }); -const sha1Regex = /^[a-f0-9]{40}$/i; -const sha256Regex = /^[a-f0-9]{64}$/i; +const sha1Regex = /^[\da-f]{40}$/i; +const sha256Regex = /^[\da-f]{64}$/i; function isValidGitHash(hash: string): boolean { return sha1Regex.test(hash) || sha256Regex.test(hash); diff --git a/packages/backend/server/routes/[owner]/[repo]/index.get.ts b/packages/backend/server/routes/[owner]/[repo]/index.get.ts index f77989a3..3cc74d15 100644 --- a/packages/backend/server/routes/[owner]/[repo]/index.get.ts +++ b/packages/backend/server/routes/[owner]/[repo]/index.get.ts @@ -1,6 +1,6 @@ import { getPackageManifest } from "query-registry"; -import { WorkflowData } from "../../../types"; import { extractOwnerAndRepo, extractRepository } from "@pkg-pr-new/utils"; +import { WorkflowData } from "../../../types"; type Params = Omit; diff --git a/packages/backend/server/routes/[packageAndRefOrSha].get.ts b/packages/backend/server/routes/[packageAndRefOrSha].get.ts index d8bea80b..9fcb5b68 100644 --- a/packages/backend/server/routes/[packageAndRefOrSha].get.ts +++ b/packages/backend/server/routes/[packageAndRefOrSha].get.ts @@ -1,6 +1,6 @@ -import { WorkflowData } from "../types"; import { getPackageManifest } from "query-registry"; import { extractOwnerAndRepo, extractRepository } from "@pkg-pr-new/utils"; +import { WorkflowData } from "../types"; type Params = Omit & { packageAndRefOrSha: string; diff --git a/packages/backend/server/routes/multipart/complete.post.ts b/packages/backend/server/routes/multipart/complete.post.ts index 2ca768f3..ee2cde6b 100644 --- a/packages/backend/server/routes/multipart/complete.post.ts +++ b/packages/backend/server/routes/multipart/complete.post.ts @@ -1,11 +1,7 @@ import type { R2UploadedPart } from "@cloudflare/workers-types"; export default eventHandler(async (event) => { - const { - key: key, - id: id, - "uploaded-parts": uploadedPartsHeader, - } = getHeaders(event); + const { key, id, "uploaded-parts": uploadedPartsHeader } = getHeaders(event); const binding = useBinding(event); diff --git a/packages/backend/server/routes/multipart/upload.put.ts b/packages/backend/server/routes/multipart/upload.put.ts index 442686aa..9c0a43ac 100644 --- a/packages/backend/server/routes/multipart/upload.put.ts +++ b/packages/backend/server/routes/multipart/upload.put.ts @@ -1,9 +1,5 @@ export default eventHandler(async (event) => { - const { - key: key, - id: id, - "part-number": partNumberHeader, - } = getHeaders(event); + const { key, id, "part-number": partNumberHeader } = getHeaders(event); const partNumber = Number(partNumberHeader); const binding = useBinding(event); diff --git a/packages/backend/server/routes/publish.post.ts b/packages/backend/server/routes/publish.post.ts index f6226025..ebd0ba0b 100644 --- a/packages/backend/server/routes/publish.post.ts +++ b/packages/backend/server/routes/publish.post.ts @@ -1,10 +1,10 @@ import { Comment, isPullRequest, isWhitelisted } from "@pkg-pr-new/utils"; import { randomUUID } from "uncrypto"; +import type { PackageManager } from "@pkg-pr-new/utils"; +import type { components as OctokitComponents } from "@octokit/openapi-types"; import { setItemStream, useTemplatesBucket } from "~/utils/bucket"; import { useOctokitInstallation } from "~/utils/octokit"; import { generateTemplateHtml } from "~/utils/template"; -import type { PackageManager } from "@pkg-pr-new/utils"; -import type { components as OctokitComponents } from "@octokit/openapi-types"; export default eventHandler(async (event) => { const origin = getRequestURL(event).origin; @@ -66,7 +66,7 @@ export default eventHandler(async (event) => { k.startsWith("template:"), ); - if (!packages.length) { + if (packages.length === 0) { throw createError({ statusCode: 400, message: "No packages", @@ -91,7 +91,7 @@ export default eventHandler(async (event) => { const currentCursor = await cursorBucket.getItem(cursorKey); await Promise.all( - packages.map(async (packageNameWithPrefix) => { + packages.map((packageNameWithPrefix) => { const packageName = packageNameWithPrefix.slice("package:".length); const packageKey = `${baseKey}:${workflowData.sha}:${packageName}`; @@ -108,13 +108,14 @@ export default eventHandler(async (event) => { }, ); } + return null; }), ); const templatesMap = new Map>(); await Promise.all( - templateAssets.map(async (templateAssetWithPrefix) => { + templateAssets.map((templateAssetWithPrefix) => { const file = formData.get(templateAssetWithPrefix)!; const [template, encodedTemplateAsset] = templateAssetWithPrefix .slice("template:".length) @@ -135,6 +136,7 @@ export default eventHandler(async (event) => { const stream = file.stream(); return setItemStream(event, useTemplatesBucket.base, uuid, stream); } + return null; }), ); @@ -181,7 +183,7 @@ export default eventHandler(async (event) => { let checkRunUrl = check_runs[0]?.html_url ?? ""; - if (!check_runs.length) { + if (check_runs.length === 0) { const { data: { html_url }, } = await installation.request("POST /repos/{owner}/{repo}/check-runs", { @@ -229,15 +231,15 @@ export default eventHandler(async (event) => { ); if (comment !== "off") { - const { data: { permissions } } = await installation.request( - "GET /repos/{owner}/{repo}/installation", - { - owner: workflowData.owner, - repo: workflowData.repo, - } - ); + const { + data: { permissions }, + } = await installation.request("GET /repos/{owner}/{repo}/installation", { + owner: workflowData.owner, + repo: workflowData.repo, + }); try { + // eslint-disable-next-line unicorn/prefer-ternary if (comment === "update" && prevComment!) { await installation.request( "PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}", @@ -279,8 +281,8 @@ export default eventHandler(async (event) => { }, ); } - } catch (e) { - console.error("failed to create/update comment", e, permissions); + } catch (error) { + console.error("failed to create/update comment", error, permissions); } } } diff --git a/packages/backend/server/routes/rm/stale.post.ts b/packages/backend/server/routes/rm/stale.post.ts index 41f041f5..c885cc10 100644 --- a/packages/backend/server/routes/rm/stale.post.ts +++ b/packages/backend/server/routes/rm/stale.post.ts @@ -48,7 +48,7 @@ async function iterateAndDelete(event: H3Event, opts: R2ListOptions) { // TODO: Avoid using context.cloudflare and migrate to unstorage, but it does not have truncated for now const next = await binding.list({ ...opts, - cursor: cursor, + cursor, }); for (const object of next.objects) { const uploaded = Date.parse(object.uploaded.toString()); diff --git a/packages/backend/server/routes/stats.get.ts b/packages/backend/server/routes/stats.get.ts index c4856473..403149ec 100644 --- a/packages/backend/server/routes/stats.get.ts +++ b/packages/backend/server/routes/stats.get.ts @@ -5,8 +5,7 @@ export default eventHandler(async (event) => { const binding = useBinding(event); const query = getQuery(event); - let cursor = (query.cursor as string) || undefined; - let objectCount = 0; + const cursor = (query.cursor as string) || undefined; const packagesPrefix = `${usePackagesBucket.base}:`; const cursorsPrefix = `${useCursorsBucket.base}:`; @@ -15,7 +14,6 @@ export default eventHandler(async (event) => { const results = []; const response = await binding.list({ cursor, limit: 500 }); - objectCount += response.objects.length; for (const { key } of response.objects) { let result = null; @@ -62,7 +60,7 @@ export default eventHandler(async (event) => { return { data: results, - nextCursor: nextCursor, + nextCursor, }; } catch (error) { throw createError({ diff --git a/packages/backend/server/routes/webhook.post.ts b/packages/backend/server/routes/webhook.post.ts index d80ad308..d08b70d5 100644 --- a/packages/backend/server/routes/webhook.post.ts +++ b/packages/backend/server/routes/webhook.post.ts @@ -1,7 +1,7 @@ import type { PullRequestEvent } from "@octokit/webhooks-types"; import type { HandlerFunction } from "@octokit/webhooks/dist-types/types"; -import type { PullRequestData, WorkflowData } from "../types"; import { hash } from "ohash"; +import type { PullRequestData, WorkflowData } from "../types"; // mark a PR as a PR :) const prMarkEvents: PullRequestEvent["action"][] = [ @@ -59,10 +59,7 @@ export default eventHandler(async (event) => { owner, repo, sha: payload.workflow_run.head_sha, - ref: isPullRequest - ? // it's a pull request workflow - `${prNumber}` - : payload.workflow_run.head_branch!, + ref: isPullRequest ? `${prNumber}` : payload.workflow_run.head_branch!, // it's a pull request workflow }; // Publishing is only available throughout the lifetime of a workflow_job @@ -73,11 +70,16 @@ export default eventHandler(async (event) => { const pullRequestHandler: HandlerFunction<"pull_request", unknown> = async ({ payload, }) => { - // TODO: functions that generate these kinda keys + const headRepo = payload.pull_request.head.repo; + if (!headRepo || !headRepo.full_name) { + throw new Error("Invalid payload: 'full_name' is undefined."); + } + const key: PullRequestData = { - full_name: payload.pull_request.head.repo?.full_name!, + full_name: headRepo.full_name, ref: payload.pull_request.head.ref, }; + if (prMarkEvents.includes(payload.action)) { await pullRequestNumbersBucket.setItem( `${key.full_name}:${key.ref}`, @@ -100,11 +102,12 @@ export default eventHandler(async (event) => { const payload = (await readRawBody(event))!; try { + // eslint-disable-next-line unicorn/prefer-ternary if (test) { // TODO: fix typing with infer await app.webhooks.receive({ - id: id, - name: name, + id, + name, payload: JSON.parse(payload), } as any); } else { diff --git a/packages/backend/server/utils/bucket.ts b/packages/backend/server/utils/bucket.ts index 45a61b36..b33560ee 100644 --- a/packages/backend/server/utils/bucket.ts +++ b/packages/backend/server/utils/bucket.ts @@ -1,8 +1,8 @@ import { prefixStorage, createStorage, joinKeys } from "unstorage"; import cloudflareR2BindingDriver from "unstorage/drivers/cloudflare-r2-binding"; import { getR2Binding } from "unstorage/drivers/utils/cloudflare"; -import { WorkflowData, Cursor } from "../types"; import type { H3EventContext } from "h3"; +import { WorkflowData, Cursor } from "../types"; type Binary = Parameters[1]; type Event = { context: { cloudflare: H3EventContext["cloudflare"] } }; diff --git a/packages/backend/server/utils/markdown.ts b/packages/backend/server/utils/markdown.ts index a2a92afd..c20fdccf 100644 --- a/packages/backend/server/utils/markdown.ts +++ b/packages/backend/server/utils/markdown.ts @@ -97,7 +97,7 @@ ${packageManager} ${packageCommands[packageManager]} ${refUrl} return ` ${templatesStr} -${!onlyTemplates ? refMessages : ""} +${onlyTemplates ? "" : refMessages} _commit: ${abbreviateCommitHash(workflowData.sha)}_ `; @@ -105,11 +105,11 @@ _commit: ${abbreviateCommitHash(workflowData.sha) function generateTemplatesStr(templates: Record) { const entries = Object.entries(templates).filter(([k]) => k !== "default"); - let str = templates["default"] - ? `[Open in Stackblitz](${templates["default"]})` + let str = templates.default + ? `[Open in Stackblitz](${templates.default})` : ""; - if (entries.length && entries.length <= 2) { + if (entries.length > 0 && entries.length <= 2) { str = [str, ...entries.map(([k, v]) => `[${k}](${v})`)] .filter(Boolean) .join(" • "); diff --git a/packages/backend/server/utils/octokit.ts b/packages/backend/server/utils/octokit.ts index a1038ecb..d10a8cd0 100644 --- a/packages/backend/server/utils/octokit.ts +++ b/packages/backend/server/utils/octokit.ts @@ -21,8 +21,8 @@ export async function useOctokitInstallation( const { data: installationData } = await app.octokit.request( "GET /repos/{owner}/{repo}/installation", { - owner: owner, - repo: repo, + owner, + repo, }, ); diff --git a/packages/backend/server/utils/template.ts b/packages/backend/server/utils/template.ts index 47cd0648..484e5091 100644 --- a/packages/backend/server/utils/template.ts +++ b/packages/backend/server/utils/template.ts @@ -1,3 +1,6 @@ +/* eslint-disable unicorn/no-abusive-eslint-disable */ +/* eslint-disable */ + export function generateTemplateHtml( name: string, files: Record, diff --git a/packages/cli/environments.ts b/packages/cli/environments.ts index b8ef1a06..28bca743 100644 --- a/packages/cli/environments.ts +++ b/packages/cli/environments.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-namespace */ // https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables declare global { namespace NodeJS { diff --git a/packages/cli/index.ts b/packages/cli/index.ts index 5f964014..eb29494c 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -1,11 +1,12 @@ -import { defineCommand, runMain } from "citty"; +/* eslint-disable unicorn/no-process-exit */ import assert from "node:assert"; -import path from "path"; -import ezSpawn from "@jsdevtools/ez-spawn"; +import path from "node:path"; import { createHash } from "node:crypto"; +import fsSync from "node:fs"; +import fs from "node:fs/promises"; import { hash } from "ohash"; -import fsSync from "fs"; -import fs from "fs/promises"; +import ezSpawn from "@jsdevtools/ez-spawn"; +import { defineCommand, runMain } from "citty"; import { getPackageManifest, type PackageManifest } from "query-registry"; import type { Comment } from "@pkg-pr-new/utils"; import { @@ -16,13 +17,13 @@ import { import { glob } from "tinyglobby"; import ignore from "ignore"; import "./environments"; -import pkg from "./package.json" with { type: "json" }; import { isBinaryFile } from "isbinaryfile"; import { writePackageJSON, type PackageJson } from "pkg-types"; +import pkg from "./package.json" with { type: "json" }; import { createDefaultTemplate } from "./template"; declare global { - var API_URL: string; + const API_URL: string; } type OutputMetadata = { @@ -394,7 +395,7 @@ const main = defineCommand({ // multipart uploading if (formDataPackagesSize > 1024 * 1024 * 99) { - for (const [name, entry] of [...formData]) { + for (const [name, entry] of formData) { if (name.startsWith("package:")) { const file = entry as File; const chunkSize = 1024 * 1024 * 5; @@ -413,11 +414,8 @@ const main = defineCommand({ console.error(await createMultipartRes.text()); continue; } - const { - key: uploadKey, - id: uploadId, - ...data - } = await createMultipartRes.json(); + const { key: uploadKey, id: uploadId } = + await createMultipartRes.json(); interface R2UploadedPart { partNumber: number; @@ -526,7 +524,9 @@ const main = defineCommand({ link: () => { return { meta: {}, - run: () => {}, + run: () => { + // noop + }, }; }, }, diff --git a/packages/utils/index.ts b/packages/utils/index.ts index 21a0ed93..955b0828 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -1,7 +1,7 @@ import type { PackageManifest } from "query-registry"; const githubUrlRegex = - /^(?:git\+)?https?:\/\/github\.com\/([^\/]+)\/([^\/]+)\.git$/; + /^(?:git\+)?https?:\/\/github\.com\/([^/]+)\/([^/]+)\.git$/; export function extractOwnerAndRepo( repositoryUrl: string, diff --git a/templates/example-2/src/utils.js b/templates/example-2/src/utils.js deleted file mode 100644 index e9b6a44c..00000000 --- a/templates/example-2/src/utils.js +++ /dev/null @@ -1 +0,0 @@ -// nothing