Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]

<!-- dprint-ignore-start -->
```ts
type Builder<T extends Type = Type<AnyNode>> = T extends Type<AnyNode>
? ub.Builder<Match<AnyNode, T>>
? ub.Builder<Match<AnyNode, T>> 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 -->
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down
46 changes: 40 additions & 6 deletions src/types/__tests__/builder.spec-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand All @@ -14,13 +16,45 @@ describe('unit-d:types/Builder', () => {
})

describe('T extends Type<AnyNode>', () => {
it('should equal build.Builder<Match<AnyNode, T>>', () => {
// Arrange
type T = Type<esast.Comment>
type Expect = build.Builder<Match<esast.AnyNode, T>>
describe('node', () => {
it('should construct node builders union', () => {
// Arrange
type T = Type<mdast.Code>
type Expect = build.Builder<Match<esast.AnyNode, T>>

// Expect
expectTypeOf<TestSubject<T>>().toEqualTypeOf<Expect>()
// Expect
expectTypeOf<TestSubject<T>>().toEqualTypeOf<Expect>()
})
})

describe('parent', () => {
it('should construct node builders union', () => {
// Arrange
type T = Type<esast.CallExpression>
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<TestSubject<T>>().toEqualTypeOf<Expect>()
})
})
})
})
20 changes: 19 additions & 1 deletion src/types/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<AnyNode>] - esast node type
*/
// dprint-ignore-start
type Builder<T extends Type = Type<AnyNode>> = T extends Type<AnyNode>
? ub.Builder<Match<AnyNode, T>>
? ub.Builder<Match<AnyNode, T>> 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 }
1 change: 1 addition & 0 deletions src/u.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ function u<T extends Type<AnyNode> = Type<AnyNode>>(
type: T,
builder?: Builder<T>
): Match<AnyNode, T> {
// @ts-expect-error ts(2769) tuples overridden
return build(type as unknown as Type<Match<AnyNode, T>>, builder)
}

Expand Down
18 changes: 9 additions & 9 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -10129,13 +10129,13 @@ __metadata:
languageName: node
linkType: hard

"typescript@patch:typescript@npm%3A5.5.0-beta#optional!builtin<compat/typescript>":
version: 5.5.0-beta
resolution: "typescript@patch:typescript@npm%3A5.5.0-beta#optional!builtin<compat/typescript>::version=5.5.0-beta&hash=b45daf"
"typescript@patch:typescript@npm%3A5.5.0-dev.20240529#optional!builtin<compat/typescript>":
version: 5.5.0-dev.20240529
resolution: "typescript@patch:typescript@npm%3A5.5.0-dev.20240529#optional!builtin<compat/typescript>::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

Expand Down