From 5f8438b367390b4b1028768fbb6681a10a1a7b23 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Fri, 23 Jan 2026 21:36:16 +0000 Subject: [PATCH 1/3] add release workflow and update exports --- .github/workflows/release.yml | 60 ++++++++++++++++++++++++++ package-lock.json | 80 ++++++++++++++++++++++++++++++++++- package.json | 7 ++- src/index.ts | 15 +++++++ src/lib/download-request.ts | 10 ++--- src/routes/downloads.ts | 2 +- src/routes/map-shares.ts | 4 ++ 7 files changed, 168 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8eb8547 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,60 @@ +name: Release + +on: + workflow_dispatch: + inputs: + semver: + description: "The semver to use" + required: true + default: "auto" + type: choice + options: + - auto + - patch + - minor + - major + - prerelease + - prepatch + - preminor + - premajor + pull_request: + types: [closed] + +jobs: + release: + if: >- + ${{ + ( + startsWith(github.event.inputs.semver, 'pre') || + github.ref == format( + 'refs/heads/{0}', + github.event.repository.default_branch + ) + ) && + ( + github.event_name != 'pull_request' || + github.event.pull_request.user.login == 'optic-release-automation[bot]' + ) + }} + runs-on: ubuntu-latest + permissions: + contents: write + issues: write + pull-requests: write + id-token: write + steps: + - uses: nearform-actions/optic-release-automation-action@9e3518763346efacba15d729d0faaa4cbd8fdd52 # v4.12.3 + with: + commit-message: "Release {version}" + sync-semver-tags: false + access: "public" + # This prefix is added before the prerelease number, e.g. `v3.0.0-pre.0` + prerelease-prefix: "pre" + semver: ${{ github.event.inputs.semver }} + # Prereleases are published under the `next` npm dist-tag + npm-tag: ${{ startsWith(github.event.inputs.semver, 'pre') && 'next' || 'latest' }} + # Don't notify linked issues + notify-linked-issues: false + publish-mode: oidc + build-command: | + npm ci diff --git a/package-lock.json b/package-lock.json index 9d418e1..05030d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@comapeo/map-server", - "version": "1.0.0", + "version": "1.0.0-pre.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@comapeo/map-server", - "version": "1.0.0", + "version": "1.0.0-pre.0", "bundleDependencies": [ "@whatwg-node/server" ], @@ -41,6 +41,7 @@ "npm-run-all2": "^7.0.2", "patch-package": "^8.0.1", "prettier": "^3.7.4", + "publint": "^0.3.17", "type-fest": "^5.3.1", "typescript": "^5.9.3", "typescript-eslint": "^8.53.1", @@ -2125,6 +2126,19 @@ "node": ">=10" } }, + "node_modules/@publint/pack": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.3.tgz", + "integrity": "sha512-dHDWeutAerz+Z2wFYAce7Y51vd4rbLBfUh0BNnyul4xKoVsPUVJBrOAFsJvtvYBwGFJSqKsxyyHf/7evZ8+Q5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.55.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz", @@ -2728,6 +2742,7 @@ "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.53.1", "@typescript-eslint/types": "8.53.1", @@ -3186,6 +3201,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4477,6 +4493,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6230,6 +6247,16 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6927,6 +6954,13 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7245,6 +7279,7 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7313,6 +7348,28 @@ ], "license": "MIT" }, + "node_modules/publint": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.17.tgz", + "integrity": "sha512-Q3NLegA9XM6usW+dYQRG1g9uEHiYUzcCVBJDJ7yMcWRqVU9LYZUWdqbwMZfmTCFC5PZLQpLAmhvRcQRl3exqkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@publint/pack": "^0.1.3", + "package-manager-detector": "^1.6.0", + "picocolors": "^1.1.1", + "sade": "^1.8.1" + }, + "bin": { + "publint": "src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" + } + }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -7631,6 +7688,19 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -8217,6 +8287,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -8418,6 +8489,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8600,6 +8672,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8705,6 +8778,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -8798,6 +8872,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8811,6 +8886,7 @@ "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.17", "@vitest/mocker": "4.0.17", diff --git a/package.json b/package.json index d4f82bf..94db242 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@comapeo/map-server", - "version": "1.0.0", + "version": "1.0.0-pre.0", "type": "module", "exports": { ".": { @@ -13,9 +13,11 @@ "test:js": "vitest run", "test:lint": "eslint", "test:types": "tsc --noEmit", + "test:publint": "publint", "format": "prettier --write .", "prepare": "husky", - "prepack": "tsc -p tsconfig.npm.json", + "build": "tsc -p tsconfig.npm.json", + "prepack": "run-s test build", "postinstall": "patch-package" }, "keywords": [], @@ -40,6 +42,7 @@ "npm-run-all2": "^7.0.2", "patch-package": "^8.0.1", "prettier": "^3.7.4", + "publint": "^0.3.17", "type-fest": "^5.3.1", "typescript": "^5.9.3", "typescript-eslint": "^8.53.1", diff --git a/src/index.ts b/src/index.ts index 7ea6246..236e0a7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,6 +16,21 @@ import { fetchAPI } from './lib/fetch-api.js' import { RootRouter } from './routes/root.js' import type { FetchContext } from './types.js' +export { errors } from './lib/errors.js' + +export type { + MapInfo, + MapShareState, + MapShareStateUpdate, + DownloadStateUpdate, +} from './types.js' +export type { DownloadState } from './lib/download-request.js' +export type { + MapShareCreateParams, + MapShareDeclineParams, +} from './routes/map-shares.js' +export type { DownloadCreateParams } from './routes/downloads.js' + export type ServerOptions = { defaultOnlineStyleUrl: string | URL customMapPath: string | URL diff --git a/src/lib/download-request.ts b/src/lib/download-request.ts index 16b1b7f..d3e7a02 100644 --- a/src/lib/download-request.ts +++ b/src/lib/download-request.ts @@ -2,7 +2,7 @@ import { Agent as SecretStreamAgent } from 'secret-stream-http' import z32 from 'z32' import { TypedEventTarget } from '../lib/event-target.js' -import type { DownloadCreateRequest } from '../routes/downloads.js' +import type { DownloadCreateParams } from '../routes/downloads.js' import { type DownloadStateUpdate } from '../types.js' import { StatusError } from './errors.js' import { errors, jsonError } from './errors.js' @@ -10,13 +10,13 @@ import { secretStreamFetch } from './secret-stream-fetch.js' import { StateUpdateEvent } from './state-update-event.js' import { addTrailingSlash, generateId, getErrorCode, noop } from './utils.js' -type DownloadRequestState = DownloadStateUpdate & - Omit & { downloadId: string } +export type DownloadState = DownloadStateUpdate & + Omit & { downloadId: string } export class DownloadRequest extends TypedEventTarget< InstanceType> > { - #state: DownloadRequestState + #state: DownloadState #abortController = new AbortController() #transform = new TransformStream({ transform: (chunk, controller) => { @@ -34,7 +34,7 @@ export class DownloadRequest extends TypedEventTarget< constructor( stream: WritableStream, - { mapShareUrls, ...rest }: DownloadCreateRequest, + { mapShareUrls, ...rest }: DownloadCreateParams, keyPair: { publicKey: Uint8Array; secretKey: Uint8Array }, ) { super() diff --git a/src/routes/downloads.ts b/src/routes/downloads.ts index e9d81e4..e2e3f45 100644 --- a/src/routes/downloads.ts +++ b/src/routes/downloads.ts @@ -26,7 +26,7 @@ const DownloadCreateRequest = T.Object({ estimatedSizeBytes: EstimatedSizeBytes, }) -export type DownloadCreateRequest = Static +export type DownloadCreateParams = Static export function DownloadsRouter( { base }: { base: string }, diff --git a/src/routes/map-shares.ts b/src/routes/map-shares.ts index 9cbbeed..a0e592f 100644 --- a/src/routes/map-shares.ts +++ b/src/routes/map-shares.ts @@ -30,6 +30,8 @@ const MapShareCreateRequest = T.Object({ receiverDeviceId: T.String({ minLength: 1 }), }) +export type MapShareCreateParams = Static + const LocalMapShareDeclineRequest = T.Object({ reason: MapShareDeclineReason, mapShareUrls: MapShareUrls, @@ -39,6 +41,8 @@ const LocalMapShareDeclineRequest = T.Object({ }), }) +export type MapShareDeclineParams = Static + const RemoteMapShareDeclineRequest = T.Object({ reason: MapShareDeclineReason, }) From 17bac7f53116b40970c66e64d0a977c8cc315531 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Fri, 23 Jan 2026 21:45:00 +0000 Subject: [PATCH 2/3] move patch-package to prepare script --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 94db242..a147739 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,9 @@ "test:types": "tsc --noEmit", "test:publint": "publint", "format": "prettier --write .", - "prepare": "husky", + "prepare": "husky && patch-package", "build": "tsc -p tsconfig.npm.json", - "prepack": "run-s test build", - "postinstall": "patch-package" + "prepack": "run-s test build" }, "keywords": [], "author": "", From ea765d8bc79b07b25d7aea1484f637ccf51ce8a3 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 28 Jan 2026 23:24:05 +0000 Subject: [PATCH 3/3] fix: build before publint test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a147739..1f2284e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test:js": "vitest run", "test:lint": "eslint", "test:types": "tsc --noEmit", - "test:publint": "publint", + "test:publint": "npm run build && publint", "format": "prettier --write .", "prepare": "husky && patch-package", "build": "tsc -p tsconfig.npm.json",