@likec4/core 1.12.1 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/index.cjs +777 -251
  2. package/dist/index.d.cts +301 -32
  3. package/dist/index.d.mts +301 -32
  4. package/dist/index.d.ts +301 -32
  5. package/dist/index.mjs +774 -252
  6. package/dist/shared/{core.BvFch1jG.mjs → core.BJDxVHFh.mjs} +19 -19
  7. package/dist/shared/{core.dY8efyk0.d.ts → core.C4jDMQ1i.d.cts} +242 -238
  8. package/dist/shared/{core.dY8efyk0.d.cts → core.C4jDMQ1i.d.mts} +242 -238
  9. package/dist/shared/{core.dY8efyk0.d.mts → core.C4jDMQ1i.d.ts} +242 -238
  10. package/dist/shared/{core.CTiE4teS.cjs → core.IR7XOEkQ.cjs} +19 -18
  11. package/dist/types/index.cjs +1 -1
  12. package/dist/types/index.d.cts +1 -1
  13. package/dist/types/index.d.mts +1 -1
  14. package/dist/types/index.d.ts +1 -1
  15. package/dist/types/index.mjs +1 -1
  16. package/package.json +4 -3
  17. package/src/builder/Builder.element.ts +221 -0
  18. package/src/builder/Builder.model.ts +346 -0
  19. package/src/builder/Builder.test-d.ts +69 -0
  20. package/src/builder/Builder.ts +574 -0
  21. package/src/builder/Builder.view.ts +358 -0
  22. package/src/builder/Builder.views.ts +318 -0
  23. package/src/builder/_types.ts +195 -0
  24. package/src/builder/index.ts +5 -0
  25. package/src/index.ts +4 -0
  26. package/src/model/LikeC4DiagramModel.ts +5 -5
  27. package/src/model/LikeC4Model.ts +63 -46
  28. package/src/model/LikeC4ViewModel.ts +7 -7
  29. package/src/model/__test__/fixture.ts +5 -0
  30. package/src/types/element.ts +19 -11
  31. package/src/types/model.ts +13 -8
  32. package/src/types/relation.ts +1 -1
  33. package/src/types/view-changes.ts +6 -2
  34. package/src/types/view.ts +53 -22
  35. package/src/utils/fqn.ts +12 -11
@@ -0,0 +1,358 @@
1
+ import { isArray, isString, map } from 'remeda'
2
+ import type { LiteralUnion, Simplify, Tagged } from 'type-fest'
3
+ import {
4
+ type AutoLayoutDirection,
5
+ type CustomElementExpr,
6
+ type CustomRelationExpr,
7
+ type ElementExpression as C4ElementExpression,
8
+ type Expression as C4Expression,
9
+ type Fqn,
10
+ isElementPredicateExpr,
11
+ type NonEmptyArray,
12
+ type ViewRuleStyle,
13
+ type WhereOperator
14
+ } from '../types'
15
+ import type { AnyTypes, Types } from './_types'
16
+ import type { views, ViewsBuilder as Builder } from './Builder.views'
17
+
18
+ export interface ViewBuilder<T extends AnyTypes> {
19
+ include(...exprs: C4Expression[]): ViewBuilder<T>
20
+ exclude(...exprs: C4Expression[]): ViewBuilder<T>
21
+ style(rule: ViewRuleStyle): ViewBuilder<T>
22
+ autoLayout(layout: AutoLayoutDirection): ViewBuilder<T>
23
+ }
24
+
25
+ export namespace ViewPredicate {
26
+ export type ElementExpr<Fqn extends string> = '*' | Fqn | `${Fqn}.*` | `${Fqn}._`
27
+
28
+ type AllExpression<ElementExpr extends string> =
29
+ | ElementExpr
30
+ | `-> ${ElementExpr} ->`
31
+ | `-> ${ElementExpr}`
32
+ | `${ElementExpr} ->`
33
+ | `${ElementExpr} ${'->' | '<->'} ${ElementExpr}`
34
+
35
+ export type Expression<T extends AnyTypes> = T extends Types<any, infer F extends string, any, any, any, any>
36
+ ? AllExpression<ViewPredicate.ElementExpr<F>>
37
+ : never
38
+
39
+ export type WhereTag<Tag extends string> = `tag ${'is' | 'is not'} #${Tag}`
40
+ export type WhereKind<Kind extends string> = `kind ${'is' | 'is not'} ${Kind}`
41
+
42
+ export type WhereEq<Types extends AnyTypes> =
43
+ | ViewPredicate.WhereTag<Types['Tag']>
44
+ | ViewPredicate.WhereKind<Types['ElementKind']>
45
+
46
+ export type WhereOperator<Types extends AnyTypes> = ViewPredicate.WhereEq<Types> | {
47
+ and: NonEmptyArray<ViewPredicate.WhereOperator<Types>>
48
+ or?: never
49
+ not?: never
50
+ } | {
51
+ or: NonEmptyArray<ViewPredicate.WhereOperator<Types>>
52
+ and?: never
53
+ not?: never
54
+ } | {
55
+ not: ViewPredicate.WhereOperator<Types>
56
+ and?: never
57
+ or?: never
58
+ }
59
+
60
+ export type Custom<Types extends AnyTypes> = {
61
+ where?: ViewPredicate.WhereOperator<Types>
62
+ with?: Simplify<
63
+ Omit<CustomElementExpr['custom'] & CustomRelationExpr['customRelation'], 'expr' | 'relation' | 'navigateTo'> & {
64
+ navigateTo?: Types['ViewId']
65
+ }
66
+ >
67
+ }
68
+ }
69
+
70
+ export type ViewRuleBuilderOp<Types extends AnyTypes> = (b: ViewBuilder<Types>) => ViewBuilder<Types>
71
+
72
+ export interface AddViewHelper<Props = unknown> {
73
+ // <
74
+ // const Id extends string,
75
+ // T extends AnyTypes
76
+ // >(
77
+ // id: Id
78
+ // ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
79
+
80
+ <
81
+ const Id extends string,
82
+ T extends AnyTypes
83
+ >(
84
+ id: Id,
85
+ builder: (b: ViewBuilder<T>) => ViewBuilder<T>
86
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
87
+
88
+ <
89
+ const Id extends string,
90
+ T extends AnyTypes
91
+ >(
92
+ id: Id,
93
+ propsOrTitle: Props | string
94
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
95
+
96
+ <
97
+ const Id extends string,
98
+ T extends AnyTypes
99
+ >(
100
+ id: Id,
101
+ propsOrTitle: Props | string | undefined,
102
+ builder: (b: ViewBuilder<T>) => ViewBuilder<T>
103
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
104
+ }
105
+
106
+ export interface AddViewOfHelper<Props = unknown> {
107
+ <
108
+ const Id extends string,
109
+ T extends AnyTypes,
110
+ Of extends string & T['Fqn']
111
+ >(
112
+ id: Id,
113
+ of: Of
114
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
115
+
116
+ <
117
+ const Id extends string,
118
+ T extends AnyTypes,
119
+ Of extends string & T['Fqn']
120
+ >(
121
+ id: Id,
122
+ of: Of,
123
+ builder: (b: ViewBuilder<T>) => ViewBuilder<T>
124
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
125
+
126
+ <
127
+ const Id extends string,
128
+ T extends AnyTypes,
129
+ Of extends string & T['Fqn']
130
+ >(
131
+ id: Id,
132
+ of: Of,
133
+ propsOrTitle: Props | string
134
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
135
+
136
+ <
137
+ const Id extends string,
138
+ T extends AnyTypes,
139
+ Of extends string & T['Fqn']
140
+ >(
141
+ id: Id,
142
+ of: Of,
143
+ propsOrTitle: Props | string | undefined,
144
+ builder: (b: ViewBuilder<T>) => ViewBuilder<T>
145
+ ): (builder: Builder<T>) => Builder<Types.AddView<T, Id>>
146
+ }
147
+
148
+ // To hook types
149
+ type TypedC4Expression<Types extends AnyTypes> = Tagged<C4Expression, 'typed', Types>
150
+
151
+ function parseWhere(where: ViewPredicate.WhereOperator<AnyTypes>): WhereOperator<any, any> {
152
+ if (isString(where)) {
153
+ const op = where as LiteralUnion<ViewPredicate.WhereEq<AnyTypes>, string>
154
+ switch (true) {
155
+ case op.startsWith('tag is not #'):
156
+ return {
157
+ tag: {
158
+ neq: op.replace('tag is not #', '')
159
+ }
160
+ }
161
+ case op.startsWith('tag is #'):
162
+ return {
163
+ tag: {
164
+ eq: op.replace('tag is #', '')
165
+ }
166
+ }
167
+ case op.startsWith('kind is not '):
168
+ return {
169
+ kind: {
170
+ neq: op.replace('kind is not ', '')
171
+ }
172
+ }
173
+ case op.startsWith('kind is '):
174
+ return {
175
+ kind: {
176
+ eq: op.replace('kind is ', '')
177
+ }
178
+ }
179
+ default:
180
+ throw new Error(`Unknown where operator: ${where}`)
181
+ }
182
+ }
183
+
184
+ if (where.and) {
185
+ return {
186
+ and: map(where.and, parseWhere)
187
+ }
188
+ }
189
+ if (where.or) {
190
+ return {
191
+ or: map(where.or, parseWhere)
192
+ }
193
+ }
194
+ if (where.not) {
195
+ return {
196
+ not: parseWhere(where.not)
197
+ }
198
+ }
199
+
200
+ throw new Error(`Unknown where operator: ${where}`)
201
+ }
202
+
203
+ function $include<Types extends AnyTypes>(
204
+ ...args:
205
+ | [ViewPredicate.Expression<Types>]
206
+ | [TypedC4Expression<Types>]
207
+ | [ViewPredicate.Expression<Types>, ViewPredicate.Custom<Types>]
208
+ ): (b: ViewBuilder<Types>) => ViewBuilder<Types> {
209
+ return (b) => {
210
+ let expr = $expr(args[0]) as C4Expression
211
+ const isElement = isElementPredicateExpr(expr)
212
+ if (args.length === 2) {
213
+ const condition = args[1].where ? parseWhere(args[1].where) : undefined
214
+ if (condition) {
215
+ expr = {
216
+ where: {
217
+ expr: expr as any,
218
+ condition
219
+ }
220
+ }
221
+ }
222
+
223
+ const custom = args[1].with
224
+ if (custom) {
225
+ if (isElement) {
226
+ expr = {
227
+ custom: {
228
+ ...custom,
229
+ expr: expr as any
230
+ }
231
+ }
232
+ } else {
233
+ expr = {
234
+ customRelation: {
235
+ ...custom,
236
+ relation: expr as any
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ b.include(expr)
243
+ return b
244
+ }
245
+ }
246
+
247
+ function $exclude<Types extends AnyTypes>(
248
+ ...args:
249
+ | [ViewPredicate.Expression<Types>]
250
+ | [TypedC4Expression<Types>]
251
+ | [ViewPredicate.Expression<Types>, ViewPredicate.Custom<Types>]
252
+ ): (b: ViewBuilder<Types>) => ViewBuilder<Types> {
253
+ return (b) => {
254
+ let expr = $expr(args[0]) as C4Expression
255
+ if (args.length === 2 && args[1].where) {
256
+ const condition = parseWhere(args[1].where)
257
+ expr = {
258
+ where: {
259
+ expr: expr as any,
260
+ condition
261
+ }
262
+ }
263
+ }
264
+ b.exclude(expr)
265
+ return b
266
+ }
267
+ }
268
+
269
+ function $expr<Types extends AnyTypes>(expr: ViewPredicate.Expression<Types> | C4Expression): TypedC4Expression<Types> {
270
+ if (!isString(expr)) {
271
+ return expr as TypedC4Expression<Types>
272
+ }
273
+ if (expr === '*') {
274
+ return { wildcard: true } as TypedC4Expression<Types>
275
+ }
276
+ if (expr.startsWith('->')) {
277
+ if (expr.endsWith('->')) {
278
+ return {
279
+ inout: $expr(expr.replace(/->/g, '').trim()) as any
280
+ } as TypedC4Expression<Types>
281
+ }
282
+ return {
283
+ incoming: $expr(expr.replace('-> ', '')) as any
284
+ } as TypedC4Expression<Types>
285
+ }
286
+ if (expr.endsWith(' ->')) {
287
+ return {
288
+ outgoing: $expr(expr.replace(' ->', '')) as any
289
+ } as TypedC4Expression<Types>
290
+ }
291
+ if (expr.includes(' <-> ')) {
292
+ const [source, target] = expr.split(' <-> ')
293
+ return {
294
+ source: $expr(source) as any,
295
+ target: $expr(target) as any,
296
+ isBidirectional: true
297
+ } as TypedC4Expression<Types>
298
+ }
299
+ if (expr.includes(' -> ')) {
300
+ const [source, target] = expr.split(' -> ')
301
+ return {
302
+ source: $expr(source) as any,
303
+ target: $expr(target) as any
304
+ } as TypedC4Expression<Types>
305
+ }
306
+ if (expr.endsWith('._')) {
307
+ return {
308
+ expanded: expr.replace('._', '') as Fqn
309
+ } as TypedC4Expression<Types>
310
+ }
311
+ if (expr.endsWith('.*')) {
312
+ return {
313
+ element: expr.replace('.*', '') as Fqn,
314
+ isDescedants: true
315
+ } as TypedC4Expression<Types>
316
+ }
317
+ return {
318
+ element: expr as any as Fqn,
319
+ isDescedants: false
320
+ } as TypedC4Expression<Types>
321
+ }
322
+
323
+ function $style<Types extends AnyTypes>(
324
+ element: ViewPredicate.ElementExpr<Types['Fqn']> | NonEmptyArray<ViewPredicate.ElementExpr<Types['Fqn']>>,
325
+ { notation, ...style }: ViewRuleStyle['style'] & { notation?: string }
326
+ ): (b: ViewBuilder<Types>) => ViewBuilder<Types> {
327
+ return (b) =>
328
+ b.style({
329
+ targets: (isArray(element) ? element : [element]).map(e => $expr(e) as C4ElementExpression),
330
+ ...notation ? { notation } : {},
331
+ style: {
332
+ ...style
333
+ }
334
+ })
335
+ }
336
+
337
+ function $autoLayout<Types extends AnyTypes>(
338
+ layout: AutoLayoutDirection
339
+ ): (b: ViewBuilder<Types>) => ViewBuilder<Types> {
340
+ return (b) => b.autoLayout(layout)
341
+ }
342
+
343
+ function $rules<T extends AnyTypes>(...rules: ViewRuleBuilderOp<T>[]): (b: ViewBuilder<T>) => ViewBuilder<T> {
344
+ return (b) => rules.reduce((b, rule) => rule(b), b)
345
+ }
346
+
347
+ export { $autoLayout, $exclude, $expr, $include, $rules, $style }
348
+
349
+ export type ViewHelpers<T = unknown> = {
350
+ views: typeof views
351
+ view: AddViewHelper<T>
352
+ viewOf: AddViewOfHelper<T>
353
+ $include: typeof $include
354
+ $exclude: typeof $exclude
355
+ $style: typeof $style
356
+ $rules: typeof $rules
357
+ $autoLayout: typeof $autoLayout
358
+ }
@@ -0,0 +1,318 @@
1
+ import type { LikeC4View } from '../types'
2
+ import type { AnyTypes } from './_types'
3
+ import type { Builder } from './Builder'
4
+
5
+ export interface ViewsBuilder<T extends AnyTypes> {
6
+ addView(view: LikeC4View): Builder<T>
7
+ }
8
+
9
+ export function views<
10
+ A extends AnyTypes,
11
+ B extends AnyTypes
12
+ >(
13
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>
14
+ ): (input: Builder<A>) => Builder<B>
15
+ export function views<
16
+ A extends AnyTypes,
17
+ B extends AnyTypes,
18
+ C extends AnyTypes
19
+ >(
20
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
21
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>
22
+ ): (input: Builder<A>) => Builder<C>
23
+ export function views<
24
+ A extends AnyTypes,
25
+ B extends AnyTypes,
26
+ C extends AnyTypes,
27
+ D extends AnyTypes
28
+ >(
29
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
30
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
31
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>
32
+ ): (input: Builder<A>) => Builder<D>
33
+ export function views<
34
+ A extends AnyTypes,
35
+ B extends AnyTypes,
36
+ C extends AnyTypes,
37
+ D extends AnyTypes,
38
+ E extends AnyTypes
39
+ >(
40
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
41
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
42
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
43
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>
44
+ ): (input: Builder<A>) => Builder<E>
45
+ export function views<
46
+ A extends AnyTypes,
47
+ B extends AnyTypes,
48
+ C extends AnyTypes,
49
+ D extends AnyTypes,
50
+ E extends AnyTypes,
51
+ F extends AnyTypes
52
+ >(
53
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
54
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
55
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
56
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
57
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>
58
+ ): (input: Builder<A>) => Builder<F>
59
+ export function views<
60
+ A extends AnyTypes,
61
+ B extends AnyTypes,
62
+ C extends AnyTypes,
63
+ D extends AnyTypes,
64
+ E extends AnyTypes,
65
+ F extends AnyTypes,
66
+ G extends AnyTypes
67
+ >(
68
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
69
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
70
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
71
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
72
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
73
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>
74
+ ): (input: Builder<A>) => Builder<G>
75
+ export function views<
76
+ A extends AnyTypes,
77
+ B extends AnyTypes,
78
+ C extends AnyTypes,
79
+ D extends AnyTypes,
80
+ E extends AnyTypes,
81
+ F extends AnyTypes,
82
+ G extends AnyTypes,
83
+ H extends AnyTypes
84
+ >(
85
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
86
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
87
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
88
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
89
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
90
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
91
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>
92
+ ): (input: Builder<A>) => Builder<H>
93
+ export function views<
94
+ A extends AnyTypes,
95
+ B extends AnyTypes,
96
+ C extends AnyTypes,
97
+ D extends AnyTypes,
98
+ E extends AnyTypes,
99
+ F extends AnyTypes,
100
+ G extends AnyTypes,
101
+ H extends AnyTypes,
102
+ I extends AnyTypes
103
+ >(
104
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
105
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
106
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
107
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
108
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
109
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
110
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
111
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>
112
+ ): (input: Builder<A>) => Builder<I>
113
+ export function views<
114
+ A extends AnyTypes,
115
+ B extends AnyTypes,
116
+ C extends AnyTypes,
117
+ D extends AnyTypes,
118
+ E extends AnyTypes,
119
+ F extends AnyTypes,
120
+ G extends AnyTypes,
121
+ H extends AnyTypes,
122
+ I extends AnyTypes,
123
+ J extends AnyTypes
124
+ >(
125
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
126
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
127
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
128
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
129
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
130
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
131
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
132
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
133
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>
134
+ ): (input: Builder<A>) => Builder<J>
135
+ export function views<
136
+ A extends AnyTypes,
137
+ B extends AnyTypes,
138
+ C extends AnyTypes,
139
+ D extends AnyTypes,
140
+ E extends AnyTypes,
141
+ F extends AnyTypes,
142
+ G extends AnyTypes,
143
+ H extends AnyTypes,
144
+ I extends AnyTypes,
145
+ J extends AnyTypes,
146
+ K extends AnyTypes
147
+ >(
148
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
149
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
150
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
151
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
152
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
153
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
154
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
155
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
156
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
157
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>
158
+ ): (input: Builder<A>) => Builder<K>
159
+ export function views<
160
+ A extends AnyTypes,
161
+ B extends AnyTypes,
162
+ C extends AnyTypes,
163
+ D extends AnyTypes,
164
+ E extends AnyTypes,
165
+ F extends AnyTypes,
166
+ G extends AnyTypes,
167
+ H extends AnyTypes,
168
+ I extends AnyTypes,
169
+ J extends AnyTypes,
170
+ K extends AnyTypes,
171
+ L extends AnyTypes
172
+ >(
173
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
174
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
175
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
176
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
177
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
178
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
179
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
180
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
181
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
182
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>,
183
+ op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>
184
+ ): (input: Builder<A>) => Builder<L>
185
+ export function views<
186
+ A extends AnyTypes,
187
+ B extends AnyTypes,
188
+ C extends AnyTypes,
189
+ D extends AnyTypes,
190
+ E extends AnyTypes,
191
+ F extends AnyTypes,
192
+ G extends AnyTypes,
193
+ H extends AnyTypes,
194
+ I extends AnyTypes,
195
+ J extends AnyTypes,
196
+ K extends AnyTypes,
197
+ L extends AnyTypes,
198
+ M extends AnyTypes
199
+ >(
200
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
201
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
202
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
203
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
204
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
205
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
206
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
207
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
208
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
209
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>,
210
+ op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>,
211
+ op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>
212
+ ): (input: Builder<A>) => Builder<M>
213
+ export function views<
214
+ A extends AnyTypes,
215
+ B extends AnyTypes,
216
+ C extends AnyTypes,
217
+ D extends AnyTypes,
218
+ E extends AnyTypes,
219
+ F extends AnyTypes,
220
+ G extends AnyTypes,
221
+ H extends AnyTypes,
222
+ I extends AnyTypes,
223
+ J extends AnyTypes,
224
+ K extends AnyTypes,
225
+ L extends AnyTypes,
226
+ M extends AnyTypes,
227
+ N extends AnyTypes
228
+ >(
229
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
230
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
231
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
232
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
233
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
234
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
235
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
236
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
237
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
238
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>,
239
+ op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>,
240
+ op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>,
241
+ op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>
242
+ ): (input: Builder<A>) => Builder<N>
243
+ export function views<
244
+ A extends AnyTypes,
245
+ B extends AnyTypes,
246
+ C extends AnyTypes,
247
+ D extends AnyTypes,
248
+ E extends AnyTypes,
249
+ F extends AnyTypes,
250
+ G extends AnyTypes,
251
+ H extends AnyTypes,
252
+ I extends AnyTypes,
253
+ J extends AnyTypes,
254
+ K extends AnyTypes,
255
+ L extends AnyTypes,
256
+ M extends AnyTypes,
257
+ N extends AnyTypes,
258
+ O extends AnyTypes
259
+ >(
260
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
261
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
262
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
263
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
264
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
265
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
266
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
267
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
268
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
269
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>,
270
+ op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>,
271
+ op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>,
272
+ op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>,
273
+ op14: (input: ViewsBuilder<N>) => ViewsBuilder<O>
274
+ ): (input: Builder<A>) => Builder<O>
275
+ export function views<
276
+ A extends AnyTypes,
277
+ B extends AnyTypes,
278
+ C extends AnyTypes,
279
+ D extends AnyTypes,
280
+ E extends AnyTypes,
281
+ F extends AnyTypes,
282
+ G extends AnyTypes,
283
+ H extends AnyTypes,
284
+ I extends AnyTypes,
285
+ J extends AnyTypes,
286
+ K extends AnyTypes,
287
+ L extends AnyTypes,
288
+ M extends AnyTypes,
289
+ N extends AnyTypes,
290
+ O extends AnyTypes,
291
+ P extends AnyTypes
292
+ >(
293
+ op1: (input: ViewsBuilder<A>) => ViewsBuilder<B>,
294
+ op2: (input: ViewsBuilder<B>) => ViewsBuilder<C>,
295
+ op3: (input: ViewsBuilder<C>) => ViewsBuilder<D>,
296
+ op4: (input: ViewsBuilder<D>) => ViewsBuilder<E>,
297
+ op5: (input: ViewsBuilder<E>) => ViewsBuilder<F>,
298
+ op6: (input: ViewsBuilder<F>) => ViewsBuilder<G>,
299
+ op7: (input: ViewsBuilder<G>) => ViewsBuilder<H>,
300
+ op8: (input: ViewsBuilder<H>) => ViewsBuilder<I>,
301
+ op9: (input: ViewsBuilder<I>) => ViewsBuilder<J>,
302
+ op10: (input: ViewsBuilder<J>) => ViewsBuilder<K>,
303
+ op11: (input: ViewsBuilder<K>) => ViewsBuilder<L>,
304
+ op12: (input: ViewsBuilder<L>) => ViewsBuilder<M>,
305
+ op13: (input: ViewsBuilder<M>) => ViewsBuilder<N>,
306
+ op14: (input: ViewsBuilder<N>) => ViewsBuilder<O>,
307
+ op15: (input: ViewsBuilder<O>) => ViewsBuilder<P>
308
+ ): (input: Builder<A>) => Builder<P>
309
+
310
+ export function views(...ops: any[]) {
311
+ return (input: Builder<any>) => {
312
+ let builder = input
313
+ for (const op of ops) {
314
+ builder = op(builder)
315
+ }
316
+ return builder
317
+ }
318
+ }