@rikalabs/effect-react 0.0.1

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/dist/actions/http.d.ts +18 -0
  4. package/dist/actions/index.d.ts +4 -0
  5. package/dist/actions/react.d.ts +7 -0
  6. package/dist/actions/service.d.ts +18 -0
  7. package/dist/actions/types.d.ts +33 -0
  8. package/dist/boundary/codecs.d.ts +40 -0
  9. package/dist/boundary/errors.d.ts +22 -0
  10. package/dist/boundary/index.d.ts +2 -0
  11. package/dist/chunk-2GIUCKL2.js +16 -0
  12. package/dist/chunk-2GIUCKL2.js.map +1 -0
  13. package/dist/chunk-2TG7YEVD.js +11 -0
  14. package/dist/chunk-2TG7YEVD.js.map +1 -0
  15. package/dist/chunk-6FI4ROTW.js +152 -0
  16. package/dist/chunk-6FI4ROTW.js.map +1 -0
  17. package/dist/chunk-C5JI7D7W.js +213 -0
  18. package/dist/chunk-C5JI7D7W.js.map +1 -0
  19. package/dist/chunk-EEYASTXR.js +99 -0
  20. package/dist/chunk-EEYASTXR.js.map +1 -0
  21. package/dist/chunk-H7MOLKTU.js +301 -0
  22. package/dist/chunk-H7MOLKTU.js.map +1 -0
  23. package/dist/chunk-IVIYY6S5.js +77 -0
  24. package/dist/chunk-IVIYY6S5.js.map +1 -0
  25. package/dist/chunk-JKN75OYC.js +87 -0
  26. package/dist/chunk-JKN75OYC.js.map +1 -0
  27. package/dist/chunk-M2CJG6T7.js +24 -0
  28. package/dist/chunk-M2CJG6T7.js.map +1 -0
  29. package/dist/chunk-MDGEGQZB.js +206 -0
  30. package/dist/chunk-MDGEGQZB.js.map +1 -0
  31. package/dist/chunk-NI2GNZ7S.js +78 -0
  32. package/dist/chunk-NI2GNZ7S.js.map +1 -0
  33. package/dist/chunk-O7XTA7H3.js +423 -0
  34. package/dist/chunk-O7XTA7H3.js.map +1 -0
  35. package/dist/chunk-S67FHWAR.js +88 -0
  36. package/dist/chunk-S67FHWAR.js.map +1 -0
  37. package/dist/chunk-SKC3HMF3.js +17 -0
  38. package/dist/chunk-SKC3HMF3.js.map +1 -0
  39. package/dist/chunk-TUJZ6XJY.js +127 -0
  40. package/dist/chunk-TUJZ6XJY.js.map +1 -0
  41. package/dist/chunk-WPV3WFMS.js +38 -0
  42. package/dist/chunk-WPV3WFMS.js.map +1 -0
  43. package/dist/chunk-XIBEKS5A.js +301 -0
  44. package/dist/chunk-XIBEKS5A.js.map +1 -0
  45. package/dist/chunk-YG22YP5K.js +68 -0
  46. package/dist/chunk-YG22YP5K.js.map +1 -0
  47. package/dist/chunk-ZMZQBREU.js +262 -0
  48. package/dist/chunk-ZMZQBREU.js.map +1 -0
  49. package/dist/client/index.cjs +191 -0
  50. package/dist/client/index.cjs.map +1 -0
  51. package/dist/client/index.d.ts +8 -0
  52. package/dist/client/index.js +14 -0
  53. package/dist/client/index.js.map +1 -0
  54. package/dist/config/index.cjs +63 -0
  55. package/dist/config/index.cjs.map +1 -0
  56. package/dist/config/index.d.ts +32 -0
  57. package/dist/config/index.js +9 -0
  58. package/dist/config/index.js.map +1 -0
  59. package/dist/data/index.d.ts +3 -0
  60. package/dist/data/react.d.ts +10 -0
  61. package/dist/data/service.d.ts +20 -0
  62. package/dist/data/types.d.ts +31 -0
  63. package/dist/devtools/events.d.ts +37 -0
  64. package/dist/devtools/index.cjs +149 -0
  65. package/dist/devtools/index.cjs.map +1 -0
  66. package/dist/devtools/index.d.ts +2 -0
  67. package/dist/devtools/index.js +18 -0
  68. package/dist/devtools/index.js.map +1 -0
  69. package/dist/devtools/react.d.ts +8 -0
  70. package/dist/form/index.cjs +301 -0
  71. package/dist/form/index.cjs.map +1 -0
  72. package/dist/form/index.d.ts +3 -0
  73. package/dist/form/index.js +14 -0
  74. package/dist/form/index.js.map +1 -0
  75. package/dist/form/react.d.ts +9 -0
  76. package/dist/form/service.d.ts +3 -0
  77. package/dist/form/types.d.ts +41 -0
  78. package/dist/framework/app.d.ts +21 -0
  79. package/dist/framework/cache.d.ts +10 -0
  80. package/dist/framework/contracts.d.ts +32 -0
  81. package/dist/framework/index.cjs +1006 -0
  82. package/dist/framework/index.cjs.map +1 -0
  83. package/dist/framework/index.d.ts +4 -0
  84. package/dist/framework/index.js +35 -0
  85. package/dist/framework/index.js.map +1 -0
  86. package/dist/framework/manifest.d.ts +12 -0
  87. package/dist/framework/vite.d.ts +13 -0
  88. package/dist/framework-vite/index.cjs +163 -0
  89. package/dist/framework-vite/index.cjs.map +1 -0
  90. package/dist/framework-vite/index.d.ts +1 -0
  91. package/dist/framework-vite/index.js +125 -0
  92. package/dist/framework-vite/index.js.map +1 -0
  93. package/dist/grid/grid.d.ts +8 -0
  94. package/dist/grid/index.cjs +238 -0
  95. package/dist/grid/index.cjs.map +1 -0
  96. package/dist/grid/index.d.ts +2 -0
  97. package/dist/grid/index.js +19 -0
  98. package/dist/grid/index.js.map +1 -0
  99. package/dist/grid/types.d.ts +35 -0
  100. package/dist/index.cjs +2512 -0
  101. package/dist/index.cjs.map +1 -0
  102. package/dist/index.d.ts +13 -0
  103. package/dist/index.js +207 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/kernel/app.d.ts +26 -0
  106. package/dist/kernel/index.d.ts +3 -0
  107. package/dist/kernel/runtime.d.ts +5 -0
  108. package/dist/kernel/telemetry.d.ts +37 -0
  109. package/dist/navigation/index.d.ts +4 -0
  110. package/dist/navigation/matcher.d.ts +13 -0
  111. package/dist/navigation/react.d.ts +12 -0
  112. package/dist/navigation/service.d.ts +23 -0
  113. package/dist/navigation/types.d.ts +65 -0
  114. package/dist/query/index.cjs +361 -0
  115. package/dist/query/index.cjs.map +1 -0
  116. package/dist/query/index.d.ts +3 -0
  117. package/dist/query/index.js +30 -0
  118. package/dist/query/index.js.map +1 -0
  119. package/dist/query/react.d.ts +27 -0
  120. package/dist/query/service.d.ts +10 -0
  121. package/dist/query/types.d.ts +5 -0
  122. package/dist/react/index.d.ts +1 -0
  123. package/dist/react/provider.d.ts +10 -0
  124. package/dist/realtime/channel.d.ts +15 -0
  125. package/dist/realtime/index.cjs +117 -0
  126. package/dist/realtime/index.cjs.map +1 -0
  127. package/dist/realtime/index.d.ts +2 -0
  128. package/dist/realtime/index.js +15 -0
  129. package/dist/realtime/index.js.map +1 -0
  130. package/dist/realtime/presence.d.ts +22 -0
  131. package/dist/render/hydration.d.ts +24 -0
  132. package/dist/render/index.d.ts +2 -0
  133. package/dist/render/ssr.d.ts +13 -0
  134. package/dist/router/helpers.d.ts +26 -0
  135. package/dist/router/index.cjs +236 -0
  136. package/dist/router/index.cjs.map +1 -0
  137. package/dist/router/index.d.ts +4 -0
  138. package/dist/router/index.js +40 -0
  139. package/dist/router/index.js.map +1 -0
  140. package/dist/router/react.d.ts +5 -0
  141. package/dist/router/service.d.ts +5 -0
  142. package/dist/router/types.d.ts +1 -0
  143. package/dist/server/index.cjs +174 -0
  144. package/dist/server/index.cjs.map +1 -0
  145. package/dist/server/index.d.ts +16 -0
  146. package/dist/server/index.js +12 -0
  147. package/dist/server/index.js.map +1 -0
  148. package/dist/state/index.cjs +128 -0
  149. package/dist/state/index.cjs.map +1 -0
  150. package/dist/state/index.d.ts +2 -0
  151. package/dist/state/index.js +36 -0
  152. package/dist/state/index.js.map +1 -0
  153. package/dist/state/react.d.ts +3 -0
  154. package/dist/state/service.d.ts +28 -0
  155. package/dist/testing/index.cjs +970 -0
  156. package/dist/testing/index.cjs.map +1 -0
  157. package/dist/testing/index.d.ts +2 -0
  158. package/dist/testing/index.js +13 -0
  159. package/dist/testing/index.js.map +1 -0
  160. package/dist/virtual/index.cjs +160 -0
  161. package/dist/virtual/index.cjs.map +1 -0
  162. package/dist/virtual/index.d.ts +2 -0
  163. package/dist/virtual/index.js +21 -0
  164. package/dist/virtual/index.js.map +1 -0
  165. package/dist/virtual/types.d.ts +25 -0
  166. package/dist/virtual/virtual.d.ts +9 -0
  167. package/package.json +156 -0
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/grid/index.ts
21
+ var grid_exports = {};
22
+ __export(grid_exports, {
23
+ defineColumns: () => defineColumns,
24
+ filterRows: () => filterRows,
25
+ mapRows: () => mapRows,
26
+ paginateRows: () => paginateRows,
27
+ projectRow: () => projectRow,
28
+ projectRows: () => projectRows,
29
+ sortRows: () => sortRows
30
+ });
31
+ module.exports = __toCommonJS(grid_exports);
32
+
33
+ // src/grid/grid.ts
34
+ var import_effect = require("effect");
35
+ var normalizeInteger = (value, minimum) => {
36
+ if (!Number.isFinite(value)) {
37
+ return minimum;
38
+ }
39
+ return Math.max(minimum, Math.floor(value));
40
+ };
41
+ var toComparable = (value) => {
42
+ if (value === null || value === void 0 || value instanceof Date) {
43
+ return value;
44
+ }
45
+ switch (typeof value) {
46
+ case "string":
47
+ case "number":
48
+ case "bigint":
49
+ case "boolean":
50
+ return value;
51
+ case "symbol":
52
+ return value.description ?? "symbol";
53
+ case "function":
54
+ return value.name.length > 0 ? `[function ${value.name}]` : "[function]";
55
+ default:
56
+ try {
57
+ const encoded = JSON.stringify(value);
58
+ return encoded ?? "";
59
+ } catch {
60
+ return "";
61
+ }
62
+ }
63
+ };
64
+ var compareComparable = (left, right) => {
65
+ if (left === right) {
66
+ return 0;
67
+ }
68
+ if (left === null || left === void 0) {
69
+ return right === null || right === void 0 ? 0 : -1;
70
+ }
71
+ if (right === null || right === void 0) {
72
+ return 1;
73
+ }
74
+ if (left instanceof Date && right instanceof Date) {
75
+ return import_effect.Order.Date(left, right);
76
+ }
77
+ if (typeof left === "number" && typeof right === "number") {
78
+ return import_effect.Order.number(left, right);
79
+ }
80
+ if (typeof left === "bigint" && typeof right === "bigint") {
81
+ return import_effect.Order.bigint(left, right);
82
+ }
83
+ if (typeof left === "boolean" && typeof right === "boolean") {
84
+ return import_effect.Order.boolean(left, right);
85
+ }
86
+ return import_effect.Order.string(toSearchText(left), toSearchText(right));
87
+ };
88
+ var comparableOrder = import_effect.Order.make(compareComparable);
89
+ var toSearchText = (value) => {
90
+ if (value === null || value === void 0) {
91
+ return "";
92
+ }
93
+ if (value instanceof Date) {
94
+ return value.toISOString();
95
+ }
96
+ switch (typeof value) {
97
+ case "string":
98
+ return value;
99
+ case "number":
100
+ case "bigint":
101
+ case "boolean":
102
+ return value.toString();
103
+ case "symbol":
104
+ return value.description ?? "symbol";
105
+ case "function":
106
+ return value.name.length > 0 ? value.name : "function";
107
+ default:
108
+ try {
109
+ const encoded = JSON.stringify(value);
110
+ return encoded ?? "";
111
+ } catch {
112
+ return "";
113
+ }
114
+ }
115
+ };
116
+ var defaultFilterMatch = (value, filterValue) => {
117
+ if (filterValue === null || filterValue === void 0) {
118
+ return true;
119
+ }
120
+ if (typeof filterValue === "string") {
121
+ const normalizedFilter = filterValue.trim().toLowerCase();
122
+ if (normalizedFilter.length === 0) {
123
+ return true;
124
+ }
125
+ return toSearchText(value).toLowerCase().includes(normalizedFilter);
126
+ }
127
+ if (Array.isArray(filterValue)) {
128
+ return filterValue.some((candidate) => Object.is(candidate, value));
129
+ }
130
+ if (filterValue instanceof Date && value instanceof Date) {
131
+ return filterValue.getTime() === value.getTime();
132
+ }
133
+ return Object.is(value, filterValue);
134
+ };
135
+ var toSortDirection = (direction) => direction === "desc" ? "desc" : "asc";
136
+ var defineColumns = (columns) => columns;
137
+ var projectRow = (row, columns) => {
138
+ const projection = {};
139
+ for (const column of columns) {
140
+ projection[column.id] = column.accessor(row);
141
+ }
142
+ return projection;
143
+ };
144
+ var projectRows = (rows, columns) => (0, import_effect.pipe)(
145
+ rows,
146
+ import_effect.Array.fromIterable,
147
+ import_effect.Array.map((row) => projectRow(row, columns))
148
+ );
149
+ var mapRows = projectRows;
150
+ var sortRows = (rows, columns, sorts) => {
151
+ const input = import_effect.Array.fromIterable(rows);
152
+ if (input.length < 2 || sorts.length === 0) {
153
+ return input;
154
+ }
155
+ const columnLookup = /* @__PURE__ */ new Map();
156
+ for (const column of columns) {
157
+ columnLookup.set(column.id, column);
158
+ }
159
+ const orders = [];
160
+ for (const sort of sorts) {
161
+ const column = columnLookup.get(sort.id);
162
+ if (column === void 0) {
163
+ continue;
164
+ }
165
+ const orderForColumn = import_effect.Order.mapInput(
166
+ comparableOrder,
167
+ (row) => toComparable(column.accessor(row))
168
+ );
169
+ orders.push(toSortDirection(sort.direction) === "desc" ? import_effect.Order.reverse(orderForColumn) : orderForColumn);
170
+ }
171
+ if (orders.length === 0) {
172
+ return input;
173
+ }
174
+ const combinedOrder = import_effect.Order.combineAll(orders);
175
+ const indexedOrder = import_effect.Order.combine(
176
+ import_effect.Order.mapInput(combinedOrder, (entry) => entry.row),
177
+ import_effect.Order.mapInput(import_effect.Order.number, (entry) => entry.index)
178
+ );
179
+ return (0, import_effect.pipe)(
180
+ input,
181
+ import_effect.Array.map((row, index) => ({ row, index })),
182
+ import_effect.Array.sort(indexedOrder),
183
+ import_effect.Array.map((entry) => entry.row)
184
+ );
185
+ };
186
+ var filterRows = (rows, columns, filters) => {
187
+ const input = import_effect.Array.fromIterable(rows);
188
+ if (filters.length === 0) {
189
+ return input;
190
+ }
191
+ const columnLookup = /* @__PURE__ */ new Map();
192
+ for (const column of columns) {
193
+ columnLookup.set(column.id, column);
194
+ }
195
+ return (0, import_effect.pipe)(
196
+ input,
197
+ import_effect.Array.filter(
198
+ (row) => filters.every((filter) => {
199
+ const column = columnLookup.get(filter.id);
200
+ if (column === void 0) {
201
+ return true;
202
+ }
203
+ return defaultFilterMatch(column.accessor(row), filter.value);
204
+ })
205
+ )
206
+ );
207
+ };
208
+ var paginateRows = (rows, pagination) => {
209
+ const input = import_effect.Array.fromIterable(rows);
210
+ const pageSize = normalizeInteger(pagination.pageSize, 1);
211
+ const pageCount = input.length === 0 ? 0 : Math.ceil(input.length / pageSize);
212
+ const requestedPageIndex = normalizeInteger(pagination.pageIndex, 0);
213
+ const pageIndex = pageCount === 0 ? 0 : Math.min(requestedPageIndex, pageCount - 1);
214
+ const pageOffset = pageIndex * pageSize;
215
+ const pageRows = (0, import_effect.pipe)(
216
+ input,
217
+ import_effect.Array.drop(pageOffset),
218
+ import_effect.Array.take(pageSize)
219
+ );
220
+ return {
221
+ rows: pageRows,
222
+ pageIndex,
223
+ pageSize,
224
+ pageCount,
225
+ totalRows: input.length
226
+ };
227
+ };
228
+ // Annotate the CommonJS export names for ESM import in node:
229
+ 0 && (module.exports = {
230
+ defineColumns,
231
+ filterRows,
232
+ mapRows,
233
+ paginateRows,
234
+ projectRow,
235
+ projectRows,
236
+ sortRows
237
+ });
238
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/grid/index.ts","../../src/grid/grid.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./grid\";\n","import { Array as EffectArray, Order, pipe } from \"effect\";\nimport type {\n GridColumn,\n GridColumnId,\n GridFilter,\n GridPage,\n GridPagination,\n GridRowProjection,\n GridSort,\n GridSortDirection,\n} from \"./types\";\n\ntype GridComparable = string | number | bigint | boolean | Date | null | undefined;\n\nconst normalizeInteger = (value: number, minimum: number): number => {\n if (!Number.isFinite(value)) {\n return minimum;\n }\n return Math.max(minimum, Math.floor(value));\n};\n\nconst toComparable = (value: unknown): GridComparable => {\n if (value === null || value === undefined || value instanceof Date) {\n return value;\n }\n\n switch (typeof value) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return value;\n case \"symbol\":\n return value.description ?? \"symbol\";\n case \"function\":\n return value.name.length > 0 ? `[function ${value.name}]` : \"[function]\";\n default:\n try {\n const encoded = JSON.stringify(value);\n return encoded ?? \"\";\n } catch {\n return \"\";\n }\n }\n};\n\nconst compareComparable = (left: GridComparable, right: GridComparable): -1 | 0 | 1 => {\n if (left === right) {\n return 0;\n }\n\n if (left === null || left === undefined) {\n return right === null || right === undefined ? 0 : -1;\n }\n\n if (right === null || right === undefined) {\n return 1;\n }\n\n if (left instanceof Date && right instanceof Date) {\n return Order.Date(left, right);\n }\n\n if (typeof left === \"number\" && typeof right === \"number\") {\n return Order.number(left, right);\n }\n\n if (typeof left === \"bigint\" && typeof right === \"bigint\") {\n return Order.bigint(left, right);\n }\n\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Order.boolean(left, right);\n }\n\n return Order.string(toSearchText(left), toSearchText(right));\n};\n\nconst comparableOrder: Order.Order<GridComparable> = Order.make(compareComparable);\n\nconst toSearchText = (value: unknown): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n switch (typeof value) {\n case \"string\":\n return value;\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return value.toString();\n case \"symbol\":\n return value.description ?? \"symbol\";\n case \"function\":\n return value.name.length > 0 ? value.name : \"function\";\n default:\n try {\n const encoded = JSON.stringify(value);\n return encoded ?? \"\";\n } catch {\n return \"\";\n }\n }\n};\n\nconst defaultFilterMatch = (value: unknown, filterValue: unknown): boolean => {\n if (filterValue === null || filterValue === undefined) {\n return true;\n }\n\n if (typeof filterValue === \"string\") {\n const normalizedFilter = filterValue.trim().toLowerCase();\n if (normalizedFilter.length === 0) {\n return true;\n }\n return toSearchText(value).toLowerCase().includes(normalizedFilter);\n }\n\n if (Array.isArray(filterValue)) {\n return filterValue.some((candidate) => Object.is(candidate, value));\n }\n\n if (filterValue instanceof Date && value instanceof Date) {\n return filterValue.getTime() === value.getTime();\n }\n\n return Object.is(value, filterValue);\n};\n\nconst toSortDirection = (direction: GridSortDirection | undefined): GridSortDirection =>\n direction === \"desc\" ? \"desc\" : \"asc\";\n\nexport const defineColumns = <\n Row,\n const Columns extends readonly GridColumn<Row, string, unknown>[] = readonly GridColumn<\n Row,\n string,\n unknown\n >[],\n>(\n columns: Columns,\n): Columns => columns;\n\nexport const projectRow = <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(\n row: Row,\n columns: Columns,\n): GridRowProjection<Columns> => {\n const projection: Record<string, unknown> = {};\n\n for (const column of columns) {\n projection[column.id] = column.accessor(row);\n }\n\n return projection as GridRowProjection<Columns>;\n};\n\nexport const projectRows = <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(\n rows: readonly Row[],\n columns: Columns,\n): readonly GridRowProjection<Columns>[] =>\n pipe(\n rows,\n EffectArray.fromIterable,\n EffectArray.map((row) => projectRow(row, columns)),\n );\n\nexport const mapRows = projectRows;\n\nexport const sortRows = <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(\n rows: readonly Row[],\n columns: Columns,\n sorts: readonly GridSort<GridColumnId<Columns>>[],\n): readonly Row[] => {\n const input = EffectArray.fromIterable(rows);\n\n if (input.length < 2 || sorts.length === 0) {\n return input;\n }\n\n const columnLookup = new Map<GridColumnId<Columns>, Columns[number]>();\n for (const column of columns) {\n columnLookup.set(column.id as GridColumnId<Columns>, column);\n }\n\n const orders: Order.Order<Row>[] = [];\n\n for (const sort of sorts) {\n const column = columnLookup.get(sort.id);\n if (column === undefined) {\n continue;\n }\n\n const orderForColumn = Order.mapInput(comparableOrder, (row: Row) =>\n toComparable(column.accessor(row)),\n );\n\n orders.push(toSortDirection(sort.direction) === \"desc\" ? Order.reverse(orderForColumn) : orderForColumn);\n }\n\n if (orders.length === 0) {\n return input;\n }\n\n const combinedOrder = Order.combineAll(orders);\n\n type IndexedRow = {\n readonly row: Row;\n readonly index: number;\n };\n\n const indexedOrder = Order.combine(\n Order.mapInput(combinedOrder, (entry: IndexedRow) => entry.row),\n Order.mapInput(Order.number, (entry: IndexedRow) => entry.index),\n );\n\n return pipe(\n input,\n EffectArray.map((row, index): IndexedRow => ({ row, index })),\n EffectArray.sort(indexedOrder),\n EffectArray.map((entry) => entry.row),\n );\n};\n\nexport const filterRows = <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(\n rows: readonly Row[],\n columns: Columns,\n filters: readonly GridFilter<GridColumnId<Columns>>[],\n): readonly Row[] => {\n const input = EffectArray.fromIterable(rows);\n\n if (filters.length === 0) {\n return input;\n }\n\n const columnLookup = new Map<GridColumnId<Columns>, Columns[number]>();\n for (const column of columns) {\n columnLookup.set(column.id as GridColumnId<Columns>, column);\n }\n\n return pipe(\n input,\n EffectArray.filter((row) =>\n filters.every((filter) => {\n const column = columnLookup.get(filter.id);\n if (column === undefined) {\n return true;\n }\n return defaultFilterMatch(column.accessor(row), filter.value);\n }),\n ),\n );\n};\n\nexport const paginateRows = <Row>(\n rows: readonly Row[],\n pagination: GridPagination,\n): GridPage<Row> => {\n const input = EffectArray.fromIterable(rows);\n const pageSize = normalizeInteger(pagination.pageSize, 1);\n const pageCount = input.length === 0 ? 0 : Math.ceil(input.length / pageSize);\n const requestedPageIndex = normalizeInteger(pagination.pageIndex, 0);\n const pageIndex = pageCount === 0 ? 0 : Math.min(requestedPageIndex, pageCount - 1);\n const pageOffset = pageIndex * pageSize;\n\n const pageRows = pipe(\n input,\n EffectArray.drop(pageOffset),\n EffectArray.take(pageSize),\n );\n\n return {\n rows: pageRows,\n pageIndex,\n pageSize,\n pageCount,\n totalRows: input.length,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAkD;AAclD,IAAM,mBAAmB,CAAC,OAAe,YAA4B;AACnE,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,SAAS,KAAK,MAAM,KAAK,CAAC;AAC5C;AAEA,IAAM,eAAe,CAAC,UAAmC;AACvD,MAAI,UAAU,QAAQ,UAAU,UAAa,iBAAiB,MAAM;AAClE,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,MAAM,eAAe;AAAA,IAC9B,KAAK;AACH,aAAO,MAAM,KAAK,SAAS,IAAI,aAAa,MAAM,IAAI,MAAM;AAAA,IAC9D;AACE,UAAI;AACF,cAAM,UAAU,KAAK,UAAU,KAAK;AACpC,eAAO,WAAW;AAAA,MACpB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,EACJ;AACF;AAEA,IAAM,oBAAoB,CAAC,MAAsB,UAAsC;AACrF,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,WAAO,UAAU,QAAQ,UAAU,SAAY,IAAI;AAAA,EACrD;AAEA,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,QAAQ,iBAAiB,MAAM;AACjD,WAAO,oBAAM,KAAK,MAAM,KAAK;AAAA,EAC/B;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,WAAO,oBAAM,OAAO,MAAM,KAAK;AAAA,EACjC;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,WAAO,oBAAM,OAAO,MAAM,KAAK;AAAA,EACjC;AAEA,MAAI,OAAO,SAAS,aAAa,OAAO,UAAU,WAAW;AAC3D,WAAO,oBAAM,QAAQ,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO,oBAAM,OAAO,aAAa,IAAI,GAAG,aAAa,KAAK,CAAC;AAC7D;AAEA,IAAM,kBAA+C,oBAAM,KAAK,iBAAiB;AAEjF,IAAM,eAAe,CAAC,UAA2B;AAC/C,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAY;AAAA,EAC3B;AAEA,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAM,SAAS;AAAA,IACxB,KAAK;AACH,aAAO,MAAM,eAAe;AAAA,IAC9B,KAAK;AACH,aAAO,MAAM,KAAK,SAAS,IAAI,MAAM,OAAO;AAAA,IAC9C;AACE,UAAI;AACF,cAAM,UAAU,KAAK,UAAU,KAAK;AACpC,eAAO,WAAW;AAAA,MACpB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,EACJ;AACF;AAEA,IAAM,qBAAqB,CAAC,OAAgB,gBAAkC;AAC5E,MAAI,gBAAgB,QAAQ,gBAAgB,QAAW;AACrD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,gBAAgB,UAAU;AACnC,UAAM,mBAAmB,YAAY,KAAK,EAAE,YAAY;AACxD,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO;AAAA,IACT;AACA,WAAO,aAAa,KAAK,EAAE,YAAY,EAAE,SAAS,gBAAgB;AAAA,EACpE;AAEA,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,WAAO,YAAY,KAAK,CAAC,cAAc,OAAO,GAAG,WAAW,KAAK,CAAC;AAAA,EACpE;AAEA,MAAI,uBAAuB,QAAQ,iBAAiB,MAAM;AACxD,WAAO,YAAY,QAAQ,MAAM,MAAM,QAAQ;AAAA,EACjD;AAEA,SAAO,OAAO,GAAG,OAAO,WAAW;AACrC;AAEA,IAAM,kBAAkB,CAAC,cACvB,cAAc,SAAS,SAAS;AAE3B,IAAM,gBAAgB,CAQ3B,YACY;AAEP,IAAM,aAAa,CACxB,KACA,YAC+B;AAC/B,QAAM,aAAsC,CAAC;AAE7C,aAAW,UAAU,SAAS;AAC5B,eAAW,OAAO,EAAE,IAAI,OAAO,SAAS,GAAG;AAAA,EAC7C;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,CACzB,MACA,gBAEA;AAAA,EACE;AAAA,EACA,cAAAA,MAAY;AAAA,EACZ,cAAAA,MAAY,IAAI,CAAC,QAAQ,WAAW,KAAK,OAAO,CAAC;AACnD;AAEK,IAAM,UAAU;AAEhB,IAAM,WAAW,CACtB,MACA,SACA,UACmB;AACnB,QAAM,QAAQ,cAAAA,MAAY,aAAa,IAAI;AAE3C,MAAI,MAAM,SAAS,KAAK,MAAM,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAI,IAA4C;AACrE,aAAW,UAAU,SAAS;AAC5B,iBAAa,IAAI,OAAO,IAA6B,MAAM;AAAA,EAC7D;AAEA,QAAM,SAA6B,CAAC;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,aAAa,IAAI,KAAK,EAAE;AACvC,QAAI,WAAW,QAAW;AACxB;AAAA,IACF;AAEA,UAAM,iBAAiB,oBAAM;AAAA,MAAS;AAAA,MAAiB,CAAC,QACtD,aAAa,OAAO,SAAS,GAAG,CAAC;AAAA,IACnC;AAEA,WAAO,KAAK,gBAAgB,KAAK,SAAS,MAAM,SAAS,oBAAM,QAAQ,cAAc,IAAI,cAAc;AAAA,EACzG;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,oBAAM,WAAW,MAAM;AAO7C,QAAM,eAAe,oBAAM;AAAA,IACzB,oBAAM,SAAS,eAAe,CAAC,UAAsB,MAAM,GAAG;AAAA,IAC9D,oBAAM,SAAS,oBAAM,QAAQ,CAAC,UAAsB,MAAM,KAAK;AAAA,EACjE;AAEA,aAAO;AAAA,IACL;AAAA,IACA,cAAAA,MAAY,IAAI,CAAC,KAAK,WAAuB,EAAE,KAAK,MAAM,EAAE;AAAA,IAC5D,cAAAA,MAAY,KAAK,YAAY;AAAA,IAC7B,cAAAA,MAAY,IAAI,CAAC,UAAU,MAAM,GAAG;AAAA,EACtC;AACF;AAEO,IAAM,aAAa,CACxB,MACA,SACA,YACmB;AACnB,QAAM,QAAQ,cAAAA,MAAY,aAAa,IAAI;AAE3C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAI,IAA4C;AACrE,aAAW,UAAU,SAAS;AAC5B,iBAAa,IAAI,OAAO,IAA6B,MAAM;AAAA,EAC7D;AAEA,aAAO;AAAA,IACL;AAAA,IACA,cAAAA,MAAY;AAAA,MAAO,CAAC,QAClB,QAAQ,MAAM,CAAC,WAAW;AACxB,cAAM,SAAS,aAAa,IAAI,OAAO,EAAE;AACzC,YAAI,WAAW,QAAW;AACxB,iBAAO;AAAA,QACT;AACA,eAAO,mBAAmB,OAAO,SAAS,GAAG,GAAG,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAC1B,MACA,eACkB;AAClB,QAAM,QAAQ,cAAAA,MAAY,aAAa,IAAI;AAC3C,QAAM,WAAW,iBAAiB,WAAW,UAAU,CAAC;AACxD,QAAM,YAAY,MAAM,WAAW,IAAI,IAAI,KAAK,KAAK,MAAM,SAAS,QAAQ;AAC5E,QAAM,qBAAqB,iBAAiB,WAAW,WAAW,CAAC;AACnE,QAAM,YAAY,cAAc,IAAI,IAAI,KAAK,IAAI,oBAAoB,YAAY,CAAC;AAClF,QAAM,aAAa,YAAY;AAE/B,QAAM,eAAW;AAAA,IACf;AAAA,IACA,cAAAA,MAAY,KAAK,UAAU;AAAA,IAC3B,cAAAA,MAAY,KAAK,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AAAA,EACnB;AACF;","names":["EffectArray"]}
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ export * from "./grid";
@@ -0,0 +1,19 @@
1
+ import {
2
+ defineColumns,
3
+ filterRows,
4
+ mapRows,
5
+ paginateRows,
6
+ projectRow,
7
+ projectRows,
8
+ sortRows
9
+ } from "../chunk-MDGEGQZB.js";
10
+ export {
11
+ defineColumns,
12
+ filterRows,
13
+ mapRows,
14
+ paginateRows,
15
+ projectRow,
16
+ projectRows,
17
+ sortRows
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,35 @@
1
+ export interface GridColumn<Row, Id extends string = string, Value = unknown> {
2
+ readonly id: Id;
3
+ readonly header?: string;
4
+ readonly accessor: (row: Row) => Value;
5
+ }
6
+ type ColumnIdOf<Column> = Column extends GridColumn<infer _Row, infer Id, infer _Value> ? Id : never;
7
+ type ColumnValueOf<Column> = Column extends GridColumn<infer _Row, infer _Id, infer Value> ? Value : never;
8
+ export type GridColumnId<Columns extends readonly unknown[]> = ColumnIdOf<Columns[number]>;
9
+ export type GridColumnValue<Columns extends readonly unknown[], Id extends GridColumnId<Columns>> = ColumnValueOf<Extract<Columns[number], {
10
+ readonly id: Id;
11
+ }>>;
12
+ export type GridRowProjection<Columns extends readonly unknown[]> = {
13
+ readonly [Column in Columns[number] as ColumnIdOf<Column>]: ColumnValueOf<Column>;
14
+ };
15
+ export type GridSortDirection = "asc" | "desc";
16
+ export interface GridSort<ColumnId extends string> {
17
+ readonly id: ColumnId;
18
+ readonly direction?: GridSortDirection;
19
+ }
20
+ export interface GridFilter<ColumnId extends string> {
21
+ readonly id: ColumnId;
22
+ readonly value: unknown;
23
+ }
24
+ export interface GridPagination {
25
+ readonly pageIndex: number;
26
+ readonly pageSize: number;
27
+ }
28
+ export interface GridPage<Row> {
29
+ readonly rows: readonly Row[];
30
+ readonly pageIndex: number;
31
+ readonly pageSize: number;
32
+ readonly pageCount: number;
33
+ readonly totalRows: number;
34
+ }
35
+ export {};