diff --git a/CLAUDE.md b/CLAUDE.md index 76eaecc..c413c15 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -119,7 +119,7 @@ Two registries, different entry files (both pinned to the same version — keep | Registry | Package name | Entry | Ships | | -------- | --------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| npm | `leaflet-web-components` | `package.json` `.`/`main`/`module`/`types` → `dist/index.npm.*` | compiled `dist/` + `README.md` + `LICENSE` (`files` field); `prepublishOnly` runs `build` | +| npm | `leaflet-web-components` | `package.json` `.`/`main`/`module`/`types` → `dist/index.npm.*` | compiled `dist/` + `README.md` + `LICENSE` (`files` field); `prepublishOnly` runs `typecheck` + `test` + `build` | | JSR | `@buddy/leaflet-components` | `jsr.json` `exports` → `./src/index.ts` (+ `./elements`) | TypeScript source directly, minus `jsr.json`'s `publish.exclude` (which drops `src/index.npm.ts`, `src/core/globals.ts`, `test/`, `docs/`, `dist/`, configs) | The npm entry (`src/index.npm.ts`) adds the `declare global` augmentations via `src/core/globals.ts`; the JSR entry (`src/index.ts`) can't, because JSR's "no slow types" check forbids `declare global` in its published graph. That constraint is also why every element file uses the explicitly-typed `const PROPS` / `const Base` shape (see the `WithProps` section). `npx jsr publish --dry-run` is the authoritative check; it must print "Success" with no slow-type errors. diff --git a/README.md b/README.md index 6cc4ad1..1344ec1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,12 @@ npm install leaflet-web-components leaflet ``` -Also published to JSR as [`@buddy/leaflet-components`](https://jsr.io/@buddy/leaflet-components) (`deno add jsr:@buddy/leaflet-components`). `leaflet` is always a peer dependency you install yourself; there is no CommonJS or UMD build. The examples below use the npm name — substitute `@buddy/leaflet-components` if you pull from JSR. +`leaflet` is a **peer dependency** — you install it, and only one copy must be +present (the nesting protocol relies on `instanceof` against Leaflet's own +classes). The Leaflet type definitions (`@types/leaflet`, `@types/geojson`) +ship as regular dependencies, so TypeScript consumers need nothing extra. + +Also published to JSR as [`@buddy/leaflet-components`](https://jsr.io/@buddy/leaflet-components) (`deno add jsr:@buddy/leaflet-components`). There is no CommonJS or UMD build. The examples below use the npm name — substitute `@buddy/leaflet-components` if you pull from JSR. ## Import options diff --git a/docs/07-tooling-and-build.md b/docs/07-tooling-and-build.md index cec3662..a9702a8 100644 --- a/docs/07-tooling-and-build.md +++ b/docs/07-tooling-and-build.md @@ -109,23 +109,30 @@ export default defineConfig({ `src/index.ts` on JSR — see "Publishing" below) or any single module directly. - **No CJS, no UMD** build. -- **Leaflet is always external** — never bundled. It's a `dependencies` entry - and a bare `import` in the output. +- **Leaflet is always external** — never bundled, a bare `import` in the + output. It's a **`peerDependency`** (`^1.9.4`), not a regular dependency: + the nesting protocol keys off `instanceof` against Leaflet's own `Layer` / + `Popup` / `Tooltip`, so a second copy under our own `node_modules` would + silently break it. Kept in `devDependencies` too, for local dev and tests. + The Leaflet **type** packages (`@types/leaflet`, `@types/geojson`) are + regular `dependencies` — the emitted `.d.ts` reference them directly, and + `leaflet` ships no types of its own. - `package.json` `exports`: `.` → `dist/index.npm.js` (+ types — this is the npm entry, `src/index.npm.ts` compiled; see below); `./elements` → `dist/elements/index.js` (the class barrel, no `define`); - `./elements/*.js` and `./components/*.js` → the matching `dist/` module; - `./dist/*` still there for deep imports. + `./elements/*.js` and `./components/*.js` → the matching `dist/` module. + There is deliberately **no `./dist/*`** wildcard — `core/*` is not a stable + contract, and the root export already surfaces the toolkit. - `sideEffects: true` — the `components/*` modules (and both `index*.js` entries) call `customElements.define()` at import time, so a bundler must not tree-shake them away. The `elements/*` modules have no side effect. ## Publishing to two registries -| Registry | Package name | Entry | Ships | -| -------- | --------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -| npm | `leaflet-web-components` | `package.json` `.`/`main`/`module`/`types` → `dist/index.npm.*` | compiled `dist/` + `README.md` + `LICENSE` (`files` field); `prepublishOnly` runs `build` | -| JSR | `@buddy/leaflet-components` | `jsr.json` `exports` → `./src/index.ts` (+ `./elements`) | TypeScript source directly (JSR compiles per-consumer), minus `jsr.json`'s `publish.exclude` | +| Registry | Package name | Entry | Ships | +| -------- | --------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| npm | `leaflet-web-components` | `package.json` `.`/`main`/`module`/`types` → `dist/index.npm.*` | compiled `dist/` + `README.md` + `LICENSE` (`files` field); `prepublishOnly` runs `typecheck` + `test` + `build` | +| JSR | `@buddy/leaflet-components` | `jsr.json` `exports` → `./src/index.ts` (+ `./elements`) | TypeScript source directly (JSR compiles per-consumer), minus `jsr.json`'s `publish.exclude` | Both are pinned to the same version; keep them in step. JSR publishes `src/` with its `.ts` import extensions intact, which JSR supports natively. diff --git a/package-lock.json b/package-lock.json index 1b44934..6fa328f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,27 @@ { - "name": "leaflet-components", + "name": "leaflet-web-components", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "leaflet-components", + "name": "leaflet-web-components", "version": "0.1.0", "license": "MIT", "dependencies": { - "leaflet": "^1.9.4" + "@types/geojson": "^7946.0.16", + "@types/leaflet": "^1.9.21" }, "devDependencies": { - "@types/leaflet": "^1.9.21", "jsdom": "^30.0.1", + "leaflet": "^1.9.4", "oxfmt": "^0.66.0", "oxlint": "^1.79.0", "typescript": "^7.0.2", "vitest": "^4.1.11" + }, + "peerDependencies": { + "leaflet": "^1.9.4" } }, "node_modules/@asamuzakjp/css-color": { @@ -1251,14 +1255,12 @@ "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true, "license": "MIT" }, "node_modules/@types/leaflet": { "version": "1.9.22", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.22.tgz", "integrity": "sha512-h3lhECYEKDasG7LFHu+GiHqAvsgLuQvlJvVZzJDGONo3sEL+wUOqSFLnwkZlK0qVxnxbuGFW8iBlJNYs5wgndA==", - "dev": true, "license": "MIT", "dependencies": { "@types/geojson": "*" @@ -1952,6 +1954,7 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/lightningcss": { diff --git a/package.json b/package.json index bf500dc..1a66737 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "types": "./dist/components/*.d.ts", "import": "./dist/components/*.js" }, - "./dist/*": "./dist/*", "./package.json": "./package.json" }, "sideEffects": true, @@ -38,7 +37,7 @@ "format": "oxfmt '*.md' 'docs/**/*.md' 'src/**/*.{ts,js,json,md}' 'test/**/*.ts'", "test": "vitest run", "test:watch": "vitest", - "prepublishOnly": "npm run build" + "prepublishOnly": "npm run typecheck && npm run test && npm run build" }, "keywords": [ "leaflet", @@ -49,11 +48,15 @@ "license": "MIT", "type": "module", "dependencies": { + "@types/geojson": "^7946.0.16", + "@types/leaflet": "^1.9.21" + }, + "peerDependencies": { "leaflet": "^1.9.4" }, "devDependencies": { - "@types/leaflet": "^1.9.21", "jsdom": "^30.0.1", + "leaflet": "^1.9.4", "oxfmt": "^0.66.0", "oxlint": "^1.79.0", "typescript": "^7.0.2",