@interactors/core 0.4.0 → 1.0.0-effection.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 (121) hide show
  1. package/dist/cjs/constructor.js +55 -126
  2. package/dist/cjs/constructor.js.map +1 -1
  3. package/dist/cjs/converge.js +3 -5
  4. package/dist/cjs/converge.js.map +1 -1
  5. package/dist/cjs/format.js +50 -0
  6. package/dist/cjs/format.js.map +1 -0
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/inspector.js +2 -1
  9. package/dist/cjs/inspector.js.map +1 -1
  10. package/dist/cjs/interaction.js +54 -35
  11. package/dist/cjs/interaction.js.map +1 -1
  12. package/dist/cjs/match.js +17 -7
  13. package/dist/cjs/match.js.map +1 -1
  14. package/dist/cjs/matcher.js +13 -1
  15. package/dist/cjs/matcher.js.map +1 -1
  16. package/dist/cjs/matchers/and.js +3 -0
  17. package/dist/cjs/matchers/and.js.map +1 -1
  18. package/dist/cjs/matchers/every.js +3 -0
  19. package/dist/cjs/matchers/every.js.map +1 -1
  20. package/dist/cjs/matchers/including.js +4 -0
  21. package/dist/cjs/matchers/including.js.map +1 -1
  22. package/dist/cjs/matchers/matching.js +4 -0
  23. package/dist/cjs/matchers/matching.js.map +1 -1
  24. package/dist/cjs/matchers/not.js +3 -0
  25. package/dist/cjs/matchers/not.js.map +1 -1
  26. package/dist/cjs/matchers/or.js +3 -0
  27. package/dist/cjs/matchers/or.js.map +1 -1
  28. package/dist/cjs/matchers/some.js +3 -0
  29. package/dist/cjs/matchers/some.js.map +1 -1
  30. package/dist/cjs/resolvers.js +98 -0
  31. package/dist/cjs/resolvers.js.map +1 -0
  32. package/dist/cjs/serialize.js +48 -0
  33. package/dist/cjs/serialize.js.map +1 -0
  34. package/dist/constructor.d.ts +2 -8
  35. package/dist/constructor.d.ts.map +1 -1
  36. package/dist/converge.d.ts +2 -1
  37. package/dist/converge.d.ts.map +1 -1
  38. package/dist/esm/constructor.js +52 -117
  39. package/dist/esm/constructor.js.map +1 -1
  40. package/dist/esm/converge.js +3 -5
  41. package/dist/esm/converge.js.map +1 -1
  42. package/dist/esm/{format-table.js → format.js} +19 -1
  43. package/dist/esm/format.js.map +1 -0
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/inspector.js +2 -1
  46. package/dist/esm/inspector.js.map +1 -1
  47. package/dist/esm/interaction.js +51 -29
  48. package/dist/esm/interaction.js.map +1 -1
  49. package/dist/esm/match.js +17 -7
  50. package/dist/esm/match.js.map +1 -1
  51. package/dist/esm/matcher.js +11 -0
  52. package/dist/esm/matcher.js.map +1 -1
  53. package/dist/esm/matchers/and.js +4 -1
  54. package/dist/esm/matchers/and.js.map +1 -1
  55. package/dist/esm/matchers/every.js +4 -1
  56. package/dist/esm/matchers/every.js.map +1 -1
  57. package/dist/esm/matchers/including.js +4 -0
  58. package/dist/esm/matchers/including.js.map +1 -1
  59. package/dist/esm/matchers/matching.js +4 -0
  60. package/dist/esm/matchers/matching.js.map +1 -1
  61. package/dist/esm/matchers/not.js +4 -1
  62. package/dist/esm/matchers/not.js.map +1 -1
  63. package/dist/esm/matchers/or.js +4 -1
  64. package/dist/esm/matchers/or.js.map +1 -1
  65. package/dist/esm/matchers/some.js +4 -1
  66. package/dist/esm/matchers/some.js.map +1 -1
  67. package/dist/esm/resolvers.js +88 -0
  68. package/dist/esm/resolvers.js.map +1 -0
  69. package/dist/esm/serialize.js +43 -0
  70. package/dist/esm/serialize.js.map +1 -0
  71. package/dist/format.d.ts +10 -0
  72. package/dist/format.d.ts.map +1 -0
  73. package/dist/index.d.ts +4 -2
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/inspector.d.ts.map +1 -1
  76. package/dist/interaction.d.ts +38 -10
  77. package/dist/interaction.d.ts.map +1 -1
  78. package/dist/match.d.ts +5 -5
  79. package/dist/match.d.ts.map +1 -1
  80. package/dist/matcher.d.ts +2 -0
  81. package/dist/matcher.d.ts.map +1 -1
  82. package/dist/matchers/and.d.ts.map +1 -1
  83. package/dist/matchers/every.d.ts.map +1 -1
  84. package/dist/matchers/including.d.ts.map +1 -1
  85. package/dist/matchers/matching.d.ts.map +1 -1
  86. package/dist/matchers/not.d.ts.map +1 -1
  87. package/dist/matchers/or.d.ts.map +1 -1
  88. package/dist/matchers/some.d.ts.map +1 -1
  89. package/dist/resolvers.d.ts +9 -0
  90. package/dist/resolvers.d.ts.map +1 -0
  91. package/dist/serialize.d.ts +13 -0
  92. package/dist/serialize.d.ts.map +1 -0
  93. package/dist/specification.d.ts +19 -17
  94. package/dist/specification.d.ts.map +1 -1
  95. package/dist/tsconfig.build.tsbuildinfo +1 -1
  96. package/package.json +3 -2
  97. package/src/constructor.ts +63 -138
  98. package/src/converge.ts +3 -6
  99. package/src/format.ts +58 -0
  100. package/src/index.ts +4 -2
  101. package/src/inspector.ts +2 -1
  102. package/src/interaction.ts +96 -36
  103. package/src/match.ts +23 -15
  104. package/src/matcher.ts +11 -0
  105. package/src/matchers/and.ts +4 -1
  106. package/src/matchers/every.ts +4 -1
  107. package/src/matchers/including.ts +4 -1
  108. package/src/matchers/matching.ts +4 -1
  109. package/src/matchers/not.ts +4 -1
  110. package/src/matchers/or.ts +4 -1
  111. package/src/matchers/some.ts +4 -1
  112. package/src/resolvers.ts +100 -0
  113. package/src/serialize.ts +54 -0
  114. package/src/specification.ts +21 -19
  115. package/CHANGELOG.md +0 -27
  116. package/dist/cjs/format-table.js +0 -30
  117. package/dist/cjs/format-table.js.map +0 -1
  118. package/dist/esm/format-table.js.map +0 -1
  119. package/dist/format-table.d.ts +0 -6
  120. package/dist/format-table.d.ts.map +0 -1
  121. package/src/format-table.ts +0 -34
@@ -1,8 +1,9 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
 
3
+ import { Operation } from '@effection/core';
3
4
  import { FilterSet } from './filter-set';
4
5
  import { Locator } from './locator';
5
- import { Interaction, ReadonlyInteraction } from './interaction';
6
+ import { ActionInteraction, AssertionInteraction } from './interaction';
6
7
  import { MergeObjects } from './merge-objects';
7
8
  import { MaybeMatcher } from './matcher';
8
9
 
@@ -38,7 +39,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
38
39
  * await Link('Next').perform((e) => e.click());
39
40
  * ```
40
41
  */
41
- perform(fn: (element: E) => void): Interaction<void>;
42
+ perform(fn: (element: E) => void): ActionInteraction<E, void>;
42
43
 
43
44
  /**
44
45
  * Perform a one-off assertion on the given interactor. Takes a function which
@@ -54,7 +55,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
54
55
  * await Link('Next').assert((e) => assert(e.tagName === 'A'));
55
56
  * ```
56
57
  */
57
- assert(fn: (element: E) => void): ReadonlyInteraction<void>;
58
+ assert(fn: (element: E) => void): AssertionInteraction<E, void>;
58
59
 
59
60
  /**
60
61
  * An assertion which checks that an element matching the interactor exists.
@@ -66,7 +67,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
66
67
  * await Link('Next').exists();
67
68
  * ```
68
69
  */
69
- exists(): ReadonlyInteraction<void> & FilterObject<boolean, Element>;
70
+ exists(): AssertionInteraction<E, void> & FilterObject<boolean, Element>;
70
71
 
71
72
  /**
72
73
  * An assertion which checks that an element matching the interactor does not
@@ -78,7 +79,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
78
79
  * await Link('Next').absent();
79
80
  * ```
80
81
  */
81
- absent(): ReadonlyInteraction<void> & FilterObject<boolean, Element>;
82
+ absent(): AssertionInteraction<E, void> & FilterObject<boolean, Element>;
82
83
 
83
84
  /**
84
85
  * Checks that there is one element matching the interactor, and that this
@@ -91,7 +92,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
91
92
  * await Link('Home').has({ href: '/' })
92
93
  * ```
93
94
  */
94
- has(filters: F): ReadonlyInteraction<void>;
95
+ has(filters: F): AssertionInteraction<E, void>;
95
96
 
96
97
  /**
97
98
  * Identical to {@link has}, but reads better with some filters.
@@ -102,7 +103,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
102
103
  * await CheckBox('Accept conditions').is({ checked: true })
103
104
  * ```
104
105
  */
105
- is(filters: F): ReadonlyInteraction<void>;
106
+ is(filters: F): AssertionInteraction<E, void>;
106
107
 
107
108
  /**
108
109
  * Returns a copy of the given interactor which is scoped to this interactor.
@@ -128,7 +129,7 @@ export interface Interactor<E extends Element, F extends FilterParams<any, any>>
128
129
  apply: FilterFn<string, Element>;
129
130
  }
130
131
 
131
- export type ActionFn<E extends Element> = (interactor: Interactor<E, EmptyObject>, ...args: any[]) => Promise<unknown>;
132
+ export type ActionFn<E extends Element, I extends Interactor<E, any>> = (interactor: I, ...args: any[]) => Operation<unknown>;
132
133
 
133
134
  export type FilterFn<T, E extends Element> = (element: E) => T;
134
135
 
@@ -141,11 +142,11 @@ export type FilterDefinition<T, E extends Element> = FilterFn<T, E> | FilterObje
141
142
 
142
143
  export type Filters<E extends Element> = Record<string, FilterDefinition<unknown, E>>;
143
144
 
144
- export type Actions<E extends Element> = Record<string, ActionFn<E>>;
145
+ export type Actions<E extends Element, I extends Interactor<E, any>> = Record<string, ActionFn<E, I>>;
145
146
 
146
147
  export type SelectorFn<E extends Element> = (parentElement: Element) => E[];
147
148
 
148
- export type InteractorSpecification<E extends Element, F extends Filters<E>, A extends Actions<E>> = {
149
+ export type InteractorSpecification<E extends Element, F extends Filters<E>, A extends Actions<E, Interactor<E, EmptyObject>>> = {
149
150
  /**
150
151
  * The CSS selector that this interactor uses to find matching elements
151
152
  */
@@ -161,16 +162,16 @@ export type InteractorSpecification<E extends Element, F extends Filters<E>, A e
161
162
  locator?: FilterDefinition<string, E>;
162
163
  }
163
164
 
164
- export type ActionMethods<E extends Element, A extends Actions<E>> = {
165
- [P in keyof A]: A[P] extends ((interactor: Interactor<E, EmptyObject>, ...args: infer TArgs) => Promise<infer TReturn>)
166
- ? ((...args: TArgs) => Interaction<TReturn>)
165
+ export type ActionMethods<E extends Element, A extends Actions<E, I>, I extends Interactor<E, any>> = {
166
+ [P in keyof A]: A[P] extends ((interactor: I, ...args: infer TArgs) => Operation<infer TReturn>)
167
+ ? ((...args: TArgs) => ActionInteraction<E, TReturn>)
167
168
  : never;
168
169
  }
169
170
 
170
171
  export type FilterMethods<E extends Element, F extends Filters<E>> = {
171
172
  [P in keyof F]:
172
- F[P] extends FilterFn<infer TReturn, any> ? (() => Interaction<TReturn> & FilterObject<TReturn, Element>) :
173
- F[P] extends FilterObject<infer TReturn, any> ? (() => Interaction<TReturn> & FilterObject<TReturn, Element>) :
173
+ F[P] extends FilterFn<infer TReturn, any> ? (() => AssertionInteraction<E, TReturn> & FilterObject<TReturn, Element>) :
174
+ F[P] extends FilterObject<infer TReturn, any> ? (() => AssertionInteraction<E, TReturn> & FilterObject<TReturn, Element>) :
174
175
  never;
175
176
  }
176
177
 
@@ -197,11 +198,11 @@ export type FilterParams<E extends Element, F extends Filters<E>> = keyof F exte
197
198
  * @typeParam F the filters of this interactor, this is usually inferred from the specification
198
199
  * @typeParam A the actions of this interactor, this is usually inferred from the specification
199
200
  */
200
- export interface InteractorConstructor<E extends Element, FP extends FilterParams<any, any>, FM extends FilterMethods<any, any>, AM extends ActionMethods<any, any>> {
201
+ export interface InteractorConstructor<E extends Element, FP extends FilterParams<any, any>, FM extends FilterMethods<any, any>, AM extends ActionMethods<any, any, any>> {
201
202
  selector(value: string | SelectorFn<E>): InteractorConstructor<E, FP, FM, AM>;
202
203
  locator(value: FilterDefinition<string, E>): InteractorConstructor<E, FP, FM, AM>;
203
204
  filters<FR extends Filters<E>>(filters: FR): InteractorConstructor<E, MergeObjects<FP, FilterParams<E, FR>>, MergeObjects<FM, FilterMethods<E, FR>>, AM>;
204
- actions<AR extends Actions<E>>(actions: AR): InteractorConstructor<E, FP, FM, MergeObjects<AM, ActionMethods<E, AR>>>;
205
+ actions<I extends Interactor<E, FP> & FM & AM, AR extends Actions<E, I>>(actions: AR): InteractorConstructor<E, FP, FM, MergeObjects<AM, ActionMethods<E, AR, I>>>;
205
206
  extend<ER extends E = E>(name: string): InteractorConstructor<ER, FP, FM, AM>;
206
207
 
207
208
  /**
@@ -225,6 +226,7 @@ export interface InteractorConstructor<E extends Element, FP extends FilterParam
225
226
  *
226
227
  * ``` typescript
227
228
  * Link('Home');
229
+ * Link(/^home/i);
228
230
  * ```
229
231
  *
230
232
  * Or with a locator and options:
@@ -236,10 +238,10 @@ export interface InteractorConstructor<E extends Element, FP extends FilterParam
236
238
  * @param value The locator value, which should match the value of applying the locator function defined in the {@link InteractorSpecification} to the element.
237
239
  * @param filters An object describing a set of filters to apply, which should match the value of applying the filters defined in the {@link InteractorSpecification} to the element.
238
240
  */
239
- (value: MaybeMatcher<string>, filters?: FP): Interactor<E, FP> & FM & AM;
241
+ (value: MaybeMatcher<string> | RegExp, filters?: FP): Interactor<E, FP> & FM & AM;
240
242
  }
241
243
 
242
- export type InteractorOptions<E extends Element, F extends Filters<E>, A extends Actions<E>> = {
244
+ export type InteractorOptions<E extends Element, F extends Filters<E>, A extends Actions<E, Interactor<E, EmptyObject>>> = {
243
245
  name: string;
244
246
  specification: InteractorSpecification<E, F, A>;
245
247
  locator?: Locator<E>;
package/CHANGELOG.md DELETED
@@ -1,27 +0,0 @@
1
- # @interactors/core
2
-
3
- ## 0.4.0
4
-
5
- ### Minor Changes
6
-
7
- - 76215cc: Remove deprecated functionality
8
-
9
- ### Patch Changes
10
-
11
- - f06c7fe: simplify interactor instatiate function
12
- - 960da4e: Remove the ExistsAssertionsImplementation since it is no longer necessary
13
- - Updated dependencies [891af02]
14
- - @interactors/globals@0.2.0
15
-
16
- ## 0.3.0
17
-
18
- ### Minor Changes
19
-
20
- - 53dea63: Enable delegation to locator of an interactor if no filter given
21
-
22
- ## 0.2.0
23
-
24
- ### Minor Changes
25
-
26
- - 0c96dab: Add locator delegation. Locators can be delegated to another delegator.
27
- - f4949ac: Selector can be a function to return arbitrary elements
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatTable = void 0;
4
- const MAX_COLUMN_WIDTH = 40;
5
- function formatValue(value, width) {
6
- if (value.length > width) {
7
- return value.slice(0, width - 1) + '…';
8
- }
9
- else {
10
- return value.padEnd(width);
11
- }
12
- }
13
- function formatTable(options) {
14
- let columnWidths = options.headers.map((h, index) => {
15
- return Math.min(MAX_COLUMN_WIDTH, Math.max(h.length, ...options.rows.map((r) => r[index].length)));
16
- });
17
- let formatRow = (cells) => {
18
- return '┃ ' + cells.map((c, index) => formatValue(c, columnWidths[index])).join(' ┃ ') + ' ┃';
19
- };
20
- let spacerRow = () => {
21
- return '┣━' + columnWidths.map((w) => "━".repeat(w)).join('━╋━') + '━┫';
22
- };
23
- return [
24
- formatRow(options.headers),
25
- spacerRow(),
26
- ...options.rows.map((row) => formatRow(row))
27
- ].join('\n');
28
- }
29
- exports.formatTable = formatTable;
30
- //# sourceMappingURL=format-table.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-table.js","sourceRoot":"","sources":["../../src/format-table.ts"],"names":[],"mappings":";;;AAKA,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,IAAG,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE;QACvB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACxC;SAAM;QACL,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5B;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,OAAqB;IAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,KAAe,EAAE,EAAE;QAClC,OAAO,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAChG,CAAC,CAAA;IAED,IAAI,SAAS,GAAG,GAAG,EAAE;QACnB,OAAO,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1E,CAAC,CAAA;IAED,OAAO;QACL,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1B,SAAS,EAAE;QACX,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAlBD,kCAkBC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-table.js","sourceRoot":"","sources":["../../src/format-table.ts"],"names":[],"mappings":"AAKA,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,IAAG,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE;QACvB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACxC;SAAM;QACL,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5B;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,KAAe,EAAE,EAAE;QAClC,OAAO,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAChG,CAAC,CAAA;IAED,IAAI,SAAS,GAAG,GAAG,EAAE;QACnB,OAAO,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1E,CAAC,CAAA;IAED,OAAO;QACL,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1B,SAAS,EAAE;QACX,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1,6 +0,0 @@
1
- export interface TableOptions {
2
- headers: string[];
3
- rows: string[][];
4
- }
5
- export declare function formatTable(options: TableOptions): string;
6
- //# sourceMappingURL=format-table.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-table.d.ts","sourceRoot":"","sources":["../src/format-table.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CAClB;AAYD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAkBzD"}
@@ -1,34 +0,0 @@
1
- export interface TableOptions {
2
- headers: string[];
3
- rows: string[][];
4
- }
5
-
6
- const MAX_COLUMN_WIDTH = 40
7
-
8
- function formatValue(value: string, width: number) {
9
- if(value.length > width) {
10
- return value.slice(0, width - 1) + '…';
11
- } else {
12
- return value.padEnd(width);
13
- }
14
- }
15
-
16
- export function formatTable(options: TableOptions): string {
17
- let columnWidths = options.headers.map((h, index) => {
18
- return Math.min(MAX_COLUMN_WIDTH, Math.max(h.length, ...options.rows.map((r) => r[index].length)));
19
- });
20
-
21
- let formatRow = (cells: string[]) => {
22
- return '┃ ' + cells.map((c, index) => formatValue(c, columnWidths[index])).join(' ┃ ') + ' ┃';
23
- }
24
-
25
- let spacerRow = () => {
26
- return '┣━' + columnWidths.map((w) => "━".repeat(w)).join('━╋━') + '━┫';
27
- }
28
-
29
- return [
30
- formatRow(options.headers),
31
- spacerRow(),
32
- ...options.rows.map((row) => formatRow(row))
33
- ].join('\n');
34
- }