From b498bdeb947e00d8b17c4588f180894b57e06f59 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 12:41:20 +0700 Subject: [PATCH 1/8] chore: update dependencies and run biome fix --- .changeset/config.json | 2 +- .github/CONTRIBUTING.md | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/deploy.yml | 22 +++--- .github/workflows/docs.yml | 2 +- .husky/pre-commit | 5 +- README.md | 4 +- apps/docs/package.json | 63 ++++++++++-------- apps/docs/src/components/Footer.tsx | 2 +- apps/docs/src/components/LayoutWrapper.tsx | 2 +- apps/docs/src/components/Navbar.tsx | 2 +- apps/docs/src/pages/_app.tsx | 2 +- apps/docs/src/pages/index.tsx | 2 +- biome.json | 2 +- bun.lockb | Bin 297536 -> 287828 bytes package.json | 29 ++++---- packages/api/lib/rest/util/message.ts | 2 +- .../api/lib/rest/webhook/WebhookClient.ts | 4 +- packages/api/lib/rest/webhook/WebhookEmbed.ts | 24 +++---- packages/api/package.json | 19 +++--- packages/create-guilded-app/package.json | 6 +- .../templates/bot-starter-js/package.json | 4 +- .../command-handler-starter-js/package.json | 6 +- .../command-handler-starter-js/src/index.js | 4 +- packages/gil/__tests__/bot_mongo/db/Server.ts | 2 +- packages/gil/__tests__/bot_mongo/index.ts | 2 +- packages/gil/__tests__/bot_postgres/index.ts | 2 +- packages/gil/__tests__/bot_sqlite/index.ts | 2 +- .../gil/__tests__/shared/commands/Help.ts | 2 +- .../gil/__tests__/shared/commands/Ping.ts | 2 +- packages/gil/lib/GilClient.ts | 14 ++-- .../lib/adapters/db/BetterSQLite3Adapter.ts | 4 +- packages/gil/lib/adapters/db/MongoAdapter.ts | 2 +- .../gil/lib/adapters/db/PostgresAdapter.ts | 4 +- packages/gil/lib/arguments/ArgumentParser.ts | 2 +- packages/gil/lib/arguments/args/member.ts | 2 +- packages/gil/lib/events.ts | 6 +- .../lib/listeners/CommandMessageListener.ts | 10 +-- packages/gil/lib/listeners/MessageListener.ts | 6 +- packages/gil/lib/listeners/ReadyListener.ts | 4 +- packages/gil/lib/structures/Command.ts | 10 +-- packages/gil/lib/structures/Listener.ts | 2 +- .../gil/lib/structures/ListenerManager.ts | 6 +- packages/gil/lib/structures/Manager.ts | 2 +- packages/gil/lib/structures/Responses.ts | 4 +- packages/gil/lib/structures/Task.ts | 2 +- packages/gil/lib/utils/prefix.ts | 2 +- packages/gil/package.json | 11 ++- packages/gil/tsconfig.json | 3 - packages/guilded.js/lib/structures/Embed.ts | 16 ++--- .../lib/structures/channels/ListChannel.ts | 2 +- packages/guilded.js/package.json | 8 +-- pnpm-workspace.yaml | 5 -- 53 files changed, 172 insertions(+), 179 deletions(-) delete mode 100644 pnpm-workspace.yaml diff --git a/.changeset/config.json b/.changeset/config.json index cd11835c..294b24a0 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,5 +1,5 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.0.0/schema.json", + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [], diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6b599330..e4f612c9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,7 @@ If you wish to contribute to the codebase or documentation, feel free to fork th To get ready to work on the codebase, please do the following: - Fork & clone the repository, and make sure you're on the main branch -- Run bun install -r +- Run bun install - Code your heart out! - Run bun run test to run Biome and ensure any JSDoc changes are valid - Submit a pull request (Make sure you follow the conventional commit format) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6545b42c..dc36a5d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Clone repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - name: Install dependencies diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 29c05f15..af132f2f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -8,32 +8,28 @@ jobs: runs-on: ubuntu-latest steps: - name: Clone repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.API_TOKEN_GITHUB }} - - name: Install PNPM - uses: pnpm/action-setup@6e1964dde3397a825e79e4607ad57f3f7ca2c7cb - with: - version: 8.6.3 - - name: Set up Node v18 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "18" - registry-url: " https://registry.npmjs.org" + + - uses: oven-sh/setup-bun@v1 - name: Install dependencies - run: pnpm install -r + run: bun install - name: Install turbo globally - run: pnpm install -g turbo + run: bun install -g turbo - name: Build packages - run: mv bun.lockb bun.inert && pnpm turbo run build ; mv bun.inert bun.lockb + run: bun turbo run build - name: Apply version changes to packages - run: pnpm run changeset:version + run: bun run changeset:version - name: Commit package.json changes uses: EndBug/add-and-commit@v9 @@ -44,7 +40,7 @@ jobs: push: true - name: Release - run: pnpm recursive publish + run: bun publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 926730d4..a7ab7a98 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - name: Install dependencies diff --git a/.husky/pre-commit b/.husky/pre-commit index 86625e2c..4dfead07 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -bun run check:fix \ No newline at end of file +bun test diff --git a/README.md b/README.md index 6bbfe3ec..d206cd60 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,9 @@ client.login(); Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. -We make use of [PNPM](https://pnpm.io/) and [Changeset](https://github.com/changesets/changesets) to manage our monorepo. It's recommended that if you plan on contributing, you use these tools. +We make use of [Bun](https://bun.sh/) and [Changeset](https://github.com/changesets/changesets) to manage our monorepo. It's recommended that if you plan on contributing, you use these tools. -Please run `pnpm install -r` in your local environment to properly locally symlink all the packages that depend on each other. +Please run `bun install` in your local environment to properly locally symlink all the packages that depend on each other. Please ensure your commits pass the test, lint, and build scripts. diff --git a/apps/docs/package.json b/apps/docs/package.json index 8c65f58a..7ba15724 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,30 +1,37 @@ { - "name": "@guildedjs/docs", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start" - }, - "devDependencies": { - "@types/node": "18.16.12", - "@types/react": "18.2.6", - "@types/react-dom": "18.2.4", - "autoprefixer": "^10.4.14", - "postcss": "^8.4.23", - "tailwindcss": "^3.3.2", - "typedoc": "0.23.24", - "typescript": "5.0.4" - }, - "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.4.0", - "@fortawesome/free-solid-svg-icons": "^6.4.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "@next/font": "^13.4.2", - "next": "13.4.2", - "react": "18.2.0", - "react-code-blocks": "0.0.9-0", - "react-dom": "18.2.0" - } + "name": "@guildedjs/docs", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "devDependencies": { + "@types/node": "18.19.33", + "@types/react": "18.3.1", + "@types/react-dom": "18.3.0", + "autoprefixer": "^10.4.14", + "postcss": "^8.4.23", + "tailwindcss": "^3.3.2", + "typedoc": "0.25.13", + "typescript": "5.4.5" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "next": "14.2.3", + "react": "18.3.1", + "react-code-blocks": "0.1.6", + "react-dom": "18.3.1" + }, + "trustedDependencies": [ + "@biomejs/biome", + "@fortawesome/fontawesome-common-types", + "@fortawesome/fontawesome-svg-core", + "@fortawesome/free-solid-svg-icons", + "core-js", + "es5-ext" + ] } \ No newline at end of file diff --git a/apps/docs/src/components/Footer.tsx b/apps/docs/src/components/Footer.tsx index b6ab85af..a1670bf4 100644 --- a/apps/docs/src/components/Footer.tsx +++ b/apps/docs/src/components/Footer.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; const HoverableLink = ({ link, children }: { children: React.ReactNode[] | React.ReactNode; link: string }) => ( diff --git a/apps/docs/src/components/LayoutWrapper.tsx b/apps/docs/src/components/LayoutWrapper.tsx index 4d0e5c18..744c0d7e 100644 --- a/apps/docs/src/components/LayoutWrapper.tsx +++ b/apps/docs/src/components/LayoutWrapper.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; import { Breadcrumb } from "./Breadcrumb"; import { Footer } from "./Footer"; import { Navbar } from "./Navbar"; diff --git a/apps/docs/src/components/Navbar.tsx b/apps/docs/src/components/Navbar.tsx index 72739b7b..7f6c1aac 100644 --- a/apps/docs/src/components/Navbar.tsx +++ b/apps/docs/src/components/Navbar.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; const topBars = { Docs: "/docs", - Guide: "/guide", + Guide: "https://guilded-js.gitbook.io/api-docs", Github: "https://github.com/zaida04/guilded.js", "Support Server": "https://guilded.gg/guildedjs", "Legacy Docs": "https://guildedjs.github.io/", diff --git a/apps/docs/src/pages/_app.tsx b/apps/docs/src/pages/_app.tsx index 94846a88..a36ea736 100644 --- a/apps/docs/src/pages/_app.tsx +++ b/apps/docs/src/pages/_app.tsx @@ -1,6 +1,6 @@ import "@fortawesome/fontawesome-svg-core/styles.css"; -import localFont from "@next/font/local"; import type { AppProps } from "next/app"; +import localFont from "next/font/local"; import "../styles/globals.css"; const Mono = localFont({ diff --git a/apps/docs/src/pages/index.tsx b/apps/docs/src/pages/index.tsx index 134ceeb6..60affb31 100644 --- a/apps/docs/src/pages/index.tsx +++ b/apps/docs/src/pages/index.tsx @@ -55,7 +55,7 @@ export default function Home({ buildDate }: InferGetStaticPropsType
- {["npm install guilded.js", "yarn add guilded.js", "pnpm add guilded.js"].map((click) => ( + {["npm install guilded.js", "yarn add guilded.js", "pnpm add guilded.js", "bun add guilded.js"].map((click) => ( ))}
diff --git a/biome.json b/biome.json index 7d5f322b..3760c542 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", + "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", "organizeImports": { "enabled": true }, diff --git a/bun.lockb b/bun.lockb index a072fa30b70417fa52c677157227daf313590b4f..3c84ef2cc6b9fdd640bbfeb00f02f9ea4b2c4bfe 100755 GIT binary patch delta 72758 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 delta 79282 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≀hi@4HJ^*4#>Pbl0gS$olx4C56MD#qy~;crwX}p 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

hg>_nBeCe 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 X%2p1?RctNxRG#0*)r%JRs~7z@b!c9q diff --git a/package.json b/package.json index a1313e45..18b1f0e9 100644 --- a/package.json +++ b/package.json @@ -7,27 +7,27 @@ "scripts": { "build": "turbo run build", "build:typecheck": "turbo run build:typecheck", - "check": "biome check apps packages services", - "check:fix": "biome check --apply-unsafe apps packages services", + "check": "biome check apps packages", + "check:fix": "biome check --apply-unsafe apps packages", "changeset": "changeset", "changeset:version": "changeset version", "docs": "typedoc && cd docs && find . -type f -name \"*.html\" -exec sed -i'' -e 's/__namedParameters/options/g' {} +", "prepublishOnly": "turbo run prepublishOnly", - "prepare": "husky install" + "prepare": "husky init" }, "devDependencies": { - "@biomejs/biome": "1.5.2", + "@biomejs/biome": "1.7.3", "@changesets/cli": "^2.26.1", - "@types/node": "18.16.12", - "dotenv": "16.0.3", + "@types/node": "18.19.33", + "dotenv": "16.4.5", "gen-esm-wrapper": "1.1.3", - "husky": "7.0.4", - "lint-staged": "13.2.2", - "nodemon": "^2.0.22", - "rimraf": "5.0.1", + "husky": "9.0.11", + "lint-staged": "15.2.2", + "nodemon": "^3.1.0", + "rimraf": "5.0.6", "turbo": "^1.11.2", - "typedoc": "0.24.7", - "typescript": "5.0.4" + "typedoc": "0.25.13", + "typescript": "5.4.5" }, "contributors": [ { @@ -54,5 +54,8 @@ "workspaces": [ "packages/*", "apps/*" + ], + "trustedDependencies": [ + "better-sqlite3" ] -} \ No newline at end of file +} diff --git a/packages/api/lib/rest/util/message.ts b/packages/api/lib/rest/util/message.ts index f6b12a74..a76cbc9f 100644 --- a/packages/api/lib/rest/util/message.ts +++ b/packages/api/lib/rest/util/message.ts @@ -78,7 +78,7 @@ export function parseMessage(data: APIContent): parsedMessage { x.data as { embeds: APIEmbed[]; } - ).embeds.length > 0 + ).embeds.length > 0 : true, ); diff --git a/packages/api/lib/rest/webhook/WebhookClient.ts b/packages/api/lib/rest/webhook/WebhookClient.ts index 416af898..fbfd2550 100644 --- a/packages/api/lib/rest/webhook/WebhookClient.ts +++ b/packages/api/lib/rest/webhook/WebhookClient.ts @@ -78,13 +78,13 @@ export class WebhookClient { ? { ...content, embeds: resEmbeds, - } + } : { content, embeds: resEmbeds, username: options?.username ?? this.username ?? undefined, avatar_url: options?.avatarURL ?? this.avatarURL ?? undefined, - }; + }; let body: FormData | RESTPostWebhookBody = baseBody; const formData = new FormData(); diff --git a/packages/api/lib/rest/webhook/WebhookEmbed.ts b/packages/api/lib/rest/webhook/WebhookEmbed.ts index 6365d49e..4e47095f 100644 --- a/packages/api/lib/rest/webhook/WebhookEmbed.ts +++ b/packages/api/lib/rest/webhook/WebhookEmbed.ts @@ -160,7 +160,7 @@ export class WebhookEmbed { iconURL: iconURL ?? null, proxyIconURL: proxyIconURL ?? null, text, - } + } : null; return this; } @@ -172,7 +172,7 @@ export class WebhookEmbed { proxyURL: proxyURL ?? null, url, width: width ?? null, - } + } : null; return this; } @@ -184,7 +184,7 @@ export class WebhookEmbed { proxyURL: proxyURL ?? null, url, width: width ?? null, - } + } : null; return this; } @@ -196,7 +196,7 @@ export class WebhookEmbed { proxyURL: proxyURL ?? null, url, width: width ?? null, - } + } : null; return this; } @@ -207,7 +207,7 @@ export class WebhookEmbed { ? { name: name ?? null, url: url ?? null, - } + } : null; return this; } @@ -219,7 +219,7 @@ export class WebhookEmbed { name: name ?? null, proxyIconURL: proxyIconURL ?? null, url: url ?? null, - } + } : null; return this; } @@ -265,7 +265,7 @@ export class WebhookEmbed { name: this.author.name, proxy_icon_url: this.author.proxyIconURL ?? undefined, url: this.author.url ?? undefined, - } + } : undefined, color: this.color ?? undefined, description: this.description ?? undefined, @@ -280,7 +280,7 @@ export class WebhookEmbed { icon_url: this.footer.iconURL ?? undefined, proxy_icon_url: this.footer.proxyIconURL ?? undefined, text: this.footer.text ?? undefined, - } + } : undefined, image: this.image ? { @@ -288,13 +288,13 @@ export class WebhookEmbed { proxy_url: this.image.proxyURL ?? undefined, url: this.image.url ?? undefined, width: this.image.width ?? undefined, - } + } : undefined, provider: this.provider ? { name: this.provider.name ?? undefined, url: this.provider.url ?? undefined, - } + } : undefined, thumbnail: this.thumbnail ? { @@ -302,7 +302,7 @@ export class WebhookEmbed { proxy_url: this.thumbnail.proxyURL ?? undefined, url: this.thumbnail.url ?? undefined, width: this.thumbnail.width ?? undefined, - } + } : undefined, timestamp: this.timestampString ?? undefined, title: this.title ?? undefined, @@ -313,7 +313,7 @@ export class WebhookEmbed { proxy_url: this.video.proxyURL ?? undefined, url: this.video.url ?? undefined, width: this.video.width ?? undefined, - } + } : undefined, }; } diff --git a/packages/api/package.json b/packages/api/package.json index b328a4ec..67821d3f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -9,32 +9,31 @@ "scripts": { "build": "tsc && gen-esm-wrapper . ./dist/index.mjs", "build:typecheck": "tsc --noEmit", - "prepublishOnly": "rimraf dist/ && rimraf types/ && pnpm run build", + "prepublishOnly": "rimraf dist/ && rimraf types/ && bun run build", "release": "npm publish", "router:preserve": "ts-node scripts/pre-gen-router.ts", "router:restore": "ts-node scripts/post-gen-router.ts", "generate:ws": "openapi-typescript \"https://www.guilded.gg/api/v1/socket-open-api-schema.json\" --output lib/generated/api-typings/v1/ws.ts", - "generate:long:router": "pnpx openapi-typescript-codegen --input \"https://www.guilded.gg/api/v1/open-api-schema.json\" --output lib/generated/router --name GuildedRouter --useOptions --postfixModels Payload --useUnionTypes", + "generate:long:router": "pnpx @hey-api/openapi-ts --input \"https://www.guilded.gg/api/v1/open-api-schema.json\" --output lib/generated/router --name GuildedRouter --useOptions --postfixModels Payload --useUnionTypes", "generate:router": "bun run router:preserve && bun run generate:long:router && biome check --apply-unsafe lib/generated/router/**/*.ts && pnpm router:restore" }, "devDependencies": { "@types/fs-extra": "^11.0.1", - "@types/node-fetch": "2.6.4", + "@types/node-fetch": "2.6.11", "@types/qs": "^6.9.7", - "@types/ws": "8.5.4", + "@types/ws": "8.5.10", "fs-extra": "^11.1.1", "openapi-typescript": "^6.2.4", - "openapi-typescript-codegen": "^0.24.0", - "ts-node": "10.9.1", - "typescript": "5.0.4" + "@hey-api/openapi-ts": "^0.43.2", + "ts-node": "10.9.2", + "typescript": "5.4.5" }, "dependencies": { - "@types/ws": "8.5.4", "form-data": "^4.0.0", - "node-fetch": "2.6.11", + "node-fetch": "2.6.13", "qs": "^6.11.2", "typed-emitter": "2.1.0", - "ws": "8.13.0" + "ws": "8.17.0" }, "contributors": [ { diff --git a/packages/create-guilded-app/package.json b/packages/create-guilded-app/package.json index 284ce354..c8a733c8 100644 --- a/packages/create-guilded-app/package.json +++ b/packages/create-guilded-app/package.json @@ -12,12 +12,12 @@ "scripts": { "build": "tsc", "build:typecheck": "tsc --noEmit", - "prepublishOnly": "rimraf dist/ && rimraf types/ && pnpm run build", + "prepublishOnly": "rimraf dist/ && rimraf types/ && bun run build", "release": "npm publish" }, "devDependencies": { - "@types/node": "18.16.12", - "typescript": "5.0.4" + "@types/node": "18.19.33", + "typescript": "5.4.5" }, "dependencies": { "create-create-app": "^7.3.0" diff --git a/packages/create-guilded-app/templates/bot-starter-js/package.json b/packages/create-guilded-app/templates/bot-starter-js/package.json index ff4b5600..1b1d38e8 100644 --- a/packages/create-guilded-app/templates/bot-starter-js/package.json +++ b/packages/create-guilded-app/templates/bot-starter-js/package.json @@ -9,8 +9,8 @@ "start": "node src/index.js" }, "dependencies": { - "dotenv": "^16.0.3", - "guilded.js": "0.22.2" + "dotenv": "^16.4.5", + "guilded.js": "0.24.2" }, "repository": "https://github.com/guildedjs/guilded.js" } diff --git a/packages/create-guilded-app/templates/command-handler-starter-js/package.json b/packages/create-guilded-app/templates/command-handler-starter-js/package.json index e9277f50..0f460817 100644 --- a/packages/create-guilded-app/templates/command-handler-starter-js/package.json +++ b/packages/create-guilded-app/templates/command-handler-starter-js/package.json @@ -9,9 +9,9 @@ "start": "node src/index.js" }, "dependencies": { - "@discordjs/collection": "^1.5.1", - "dotenv": "^16.0.3", - "guilded.js": "0.22.2" + "@discordjs/collection": "^2.1.0", + "dotenv": "^16.4.5", + "guilded.js": "0.24.2" }, "repository": "https://github.com/guildedjs/guilded.js" } diff --git a/packages/create-guilded-app/templates/command-handler-starter-js/src/index.js b/packages/create-guilded-app/templates/command-handler-starter-js/src/index.js index e848e1d6..43bf50ca 100644 --- a/packages/create-guilded-app/templates/command-handler-starter-js/src/index.js +++ b/packages/create-guilded-app/templates/command-handler-starter-js/src/index.js @@ -2,8 +2,8 @@ require("dotenv/config"); if (!process.env.TOKEN) throw new Error("Please supply a Guilded API token in your .env file."); const { Collection } = require("@discordjs/collection"); -const { readdir } = require("fs/promises"); -const { join } = require("path"); +const { readdir } = require("node:fs/promises"); +const { join } = require("node:path"); const { Client } = require("guilded.js"); const client = new Client({ token: process.env.TOKEN }); diff --git a/packages/gil/__tests__/bot_mongo/db/Server.ts b/packages/gil/__tests__/bot_mongo/db/Server.ts index 05efdc46..461299ce 100644 --- a/packages/gil/__tests__/bot_mongo/db/Server.ts +++ b/packages/gil/__tests__/bot_mongo/db/Server.ts @@ -1,4 +1,4 @@ -import mongoose, { Schema, Document } from "mongoose"; +import mongoose, { Schema, type Document } from "mongoose"; // This is for typescript export interface IServer extends Document { diff --git a/packages/gil/__tests__/bot_mongo/index.ts b/packages/gil/__tests__/bot_mongo/index.ts index b0bcd55b..95a85d10 100644 --- a/packages/gil/__tests__/bot_mongo/index.ts +++ b/packages/gil/__tests__/bot_mongo/index.ts @@ -1,4 +1,4 @@ -import { join } from "path"; +import { join } from "node:path"; import "dotenv/config"; import { GilClient } from "../../lib/GilClient"; import { MongoAdapter } from "../../lib/adapters/db/MongoAdapter"; diff --git a/packages/gil/__tests__/bot_postgres/index.ts b/packages/gil/__tests__/bot_postgres/index.ts index 1ff88b6d..7ddc547c 100644 --- a/packages/gil/__tests__/bot_postgres/index.ts +++ b/packages/gil/__tests__/bot_postgres/index.ts @@ -1,4 +1,4 @@ -import { join } from "path"; +import { join } from "node:path"; import "dotenv/config"; import { GilClient } from "../../lib/GilClient"; diff --git a/packages/gil/__tests__/bot_sqlite/index.ts b/packages/gil/__tests__/bot_sqlite/index.ts index 7911871f..ff4dccf8 100644 --- a/packages/gil/__tests__/bot_sqlite/index.ts +++ b/packages/gil/__tests__/bot_sqlite/index.ts @@ -1,4 +1,4 @@ -import { join } from "path"; +import { join } from "node:path"; import "dotenv/config"; import { GilClient } from "../../lib/GilClient"; import { BetterSQLite3Adapter } from "../../lib/adapters/db/BetterSQLite3Adapter"; diff --git a/packages/gil/__tests__/shared/commands/Help.ts b/packages/gil/__tests__/shared/commands/Help.ts index 9d435634..5a3388ef 100644 --- a/packages/gil/__tests__/shared/commands/Help.ts +++ b/packages/gil/__tests__/shared/commands/Help.ts @@ -1,4 +1,4 @@ -import { Command, CommandExecuteContext, CommandOptions, GilClient } from "../../../lib"; +import { Command, type CommandExecuteContext, type CommandOptions, GilClient } from "../../../lib"; export default class Help extends Command { options = { diff --git a/packages/gil/__tests__/shared/commands/Ping.ts b/packages/gil/__tests__/shared/commands/Ping.ts index eba18842..aad9efbf 100644 --- a/packages/gil/__tests__/shared/commands/Ping.ts +++ b/packages/gil/__tests__/shared/commands/Ping.ts @@ -1,4 +1,4 @@ -import { Command, CommandOptions, StoredRoleType } from "../../../lib"; +import { Command, type CommandOptions, StoredRoleType } from "../../../lib"; export default class Ping extends Command { options = { diff --git a/packages/gil/lib/GilClient.ts b/packages/gil/lib/GilClient.ts index 59bf66d3..63c33abb 100644 --- a/packages/gil/lib/GilClient.ts +++ b/packages/gil/lib/GilClient.ts @@ -1,15 +1,15 @@ import EventEmitter from "node:events"; -import { Client, ClientOptions, Message } from "guilded.js"; -import TypedEmitter from "typed-emitter"; -import { DatabaseAdapter } from "./adapters/db/DatabaseAdapter"; +import { Client, type ClientOptions, type Message } from "guilded.js"; +import type TypedEmitter from "typed-emitter"; +import type { DatabaseAdapter } from "./adapters/db/DatabaseAdapter"; import { ConsoleAdapter } from "./adapters/logging/ConsoleAdapter"; -import { LoggerAdapter } from "./adapters/logging/LoggerAdapter"; -import { GilEvents } from "./events"; +import type { LoggerAdapter } from "./adapters/logging/LoggerAdapter"; +import type { GilEvents } from "./events"; import { CommandManager } from "./structures/Command"; import { ListenerManager } from "./structures/ListenerManager"; -import { DefaultResponseParams, defaultResponses } from "./structures/Responses"; +import { type DefaultResponseParams, defaultResponses } from "./structures/Responses"; import { TaskManager } from "./structures/Task"; -import { CommandCustomContextFn, CommandErrorHandler } from "./types"; +import type { CommandCustomContextFn, CommandErrorHandler } from "./types"; interface GilClientOptions { token: string; diff --git a/packages/gil/lib/adapters/db/BetterSQLite3Adapter.ts b/packages/gil/lib/adapters/db/BetterSQLite3Adapter.ts index 8f43e2d0..7304b7cc 100644 --- a/packages/gil/lib/adapters/db/BetterSQLite3Adapter.ts +++ b/packages/gil/lib/adapters/db/BetterSQLite3Adapter.ts @@ -1,5 +1,5 @@ -import sqlite from "better-sqlite3"; -import { DatabaseAdapter, StoredRole, StoredServer } from "./DatabaseAdapter"; +import type sqlite from "better-sqlite3"; +import { DatabaseAdapter, type StoredRole, type StoredServer } from "./DatabaseAdapter"; export class BetterSQLite3Adapter extends DatabaseAdapter { public constructor( diff --git a/packages/gil/lib/adapters/db/MongoAdapter.ts b/packages/gil/lib/adapters/db/MongoAdapter.ts index 786b2fbd..d99bce86 100644 --- a/packages/gil/lib/adapters/db/MongoAdapter.ts +++ b/packages/gil/lib/adapters/db/MongoAdapter.ts @@ -1,5 +1,5 @@ import type mongoose from "mongoose"; -import { DatabaseAdapter, StoredRole, StoredServer } from "./DatabaseAdapter"; +import { DatabaseAdapter, type StoredRole, type StoredServer } from "./DatabaseAdapter"; export class MongoAdapter extends DatabaseAdapter { public constructor( diff --git a/packages/gil/lib/adapters/db/PostgresAdapter.ts b/packages/gil/lib/adapters/db/PostgresAdapter.ts index 0f839fea..8f48ab0d 100644 --- a/packages/gil/lib/adapters/db/PostgresAdapter.ts +++ b/packages/gil/lib/adapters/db/PostgresAdapter.ts @@ -1,5 +1,5 @@ -import postgres from "postgres"; -import { DatabaseAdapter, StoredRole, StoredServer } from "./DatabaseAdapter"; +import type postgres from "postgres"; +import { DatabaseAdapter, type StoredRole, type StoredServer } from "./DatabaseAdapter"; export class PostgresAdapter extends DatabaseAdapter { private pg: postgres.Sql; diff --git a/packages/gil/lib/arguments/ArgumentParser.ts b/packages/gil/lib/arguments/ArgumentParser.ts index 4938ff7c..b566ddc2 100644 --- a/packages/gil/lib/arguments/ArgumentParser.ts +++ b/packages/gil/lib/arguments/ArgumentParser.ts @@ -1,5 +1,5 @@ import type { Channel, Message, PartialMember, Role } from "guilded.js"; -import { Command } from "../structures/Command"; +import type { Command } from "../structures/Command"; import boolean from "./args/boolean"; import channel from "./args/channel"; diff --git a/packages/gil/lib/arguments/args/member.ts b/packages/gil/lib/arguments/args/member.ts index 65d15bf0..4341f293 100644 --- a/packages/gil/lib/arguments/args/member.ts +++ b/packages/gil/lib/arguments/args/member.ts @@ -1,4 +1,4 @@ -import { Member, PartialMember } from "guilded.js"; +import { type Member, PartialMember } from "guilded.js"; import { isHashId } from "../../utils/uuid"; import type { CommandArgumentValidator } from "../ArgumentParser"; diff --git a/packages/gil/lib/events.ts b/packages/gil/lib/events.ts index 490e6fa6..fb997082 100644 --- a/packages/gil/lib/events.ts +++ b/packages/gil/lib/events.ts @@ -1,6 +1,6 @@ -import { Member, Message } from "guilded.js"; -import { StoredServer } from "./adapters/db/DatabaseAdapter"; -import { Command } from "./structures/Command"; +import type { Member, Message } from "guilded.js"; +import type { StoredServer } from "./adapters/db/DatabaseAdapter"; +import type { Command } from "./structures/Command"; export interface NonCommandMessageParams { message: Message; diff --git a/packages/gil/lib/listeners/CommandMessageListener.ts b/packages/gil/lib/listeners/CommandMessageListener.ts index 651d648b..cac8d037 100644 --- a/packages/gil/lib/listeners/CommandMessageListener.ts +++ b/packages/gil/lib/listeners/CommandMessageListener.ts @@ -1,9 +1,9 @@ import * as lexure from "lexure"; -import { GilClient } from "../GilClient"; -import { StoredRole, StoredRoleType } from "../adapters/db/DatabaseAdapter"; +import type { GilClient } from "../GilClient"; +import { type StoredRole, StoredRoleType } from "../adapters/db/DatabaseAdapter"; import { convertArguments } from "../arguments/ArgumentParser"; -import { CommandMessageParams } from "../events"; -import { Listener, ListenerContext } from "../structures/Listener"; +import type { CommandMessageParams } from "../events"; +import { Listener, type ListenerContext } from "../structures/Listener"; export default class CommandMessageListener extends Listener { constructor(gil: GilClient) { @@ -86,7 +86,7 @@ export default class CommandMessageListener extends Listener { ? await this.gil.options.contexts.command({ server: params.server, message: params.message, - }) + }) : {}; this.gil.emitter.emit("commandRan", { diff --git a/packages/gil/lib/listeners/MessageListener.ts b/packages/gil/lib/listeners/MessageListener.ts index 0aa893c9..5e404f63 100644 --- a/packages/gil/lib/listeners/MessageListener.ts +++ b/packages/gil/lib/listeners/MessageListener.ts @@ -1,6 +1,6 @@ -import { Message, UserType } from "guilded.js"; -import { GilClient } from "../GilClient"; -import { Listener, ListenerContext } from "../structures/Listener"; +import { type Message, UserType } from "guilded.js"; +import type { GilClient } from "../GilClient"; +import { Listener, type ListenerContext } from "../structures/Listener"; import { getPrefix } from "../utils/prefix"; export default class MessageListener extends Listener { diff --git a/packages/gil/lib/listeners/ReadyListener.ts b/packages/gil/lib/listeners/ReadyListener.ts index cfec3df8..7fe225ee 100644 --- a/packages/gil/lib/listeners/ReadyListener.ts +++ b/packages/gil/lib/listeners/ReadyListener.ts @@ -1,5 +1,5 @@ -import { GilClient } from "../GilClient"; -import { Listener, ListenerContext } from "../structures/Listener"; +import type { GilClient } from "../GilClient"; +import { Listener, type ListenerContext } from "../structures/Listener"; export default class ReadyListener extends Listener { constructor(gil: GilClient) { diff --git a/packages/gil/lib/structures/Command.ts b/packages/gil/lib/structures/Command.ts index 3c8bf3b3..95f091a5 100644 --- a/packages/gil/lib/structures/Command.ts +++ b/packages/gil/lib/structures/Command.ts @@ -1,10 +1,10 @@ import { Collection } from "@discordjs/collection"; import glob from "fast-glob"; -import { Message } from "guilded.js"; -import { GilClient } from "../GilClient"; -import { StoredRoleType } from "../adapters/db/DatabaseAdapter"; -import { CommandArgument, CommandArgumentType } from "../arguments/ArgumentParser"; -import { CommandMessageParams } from "../events"; +import type { Message } from "guilded.js"; +import type { GilClient } from "../GilClient"; +import type { StoredRoleType } from "../adapters/db/DatabaseAdapter"; +import type { CommandArgument, CommandArgumentType } from "../arguments/ArgumentParser"; +import type { CommandMessageParams } from "../events"; import { Manager } from "./Manager"; export interface CommandOptions { diff --git a/packages/gil/lib/structures/Listener.ts b/packages/gil/lib/structures/Listener.ts index 99100f7d..8532c52a 100644 --- a/packages/gil/lib/structures/Listener.ts +++ b/packages/gil/lib/structures/Listener.ts @@ -1,4 +1,4 @@ -import { GilClient } from "../GilClient"; +import type { GilClient } from "../GilClient"; interface ListenerOptions { event: string; diff --git a/packages/gil/lib/structures/ListenerManager.ts b/packages/gil/lib/structures/ListenerManager.ts index fb4498bf..a1fd9589 100644 --- a/packages/gil/lib/structures/ListenerManager.ts +++ b/packages/gil/lib/structures/ListenerManager.ts @@ -1,10 +1,10 @@ import { Collection } from "@discordjs/collection"; import { glob } from "fast-glob"; -import { ClientEvents } from "guilded.js"; -import { Listener } from "./Listener"; +import type { ClientEvents } from "guilded.js"; +import type { Listener } from "./Listener"; import { Manager } from "./Manager"; -import { GilEvents } from "../events"; +import type { GilEvents } from "../events"; import CommandMessageListener from "../listeners/CommandMessageListener"; import MessageListener from "../listeners/MessageListener"; import ReadyListener from "../listeners/ReadyListener"; diff --git a/packages/gil/lib/structures/Manager.ts b/packages/gil/lib/structures/Manager.ts index 38f87ca0..625c397a 100644 --- a/packages/gil/lib/structures/Manager.ts +++ b/packages/gil/lib/structures/Manager.ts @@ -1,4 +1,4 @@ -import { GilClient } from "../GilClient"; +import type { GilClient } from "../GilClient"; export abstract class Manager { public constructor(public readonly gil: GilClient) {} diff --git a/packages/gil/lib/structures/Responses.ts b/packages/gil/lib/structures/Responses.ts index c2f6de3e..186d3c09 100644 --- a/packages/gil/lib/structures/Responses.ts +++ b/packages/gil/lib/structures/Responses.ts @@ -1,6 +1,6 @@ -import { Embed, MessageContent } from "guilded.js"; +import { Embed, type MessageContent } from "guilded.js"; import { strip } from "../utils/string"; -import { CommandArg } from "./Command"; +import type { CommandArg } from "./Command"; export type Response = (...args: any[]) => MessageContent; export type ParamsObject = T extends (...args: infer P) => any ? { [K in keyof P]: P[K] } : never; diff --git a/packages/gil/lib/structures/Task.ts b/packages/gil/lib/structures/Task.ts index e113191c..a0565d3b 100644 --- a/packages/gil/lib/structures/Task.ts +++ b/packages/gil/lib/structures/Task.ts @@ -1,6 +1,6 @@ import { Collection } from "@discordjs/collection"; import glob from "fast-glob"; -import { GilClient } from "../GilClient"; +import type { GilClient } from "../GilClient"; import { Manager } from "./Manager"; interface TaskOptions { diff --git a/packages/gil/lib/utils/prefix.ts b/packages/gil/lib/utils/prefix.ts index c552a51a..6cc678de 100644 --- a/packages/gil/lib/utils/prefix.ts +++ b/packages/gil/lib/utils/prefix.ts @@ -1,4 +1,4 @@ -import { StoredServer } from "../adapters/db/DatabaseAdapter"; +import type { StoredServer } from "../adapters/db/DatabaseAdapter"; export function getPrefix(server: StoredServer) { return server.prefix ?? process.env.DEFAULT_PREFIX ?? "!"; diff --git a/packages/gil/package.json b/packages/gil/package.json index 0d07fc00..5dba8d4b 100644 --- a/packages/gil/package.json +++ b/packages/gil/package.json @@ -10,22 +10,21 @@ "test": "ts-node test/index.ts", "build": "tsc && gen-esm-wrapper . ./dist/index.mjs", "build:typecheck": "tsc --noEmit", - "prepublishOnly": "rimraf dist/ && rimraf types/ && pnpm run build", + "prepublishOnly": "rimraf dist/ && rimraf types/ && bun run build", "release": "npm publish" }, "devDependencies": { "@types/better-sqlite3": "^7.6.9", - "@types/mongoose": "^5.11.97", + "@types/bun": "^1.0.12", "better-sqlite3": "^9.4.3", - "dotenv": "^16.0.3", + "dotenv": "^16.4.5", "mongoose": "^8.2.3", "pino": "^8.19.0", "postgres": "^3.4.4", - "typescript": "5.0.4" + "typescript": "5.4.5" }, "dependencies": { - "@discordjs/collection": "^1.5.1", - "@types/bun": "^1.0.12", + "@discordjs/collection": "^2.1.0", "colorette": "^2.0.20", "fast-glob": "^3.3.2", "guilded.js": "workspace:*", diff --git a/packages/gil/tsconfig.json b/packages/gil/tsconfig.json index ed9f3579..74d2c141 100644 --- a/packages/gil/tsconfig.json +++ b/packages/gil/tsconfig.json @@ -2,9 +2,6 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./dist", - "types": [ - "@types/bun" - ], "declarationDir": "./types" }, "include": [ diff --git a/packages/guilded.js/lib/structures/Embed.ts b/packages/guilded.js/lib/structures/Embed.ts index 230faf9e..50f60d4a 100644 --- a/packages/guilded.js/lib/structures/Embed.ts +++ b/packages/guilded.js/lib/structures/Embed.ts @@ -113,7 +113,7 @@ export class Embed { ? { iconURL: iconURL ?? null, text, - } + } : null; return this; } @@ -122,7 +122,7 @@ export class Embed { this.image = url ? { url, - } + } : null; return this; } @@ -131,7 +131,7 @@ export class Embed { this.thumbnail = url ? { url, - } + } : null; return this; } @@ -142,7 +142,7 @@ export class Embed { iconURL: iconURL ?? null, name: name ?? null, url: url ?? null, - } + } : null; return this; } @@ -187,7 +187,7 @@ export class Embed { icon_url: this.author.iconURL ?? undefined, name: this.author.name, url: this.author.url ?? undefined, - } + } : undefined, color: this.color ?? undefined, description: this.description ?? undefined, @@ -201,17 +201,17 @@ export class Embed { ? { icon_url: this.footer.iconURL ?? undefined, text: this.footer.text ?? undefined, - } + } : undefined, image: this.image ? { url: this.image.url ?? undefined, - } + } : undefined, thumbnail: this.thumbnail ? { url: this.thumbnail.url ?? undefined, - } + } : undefined, timestamp: this.timestampString ?? undefined, title: this.title ?? undefined, diff --git a/packages/guilded.js/lib/structures/channels/ListChannel.ts b/packages/guilded.js/lib/structures/channels/ListChannel.ts index 07ab4c73..e6c027d1 100644 --- a/packages/guilded.js/lib/structures/channels/ListChannel.ts +++ b/packages/guilded.js/lib/structures/channels/ListChannel.ts @@ -26,7 +26,7 @@ export class ListChannel extends Channel { note: note ? { content: note, - } + } : undefined, }); } diff --git a/packages/guilded.js/package.json b/packages/guilded.js/package.json index ac1a70f8..813f9ebf 100644 --- a/packages/guilded.js/package.json +++ b/packages/guilded.js/package.json @@ -9,15 +9,15 @@ "scripts": { "build": "tsc && gen-esm-wrapper . ./dist/index.mjs", "build:typecheck": "tsc --noEmit", - "prepublishOnly": "rimraf dist/ && rimraf types/ && pnpm run build", + "prepublishOnly": "rimraf dist/ && rimraf types/ && bun run build", "release": "npm publish" }, "devDependencies": { - "@types/node": "18.16.12", - "typescript": "5.0.4" + "@types/node": "18.19.33", + "typescript": "5.4.5" }, "dependencies": { - "@discordjs/collection": "^1.5.1", + "@discordjs/collection": "^2.1.0", "@guildedjs/api": "workspace:*", "typed-emitter": "2.1.0" }, diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 92571cec..00000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,5 +0,0 @@ -packages: - - "packages/**" - - "services/**" - - "apps/**" - - "!packages/create-guilded-app/templates/**" \ No newline at end of file From 81bb12df5fa41d25d4f72471e793a7c820f6a893 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:07:36 +0700 Subject: [PATCH 2/8] chore: more cleanup with biome, and fully migrate to bun --- .github/renovate.json | 28 ++++++-- biome.json | 68 +++++++++--------- bun.lockb | Bin 287828 -> 287852 bytes package.json | 2 +- .../api/lib/rest/errors/PermissionsError.ts | 1 - packages/api/lib/rest/util/routes.ts | 1 - .../gil/__tests__/shared/commands/Help.ts | 2 +- .../gil/__tests__/shared/commands/Ping.ts | 2 +- packages/gil/package.json | 2 +- .../lib/gateway/handler/BotEventHandler.ts | 1 - .../managers/global/CacheableStructManager.ts | 1 - .../lib/managers/global/RoleManager.ts | 1 - packages/guilded.js/lib/typings.ts | 12 +--- 13 files changed, 61 insertions(+), 60 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index f17a9949..ac632881 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,5 +1,25 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>sapphiredev/readme:sapphire-renovate"], - "schedule": ["every month"] -} + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["github>sapphiredev/.github:sapphire-renovate"], + "bun": { + "rangeStrategy": "bump", + "packageRules": [ + { + "matchUpdateTypes": ["patch"], + "matchCurrentVersion": "/^0\\./", + "automerge": true, + "platformAutomerge": true + }, + { + "matchUpdateTypes": ["minor", "patch"], + "matchCurrentVersion": ">=1.0.0", + "automerge": true, + "platformAutomerge": true + }, + { + "matchDepTypes": ["engines"], + "enabled": false + } + ] + } +} \ No newline at end of file diff --git a/biome.json b/biome.json index 3760c542..ba35d11c 100644 --- a/biome.json +++ b/biome.json @@ -1,37 +1,33 @@ { - "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", - "organizeImports": { - "enabled": true - }, - "files": { - "ignore": [ - "dist", - "node_modules", - "types", - ".next", - "generated", - "*.json" - ] - }, - "formatter": { - "enabled": true, - "lineEnding": "lf", - "indentWidth": 2, - "indentStyle": "tab", - "lineWidth": 200 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "style": { - "noNonNullAssertion": "off", - "noParameterAssign": "off" - }, - "suspicious": { - "noArrayIndexKey": "off", - "noExplicitAny": "warn" - } - } - } -} \ No newline at end of file + "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["dist", "node_modules", "types", ".next", "generated", "*.json"] + }, + "formatter": { + "enabled": true, + "lineEnding": "lf", + "indentWidth": 2, + "indentStyle": "tab", + "lineWidth": 200 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "noNonNullAssertion": "off", + "noParameterAssign": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noExplicitAny": "warn" + }, + "correctness": { + "noUnusedImports": "warn" + } + } + } +} diff --git a/bun.lockb b/bun.lockb index 3c84ef2cc6b9fdd640bbfeb00f02f9ea4b2c4bfe..12cf2eb1cea248bbedb96eebcc224dbee8658b16 100755 GIT binary patch delta 2656 zcmXw)d2Cfh7{%u;R9_3FEvN({lpWby7D2WGvM;47qNqSA2rg_23L?HDvRRj^=vAY^ zzd)k~Fq#(=H5eok5|s#u3n*)mQWb*;n%gpeY> z3DeBhs0&POv-8^EZ*bmQuq^t8sK|L+oYxjsjn5`-C31y!XeA~mgmievusyI6-D52B%Ft%-W$1t^74S+_A;Xr^i{G+Tr}t_ifZW{dH^z*Md6%$DE}!Bnm3_J$A9 z(KnfbI+#6-{|BiiJDM%UUoq1^B;9Wr%EBnGv)Lo~3rMxAe^SbO6sj~9_Pl1)j635G8LX5zI06U{c^^O>RNon-bhUX%5plg(Z+(?jW3t(!z{%THqQ!G=E zNbJ2T)g_13XvLXR*@=En{LZ^QEI2VhojXM$^HKU6$=al delta 2636 zcmXw)dr(zX6vj8_UdRiAfLUg#T;Hjn_wUT18Y z{3~M`Cv}>-PGeJ3IGWRI3P+nX^N|@am7_&dX8pc*Uq4ewO2jo5^&d}u%G*b*E2FC;9Q9AYYcI? zzGxUs?R87N#GOPA7e;F_Da00I1Mv0u?#@NrTLuRL zm*G>1yNnIO&&R91P1M{6qlNf1;%>_ug0IB)Anr9b6rYV(dxxmG4nsNkbmDulyiq(E zoza%KF9w|(4m+p2(cXv2jzB;8D^Ia#?KZUEhO!yzF!q66A_w*>ER*=5<#9K65Z06U zk>!oXpFvlnkB#Nx&mpx|J9i9zdyMet2Mmq{tno8WGpDujF?Z0eF`oW9W1qtG{1cGY zS?x2s#6-N-v^VHkV`~hQa#`0miI9J7Z1jgZJpxt)8qn1|yYk{dij~Oe(-xJSEbKe>)0^a9W zo?%X7>>A%Oq^TF9u`m_%NmwFrCaS`#{?6JZX5r`HwJtvzE5Xk-c8?aOLPQOa=9e(#JN9U9PT#Mj8tlW8k>iI8jVAL8M__7CC<{^ zWuT@!A4U9Ano~ViHF?E`?!fCcQ~MW|L|ll{Y=07ovUj4yc#XMk0A2Pj)QO))3=uiq z-HlYEs<9NytHP_^sHceQZg3G$3#1}THMSVP2S0NY z4qrsfFt!9=fxn5E8DkNulFrQrdlEJ4dr_saUa>?96}G_GHO7|0#^F`1*AjK^{b+)* z>n!g9*i>VEh#c-glov7Bm#C+E2!${z>wd=SjHz7v8(W4ytrKWj#+Ktx!c?tcV=M4S zVXD>v##Z9BC92HGK!Xp{xr|hkgN!|bzhZ2#u~qbwxS;a%C#5;8Mi-H4cc`&P@tct9 zRDWE`dkk$wYWm}XMcf)XBT=mIEb(#ryp%CE!q^k^_3>8TNMmd9dZEO!jXjCaHI@V8 zh<$KX7i#)<)MVD9%mDkZrmv6oPTeG{YVE7esYjEMs&=BCya8W~Urd}t)VUkc4!qhF zqHeMYsnS(r+JCX9kP2OFn)Y9CGpfR?@TMEnt6YXxk>wfFtE?NV$nuH0@iV9huOch3 zyav4LNHtMt>{)y|Ok1sd-8Zq3pOAmyygtELZKbZSvFA+MwwcDB$16{(Jj>WNd~f_Z zVu>+*t}gU9{4E>CZRi*D=kwx@X8 zTy%IKaQLcFy1rYqKGA=Y1LN0+mNvxu!=h6g0*PK|L1Vn18ZB)MbRG$nRL3i5g`Za) zEDPJf+3Dt+m0}jQ#z!!9D*0 DHl7H< diff --git a/package.json b/package.json index 18b1f0e9..0ae163d8 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "changeset:version": "changeset version", "docs": "typedoc && cd docs && find . -type f -name \"*.html\" -exec sed -i'' -e 's/__namedParameters/options/g' {} +", "prepublishOnly": "turbo run prepublishOnly", - "prepare": "husky init" + "prepare": "husky" }, "devDependencies": { "@biomejs/biome": "1.7.3", diff --git a/packages/api/lib/rest/errors/PermissionsError.ts b/packages/api/lib/rest/errors/PermissionsError.ts index ad63e09a..4d6f075e 100644 --- a/packages/api/lib/rest/errors/PermissionsError.ts +++ b/packages/api/lib/rest/errors/PermissionsError.ts @@ -1,4 +1,3 @@ -import type { RequestOptions, ResponseDetails } from "../RestManager"; import { GuildedAPIError } from "./GuildedAPIError"; export class PermissionsError extends GuildedAPIError {} diff --git a/packages/api/lib/rest/util/routes.ts b/packages/api/lib/rest/util/routes.ts index d965a3b6..2d29eeff 100644 --- a/packages/api/lib/rest/util/routes.ts +++ b/packages/api/lib/rest/util/routes.ts @@ -1,4 +1,3 @@ -import { WSPayload, WSSchema } from "../../generated/api-typings"; import type { SocialLinkPayload } from "../../generated/router"; export const ROUTES = { diff --git a/packages/gil/__tests__/shared/commands/Help.ts b/packages/gil/__tests__/shared/commands/Help.ts index 5a3388ef..2d4567b1 100644 --- a/packages/gil/__tests__/shared/commands/Help.ts +++ b/packages/gil/__tests__/shared/commands/Help.ts @@ -1,4 +1,4 @@ -import { Command, type CommandExecuteContext, type CommandOptions, GilClient } from "../../../lib"; +import { Command, type CommandExecuteContext, type CommandOptions } from "../../../lib"; export default class Help extends Command { options = { diff --git a/packages/gil/__tests__/shared/commands/Ping.ts b/packages/gil/__tests__/shared/commands/Ping.ts index aad9efbf..dbf5b40d 100644 --- a/packages/gil/__tests__/shared/commands/Ping.ts +++ b/packages/gil/__tests__/shared/commands/Ping.ts @@ -1,4 +1,4 @@ -import { Command, type CommandOptions, StoredRoleType } from "../../../lib"; +import { Command, type CommandOptions } from "../../../lib"; export default class Ping extends Command { options = { diff --git a/packages/gil/package.json b/packages/gil/package.json index 5dba8d4b..5bf107b0 100644 --- a/packages/gil/package.json +++ b/packages/gil/package.json @@ -7,7 +7,7 @@ "main": "dist/index.js", "types": "types/index.d.ts", "scripts": { - "test": "ts-node test/index.ts", + "test": "bun test", "build": "tsc && gen-esm-wrapper . ./dist/index.mjs", "build:typecheck": "tsc --noEmit", "prepublishOnly": "rimraf dist/ && rimraf types/ && bun run build", diff --git a/packages/guilded.js/lib/gateway/handler/BotEventHandler.ts b/packages/guilded.js/lib/gateway/handler/BotEventHandler.ts index c967fd50..0af9e558 100644 --- a/packages/guilded.js/lib/gateway/handler/BotEventHandler.ts +++ b/packages/guilded.js/lib/gateway/handler/BotEventHandler.ts @@ -1,5 +1,4 @@ import type { WSPacket } from "@guildedjs/api"; -import { WSPayload } from "@guildedjs/api"; import { constants } from "../../constants"; import { Server } from "../../structures/Server"; import { GatewayEventHandler } from "./GatewayEventHandler"; diff --git a/packages/guilded.js/lib/managers/global/CacheableStructManager.ts b/packages/guilded.js/lib/managers/global/CacheableStructManager.ts index 070e7b3e..af363f01 100644 --- a/packages/guilded.js/lib/managers/global/CacheableStructManager.ts +++ b/packages/guilded.js/lib/managers/global/CacheableStructManager.ts @@ -1,5 +1,4 @@ import { Collection } from "@discordjs/collection"; -import type { Client } from "../../structures/Client"; import { GlobalManager } from "./GlobalManager"; /** diff --git a/packages/guilded.js/lib/managers/global/RoleManager.ts b/packages/guilded.js/lib/managers/global/RoleManager.ts index 095d8487..1f9a8052 100644 --- a/packages/guilded.js/lib/managers/global/RoleManager.ts +++ b/packages/guilded.js/lib/managers/global/RoleManager.ts @@ -1,6 +1,5 @@ import { Collection } from "@discordjs/collection"; import type { RolesService } from "@guildedjs/api"; -import { RolePayload } from "@guildedjs/api"; import { Role } from "../../structures"; import type { OptionBody } from "../../typings"; import { CacheableStructManager } from "./CacheableStructManager"; diff --git a/packages/guilded.js/lib/typings.ts b/packages/guilded.js/lib/typings.ts index 8aad7aea..99a0c58a 100644 --- a/packages/guilded.js/lib/typings.ts +++ b/packages/guilded.js/lib/typings.ts @@ -1,15 +1,5 @@ import type { Collection } from "@discordjs/collection"; -import type { - ChatService, - DocPayload, - EmbedPayload, - ListItemPayload, - ListItemSummaryPayload, - ServerMemberBanPayload, - ServerMemberPayload, - ServerMemberSummaryPayload, - SocialLinkPayload, -} from "@guildedjs/api"; +import type { ChatService, DocPayload, ListItemPayload, ListItemSummaryPayload, ServerMemberBanPayload, ServerMemberPayload, ServerMemberSummaryPayload, SocialLinkPayload } from "@guildedjs/api"; import type { MemberRemovedEvent, MemberUnbannedEvent, MemberUpdatedEvent, MessageDeletedEvent, MessageReactionDeletedEvent } from "./events"; import type { Channel, Embed, Member, MemberBan, Message, MessageReaction, Webhook } from "./structures"; import type { CalendarEvent, CalendarEventRsvp } from "./structures/CalendarEvent"; From dd4b7329df5cb6409fd47c14470d9f7db8391af1 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:11:24 +0700 Subject: [PATCH 3/8] ci: properly assign a version to commit-to-another-repository --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a7ab7a98..d7e129ae 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,7 +26,7 @@ jobs: run: bun run docs - name: Commit the Docs - uses: cpina/github-action-push-to-another-repository@main + uses: cpina/github-action-push-to-another-repository@v1 env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: From 23c30a05caf20a51f5f519662d19f267c7fbbd0d Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:16:18 +0700 Subject: [PATCH 4/8] chore: more cleanup --- .github/workflows/ci.yml | 1 - .github/workflows/deploy.yml | 4 +--- .gitignore | 2 -- apps/docs/README.md | 20 +++++++++++++------- apps/docs/vercel.json | 3 --- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc36a5d4..5ace913d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,6 @@ on: paths: - "packages/**" - "apps/**" - - "services/**" - "typedoc.json" pull_request: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index af132f2f..8933a388 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,8 +9,6 @@ jobs: steps: - name: Clone repo uses: actions/checkout@v4 - with: - token: ${{ secrets.API_TOKEN_GITHUB }} - name: Set up Node v18 uses: actions/setup-node@v4 @@ -40,7 +38,7 @@ jobs: push: true - name: Release - run: bun publish + run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 6c3ddd41..634cc6c9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ coverage/ packages/api/preserve/** .turbo -pnpm-lock.yaml *.tsbuildinfo *.log *.env @@ -19,5 +18,4 @@ docs/ !apps/docs !apps/docs/src/pages/docs !apps/docs/next-end.d.ts -package-lock.json CHANGELOG.md \ No newline at end of file diff --git a/apps/docs/README.md b/apps/docs/README.md index 33acb072..ee479cbc 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -1,4 +1,4 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/pages/api-reference/create-next-app). ## Getting Started @@ -8,27 +8,33 @@ First, run the development server: npm run dev # or yarn dev +# or +pnpm dev +# or +bun dev ``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. +[API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) instead of React pages. -The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. +This project uses [`next/font`](https://nextjs.org/docs/pages/building-your-application/optimizing/fonts) to automatically optimize and load Inter, a custom Google Font. ## Learn More To learn more about Next.js, take a look at the following resources: -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn-pages-router) - an interactive Next.js tutorial. -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! ## Deploy on Vercel The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +Check out our [Next.js deployment documentation](https://nextjs.org/docs/pages/building-your-application/deploying) for more details. \ No newline at end of file diff --git a/apps/docs/vercel.json b/apps/docs/vercel.json index 906b4877..38b650d2 100644 --- a/apps/docs/vercel.json +++ b/apps/docs/vercel.json @@ -1,8 +1,5 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "github": { - "silent": true - }, "rewrites": [ { "source": "/api-docs/:match*", From b2cbfff17a6e04936087c63a35769e41b10aba79 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:42:33 +0700 Subject: [PATCH 5/8] chore: update nextjs base template --- .gitignore | 20 +++--- apps/docs/.gitignore | 9 ++- apps/docs/{src => }/components/Breadcrumb.tsx | 0 apps/docs/{src => }/components/Copiable.tsx | 0 apps/docs/{src => }/components/Footer.tsx | 0 .../{src => }/components/LayoutWrapper.tsx | 0 apps/docs/{src => }/components/Navbar.tsx | 0 .../{src => }/components/PackageBadge.tsx | 0 apps/docs/{src => }/components/RefLink.tsx | 0 .../components/customIcons/BreadCrumbSep.tsx | 0 .../components/entity/EntityCard.tsx.ignore | 33 +++++++++ .../components/entity/EntityList.tsx.ignore | 19 ++++++ .../components/quality/Qualities.tsx.ignore | 19 ++++++ .../components/quality/QualityCard.tsx.ignore | 16 +++++ .../quality/QualityDisplay.tsx.ignore | 48 ++++++++----- .../components/quality/Signature.tsx.ignore | 49 ++++++++++++++ apps/docs/components/quality/util.ts.ignore | 24 +++++++ apps/docs/eslintrc.json | 3 + apps/docs/{src => }/lib/loader.ts.ignore | 13 ++-- apps/docs/{src => }/lib/types.ts | 2 +- apps/docs/{src => }/lib/util.ts | 0 apps/docs/{next.config.js => next.config.mjs} | 2 +- apps/docs/{src => }/pages/_app.tsx | 0 .../pages/docs/[lib]/[entity].tsx.ignore | 42 ++++++------ apps/docs/pages/docs/[lib]/index.tsx.ignore | 64 ++++++++++++++++++ apps/docs/{src => }/pages/docs/index.tsx | 2 +- apps/docs/{src => }/pages/index.tsx | 0 apps/docs/postcss.config.js | 6 -- apps/docs/postcss.config.mjs | 8 +++ .../components/entity/EntityCard.tsx.ignore | 19 ------ .../components/entity/EntityList.tsx.ignore | 15 ---- .../components/quality/Qualities.tsx.ignore | 15 ---- .../components/quality/QualityCard.tsx.ignore | 14 ---- .../components/quality/Signature.tsx.ignore | 46 ------------- .../src/components/quality/util.ts.ignore | 24 ------- .../src/pages/docs/[lib]/index.tsx.ignore | 59 ---------------- .../fonts/webfonts/JetBrainsMono-Bold.woff2 | Bin .../webfonts/JetBrainsMono-BoldItalic.woff2 | Bin .../webfonts/JetBrainsMono-ExtraBold.woff2 | Bin .../JetBrainsMono-ExtraBoldItalic.woff2 | Bin .../webfonts/JetBrainsMono-ExtraLight.woff2 | Bin .../JetBrainsMono-ExtraLightItalic.woff2 | Bin .../fonts/webfonts/JetBrainsMono-Italic.woff2 | Bin .../fonts/webfonts/JetBrainsMono-Light.woff2 | Bin .../webfonts/JetBrainsMono-LightItalic.woff2 | Bin .../fonts/webfonts/JetBrainsMono-Medium.woff2 | Bin .../webfonts/JetBrainsMono-MediumItalic.woff2 | Bin .../webfonts/JetBrainsMono-Regular.woff2 | Bin .../webfonts/JetBrainsMono-SemiBold.woff2 | Bin .../JetBrainsMono-SemiBoldItalic.woff2 | Bin .../fonts/webfonts/JetBrainsMono-Thin.woff2 | Bin .../webfonts/JetBrainsMono-ThinItalic.woff2 | Bin apps/docs/{src => }/styles/globals.css | 0 ...{tailwind.config.js => tailwind.config.ts} | 16 ++--- apps/docs/tsconfig.json | 34 +++++----- 55 files changed, 336 insertions(+), 285 deletions(-) rename apps/docs/{src => }/components/Breadcrumb.tsx (100%) rename apps/docs/{src => }/components/Copiable.tsx (100%) rename apps/docs/{src => }/components/Footer.tsx (100%) rename apps/docs/{src => }/components/LayoutWrapper.tsx (100%) rename apps/docs/{src => }/components/Navbar.tsx (100%) rename apps/docs/{src => }/components/PackageBadge.tsx (100%) rename apps/docs/{src => }/components/RefLink.tsx (100%) rename apps/docs/{src => }/components/customIcons/BreadCrumbSep.tsx (100%) create mode 100644 apps/docs/components/entity/EntityCard.tsx.ignore create mode 100644 apps/docs/components/entity/EntityList.tsx.ignore create mode 100644 apps/docs/components/quality/Qualities.tsx.ignore create mode 100644 apps/docs/components/quality/QualityCard.tsx.ignore rename apps/docs/{src => }/components/quality/QualityDisplay.tsx.ignore (65%) create mode 100644 apps/docs/components/quality/Signature.tsx.ignore create mode 100644 apps/docs/components/quality/util.ts.ignore create mode 100644 apps/docs/eslintrc.json rename apps/docs/{src => }/lib/loader.ts.ignore (69%) rename apps/docs/{src => }/lib/types.ts (75%) rename apps/docs/{src => }/lib/util.ts (100%) rename apps/docs/{next.config.js => next.config.mjs} (94%) rename apps/docs/{src => }/pages/_app.tsx (100%) rename apps/docs/{src => }/pages/docs/[lib]/[entity].tsx.ignore (67%) create mode 100644 apps/docs/pages/docs/[lib]/index.tsx.ignore rename apps/docs/{src => }/pages/docs/index.tsx (97%) rename apps/docs/{src => }/pages/index.tsx (100%) delete mode 100644 apps/docs/postcss.config.js create mode 100644 apps/docs/postcss.config.mjs delete mode 100644 apps/docs/src/components/entity/EntityCard.tsx.ignore delete mode 100644 apps/docs/src/components/entity/EntityList.tsx.ignore delete mode 100644 apps/docs/src/components/quality/Qualities.tsx.ignore delete mode 100644 apps/docs/src/components/quality/QualityCard.tsx.ignore delete mode 100644 apps/docs/src/components/quality/Signature.tsx.ignore delete mode 100644 apps/docs/src/components/quality/util.ts.ignore delete mode 100644 apps/docs/src/pages/docs/[lib]/index.tsx.ignore rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Bold.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-BoldItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-ExtraBold.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-ExtraBoldItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-ExtraLight.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-ExtraLightItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Italic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Light.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-LightItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Medium.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-MediumItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Regular.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-SemiBold.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-SemiBoldItalic.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-Thin.woff2 (100%) rename apps/docs/{src => }/styles/fonts/webfonts/JetBrainsMono-ThinItalic.woff2 (100%) rename apps/docs/{src => }/styles/globals.css (100%) rename apps/docs/{tailwind.config.js => tailwind.config.ts} (50%) diff --git a/.gitignore b/.gitignore index 634cc6c9..e6104eed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,17 @@ +./packages/api/preserve/** node_modules/ -dist/ -types/ -coverage/ .nyc_output/ -packages/api/preserve/** -.turbo +coverage/ +.vscode/ +./docs/ +.turbo/ +types/ +.idea/ +dist/ *.tsbuildinfo *.log *.env *.db -.vscode/ -.idea/ -*.env -docs/ -!apps/docs -!apps/docs/src/pages/docs -!apps/docs/next-end.d.ts CHANGELOG.md \ No newline at end of file diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index 6e1e59e8..f206ea41 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -4,7 +4,7 @@ /node_modules /.pnp .pnp.js -output.json +.yarn/install-state.gz # testing /coverage @@ -24,14 +24,13 @@ output.json npm-debug.log* yarn-debug.log* yarn-error.log* -.pnpm-debug.log* -# local env files -.env*.local +# env files (can opt-in for commiting if needed) +.env* # vercel .vercel # typescript *.tsbuildinfo -next-env.d.ts +next-env.d.ts \ No newline at end of file diff --git a/apps/docs/src/components/Breadcrumb.tsx b/apps/docs/components/Breadcrumb.tsx similarity index 100% rename from apps/docs/src/components/Breadcrumb.tsx rename to apps/docs/components/Breadcrumb.tsx diff --git a/apps/docs/src/components/Copiable.tsx b/apps/docs/components/Copiable.tsx similarity index 100% rename from apps/docs/src/components/Copiable.tsx rename to apps/docs/components/Copiable.tsx diff --git a/apps/docs/src/components/Footer.tsx b/apps/docs/components/Footer.tsx similarity index 100% rename from apps/docs/src/components/Footer.tsx rename to apps/docs/components/Footer.tsx diff --git a/apps/docs/src/components/LayoutWrapper.tsx b/apps/docs/components/LayoutWrapper.tsx similarity index 100% rename from apps/docs/src/components/LayoutWrapper.tsx rename to apps/docs/components/LayoutWrapper.tsx diff --git a/apps/docs/src/components/Navbar.tsx b/apps/docs/components/Navbar.tsx similarity index 100% rename from apps/docs/src/components/Navbar.tsx rename to apps/docs/components/Navbar.tsx diff --git a/apps/docs/src/components/PackageBadge.tsx b/apps/docs/components/PackageBadge.tsx similarity index 100% rename from apps/docs/src/components/PackageBadge.tsx rename to apps/docs/components/PackageBadge.tsx diff --git a/apps/docs/src/components/RefLink.tsx b/apps/docs/components/RefLink.tsx similarity index 100% rename from apps/docs/src/components/RefLink.tsx rename to apps/docs/components/RefLink.tsx diff --git a/apps/docs/src/components/customIcons/BreadCrumbSep.tsx b/apps/docs/components/customIcons/BreadCrumbSep.tsx similarity index 100% rename from apps/docs/src/components/customIcons/BreadCrumbSep.tsx rename to apps/docs/components/customIcons/BreadCrumbSep.tsx diff --git a/apps/docs/components/entity/EntityCard.tsx.ignore b/apps/docs/components/entity/EntityCard.tsx.ignore new file mode 100644 index 00000000..05d7e446 --- /dev/null +++ b/apps/docs/components/entity/EntityCard.tsx.ignore @@ -0,0 +1,33 @@ +import type { IconDefinition } from "@fortawesome/free-solid-svg-icons"; +import { faICursor, faAtom, faBox } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import type { EntityType } from "../../lib/types"; +import Link from "next/link"; + +const entityTypeToIcon: Record = { + classes: faBox, + functions: faAtom, + types: faICursor, +}; +export const EntityChildCard = ({ + entity, + entityChild, + libName, +}: { + entity: string; + entityChild: EntityType; + libName: string; +}) => { + return ( + +

+ + +

{entityChild.name}

+
+ {entityChild.comment?.summary.length &&

{entityChild.comment.summary[0].text}

} +

Click to see properties, methods, and more

+
+ + ); +}; diff --git a/apps/docs/components/entity/EntityList.tsx.ignore b/apps/docs/components/entity/EntityList.tsx.ignore new file mode 100644 index 00000000..54692ae2 --- /dev/null +++ b/apps/docs/components/entity/EntityList.tsx.ignore @@ -0,0 +1,19 @@ +import type { EntityType } from "../../lib/types"; +import { capitalize } from "../../lib/util"; + +export const EntityList = ({ name, entities }: { entities: EntityType[]; name: string }) => { + if (!Object.keys(entities).length) return null; + + return ( +
+

{capitalize(name)}

+
+
+ ); +}; diff --git a/apps/docs/components/quality/Qualities.tsx.ignore b/apps/docs/components/quality/Qualities.tsx.ignore new file mode 100644 index 00000000..eca81312 --- /dev/null +++ b/apps/docs/components/quality/Qualities.tsx.ignore @@ -0,0 +1,19 @@ +import type { DeclarationReflection } from "typedoc"; +import { capitalize } from "../../lib/util"; + +export const Qualities = ({ qualities, name }: { name: string; qualities: DeclarationReflection[] }) => { + if (!qualities.length) return null; + + return ( +
+

{capitalize(name)}

+
+ {qualities.map((quality) => ( + + {quality.name} + + ))} +
+
+ ); +}; diff --git a/apps/docs/components/quality/QualityCard.tsx.ignore b/apps/docs/components/quality/QualityCard.tsx.ignore new file mode 100644 index 00000000..1c9ae264 --- /dev/null +++ b/apps/docs/components/quality/QualityCard.tsx.ignore @@ -0,0 +1,16 @@ +import type { DeclarationReflection } from "typedoc"; +import { QualityDisplay } from "./QualityDisplay"; +import { Signature } from "./Signature"; + +export const QualityCard = ({ quality, lib }: { lib: string; quality: DeclarationReflection }) => { + const signature = quality.signatures?.[0].comment?.summary; + + if (["#", "_"].some((x) => quality.name.startsWith(x))) return null; + return ( +
+ + + {signature?.length && !quality.name.startsWith("_") &&

{signature[0].text}

} +
+ ); +}; diff --git a/apps/docs/src/components/quality/QualityDisplay.tsx.ignore b/apps/docs/components/quality/QualityDisplay.tsx.ignore similarity index 65% rename from apps/docs/src/components/quality/QualityDisplay.tsx.ignore rename to apps/docs/components/quality/QualityDisplay.tsx.ignore index a5cbe641..89650218 100644 --- a/apps/docs/src/components/quality/QualityDisplay.tsx.ignore +++ b/apps/docs/components/quality/QualityDisplay.tsx.ignore @@ -1,17 +1,22 @@ /* eslint-disable @typescript-eslint/switch-exhaustiveness-check */ /* eslint-disable sonarjs/no-nested-switch */ import Link from "next/link"; -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; -import type { Type } from "./util.ts.ignore"; -import { unionMap } from "./util.ts.ignore"; +import type { DeclarationReflection } from "typedoc"; +import type { Type } from "./util.ts"; +import { unionMap } from "./util.ts"; const resultTransform = (lib: string) => (type: Type, index: number) => { - if (type.isLink) return {type.name} - else return {type.name} -} - -export const QualityDisplay = ({ quality, lib }: { lib: string, quality: DeclarationReflection }): JSX.Element | null => { - let result: { isPromise?: boolean, types: Type[] } | null = null; + if (type.isLink) + return ( + + {type.name} + + ); + else return {type.name}; +}; + +export const QualityDisplay = ({ quality, lib }: { lib: string; quality: DeclarationReflection }): JSX.Element | null => { + let result: { isPromise?: boolean; types: Type[] } | null = null; switch (quality.kind) { case 1_024: { @@ -25,14 +30,14 @@ export const QualityDisplay = ({ quality, lib }: { lib: string, quality: Declara } case "reference": { - result = { types: [{ "name": qualityType.name }] }; + result = { types: [{ name: qualityType.name }] }; break; } case "reflection": { const entity = qualityType.declaration; const is__type = entity.name === "__type"; - result = { types: [{ "name": is__type ? "Object" : entity.name, isLink: !is__type }] } + result = { types: [{ name: is__type ? "Object" : entity.name, isLink: !is__type }] }; break; } @@ -79,7 +84,7 @@ export const QualityDisplay = ({ quality, lib }: { lib: string, quality: Declara switch (signatureType?.type) { case "reference": { if (signatureType.name === "Promise") { - result = { isPromise: true, types: signatureType.typeArguments!.map(unionMap) } + result = { isPromise: true, types: signatureType.typeArguments!.map(unionMap) }; } else { result = { types: [{ name: signatureType.name }] }; } @@ -101,10 +106,10 @@ export const QualityDisplay = ({ quality, lib }: { lib: string, quality: Declara // i like having string in front of null, looks better. result.types.sort((a, b) => { const priorityChars = ["s"]; - if (priorityChars.some(char => a.name.startsWith(char) && !b.name.startsWith(char))) return -1; - if (priorityChars.some(char => b.name.startsWith(char) && !a.name.startsWith(char))) return -1; + if (priorityChars.some((char) => a.name.startsWith(char) && !b.name.startsWith(char))) return -1; + if (priorityChars.some((char) => b.name.startsWith(char) && !a.name.startsWith(char))) return -1; - return a.name > b.name ? 1 : -1 + return a.name > b.name ? 1 : -1; }); for (let index = 0; index < result.types.length; index++) { @@ -112,5 +117,14 @@ export const QualityDisplay = ({ quality, lib }: { lib: string, quality: Declara result.types.splice(index, 0, { name: "or " }); } - return
Type: {result.isPromise && "Promise<"}{result.types.map(resultTransform(lib))}{result.isPromise && ">"}
-} \ No newline at end of file + return ( +
+ Type:{" "} + + {result.isPromise && "Promise<"} + {result.types.map(resultTransform(lib))} + {result.isPromise && ">"} + +
+ ); +}; diff --git a/apps/docs/components/quality/Signature.tsx.ignore b/apps/docs/components/quality/Signature.tsx.ignore new file mode 100644 index 00000000..40e7cec3 --- /dev/null +++ b/apps/docs/components/quality/Signature.tsx.ignore @@ -0,0 +1,49 @@ +import Link from "next/link"; +import type { DeclarationReflection } from "typedoc"; +import { unionMap } from "./util.ts"; + +type ParamTypeValue = { isLink?: boolean; name: string; pkg?: string }; +type ParamType = { name: string; type: ParamTypeValue }; + +const resultTransform = (lib: string) => (param: ParamType, index: number, arr: ParamType[]) => { + return ( + + {param.name}: + {param.type.isLink ? ( + + {param.type.name} + + ) : ( +

{param.type.name}

+ )} + {arr.length !== 1 && index !== arr.length - 1 &&

,

} +
+ ); +}; + +export const Signature = ({ quality, lib }: { lib: string; quality: DeclarationReflection }) => { + if (quality.kind === 2_048) { + const signature = quality.signatures?.[0]; + if (!signature) return null; + + const parameters = signature.parameters; + if (!parameters) return null; + + const resolvedParams: ParamType[] = parameters.map((param) => { + const type = param.type; + if (!type) return { name: param.name, type: { name: "unknown" } }; + + return { name: param.name, type: unionMap(type) }; + }); + + const transformedResult = resolvedParams.map(resultTransform(lib)); + return ( +

+ .{quality.name} + ({transformedResult}) +

+ ); + } else { + return

.{quality.name}

; + } +}; diff --git a/apps/docs/components/quality/util.ts.ignore b/apps/docs/components/quality/util.ts.ignore new file mode 100644 index 00000000..46cd8e13 --- /dev/null +++ b/apps/docs/components/quality/util.ts.ignore @@ -0,0 +1,24 @@ +import type { SomeType } from "typedoc"; +import { packageLookup } from "../../lib/loader.ts"; + +export type Type = { isLink?: boolean; name: string; pkg?: string }; +export const unionMap = (input: SomeType): Type => { + switch (input.type) { + case "literal": + return { name: String(input.value) }; + case "reference": { + if ("id" in input) return { name: input.name, isLink: true }; + + const pkg = packageLookup(input.name); + if (pkg) return { name: input.name, pkg, isLink: true }; + return { name: input.name }; + } + + case "intrinsic": + return { name: input.name }; + case "reflection": + return { name: input.declaration?.name, isLink: true }; + default: + return { name: "unknown" }; + } +}; diff --git a/apps/docs/eslintrc.json b/apps/docs/eslintrc.json new file mode 100644 index 00000000..3f431b28 --- /dev/null +++ b/apps/docs/eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} \ No newline at end of file diff --git a/apps/docs/src/lib/loader.ts.ignore b/apps/docs/lib/loader.ts.ignore similarity index 69% rename from apps/docs/src/lib/loader.ts.ignore rename to apps/docs/lib/loader.ts.ignore index 9ef9ef4a..d1896178 100644 --- a/apps/docs/src/lib/loader.ts.ignore +++ b/apps/docs/lib/loader.ts.ignore @@ -8,13 +8,16 @@ import { getUnscopedPackageName } from "./util"; const fetchDocs = () => docs as JSONOutput.ContainerReflection; export const packageToMembers = docs.children.reduce((prev, curr) => { - return { - ...prev, - [getUnscopedPackageName(curr.name)]: curr.children.map((x) => x.name), - }; + return { + ...prev, + [getUnscopedPackageName(curr.name)]: curr.children.map((x) => x.name), + }; }, {}) as Record; export const packages = Object.keys(packageToMembers); -export const packageLookup = (name: string) => packages.find((x) => packageToMembers[x as keyof typeof packageToMembers].includes(name)); +export const packageLookup = (name: string) => + packages.find((x) => + packageToMembers[x as keyof typeof packageToMembers].includes(name) + ); export default fetchDocs; diff --git a/apps/docs/src/lib/types.ts b/apps/docs/lib/types.ts similarity index 75% rename from apps/docs/src/lib/types.ts rename to apps/docs/lib/types.ts index 38872690..1b2fe80d 100644 --- a/apps/docs/src/lib/types.ts +++ b/apps/docs/lib/types.ts @@ -1,4 +1,4 @@ -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; +import type { DeclarationReflection } from "typedoc"; export type EntityType = { comment?: { summary: { kind: string; text: string }[] }; name: string }; export type Entity = { diff --git a/apps/docs/src/lib/util.ts b/apps/docs/lib/util.ts similarity index 100% rename from apps/docs/src/lib/util.ts rename to apps/docs/lib/util.ts diff --git a/apps/docs/next.config.js b/apps/docs/next.config.mjs similarity index 94% rename from apps/docs/next.config.js rename to apps/docs/next.config.mjs index 22fd0d3c..7268495b 100644 --- a/apps/docs/next.config.js +++ b/apps/docs/next.config.mjs @@ -20,4 +20,4 @@ const nextConfig = { }, }; -module.exports = nextConfig; +export default nextConfig; diff --git a/apps/docs/src/pages/_app.tsx b/apps/docs/pages/_app.tsx similarity index 100% rename from apps/docs/src/pages/_app.tsx rename to apps/docs/pages/_app.tsx diff --git a/apps/docs/src/pages/docs/[lib]/[entity].tsx.ignore b/apps/docs/pages/docs/[lib]/[entity].tsx.ignore similarity index 67% rename from apps/docs/src/pages/docs/[lib]/[entity].tsx.ignore rename to apps/docs/pages/docs/[lib]/[entity].tsx.ignore index 19b3de1c..395fd93e 100644 --- a/apps/docs/src/pages/docs/[lib]/[entity].tsx.ignore +++ b/apps/docs/pages/docs/[lib]/[entity].tsx.ignore @@ -1,9 +1,9 @@ import type { GetStaticPaths, GetStaticProps, NextPage } from "next"; -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; +import type { DeclarationReflection } from "typedoc"; import { LayoutWrapper } from "../../../components/LayoutWrapper"; import { Qualities } from "../../../components/quality/Qualities"; import { QualityCard } from "../../../components/quality/QualityCard"; -import fetchDocs from "../../../lib/loader.ts.ignore"; +import fetchDocs from "../../../lib/loader.ts"; import type { Entity } from "../../../lib/types"; import { getUnscopedPackageName } from "../../../lib/util"; @@ -19,7 +19,7 @@ export const getStaticProps: GetStaticProps = async (ctx) => { if (!entityLookup) return { notFound: true }; const typeEntityNarrow = entityLookup.type?.type === "reflection" ? entityLookup.type?.declaration : null; - const entityRes = (typeEntityNarrow ?? entityLookup); + const entityRes = typeEntityNarrow ?? entityLookup; const properties = (entityRes.children?.filter((x) => x.kind === 1_024) ?? []) as DeclarationReflection[]; const accessors = (entityRes.children?.filter((x) => x.kind === 262_144) ?? []) as DeclarationReflection[]; const methods = (entityRes.children?.filter((x) => x.kind === 2_048) ?? []) as DeclarationReflection[]; @@ -39,25 +39,29 @@ export const getStaticPaths: GetStaticPaths = async (ctx) => { const DocksEntity: NextPage = ({ entity, lib }) => { const qualities: Record = { // eslint-disable-next-line @typescript-eslint/require-array-sort-compare - "properties": [...entity.accessors, ...entity.properties].sort((a, b) => a.name > b.name ? 1 : -1), - "methods": [...entity.methods], + properties: [...entity.accessors, ...entity.properties].sort((a, b) => (a.name > b.name ? 1 : -1)), + methods: [...entity.methods], }; const keys = Object.keys(qualities); - const totalCount = keys.reduce((prev, curr) => prev + qualities[curr].length, 0) - - return -
- {!totalCount &&

This entity does not have any properties, methods. The value is likely "never".

} - {keys.map(x => )} -
-
-
-
-
- {keys.map(qualityKey => qualities[qualityKey].map(quality => ))} -
-
+ const totalCount = keys.reduce((prev, curr) => prev + qualities[curr].length, 0); + + return ( + +
+ {!totalCount &&

This entity does not have any properties, methods. The value is likely "never".

} + {keys.map((x) => ( + + ))} +
+
+
+
+
+ {keys.map((qualityKey) => qualities[qualityKey].map((quality) => ))} +
+
+ ); }; export default DocksEntity; diff --git a/apps/docs/pages/docs/[lib]/index.tsx.ignore b/apps/docs/pages/docs/[lib]/index.tsx.ignore new file mode 100644 index 00000000..6c122109 --- /dev/null +++ b/apps/docs/pages/docs/[lib]/index.tsx.ignore @@ -0,0 +1,64 @@ +import type { GetStaticPaths, GetStaticProps, NextPage } from "next"; +import { LayoutWrapper } from "../../../components/LayoutWrapper"; +import { EntityChildCard } from "../../../components/entity/EntityCard"; +import { EntityList } from "../../../components/entity/EntityList"; +import fetchDocs from "../../../lib/loader.ts"; +import type { EntityType } from "../../../lib/types"; +import { getUnscopedPackageName } from "../../../lib/util"; + +type Props = { entities: { classes: EntityType[]; functions: EntityType[]; types: EntityType[] }; libName: string }; + +const mapEntity = (entity: Record) => ({ name: entity.name, comment: entity.comment ?? null }); +const sortEntity = (a: ReturnType, b: ReturnType) => (a.name < b.name ? -1 : 1); + +export const getStaticProps: GetStaticProps = async (ctx) => { + const { lib: libName } = ctx.params as { lib: string }; + + const docs = fetchDocs(); + const lib = docs.children!.find((x) => x.name.includes(libName))!; + + const classes = lib + .children!.filter((x) => x.kind === 128) + .map(mapEntity) + .sort(sortEntity); + const functions = lib + .children!.filter((x) => x.kind === 64) + .map(mapEntity) + .sort(sortEntity); + const types = lib + .children!.filter((x) => x.kind === 4_194_304) + .map(mapEntity) + .sort(sortEntity); + return { props: { entities: { classes, functions, types }, libName } }; +}; + +export const getStaticPaths: GetStaticPaths = async () => { + const docs = fetchDocs(); + return { + paths: docs.children!.map((x) => `/docs/${getUnscopedPackageName(x.name)}`), + fallback: false, // can also be true or 'blocking' + }; +}; + +type propKey = keyof Props["entities"]; +const DocsPackage: NextPage = ({ entities, libName }) => { + const propsKeys = Object.keys(entities); + + return ( + +
+ {propsKeys.map((entity) => ( + + ))} +
+
+
+
+
+ {propsKeys.map((entity) => entities[entity as propKey].map((children) => ))} +
+
+ ); +}; + +export default DocsPackage; diff --git a/apps/docs/src/pages/docs/index.tsx b/apps/docs/pages/docs/index.tsx similarity index 97% rename from apps/docs/src/pages/docs/index.tsx rename to apps/docs/pages/docs/index.tsx index 2473785c..6332b907 100644 --- a/apps/docs/src/pages/docs/index.tsx +++ b/apps/docs/pages/docs/index.tsx @@ -1,7 +1,7 @@ import type { NextPage } from "next"; import { LayoutWrapper } from "../../components/LayoutWrapper"; // import { PackageBadge } from "../../components/PackageBadge"; -// import fetchDocs from "../../lib/loader.ts.ignore"; +// import fetchDocs from "../../lib/loader.ts"; type Props = { packages: string[] }; // export const getStaticProps: GetStaticProps = async () => { diff --git a/apps/docs/src/pages/index.tsx b/apps/docs/pages/index.tsx similarity index 100% rename from apps/docs/src/pages/index.tsx rename to apps/docs/pages/index.tsx diff --git a/apps/docs/postcss.config.js b/apps/docs/postcss.config.js deleted file mode 100644 index e873f1a4..00000000 --- a/apps/docs/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/apps/docs/postcss.config.mjs b/apps/docs/postcss.config.mjs new file mode 100644 index 00000000..f6c3605a --- /dev/null +++ b/apps/docs/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/apps/docs/src/components/entity/EntityCard.tsx.ignore b/apps/docs/src/components/entity/EntityCard.tsx.ignore deleted file mode 100644 index 0536ad16..00000000 --- a/apps/docs/src/components/entity/EntityCard.tsx.ignore +++ /dev/null @@ -1,19 +0,0 @@ -import type { IconDefinition } from "@fortawesome/free-solid-svg-icons"; -import { faICursor, faAtom, faBox } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import Link from "next/link"; -import type { EntityType } from "../../lib/types"; - -const entityTypeToIcon: Record = { classes: faBox, functions: faAtom, types: faICursor } -export const EntityChildCard = ({ entity, entityChild, libName }: { entity: string, entityChild: EntityType, libName: string }) => { - return -
- - -

{entityChild.name}

-
- {entityChild.comment?.summary.length &&

{entityChild.comment.summary[0].text}

} -

Click to see properties, methods, and more

-
- -} \ No newline at end of file diff --git a/apps/docs/src/components/entity/EntityList.tsx.ignore b/apps/docs/src/components/entity/EntityList.tsx.ignore deleted file mode 100644 index d9de5e9d..00000000 --- a/apps/docs/src/components/entity/EntityList.tsx.ignore +++ /dev/null @@ -1,15 +0,0 @@ -import type { EntityType } from "../../lib/types"; -import { capitalize } from "../../lib/util"; - -export const EntityList = ({ name, entities }: { entities: EntityType[], name: string }) => { - if (!Object.keys(entities).length) return null; - - return
-

{capitalize(name)}

-
- {entities.map(entity => - {entity.name} - )} -
-
-} \ No newline at end of file diff --git a/apps/docs/src/components/quality/Qualities.tsx.ignore b/apps/docs/src/components/quality/Qualities.tsx.ignore deleted file mode 100644 index 8f6638d1..00000000 --- a/apps/docs/src/components/quality/Qualities.tsx.ignore +++ /dev/null @@ -1,15 +0,0 @@ -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; -import { capitalize } from "../../lib/util"; - -export const Qualities = ({ qualities, name }: { name: string, qualities: DeclarationReflection[] }) => { - if (!qualities.length) return null; - - return
-

{capitalize(name)}

-
- {qualities.map(quality => - {quality.name} - )} -
-
-} \ No newline at end of file diff --git a/apps/docs/src/components/quality/QualityCard.tsx.ignore b/apps/docs/src/components/quality/QualityCard.tsx.ignore deleted file mode 100644 index c557cb2d..00000000 --- a/apps/docs/src/components/quality/QualityCard.tsx.ignore +++ /dev/null @@ -1,14 +0,0 @@ -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; -import { QualityDisplay } from "./QualityDisplay"; -import { Signature } from "./Signature"; - -export const QualityCard = ({ quality, lib }: { lib: string, quality: DeclarationReflection }) => { - const signature = quality.signatures?.[0].comment?.summary; - - if (["#", "_"].some(x => quality.name.startsWith(x))) return null; - return
- - - {signature?.length && !quality.name.startsWith("_") &&

{signature[0].text}

} -
-} \ No newline at end of file diff --git a/apps/docs/src/components/quality/Signature.tsx.ignore b/apps/docs/src/components/quality/Signature.tsx.ignore deleted file mode 100644 index 183545aa..00000000 --- a/apps/docs/src/components/quality/Signature.tsx.ignore +++ /dev/null @@ -1,46 +0,0 @@ -import Link from "next/link"; -import type { DeclarationReflection } from "typedoc/dist/lib/models/reflections/declaration"; -import { unionMap } from "./util.ts.ignore"; - -type ParamTypeValue = { isLink?: boolean, name: string, pkg?: string }; -type ParamType = { name: string, type: ParamTypeValue }; - -const resultTransform = (lib: string) => (param: ParamType, index: number, arr: ParamType[]) => { - return - - {param.name} - - : - {param.type.isLink ? - {param.type.name} - :

{param.type.name}

} - {arr.length !== 1 && index !== arr.length - 1 &&

,

} -
-} - -export const Signature = ({ quality, lib }: { lib: string, quality: DeclarationReflection }) => { - if (quality.kind === 2_048) { - const signature = quality.signatures?.[0]; - if (!signature) return null; - - const parameters = signature.parameters; - if (!parameters) return null - - const resolvedParams: ParamType[] = parameters.map(param => { - const type = param.type; - if (!type) return { name: param.name, type: { "name": "unknown" } }; - - return { name: param.name, type: unionMap(type) } - }); - - const transformedResult = resolvedParams.map(resultTransform(lib)); - return

- .{quality.name} - - ({transformedResult}) - -

- } else { - return

.{quality.name}

- } -} \ No newline at end of file diff --git a/apps/docs/src/components/quality/util.ts.ignore b/apps/docs/src/components/quality/util.ts.ignore deleted file mode 100644 index 54429453..00000000 --- a/apps/docs/src/components/quality/util.ts.ignore +++ /dev/null @@ -1,24 +0,0 @@ -import type { SomeType } from "typedoc"; -import { packageLookup } from "../../lib/loader.ts.ignore"; - -export type Type = { isLink?: boolean; name: string; pkg?: string }; -export const unionMap = (input: SomeType): Type => { - switch (input.type) { - case "literal": - return { name: String(input.value) }; - case "reference": { - if ("id" in input) return { name: input.name, isLink: true }; - - const pkg = packageLookup(input.name); - if (pkg) return { name: input.name, pkg, isLink: true }; - return { name: input.name }; - } - - case "intrinsic": - return { name: input.name }; - case "reflection": - return { name: input.declaration?.name, isLink: true }; - default: - return { name: "unknown" }; - } -}; diff --git a/apps/docs/src/pages/docs/[lib]/index.tsx.ignore b/apps/docs/src/pages/docs/[lib]/index.tsx.ignore deleted file mode 100644 index 3ea4d943..00000000 --- a/apps/docs/src/pages/docs/[lib]/index.tsx.ignore +++ /dev/null @@ -1,59 +0,0 @@ -import type { GetStaticPaths, GetStaticProps, NextPage } from "next"; -import { LayoutWrapper } from "../../../components/LayoutWrapper"; -import { EntityChildCard } from "../../../components/entity/EntityCard"; -import { EntityList } from "../../../components/entity/EntityList"; -import fetchDocs from "../../../lib/loader.ts.ignore"; -import type { EntityType } from "../../../lib/types"; -import { getUnscopedPackageName } from "../../../lib/util"; - -type Props = { entities: { classes: EntityType[], functions: EntityType[], types: EntityType[] }, libName: string } - -const mapEntity = (entity: Record) => ({ name: entity.name, comment: entity.comment ?? null }); -const sortEntity = (a: ReturnType, b: ReturnType) => a.name < b.name ? -1 : 1 - -export const getStaticProps: GetStaticProps = async (ctx) => { - const { lib: libName } = ctx.params as { lib: string }; - - const docs = fetchDocs(); - const lib = docs.children!.find(x => x.name.includes(libName))!; - - const classes = lib.children!.filter(x => x.kind === 128).map(mapEntity).sort(sortEntity); - const functions = lib.children!.filter(x => x.kind === 64).map(mapEntity).sort(sortEntity); - const types = lib.children!.filter(x => x.kind === 4_194_304).map(mapEntity).sort(sortEntity); - return { "props": { entities: { classes, functions, types }, libName } } -} - -export const getStaticPaths: GetStaticPaths = async () => { - const docs = fetchDocs(); - return { - paths: docs.children!.map(x => `/docs/${getUnscopedPackageName(x.name)}`), - fallback: false, // can also be true or 'blocking' - } -} - -type propKey = keyof Props["entities"]; -const DocsPackage: NextPage = ({ entities, libName }) => { - const propsKeys = Object.keys(entities); - - return -
- {propsKeys - .map(entity => - - )} -
-
-
-
-
- {propsKeys - .map(entity => - entities[entity as propKey].map(children => - - ) - )} -
-
-} - -export default DocsPackage \ No newline at end of file diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Bold.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Bold.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Bold.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Bold.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-BoldItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-BoldItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-BoldItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-BoldItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraBold.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraBold.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraBold.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraBold.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraBoldItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraBoldItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraBoldItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraBoldItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraLight.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraLight.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraLight.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraLight.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraLightItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraLightItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ExtraLightItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-ExtraLightItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Italic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Italic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Italic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Italic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Light.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Light.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Light.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Light.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-LightItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-LightItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-LightItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-LightItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Medium.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Medium.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Medium.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Medium.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-MediumItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-MediumItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-MediumItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-MediumItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Regular.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Regular.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Regular.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Regular.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-SemiBold.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-SemiBold.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-SemiBold.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-SemiBold.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-SemiBoldItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-SemiBoldItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-SemiBoldItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-SemiBoldItalic.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Thin.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-Thin.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-Thin.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-Thin.woff2 diff --git a/apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ThinItalic.woff2 b/apps/docs/styles/fonts/webfonts/JetBrainsMono-ThinItalic.woff2 similarity index 100% rename from apps/docs/src/styles/fonts/webfonts/JetBrainsMono-ThinItalic.woff2 rename to apps/docs/styles/fonts/webfonts/JetBrainsMono-ThinItalic.woff2 diff --git a/apps/docs/src/styles/globals.css b/apps/docs/styles/globals.css similarity index 100% rename from apps/docs/src/styles/globals.css rename to apps/docs/styles/globals.css diff --git a/apps/docs/tailwind.config.js b/apps/docs/tailwind.config.ts similarity index 50% rename from apps/docs/tailwind.config.js rename to apps/docs/tailwind.config.ts index 98643746..c5650530 100644 --- a/apps/docs/tailwind.config.js +++ b/apps/docs/tailwind.config.ts @@ -1,14 +1,8 @@ -const colors = require("tailwindcss/colors"); -const { fontFamily } = require("tailwindcss/defaultTheme"); +import type { Config } from "tailwindcss"; +import { fontFamily } from "tailwindcss/defaultTheme"; -colors.lightBlue = undefined; -colors.warmGray = undefined; -colors.trueGray = undefined; -colors.coolGray = undefined; -colors.blueGray = undefined; -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["./src/**/*.{js,ts,jsx,tsx}"], +const config: Config = { + content: ["./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}"], theme: { extend: { fontFamily: { @@ -32,3 +26,5 @@ module.exports = { }, plugins: [], }; + +export default config; diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 67a5304d..4f597b85 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -1,20 +1,22 @@ { "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true + "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", + "incremental": true, + "paths": { + "@/*": ["./*"] + } }, - "include": ["next-env.d.ts", "**/**/*.ts", "**/**/*.tsx", "src/components/quality/util.ts.ignore"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"] -} + } \ No newline at end of file From 085484a5780d4290bafa853073bccabe1554f1c8 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:45:53 +0700 Subject: [PATCH 6/8] removed: output.json from docs app --- apps/docs/.gitignore | 5 ++- apps/docs/output.json | 102 ------------------------------------------ 2 files changed, 4 insertions(+), 103 deletions(-) delete mode 100644 apps/docs/output.json diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index f206ea41..19dd7480 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -33,4 +33,7 @@ yarn-error.log* # typescript *.tsbuildinfo -next-env.d.ts \ No newline at end of file +next-env.d.ts + +# documentation output +output.json \ No newline at end of file diff --git a/apps/docs/output.json b/apps/docs/output.json deleted file mode 100644 index 3cabb741..00000000 --- a/apps/docs/output.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "id": 0, - "name": "Guilded.JS", - "variant": "project", - "kind": 1, - "flags": {}, - "children": [ - { - "id": 1, - "name": "@guildedjs/api", - "variant": "declaration", - "kind": 2, - "flags": {} - }, - { - "id": 2, - "name": "@guildedjs/gil", - "variant": "declaration", - "kind": 2, - "flags": {} - }, - { - "id": 3, - "name": "guilded.js", - "variant": "declaration", - "kind": 2, - "flags": {} - } - ], - "packageName": "@guildedjs/main", - "readme": [ - { - "kind": "text", - "text": "
\r\n \"guildedjs\"/\r\n

Tools for interacting with the official Guilded.gg API.

\r\n
\r\n

\r\n \r\n \"CI\"\r\n \"License:
\r\n

\r\n
\r\n\r\n> ### Looking for maintainers!\r\n>\r\n> Do you have an interest in the Guilded API and have prior experience with working with typescript libraries? Make an issue in this github repository or shoot us a message in our [Guilded Server](https://www.guilded.gg/guildedjs)!\r\n\r\n## 📝 About\r\n\r\nThis repo serves as a monorepo that houses several packages, mainly the " - }, - { - "kind": "code", - "text": "`guilded.js`" - }, - { - "kind": "text", - "text": " package, which is a library for the Guilded API.\r\n\r\n## 📦 Packages\r\n\r\n- " - }, - { - "kind": "code", - "text": "`guilded.js`" - }, - { - "kind": "text", - "text": " (**[GitHub](https://github.com/zaida04/guilded.js/tree/main/packages/guilded.js#readme), [NPM](https://www.npmjs.com/package/guilded.js)**) - Main library that ties everything together. Has additional logic for caching.\r\n- " - }, - { - "kind": "code", - "text": "`@guildedjs/gil`" - }, - { - "kind": "text", - "text": " (**[GitHub](https://github.com/zaida04/guilded.js/tree/main/packages/gil#readme), [NPM](https://www.npmjs.com/package/@guildedjs/gil)**) - Framework allowing you to build bots with ease.\r\n- " - }, - { - "kind": "code", - "text": "`@guildedjs/api`" - }, - { - "kind": "text", - "text": " (**[GitHub](https://github.com/zaida04/guilded.js/tree/main/packages/api#readme), [NPM](https://www.npmjs.com/package/@guildedjs/api)**) - Multi-use wrapper over the entire Guilded APi. Utilities for making REST requests to the Guilded API with ratelimit handling. Also contains utilities for connecting to Guilded's WebSocket gateway and receiving events.\r\n\r\n## 📥 Installation\r\n\r\n\"NPM\"\r\n\r\n**Recommended that you use node v12+**\r\n\r\n- " - }, - { - "kind": "code", - "text": "`npm install guilded.js`" - }, - { - "kind": "text", - "text": "\r\n- " - }, - { - "kind": "code", - "text": "`yarn add guilded.js`" - }, - { - "kind": "text", - "text": "\r\n\r\n## ⚡ Usage\r\n\r\nYou can find extra examples [here](https://github.com/guildedjs/examples/tree/main/examples)\r\n\r\n" - }, - { - "kind": "code", - "text": "```ts\r\nconst { Client } = require(\"guilded.js\");\r\n// import { Client } from \"guilded.js\";\r\nconst client = new Client({ token: \"TOKEN_HERE\" });\r\n\r\nclient.on(\"ready\", () => console.log(`Bot is successfully logged in`));\r\nclient.on(\"messageCreated\", (message) => {\r\n if (message.content === \"test\") {\r\n return message.reply(\"test indeed\");\r\n }\r\n});\r\n\r\nclient.login();\r\n```" - }, - { - "kind": "text", - "text": "\r\n\r\n## 📃 Documentation\r\n\r\n> ### Looking for all the Client events? See [here](https://guildedjs.github.io/types/guilded_js.ClientEvents.html)\r\n>\r\n> Documentation is viewable here: https://guilded.js.org \r\n> A general purpose guide is available here: https://guilded-js.gitbook.io/api-docs/\r\n\r\n\r\n\r\n## ✋ Contributing\r\n\r\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\r\n\r\nWe make use of [PNPM](https://pnpm.io/) and [Changeset](https://github.com/changesets/changesets) to manage our monorepo. It's recommended that if you plan on contributing, you use these tools.\r\n\r\nPlease run " - }, - { - "kind": "code", - "text": "`pnpm install -r`" - }, - { - "kind": "text", - "text": " in your local environment to properly locally symlink all the packages that depend on each other.\r\n\r\nPlease ensure your commits pass the test, lint, and build scripts.\r\n\r\n## 🤝 Acknowledgements\r\n\r\n[Discord.js](https://github.com/discordjs/discord.js) - Inspiration & derived work.\r\n\r\n## ⚖️ LICENSING\r\n\r\n> **Guilded.JS** © [zaida04](https://github.com/zaida04). All packages released under [MIT](https://github.com/zaida04/guilded.js/blob/main/LICENSE).\r\n\r\nMaintained by: [zaida04](https://github.com/zaida04), [Skillz4Killz](https://github.com/Skillz4Killz), [Uhuh](https://github.com/Uhuh), and [DaStormer](https://github.com/DaStormer)" - } - ], - "symbolIdMap": {} -} From e1a7f09eb3cd80989273e0d7d5575380f6186785 Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:51:23 +0700 Subject: [PATCH 7/8] feat: use pre-push instead of pre-commit --- .husky/pre-commit | 1 - .husky/pre-push | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100755 .husky/pre-commit create mode 100644 .husky/pre-push diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 4dfead07..00000000 --- a/.husky/pre-commit +++ /dev/null @@ -1 +0,0 @@ -bun test diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 00000000..5bfc9894 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,2 @@ +bun run check +bun test \ No newline at end of file From 524cff8d4d68cb28bb68a17b1475dd430eae67ea Mon Sep 17 00:00:00 2001 From: xhayper Date: Sat, 11 May 2024 13:53:36 +0700 Subject: [PATCH 8/8] tests: disable lint on specific file --- packages/gil/__tests__/unit/permissions.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/gil/__tests__/unit/permissions.test.ts b/packages/gil/__tests__/unit/permissions.test.ts index ff4c7b31..e30d6898 100644 --- a/packages/gil/__tests__/unit/permissions.test.ts +++ b/packages/gil/__tests__/unit/permissions.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from "bun:test"; import { StoredRoleType } from "../../lib/adapters/db/DatabaseAdapter"; import CommandMessageListener from "../../lib/listeners/CommandMessageListener"; +// biome-ignore lint: const listener = new CommandMessageListener({} as any); const minimodRole = { role_id: "role_1", type: StoredRoleType.Minimod, server_id: "MOCK_SERVER" }; const modRole = { role_id: "role_2", type: StoredRoleType.Mod, server_id: "MOCK_SERVER" };