diff --git a/README.md b/README.md index 58478bb..3b5df51 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,24 @@ Union of nodes that can occur in esast (TypeScript type). Construct a union of esast node builders (TypeScript type). -**See also**: [`ub.Builder`][buildert] +**See also**: [`ub.AnyBuilder`][anybuilder], [`ub.Builder`][buildert] ```ts type Builder> = T extends Type - ? ub.Builder> + ? ub.Builder> extends infer B extends ub.AnyBuilder + ? B extends ub.BuilderValue + ? B + : B extends readonly Node[] + ? B[number][] + : { + [K in keyof B]: K extends 'children' + ? B[K] extends infer U extends readonly Node[] + ? U[number][] + : never + : B[K] + } + : never : never ``` @@ -149,6 +161,7 @@ See [`CONTRIBUTING.md`](CONTRIBUTING.md). This project has a [code of conduct](CODE_OF_CONDUCT.md). By interacting with this repository, organization, or community you agree to abide by its terms. +[anybuilder]: https://github.com/flex-development/unist-util-builder#anybuilder [anynode]: https://github.com/flex-development/esast/blob/main/src/types/any-node.ts [buildert]: https://github.com/flex-development/unist-util-builder#buildert [esast]: https://github.com/flex-development/esast diff --git a/package.json b/package.json index 7b35088..b18bf05 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "sh-syntax": "0.4.2", "trash-cli": "5.0.0", "ts-dedent": "2.2.0", - "typescript": "5.5.0-beta", + "typescript": "5.5.0-dev.20240529", "vitest": "1.6.0", "yaml-eslint-parser": "1.2.3" }, diff --git a/src/types/__tests__/builder.spec-d.ts b/src/types/__tests__/builder.spec-d.ts index e9d5193..e928232 100644 --- a/src/types/__tests__/builder.spec-d.ts +++ b/src/types/__tests__/builder.spec-d.ts @@ -6,6 +6,8 @@ import type * as esast from '@flex-development/esast' import type * as build from '@flex-development/unist-util-builder' import type { Match, Type } from '@flex-development/unist-util-types' +import type * as mdast from 'mdast' +import type * as unist from 'unist' import type TestSubject from '../builder' describe('unit-d:types/Builder', () => { @@ -14,13 +16,45 @@ describe('unit-d:types/Builder', () => { }) describe('T extends Type', () => { - it('should equal build.Builder>', () => { - // Arrange - type T = Type - type Expect = build.Builder> + describe('node', () => { + it('should construct node builders union', () => { + // Arrange + type T = Type + type Expect = build.Builder> - // Expect - expectTypeOf>().toEqualTypeOf() + // Expect + expectTypeOf>().toEqualTypeOf() + }) + }) + + describe('parent', () => { + it('should construct node builders union', () => { + // Arrange + type T = Type + type Expect = + | ( + | esast.Comment + | esast.Expression + | esast.SpreadElement + | esast.Super + )[] + | (esast.Expression | esast.SpreadElement | esast.Super)[] + | { + children: ( + | esast.Comment + | esast.Expression + | esast.SpreadElement + | esast.Super + )[] + new: boolean + data?: esast.CallExpressionData | undefined + optional: boolean + position?: unist.Position | undefined + } + + // Expect + expectTypeOf>().toEqualTypeOf() + }) }) }) }) diff --git a/src/types/builder.ts b/src/types/builder.ts index fdf9a77..5fb8dc8 100644 --- a/src/types/builder.ts +++ b/src/types/builder.ts @@ -6,19 +6,37 @@ import type { AnyNode } from '@flex-development/esast' import type * as ub from '@flex-development/unist-util-builder' import type { Match, Type } from '@flex-development/unist-util-types' +import type { Node } from 'unist' /** * Construct a union of esast node builders. * * @see {@linkcode AnyNode} * @see {@linkcode Match} + * @see {@linkcode Node} * @see {@linkcode Type} + * @see {@linkcode ub.AnyBuilder} * @see {@linkcode ub.Builder} + * @see {@linkcode ub.BuilderValue} * * @template {Type} [T=Type] - esast node type */ +// dprint-ignore-start type Builder> = T extends Type - ? ub.Builder> + ? ub.Builder> extends infer B extends ub.AnyBuilder + ? B extends ub.BuilderValue + ? B + : B extends readonly Node[] + ? B[number][] + : { + [K in keyof B]: K extends 'children' + ? B[K] extends infer U extends readonly Node[] + ? U[number][] + : never + : B[K] + } + : never : never +// dprint-ignore-end export type { Builder as default } diff --git a/src/u.ts b/src/u.ts index 21313c4..a4b7980 100644 --- a/src/u.ts +++ b/src/u.ts @@ -35,6 +35,7 @@ function u = Type>( type: T, builder?: Builder ): Match { + // @ts-expect-error ts(2769) tuples overridden return build(type as unknown as Type>, builder) } diff --git a/yarn.lock b/yarn.lock index ef1ec44..18ec4f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1566,7 +1566,7 @@ __metadata: sh-syntax: "npm:0.4.2" trash-cli: "npm:5.0.0" ts-dedent: "npm:2.2.0" - typescript: "npm:5.5.0-beta" + typescript: "npm:5.5.0-dev.20240529" vitest: "npm:1.6.0" yaml-eslint-parser: "npm:1.2.3" languageName: unknown @@ -10109,13 +10109,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.5.0-beta": - version: 5.5.0-beta - resolution: "typescript@npm:5.5.0-beta" +"typescript@npm:5.5.0-dev.20240529": + version: 5.5.0-dev.20240529 + resolution: "typescript@npm:5.5.0-dev.20240529" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/94d187972aff9c1b521fa40cb4e8121cd0ca701c7e33a28f7d2b6b16179b51d8f209822fd49da1899ffe949446f45624face5083fd9f1cfd0dd532f5865fcdee + checksum: 10/966978ed4faf373e2c2b43bee496fd7514b410cfeb168a3b070fc9805b4ef1c3f4247a457487ed3fcefe5e9e528f3efb2d89b5d7db801a9d1795923f86238797 languageName: node linkType: hard @@ -10129,13 +10129,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.5.0-beta#optional!builtin": - version: 5.5.0-beta - resolution: "typescript@patch:typescript@npm%3A5.5.0-beta#optional!builtin::version=5.5.0-beta&hash=b45daf" +"typescript@patch:typescript@npm%3A5.5.0-dev.20240529#optional!builtin": + version: 5.5.0-dev.20240529 + resolution: "typescript@patch:typescript@npm%3A5.5.0-dev.20240529#optional!builtin::version=5.5.0-dev.20240529&hash=b45daf" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/bba23e7bcae0b253b9af030094baf3964b2d19bea67beaf9faff34ddb89b83f47ab9357118c7e8174ad27790fac0088d88bbbd6f999c938accf75a788b31f87e + checksum: 10/4ce6c5d0d812ce193d7f8a2e4d732f2427e4dfb79547d278ab72131f89e2224c949b1ca700b868ff411634d728ffd6dd3e59d4bc00ff22cd733fc416eae46466 languageName: node linkType: hard