From 047f8a71ccfa33362f7b535e68fcaab6b123e344 Mon Sep 17 00:00:00 2001 From: CatOfJupit3r Date: Thu, 15 Oct 2026 23:35:10 +0300 Subject: [PATCH 1/2] docs: remove Deno from the docs and align ESLint rule pages Drop Deno install tabs, the Deno ecosystem tile and brand asset, and Deno compatibility claims from the documentation site and the package READMEs. Give every ESLint rule section the same shape: order sections like the rules table, add Reports lines plus Flagged and Accepted examples to no-object-em and no-manual-enum, and move the prefer-native-schema-adapters Reports line ahead of its examples. Closes #38 --- .changeset/drop-deno-docs.md | 5 + README.md | 10 +- docs/adapters.mdx | 12 -- docs/agents.md | 2 +- docs/app/page.tsx | 9 +- docs/brand-assets.md | 1 - docs/components/landing-playground.tsx | 3 +- docs/eslint-plugin.md | 249 +++++++++++++++---------- docs/examples.mdx | 8 +- docs/getting-started.md | 6 +- docs/lib/brands.ts | 5 - docs/public/brands/deno.svg | 17 -- docs/release-and-compatibility.md | 4 +- packages/enumwaii/README.md | 8 +- 14 files changed, 168 insertions(+), 171 deletions(-) create mode 100644 .changeset/drop-deno-docs.md delete mode 100644 docs/public/brands/deno.svg diff --git a/.changeset/drop-deno-docs.md b/.changeset/drop-deno-docs.md new file mode 100644 index 0000000..61ba315 --- /dev/null +++ b/.changeset/drop-deno-docs.md @@ -0,0 +1,5 @@ +--- +"enumwaii": patch +--- + +Remove Deno installation instructions and Deno compatibility claims from the package README. diff --git a/README.md b/README.md index 27207fd..678c0a2 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,7 @@ OR bun add enumwaii ``` -OR - -```sh -deno add npm:enumwaii -``` - -The package ships ESM and CommonJS entry points with declarations and source maps. Node.js 18 or newer is supported; the ESM build is also tested under Bun, Deno, and Cloudflare Workers without Node compatibility flags. +The package ships ESM and CommonJS entry points with declarations and source maps. Node.js 18 or newer is supported; the ESM build is also tested under Bun and Cloudflare Workers without Node compatibility flags. ## What it gives you @@ -155,7 +149,7 @@ The `flat/recommended-type-checked` preset additionally catches direct member vi | --- | --- | | Web applications | [Next.js](examples/nextjs), [TanStack Start + Solid](examples/tanstack-start-solid), and [Vue](examples/vue) | | Servers | [Hono](examples/hono), [Elysia](examples/elysia), [oRPC](examples/orpc), [Effect](examples/effect), and [NestJS](examples/nestjs) | -| Runtimes | Node.js, Bun, Deno, and Cloudflare Workers through the shared [Hono](examples/hono) boundary contract | +| Runtimes | Node.js, Bun, and Cloudflare Workers through the shared [Hono](examples/hono) boundary contract | | Data and everyday UI | Drizzle + PGlite, Mongoose, TanStack Form, native forms, TanStack Table, URL state, persistence hydration, request validation, and visible failure paths across the examples above | Every example is independently runnable and exercises invalid or ambiguous input instead of demonstrating only a happy path. Open the [example catalog](https://catofjupit3r.github.io/enumwaii/docs/examples/) for commands and hosted StackBlitz links. diff --git a/docs/adapters.mdx b/docs/adapters.mdx index e0504ec..ed98c5f 100644 --- a/docs/adapters.mdx +++ b/docs/adapters.mdx @@ -66,10 +66,6 @@ yarn add zod bun add zod ``` -```sh tab="deno" -deno add npm:zod -``` - ```ts declare const payload: unknown; // ---cut--- @@ -124,10 +120,6 @@ yarn add valibot bun add valibot ``` -```sh tab="deno" -deno add npm:valibot -``` - ```ts declare const payload: unknown; // ---cut--- @@ -171,10 +163,6 @@ yarn add nuqs bun add nuqs ``` -```sh tab="deno" -deno add npm:nuqs -``` - For a shared default, create the parser beside the declaration and export both: ```ts diff --git a/docs/agents.md b/docs/agents.md index fed5d71..c9ca191 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -33,7 +33,7 @@ Before editing: Implementation requirements: - Install enumwaii using the repository's existing package manager. It supports - npm, pnpm, Yarn, Bun, Deno, and Cloudflare Workers projects. + npm, pnpm, Yarn, Bun, and Cloudflare Workers projects. - Declare the complete value set with em([...]), extract the branded `.enum` object once, and derive the application type from `typeof declaration["~type"]`. - Replace authored raw literals with members from the extracted object. diff --git a/docs/app/page.tsx b/docs/app/page.tsx index a671042..7669a25 100644 --- a/docs/app/page.tsx +++ b/docs/app/page.tsx @@ -53,11 +53,6 @@ const ecosystem: readonly EcosystemGroup[] = [ href: `${exampleRoot}/hono`, icons: ["bun"], }, - { - label: "Deno", - href: `${exampleRoot}/hono`, - icons: ["deno"], - }, { label: "Cloudflare Workers®", href: `${exampleRoot}/hono`, @@ -307,8 +302,8 @@ export default function HomePage() {

Add enumwaii with the tools you already use.

- The same package runs across Node.js, Bun, Deno, browsers, and - Cloudflare Workers. + The same package runs across Node.js, Bun, browsers, and Cloudflare + Workers.

diff --git a/docs/brand-assets.md b/docs/brand-assets.md index fa180c0..47b975d 100644 --- a/docs/brand-assets.md +++ b/docs/brand-assets.md @@ -23,7 +23,6 @@ A public logo file by itself is not treated as permission. When an owner says or | --- | --- | --- | | Node.js | Official hex mark, with its own link to nodejs.org | The OpenJS trademark policy permits an official project logo when it links to that project's home page. The mark is from the [Node.js branding page](https://nodejs.org/en/about/branding), and the separate link preserves the [OpenJS policy](https://trademark-policy.openjsf.org/). | | Bun | Official color logo | Bun's [press kit](https://bun.com/press-kit) publishes its color `logo.svg` alongside a separate small-size icon and asks users not to stretch, recolor, or decorate either asset. The local asset is an unmodified copy of the color logo, whose cream, pink, ink, and blush palette remains legible in this light gallery. | -| Deno | Official mark | Deno publishes downloadable artwork and handling rules on its [brand page](https://deno.com/brand). The mark is unmodified. | | Cloudflare Workers | **Text only** | Cloudflare permits truthful word-mark references but says ordinary logo use requires written permission. The first textual occurrence and attribution follow the [Cloudflare trademark guidelines](https://www.cloudflare.com/trademark/). | | Next.js | Official symbol | Vercel permits truthful references to its technologies and identifies the symbol as appropriate for constrained or multi-brand icon sets. Each page displaying the symbol includes Vercel's required attribution. See the [Vercel and Next.js brand guidance](https://vercel.com/geist/brands). | | TanStack Start | Official TanStack mark | TanStack publishes the mark and its spacing, proportion, and contrast rules in the [TanStack brand guide](https://tanstack.com/brand-guide). | diff --git a/docs/components/landing-playground.tsx b/docs/components/landing-playground.tsx index fcedad6..3429f04 100644 --- a/docs/components/landing-playground.tsx +++ b/docs/components/landing-playground.tsx @@ -3,14 +3,13 @@ import { useEffect, useState, type ReactNode } from "react"; type Scenario = "calls" | "policy" | "crossed"; -type PackageManager = "npm" | "pnpm" | "yarn" | "bun" | "deno"; +type PackageManager = "npm" | "pnpm" | "yarn" | "bun"; const installCommands: Readonly> = { npm: "npm install enumwaii", pnpm: "pnpm add enumwaii", yarn: "yarn add enumwaii", bun: "bun add enumwaii", - deno: "deno add npm:enumwaii", }; const packageManagerStorageKey = "enumwaii-package-manager"; diff --git a/docs/eslint-plugin.md b/docs/eslint-plugin.md index d584f8d..ef66fe6 100644 --- a/docs/eslint-plugin.md +++ b/docs/eslint-plugin.md @@ -25,11 +25,7 @@ yarn add -D eslint eslint-plugin-enumwaii bun add -d eslint eslint-plugin-enumwaii ``` -```sh tab="deno" -deno add --dev npm:eslint npm:eslint-plugin-enumwaii -``` - -The plugin is a Node-based development tool. Deno and Cloudflare applications need it only when their repository already runs ESLint through a compatible toolchain; it is not part of enumwaii's runtime support. +The plugin is a Node-based development tool. Cloudflare applications need it only when their repository already runs ESLint through a compatible toolchain; it is not part of enumwaii's runtime support. ### Syntax-only flat config @@ -86,49 +82,61 @@ For eslintrc configuration, use the `recommended` and `recommended-type-checked` All three configurable rules accept the same structured declaration `ignore` entries. Define reviewed exceptions once and pass that array to every rule that should honor them. Each entry requires a name matcher, an `external-contract` or `compatibility` reason, and a nonblank justification. This keeps matching behavior and rationale aligned instead of maintaining parallel wildcard and regex lists. -### `no-manual-enum` - -Enabled in both type-checked presets. Reports unions of two or more distinct raw string literals, including inline annotations, constraints, containers, nullable unions, branded wrappers, and assembly from single-literal aliases (including imports). Adding even one raw literal to a branded enumwaii type is also reported. References to an already assembled vocabulary are not reported again. - -The rule also reports string-valued const arrays and objects when indexed access extracts a multi-value domain, and unions whose branches share a required property with distinct raw string tags. Ordinary const data is allowed until used as a type vocabulary. Diagnostics distinguish unions, const containers, and discriminants. - -```ts -import { em } from "enumwaii"; - -const states = em(["LOADING", "SUCCESS", "ERROR"]); -type State = (typeof states)["~type"]; -const STATE = states.cases; -type RequestState = - | { state: typeof STATE.LOADING } - | { state: typeof STATE.SUCCESS; data: string } - | { state: typeof STATE.ERROR; error: Error }; -``` +### `enforce-enum-casing` -Use `.cases` for TypeScript's native discriminant narrowing and exhaustiveness, consistent with the other enumwaii rules. Use `.enum` for ordinary branded values. +Checks string literals in the first array or object passed directly to `em(...)` or `new Enumwaii(...)`. It does not need TypeScript parser services. Object keys always require `CONSTANT_CASE`. Tuple members and object values follow `valueCasing`: `"constant"` (the default), `"kebab"`, or `"snake"`. Non-literal values are outside its scope. -`keyof`, indexed property selection, built-in `Pick`/`Omit` keys, open template formats, and existing external type references remain allowed. No blanket exemption applies to `.d.ts` files or DTO names. Exclude generated files explicitly through ESLint `ignores`. +Use `valueCasing` for consistent lowercase wire formats. Use structured `ignore` entries for reviewed declaration exceptions shared with `no-object-em` or `no-manual-enum`. `ignoredNamePatterns` and `ignoredFilePatterns` remain available when a simple wildcard or generated-file boundary should bypass casing checks entirely. -Use `ignore` for explicit declaration exceptions, with the same matchers and required rationale as `no-object-em`: +The ignore options accept wildcard patterns. `*` matches within one path segment, `**` crosses path separators, and `?` matches one non-separator character. Name patterns match identifiers directly bound to a declaration, such as `wireStatus` in `const wireStatus = em([...])`. File patterns match normalized forward-slash paths, so `**/generated/**` works on every operating system. A matched declaration skips both key and value checks. ```js +const wireExceptions = [ + { + name: { startsWith: "provider", endsWith: "Status" }, + reason: "external-contract", + justification: "Provider status values retain their published spelling.", + }, +]; + { rules: { - "enumwaii/no-manual-enum": ["error", { - ignore: [{ - name: { startsWith: "Provider", endsWith: "Status" }, - reason: "external-contract", - justification: "Provider schema requires a separately declared wire type.", - }], - }], + "enumwaii/enforce-enum-casing": [ + "error", + { + valueCasing: "kebab", + ignore: wireExceptions, + ignoredFilePatterns: ["**/generated/**", "**/*.generated.ts"], + }, + ], + "enumwaii/no-object-em": ["error", { ignore: wireExceptions }], }, } ``` -A name matcher supports `startsWith`, `endsWith`, and `contains` together (all must match), or a standalone `regex` string. Any matching entry exempts the declaration. Matching is case-sensitive; regexes use Unicode mode. Each entry requires `reason: "external-contract" | "compatibility"` and a nonblank `justification`. Invalid options and regexes fail configuration. +Reports: `invalidInternalMember`. -Names come from the nearest enclosing type alias, interface, function, method, or variable declaration. This includes inline annotations within that declaration. For const extraction, match the derived type name, not the source container. Matching stops at the nearest declaration, so ignoring a function does not exempt a separately named local type. Unnamed declarations are not matched. Exceptions neither propagate through references nor disable other rules; generated-file exclusions still belong in ESLint `ignores`. +#### Flagged -There are no automatic fixes. Preserve existing wire and persisted values when migrating; `no-object-em` representation exceptions do not disable this rule. Coverage is deliberately bounded: it does not evaluate finite template expansions, arbitrary generic transformations, native TypeScript enum declarations, or const containers hidden behind value aliases or non-const assertions. It recognizes branded ownership through enumwaii's declaration source, not a local function named `em` or a property named `~type`. +```ts +// @noErrors +import { em } from "enumwaii"; + +const status = em({ inProgress: "IN_PROGRESS" }); +// @error: enumwaii/enforce-enum-casing (invalidInternalMember) — internal members use CONSTANT_CASE. +``` + +#### Accepted + +```ts +import { em } from "enumwaii"; + +// With valueCasing: "kebab" +const status = em({ + READY: "ready", + IN_PROGRESS: "in-progress", +}); +``` ### `no-object-em` @@ -164,50 +172,87 @@ An exemption never permits a statically resolved redundant object literal such a Exceptions apply only to this rule: retain magic-string enforcement at use sites. Required external literal values may need a separate, narrowly scoped `enforce-enum-casing` name override; keep your keys `CONSTANT_CASE`. Directly importing the provider enum avoids duplicating its literal definitions. -Reports: `objectInput`, `redundantObject`. +Reports: `objectInput` and `redundantObject`. -### `enforce-enum-casing` +#### Flagged -Checks string literals in the first array or object passed directly to `em(...)` or `new Enumwaii(...)`. It does not need TypeScript parser services. Object keys always require `CONSTANT_CASE`. Tuple members and object values follow `valueCasing`: `"constant"` (the default), `"kebab"`, or `"snake"`. Non-literal values are outside its scope. +```ts +// @noErrors +import { em } from "enumwaii"; -Use `valueCasing` for consistent lowercase wire formats. Use structured `ignore` entries for reviewed declaration exceptions shared with `no-object-em` or `no-manual-enum`. `ignoredNamePatterns` and `ignoredFilePatterns` remain available when a simple wildcard or generated-file boundary should bypass casing checks entirely. +const progress = em({ IN_PROGRESS: "STARTED", COMPLETED: "DONE" }); +// @error: enumwaii/no-object-em (objectInput) — use array input or a documented exception. +const methods = em({ GET: "GET", POST: "POST" }); +// @error: enumwaii/no-object-em (redundantObject) — use em([...]) for identical keys and values. +``` -The ignore options accept wildcard patterns. `*` matches within one path segment, `**` crosses path separators, and `?` matches one non-separator character. Name patterns match identifiers directly bound to a declaration, such as `wireStatus` in `const wireStatus = em([...])`. File patterns match normalized forward-slash paths, so `**/generated/**` works on every operating system. A matched declaration skips both key and value checks. +#### Accepted -```js -const wireExceptions = [ - { - name: { startsWith: "provider", endsWith: "Status" }, - reason: "external-contract", - justification: "Provider status values retain their published spelling.", - }, -]; +```ts +import { em } from "enumwaii"; + +const progress = em(["IN_PROGRESS", "COMPLETED"]); +const PROGRESS = progress.enum; +const progressLabels = { + [PROGRESS.IN_PROGRESS]: "In progress", + [PROGRESS.COMPLETED]: "Completed", +}; + +const methods = em({ + /** Reads a resource without side effects. */ + GET: "GET", + /** Submits data to create or process a resource. */ + POST: "POST", +}); +``` + +### `no-manual-enum` + +Enabled in both type-checked presets. Reports unions of two or more distinct raw string literals, including inline annotations, constraints, containers, nullable unions, branded wrappers, and assembly from single-literal aliases (including imports). Adding even one raw literal to a branded enumwaii type is also reported. References to an already assembled vocabulary are not reported again. + +The rule also reports string-valued const arrays and objects when indexed access extracts a multi-value domain, and unions whose branches share a required property with distinct raw string tags. Ordinary const data is allowed until used as a type vocabulary. Diagnostics distinguish unions, const containers, and discriminants. + +Use `.cases` for TypeScript's native discriminant narrowing and exhaustiveness, consistent with the other enumwaii rules. Use `.enum` for ordinary branded values. + +`keyof`, indexed property selection, built-in `Pick`/`Omit` keys, open template formats, and existing external type references remain allowed. No blanket exemption applies to `.d.ts` files or DTO names. Exclude generated files explicitly through ESLint `ignores`. + +Use `ignore` for explicit declaration exceptions, with the same matchers and required rationale as `no-object-em`: +```js { rules: { - "enumwaii/enforce-enum-casing": [ - "error", - { - valueCasing: "kebab", - ignore: wireExceptions, - ignoredFilePatterns: ["**/generated/**", "**/*.generated.ts"], - }, - ], - "enumwaii/no-object-em": ["error", { ignore: wireExceptions }], + "enumwaii/no-manual-enum": ["error", { + ignore: [{ + name: { startsWith: "Provider", endsWith: "Status" }, + reason: "external-contract", + justification: "Provider schema requires a separately declared wire type.", + }], + }], }, } ``` -Reports: `invalidInternalMember`. +A name matcher supports `startsWith`, `endsWith`, and `contains` together (all must match), or a standalone `regex` string. Any matching entry exempts the declaration. Matching is case-sensitive; regexes use Unicode mode. Each entry requires `reason: "external-contract" | "compatibility"` and a nonblank `justification`. Invalid options and regexes fail configuration. + +Names come from the nearest enclosing type alias, interface, function, method, or variable declaration. This includes inline annotations within that declaration. For const extraction, match the derived type name, not the source container. Matching stops at the nearest declaration, so ignoring a function does not exempt a separately named local type. Unnamed declarations are not matched. Exceptions neither propagate through references nor disable other rules; generated-file exclusions still belong in ESLint `ignores`. + +There are no automatic fixes. Preserve existing wire and persisted values when migrating; `no-object-em` representation exceptions do not disable this rule. Coverage is deliberately bounded: it does not evaluate finite template expansions, arbitrary generic transformations, native TypeScript enum declarations, or const containers hidden behind value aliases or non-const assertions. It recognizes branded ownership through enumwaii's declaration source, not a local function named `em` or a property named `~type`. + +Reports: `manualUnion`, `manualContainer`, and `manualDiscriminant`. #### Flagged ```ts // @noErrors -import { em } from "enumwaii"; +type Status = "LOADING" | "SUCCESS" | "ERROR"; +// @error: enumwaii/no-manual-enum (manualUnion) — declare the vocabulary with enumwaii. -const status = em({ inProgress: "IN_PROGRESS" }); -// @error: enumwaii/enforce-enum-casing (invalidInternalMember) — internal members use CONSTANT_CASE. +const PRIORITIES = ["LOW", "HIGH"] as const; +type Priority = (typeof PRIORITIES)[number]; +// @error: enumwaii/no-manual-enum (manualContainer) — replace the const container with enumwaii. + +type RequestState = { state: "LOADING" } | { state: "SUCCESS"; data: string }; +// @error: enumwaii/no-manual-enum (manualDiscriminant) — reference canonical case members. ``` #### Accepted @@ -215,11 +260,13 @@ const status = em({ inProgress: "IN_PROGRESS" }); ```ts import { em } from "enumwaii"; -// With valueCasing: "kebab" -const status = em({ - READY: "ready", - IN_PROGRESS: "in-progress", -}); +const states = em(["LOADING", "SUCCESS", "ERROR"]); +type State = (typeof states)["~type"]; +const STATE_CASES = states.cases; +type RequestState = + | { state: typeof STATE_CASES.LOADING } + | { state: typeof STATE_CASES.SUCCESS; data: string } + | { state: typeof STATE_CASES.ERROR; error: Error }; ``` ### `no-direct-enumwaii-reference` @@ -423,40 +470,6 @@ const grants = roles.deriveTo( const combined = em.combine([roles, permissions]); ``` -### `prefer-native-schema-adapters` - -Reports `z.enum`, `z.nativeEnum`, `v.enum`, and `v.picklist` calls that rebuild a schema from an enumwaii `.enum`, `.rawEnum`, `.cases`, `.values`, or `.rawValues` view. Extracted and imported aliases are traced through TypeScript symbols, while ordinary arrays and objects remain valid schema inputs. - -Use the library-specific adapter when an API requires a concrete schema type. `emToZodSchema` returns a native `z.enum`, so it also covers schemas that must convert to JSON Schema. If the receiving API supports Standard Schema, pass the enumwaii declaration directly without an adapter. - -#### Flagged - -```ts -// @noErrors -import { em } from "enumwaii"; -import { z } from "zod"; - -const roles = em(["ADMIN", "USER"]); -const RAW_ROLE = roles.rawEnum; -const roleSchema = z.enum(RAW_ROLE); -// @error: enumwaii/prefer-native-schema-adapters (preferAdapter) — preserve enumwaii validation and branded output. -``` - -#### Accepted - -```ts -import { em } from "enumwaii"; -import { emToZodSchema } from "enumwaii/zod"; - -const roles = em(["ADMIN", "USER"]); -const roleSchema = emToZodSchema(roles); - -declare function acceptsStandardSchema(schema: typeof roles): void; -acceptsStandardSchema(roles); -``` - -The rule has no autofix because adapter schemas can differ from reconstructed schemas in their inferred output types and error behavior. Reports: `preferAdapter`. - ### `no-union-property-in` Flags a static string on the left side of `in` when the right side is an object union and the property is available on some variants but unavailable on others. It does not reject ordinary property-existence checks, non-unions, dynamic property names, or unions whose members are not structurally separated by that property. @@ -498,6 +511,42 @@ if (scope.kind === SCOPE_CASES.CHAT) { } ``` +### `prefer-native-schema-adapters` + +Reports `z.enum`, `z.nativeEnum`, `v.enum`, and `v.picklist` calls that rebuild a schema from an enumwaii `.enum`, `.rawEnum`, `.cases`, `.values`, or `.rawValues` view. Extracted and imported aliases are traced through TypeScript symbols, while ordinary arrays and objects remain valid schema inputs. + +Use the library-specific adapter when an API requires a concrete schema type. `emToZodSchema` returns a native `z.enum`, so it also covers schemas that must convert to JSON Schema. If the receiving API supports Standard Schema, pass the enumwaii declaration directly without an adapter. + +The rule has no autofix because adapter schemas can differ from reconstructed schemas in their inferred output types and error behavior. + +Reports: `preferAdapter`. + +#### Flagged + +```ts +// @noErrors +import { em } from "enumwaii"; +import { z } from "zod"; + +const roles = em(["ADMIN", "USER"]); +const RAW_ROLE = roles.rawEnum; +const roleSchema = z.enum(RAW_ROLE); +// @error: enumwaii/prefer-native-schema-adapters (preferAdapter) — preserve enumwaii validation and branded output. +``` + +#### Accepted + +```ts +import { em } from "enumwaii"; +import { emToZodSchema } from "enumwaii/zod"; + +const roles = em(["ADMIN", "USER"]); +const roleSchema = emToZodSchema(roles); + +declare function acceptsStandardSchema(schema: typeof roles): void; +acceptsStandardSchema(roles); +``` + ## Oxlint Oxlint can load the package as a JavaScript plugin. JavaScript-plugin support is still evolving, and only the syntax-only casing rule is useful without TypeScript parser services: diff --git a/docs/examples.mdx b/docs/examples.mdx index 6a3d55c..56fced0 100644 --- a/docs/examples.mdx +++ b/docs/examples.mdx @@ -7,8 +7,8 @@ The repository examples are independent applications with package manifests, run StackBlitz runs the browser or Node.js path inside a WebContainer. It cannot - prove Hono's Bun, Deno, or workerd paths or NestJS's Docker-backed MongoDB - service. Use the checked-in runtime commands for those environments. + prove Hono's Bun or workerd paths or NestJS's Docker-backed MongoDB service. + Use the checked-in runtime commands for those environments. The hosted links import the complete repository so the unpublished local copy of enumwaii remains available through each example's `file:` dependency. They install only the selected example and its dependencies, then build the local library before starting. @@ -103,8 +103,8 @@ Third-party marks identify technologies exercised by the runnable examples and l - Forms use TanStack Form in the Solid application and a dependency-free native approach in Vue. - TanStack Table drives a searchable and sortable editorial grid in Byline. - Next.js, TanStack Start, and Vue parse URL or persistence state. -- Hono uses Drizzle with embedded PGlite on Node, Bun, and Deno; its shared database-free status routes also run in Cloudflare workerd with Node compatibility disabled. NestJS uses Mongoose with a checked-in MongoDB Compose service. +- Hono uses Drizzle with embedded PGlite on Node and Bun; its shared database-free status routes also run in Cloudflare workerd with Node compatibility disabled. NestJS uses Mongoose with a checked-in MongoDB Compose service. - Server examples cover JSON, form data, route parameters, request/response schemas, error mapping, and serialized branded strings. -- The Hono runtime suite keeps one status-boundary contract constant across native Bun and Deno servers and Cloudflare workerd. +- The Hono runtime suite keeps one status-boundary contract constant across a native Bun server and Cloudflare workerd. Every application includes invalid and ambiguous inputs alongside its successful flow. diff --git a/docs/getting-started.md b/docs/getting-started.md index 7d16552..851113b 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -25,11 +25,7 @@ yarn add enumwaii bun add enumwaii ``` -```sh tab="deno" -deno add npm:enumwaii -``` - -The package ships ESM and CommonJS builds with declarations and source maps. Node.js 18 or newer is supported, and the ESM entry point is also tested under Bun, Deno, and Cloudflare Workers without Node compatibility flags. In a Cloudflare Workers project, use whichever package manager already owns the project and import `enumwaii` normally. +The package ships ESM and CommonJS builds with declarations and source maps. Node.js 18 or newer is supported, and the ESM entry point is also tested under Bun and Cloudflare Workers without Node compatibility flags. In a Cloudflare Workers project, use whichever package manager already owns the project and import `enumwaii` normally. The only runtime dependency is the type-focused official Standard Schema specification package. Zod, Valibot, and ESLint are opt-in. diff --git a/docs/lib/brands.ts b/docs/lib/brands.ts index ac29769..4956cec 100644 --- a/docs/lib/brands.ts +++ b/docs/lib/brands.ts @@ -4,11 +4,6 @@ export const brandAssets = { label: "Bun", src: "/brands/bun.svg", }, - deno: { - href: "https://deno.com/", - label: "Deno", - src: "/brands/deno.svg", - }, effect: { href: "https://effect.website/", label: "Effect", diff --git a/docs/public/brands/deno.svg b/docs/public/brands/deno.svg deleted file mode 100644 index bbba5b6..0000000 --- a/docs/public/brands/deno.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/docs/release-and-compatibility.md b/docs/release-and-compatibility.md index 77f9b77..4a75d5d 100644 --- a/docs/release-and-compatibility.md +++ b/docs/release-and-compatibility.md @@ -6,12 +6,12 @@ description: Runtime requirements, module formats, optional peers, versioning, a ## Runtime and modules - Node.js 18 or newer is supported by both published packages. The final Node 18 release loads both ESM and CommonJS builds in extended validation. The ESLint plugin is specifically a Node-based development tool. -- The core package's ESM entry is additionally exercised under Bun 1.4, Deno 2.9, and Cloudflare Workers. The Worker configuration explicitly disables both Node compatibility modes. +- The core package's ESM entry is additionally exercised under Bun 1.4 and Cloudflare Workers. The Worker configuration explicitly disables both Node compatibility modes. - Both packages publish ESM and CommonJS entry points, declarations, and source maps. - Package exports define the public compatibility contract; import through the declared root and adapter subpaths. - Runtime package code is marked side-effect free. -The [Hono compatibility application](https://github.com/CatOfJupit3r/enumwaii/tree/main/examples/hono) runs its complete Drizzle + PGlite order console through native Node, Bun, and Deno servers. Its database-free status routes are also bundled and executed in Cloudflare `workerd`, where both Node compatibility modes are disabled. Every non-Node host exercises one shared HTTP contract, and a Wrangler dry-run checks the production Worker bundle. These pinned CI versions are compatibility canaries, not a promise that every older Bun or Deno release is supported. +The [Hono compatibility application](https://github.com/CatOfJupit3r/enumwaii/tree/main/examples/hono) runs its complete Drizzle + PGlite order console through native Node and Bun servers. Its database-free status routes are also bundled and executed in Cloudflare `workerd`, where both Node compatibility modes are disabled. Every non-Node host exercises one shared HTTP contract, and a Wrangler dry-run checks the production Worker bundle. These pinned CI versions are compatibility canaries, not a promise that every older Bun release is supported. ## Dependencies diff --git a/packages/enumwaii/README.md b/packages/enumwaii/README.md index 3643e44..08864e8 100644 --- a/packages/enumwaii/README.md +++ b/packages/enumwaii/README.md @@ -32,12 +32,6 @@ OR bun add enumwaii ``` -OR - -```sh -deno add npm:enumwaii -``` - ## Quick start ```ts @@ -135,7 +129,7 @@ Read [Member surfaces](https://catofjupit3r.github.io/enumwaii/docs/member-surfa ## Compatibility -Node.js 18 or newer is supported. ESM and CommonJS entry points, declarations, and source maps are included. The ESM entry is also tested under Bun 1.4, Deno 2.9, and Cloudflare Workers without Node compatibility flags. See [releases and compatibility](https://catofjupit3r.github.io/enumwaii/docs/release-and-compatibility/). +Node.js 18 or newer is supported. ESM and CommonJS entry points, declarations, and source maps are included. The ESM entry is also tested under Bun 1.4 and Cloudflare Workers without Node compatibility flags. See [releases and compatibility](https://catofjupit3r.github.io/enumwaii/docs/release-and-compatibility/). ## License From 29ab1a0786ba25aebb19f69d994db486d9689b0a Mon Sep 17 00:00:00 2001 From: CatOfJupit3r Date: Thu, 15 Oct 2026 23:44:19 +0300 Subject: [PATCH 2/2] ci: drop Deno from CI and the Hono example Remove the Deno setup step from Extended validation, the Hono example's Deno server, runtime test, scripts and config, the root Deno workspace file and the deno.lock ignore entry. The runtime suite now covers Bun and Cloudflare Workers, and contributor docs and the changeset say so. --- .changeset/drop-deno-docs.md | 2 +- .github/workflows/ci.yml | 5 +- .gitignore | 1 - CONTRIBUTING.md | 4 +- MAINTAINERS.md | 2 +- deno.json | 5 -- examples/README.md | 4 +- examples/hono/README.md | 3 +- examples/hono/deno.json | 12 ---- examples/hono/package.json | 4 +- examples/hono/runtime-tests/deno-runtime.ts | 62 --------------------- examples/hono/runtime/cloudflare.ts | 2 +- examples/hono/runtime/deno.ts | 26 --------- 13 files changed, 10 insertions(+), 122 deletions(-) delete mode 100644 deno.json delete mode 100644 examples/hono/deno.json delete mode 100644 examples/hono/runtime-tests/deno-runtime.ts delete mode 100644 examples/hono/runtime/deno.ts diff --git a/.changeset/drop-deno-docs.md b/.changeset/drop-deno-docs.md index 61ba315..2d4db29 100644 --- a/.changeset/drop-deno-docs.md +++ b/.changeset/drop-deno-docs.md @@ -2,4 +2,4 @@ "enumwaii": patch --- -Remove Deno installation instructions and Deno compatibility claims from the package README. +Drop Deno from the documented runtime support. The ESM entry is no longer tested under Deno, so the README lists only Node.js, Bun, and Cloudflare Workers. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b69e846..9fc5fda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,15 +49,12 @@ jobs: - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: 1.4.2 - - uses: denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed # v2.0.5 - with: - deno-version: v2.9.6 - name: Validate dependency pins run: node scripts/check-dependency-pins.mjs - run: pnpm install --frozen-lockfile - name: Check packages, examples, and documentation run: pnpm check - - name: Check Bun, Deno, and Cloudflare Workers + - name: Check Bun and Cloudflare Workers run: pnpm test:runtimes - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: diff --git a/.gitignore b/.gitignore index c30508e..26d8919 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ examples/**/.data examples/**/pnpm-lock.yaml examples/**/package-lock.json examples/**/bun.lock* -examples/**/deno.lock examples/react-native/android examples/react-native/ios examples/hono/worker-configuration.d.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7f93a1..9211bc3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,7 +42,7 @@ pnpm test:runtimes Examples are versioned in this repository but intentionally live outside the root pnpm workspace so their transitive dependencies do not enter the committed root lockfile. `pnpm check` builds the local `enumwaii` package, installs each example independently without a frozen lockfile, and runs its tests, type checks, and build. Generated example lockfiles are ignored. To work on one example from the repository root, run `pnpm --filter enumwaii build`, then `pnpm --dir examples/ install --no-frozen-lockfile` and `pnpm --dir examples/