104 lines
7.5 KiB
Plaintext
104 lines
7.5 KiB
Plaintext
Tasks
|
|
|
|
Backlog and tracking for tiny-pattern-ts. Managed in vscode-todotasks format.
|
|
|
|
---
|
|
|
|
Setup:
|
|
☐ Split off template into separate package => pi --session 01a07dde-7050-7054-bb36-1606d7eb2bc3 @low
|
|
✔ straighten oxc rules @done
|
|
✔ oxc forbids ternary => remove oxc rule @done
|
|
✔ oxc wants comments to start comments with a capital letter => remove oxc rule @done
|
|
✔ there already exists a /* */ block comment in primitive.ts, => change to multi-line comment @done
|
|
|
|
✔ Remove example code files and its documentation and its exports from index.ts @high @done
|
|
✔ remove src/match.ts and its documentation @high @done
|
|
✔ remove src/pattern.ts and its documentation @high @done
|
|
✔ remove src/index.test.ts and its documentation @high @done
|
|
✔ exports from `src/index.ts` should only be the public API surface @done
|
|
|
|
|
|
v1.0:
|
|
☐ API surface is stable and fully typed
|
|
☐ Finalize public exports in `src/index.ts`
|
|
☐ Document all exported types and functions
|
|
☐ Add JSDoc for public APIs
|
|
☐ Test coverage meets threshold
|
|
☐ Achieve 100% branch coverage on `src/primitive-union.ts`
|
|
☐ Achieve 100% branch coverage on `src/index.ts`
|
|
|
|
Testing:
|
|
✔ Cover autocomplete with real completion test cases in the suite @medium @done
|
|
→ `src/util/__tests__/lsp-completion.ts` (`#test-utils/…`) is the helper; the suite asserts its labels (see development/testing.md § Autocomplete)
|
|
→ wire it into `node --test` so a test asserts the offered labels
|
|
→ note: `Parameters<typeof factory>[0]` resolves only the *last* overload; use `@ts-expect-error` call sites for factory negatives, not `not.toExtend<Parameters<…>>`
|
|
✔ Drive the LSP completion helper through the LSP protocol library instead of a hand-rolled JSON-RPC client @medium @done
|
|
✔ Add `vscode-languageserver-protocol` and record the tooling decision @done
|
|
✔ Rewrite `src/util/__tests__/lsp-completion.ts` onto `createMessageConnection` and typed requests @done
|
|
✔ Update `development/testing.md § Autocomplete` for the new client @done
|
|
✔ Run `npm run verify` and check the task off @done
|
|
☐ Test a literal union widened with `(string & {})` — `"red" | "green" | "yellow" | (string & {})` @medium
|
|
→ autocomplete should still offer the literals; arbitrary strings stay assignable and fall through to the fallback
|
|
☐ Type hole when using broad types like string as a universe @high
|
|
☐ handlers cannot be exhaustive, yet it is possible to not have a fallback
|
|
☐ one test even exploits this, I think for a negative test
|
|
☐ does the same type hole exist for tagged-union matchers or primitive-union matchers only?
|
|
|
|
Matcher:
|
|
✔ Clean up: adopt the 3-overload matcher (`src/prototype-ac2.ts`) and delete the prototypes @high @done
|
|
→ `getMatcher` / `getMatcherW`, each with overloads `ExhaustiveLoose` → `Fallback` → `Handlers` (order is load-bearing)
|
|
→ fold into `src/primitive.ts` / the public API; drop `src/prototype*.ts`
|
|
✔ `_` should receive only the unhandled `T` keys, not all of `T` @medium @done
|
|
→ the fallback is now a second argument: `(handlers, (s) => …)`, `s: Exclude<T, keyof handlers>`
|
|
✔ A fallback for an already-exhaustive handler map must be a compile error @medium @done
|
|
→ rejected by an F-bounded constraint on `Handled` (checked *after* inference); a conditional in the fallback parameter is evaluated too early and breaks contextual typing
|
|
✔ Implement matcher with similar API like matcher from primitive.ts @high @done
|
|
→ `getTaggedUnionMatcher` / `getTaggedUnionMatcherW`, curried on the discriminant key
|
|
→ fallback is the second argument; `_` removed
|
|
✔ Rename `primitive` to `primitive-union` and `getMatcher` to `getPrimitiveMatcher` @medium @done
|
|
→ `src/primitive.ts` / `src/primitive.test.ts` → `primitive-union.*`
|
|
→ `getMatcherW` → `getPrimitiveMatcherW` for symmetry with the tagged-union pair
|
|
→ update `src/index.ts`, `development/library.md` and any README references
|
|
→ shipped as `getPrimitiveUnionMatcher` / `getPrimitiveUnionMatcherW`; kept `Union` for symmetry with the tagged-union pair
|
|
☐ when using a union type as a property, the current behavior of tagged union matcher is
|
|
to pass never to handler parameters
|
|
→ new matcher function needed or can be fixed in tagged union matcher
|
|
|
|
Bugs:
|
|
✔ TS 7 LSP server logs `context canceled` on stderr at shutdown @done
|
|
→ `handleExit` returns `io.EOF`, cancelling the background context while `Session.updateWatches` is still in flight; the bare error is flushed to stderr and the server exits 1
|
|
→ close stdin after `shutdown` instead of sending `exit`; the server exits cleanly (code 0, no output), kill kept as a fallback
|
|
Enhancements:
|
|
✔ Allow boolean literals in primitive union patterns (e.g. `true: () => "yes"`) @medium @done
|
|
✔ Are there other primitive types that should be supported in union patterns? (e.g. `bigint`, `symbol`) @medium @done
|
|
→ added boolean, null and undefined; rejected `symbol` (compile-time brand, nothing at runtime) and `bigint` (not a property key)
|
|
☐ Allow boolean, null and undefined discriminant values in tagged-union patterns @medium
|
|
→ needs the primitive-union matcher's `PatternKey` / `PatternParam` projection; see development/library.md § Tagged-union matcher
|
|
|
|
Documentation:
|
|
☐ Bring README.md back to its previous form — synopsis and examples restored, in the correct place
|
|
→ previous section order: title, tagline, Synopsis, Description, Requirements, Examples, API, License, Contributing
|
|
→ previous Examples order: literal/exhaustive, typeof, structural/discriminated unions, when, any
|
|
☐ Create `examples/` directory with runnable snippets
|
|
☐ Add comparison section vs. other TS pattern-matching libs in Readme.md
|
|
☐ Write migration guide for users coming from discriminated unions
|
|
☐ Create backlog tasks for implementation
|
|
✔ Document the matcher design paths in `development/` — union vs overload merge, inferred universe (`NoInfer`), conditional `RequireKeys`, cases-first — and why each was abandoned @done
|
|
☐ Validate code fences in Markdown (start with README.md) — compile the TypeScript examples against `src/` so the docs cannot drift from the API
|
|
|
|
Workflow:
|
|
✔ Resolve the finish/push tension: `create:finish` leaves `main` ahead of its upstream while `create:branch` refuses until `main` matches upstream — decide whether `finish` should push or `branch` should compare only `BEHIND` (see development/workflow.md) @done
|
|
|
|
Maintenance:
|
|
☐ Serve CI coverage over a tiny self-hosted webserver (replace the zip artifact) @low
|
|
☐ Explore serving coverage for non-tag pushes (e.g. `main/coverage`, PR previews) @low
|
|
→ design: no deploy step in CI; the webserver just exposes the shared directory (decided over Gitea Pages / Codecov — neither confirmed available/ wanted)
|
|
☐ serve docs over self hosted server @low
|
|
☐ Add a minimal dir-listing webserver to the gitea docker setup for serving docs (reuse existing reverse proxy)
|
|
☐ CI writes docs to a shared volume keyed by project + tag (e.g. `/docs/tiny-pattern-ts/<tag>/`)
|
|
☐ Browse to `…/docs/<repo>/<tag>/index.html` in the browser
|
|
☐ serve landing page over self hosted server @low
|
|
☐ Add a minimal dir-listing webserver to the gitea docker setup for serving landing page (reuse existing reverse proxy)
|
|
☐ CI writes landing page to a shared volume keyed by project + tag (e.g. `/landing/tiny-pattern-ts/<tag>/`)
|
|
☐ Browse to `…/tiny-pattern-ts/index.html` in the browser
|