From d211497dfd688ebf3d3dfbb3354ba53444f8fa17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Xalambr=C3=AD?= Date: Mon, 3 Jun 2024 00:48:19 -0500 Subject: [PATCH] Modernize package setup (#39) --- .github/dependabot.yml | 20 +++++++++++ .github/release.yml | 14 +++++--- .github/workflows/bump.yml | 5 +-- .github/workflows/ci.yml | 26 ++++++++++++--- .github/workflows/dependabot.yml | 24 ++++++++++++++ .github/workflows/docs.yml | 33 +++++++++++++++++++ .github/workflows/publish.yml | 3 +- .gitignore | 6 ++-- .nvmrc | 1 + CONTRIBUTING.md | 4 ++- bun.lockb | Bin 29541 -> 53804 bytes package.json | 55 +++++++++++++++++++++---------- scripts/exports.ts | 48 +++++++++++++++++++++++++++ src/index.ts | 2 +- tsconfig.json | 2 +- typedoc.json | 10 ++++++ 16 files changed, 218 insertions(+), 35 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dependabot.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .nvmrc create mode 100644 scripts/exports.ts create mode 100644 typedoc.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..736df1c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +version: 2 + +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + reviewers: + - "sergiodxa" + assignees: + - "sergiodxa" + + - package-ecosystem: npm + directory: / + schedule: + interval: "weekly" + reviewers: + - "sergiodxa" + assignees: + - "sergiodxa" \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml index 2b672ef..cd5f972 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -1,14 +1,20 @@ changelog: categories: - - title: Documentation Changes - labels: - - documentation - title: New Features labels: - enhancement + - title: Documentation Changes + labels: + - documentation - title: Bug Fixes labels: - bug + - title: Example + labels: + - example + - title: Deprecations + labels: + - deprecated - title: Other Changes labels: - - "*" + - "*" \ No newline at end of file diff --git a/.github/workflows/bump.yml b/.github/workflows/bump.yml index 7911f66..39fa015 100644 --- a/.github/workflows/bump.yml +++ b/.github/workflows/bump.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: version: - description: "Semver type of new version (major / minor / patch)" + description: "Type of version to bump" required: true type: choice options: @@ -22,7 +22,7 @@ jobs: ssh-key: ${{ secrets.DEPLOY_KEY }} - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - uses: actions/setup-node@v4 with: @@ -33,4 +33,5 @@ jobs: git config user.email 'hello@sergiodxa.com' - run: npm version ${{ github.event.inputs.version }} + - run: bun run quality:fix - run: git push origin main --follow-tags diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90ef6ba..69404f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,13 +3,22 @@ name: CI on: [push] jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + - run: bun install --frozen-lockfile + - run: bun run build + typecheck: name: Typechecker runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run typecheck quality: @@ -18,8 +27,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install - - run: bunx biome ci . + - run: bun install --frozen-lockfile + - run: bun run quality test: name: Tests @@ -27,5 +36,14 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun test + + exports: + name: Verify Exports + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + - run: bun install --frozen-lockfile + - run: bun run exports diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 0000000..3eff0a0 --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,24 @@ +name: Enable auto-merge for Dependabot PRs + +on: + pull_request: + types: opened + +permissions: + contents: write + pull-requests: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + - id: metadata + uses: dependabot/fetch-metadata@v2 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..2b2fb64 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,33 @@ +name: Deploy Documentation + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "docs" + cancel-in-progress: false + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + - run: bun install --frozen-lockfile + - run: bunx typedoc + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v3 + with: + path: "./docs" + - uses: actions/deploy-pages@v4 + id: deployment diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dc147b4..76134a9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,8 +11,9 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run build + - run: npx exports - uses: actions/setup-node@v4 with: diff --git a/.gitignore b/.gitignore index 4833413..650b08d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -/node_modules /build /coverage - -*.log -.DS_Store \ No newline at end of file +/docs +/node_modules \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..1a2f5bd --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed00701..0a74aff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,6 +6,8 @@ Run `bun install` to install the dependencies. Run the tests with `bun test`. -Run the linter with `bun run lint`. +Run the code quality checker with `bun run quality`. Run the typechecker with `bun run typecheck`. + +Run the exports checker with `bun run exports`. diff --git a/bun.lockb b/bun.lockb index 6921583e398505936b07f4c1d123ce863649fe7f..59ab6837ef00c68372544f62eddcec1d6175446b 100755 GIT binary patch literal 53804 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 I+yC$LFWO{?FaQ7m delta 10289 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 F{{X()EXx1@ diff --git a/package.json b/package.json index 426fb54..d935bba 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,52 @@ { "name": "remix-auth-form", "version": "1.5.0", - "main": "./build/index.js", - "types": "./build/index.d.ts", - "type": "commonjs", + "description": "A Remix Auth strategy to work with any form", + "license": "MIT", "funding": ["https://github.com/sponsors/sergiodxa"], + "author": { + "name": "Sergio Xalambrí", + "email": "hello+oss@sergiodxa.com", + "url": "https://sergiodxa.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/sergiodxa/remix-auth-form" + }, + "homepage": "https://sergiodxa.github.io/remix-auth-form", + "bugs": { + "url": "https://github.com/sergiodxa/remix-auth-form/issues" + }, "scripts": { - "prepare": "bun run build", - "build": "tsc --project tsconfig.json", - "typecheck": "tsc --project tsconfig.json --noEmit", - "check": "biome check .", - "lint": "biome lint --apply .", - "format": "biome format --write ." + "build": "tsc", + "typecheck": "tsc --noEmit", + "quality": "biome check .", + "quality:fix": "biome check . --apply-unsafe", + "exports": "bun run ./scripts/exports.ts" + }, + "sideEffects": false, + "type": "module", + "engines": { + "node": ">=20.0.0" }, - "keywords": ["remix", "remix-auth", "auth", "authentication", "strategy"], - "license": "MIT", "files": ["build", "package.json", "README.md"], + "exports": { + ".": "./build/index.js", + "./package.json": "./package.json" + }, "peerDependencies": { "@remix-run/server-runtime": "^1.0.0 || ^2.0.0", "remix-auth": "^3.6.0" }, "devDependencies": { - "@biomejs/biome": "^1.7.1", - "@remix-run/node": "2.9.1", - "@remix-run/server-runtime": "2.9.1", - "@types/bun": "^1.1.0", - "remix-auth": "3.6.0", - "typescript": "5.4.5" + "@arethetypeswrong/cli": "^0.15.3", + "@biomejs/biome": "^1.7.2", + "@remix-run/node": "^2.9.2", + "@types/bun": "^1.1.1", + "consola": "^3.2.3", + "remix-auth": "^3.7.0", + "typedoc": "^0.25.13", + "typedoc-plugin-mdn-links": "^3.1.23", + "typescript": "^5.4.5" } } diff --git a/scripts/exports.ts b/scripts/exports.ts new file mode 100644 index 0000000..ea4106f --- /dev/null +++ b/scripts/exports.ts @@ -0,0 +1,48 @@ +import { file, spawn } from "bun"; +import { consola } from "consola"; + +let proc = spawn([ + "bunx", + "attw", + "-f", + "table-flipped", + "--no-emoji", + "--no-color", + "--pack", +]); + +let text = await new Response(proc.stdout).text(); + +let entrypointLines = text + .slice(text.indexOf('"remix-utils/')) + .split("\n") + .filter(Boolean) + .filter((line) => !line.includes("─")) + .map((line) => + line + .replaceAll(/[^\d "()/A-Za-z│-]/g, "") + .replaceAll("90m│39m", "│") + .replaceAll(/^│/g, "") + .replaceAll(/│$/g, ""), + ); + +let pkg = await file("package.json").json(); +let entrypoints = entrypointLines.map((entrypointLine) => { + let [entrypoint, ...resolutionColumns] = entrypointLine.split("│"); + return { + entrypoint: entrypoint.replace(pkg.name, ".").trim(), + esm: resolutionColumns[2].trim(), + bundler: resolutionColumns[3].trim(), + }; +}); + +let entrypointsWithProblems = entrypoints.filter( + (item) => item.esm.includes("fail") || item.bundler.includes("fail"), +); + +if (entrypointsWithProblems.length > 0) { + consola.error("Entrypoints with problems:"); + process.exit(1); +} else { + consola.success("All entrypoints are valid!"); +} diff --git a/src/index.ts b/src/index.ts index 6abb0ea..ee30338 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { AppLoadContext, SessionStorage } from "@remix-run/server-runtime"; +import type { AppLoadContext, SessionStorage } from "@remix-run/server-runtime"; import { AuthenticateOptions, Strategy } from "remix-auth"; export interface FormStrategyVerifyParams { diff --git a/tsconfig.json b/tsconfig.json index f10ae24..9a09b66 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2019"], + "lib": ["ESNext"], "esModuleInterop": true, "moduleResolution": "NodeNext", "module": "NodeNext", diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..074caf3 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "includeVersion": true, + "entryPoints": ["./src/index.ts"], + "out": "docs", + "json": "docs/index.json", + "cleanOutputDir": true, + "plugin": ["typedoc-plugin-mdn-links"], + "categorizeByGroup": false +}