@powfix/core-js 0.30.1 → 0.31.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.
@@ -93,7 +93,7 @@ var SortUtils = /*#__PURE__*/ function(_shared_SortUtils) {
93
93
  {
94
94
  key: "toGridSortModel",
95
95
  value: function toGridSortModel(items) {
96
- return items.map(this.toGridSortItem);
96
+ return items.map(SortUtils.toGridSortItem);
97
97
  }
98
98
  },
99
99
  {
@@ -108,7 +108,7 @@ var SortUtils = /*#__PURE__*/ function(_shared_SortUtils) {
108
108
  {
109
109
  key: "fromGridSortModel",
110
110
  value: function fromGridSortModel(model) {
111
- return model.map(this.fromGridSortItem);
111
+ return model.map(SortUtils.fromGridSortItem);
112
112
  }
113
113
  }
114
114
  ]);
@@ -93,7 +93,7 @@ var SortUtils = /*#__PURE__*/ function(SortUtils$1) {
93
93
  {
94
94
  key: "toGridSortModel",
95
95
  value: function toGridSortModel(items) {
96
- return items.map(this.toGridSortItem);
96
+ return items.map(SortUtils.toGridSortItem);
97
97
  }
98
98
  },
99
99
  {
@@ -108,7 +108,7 @@ var SortUtils = /*#__PURE__*/ function(SortUtils$1) {
108
108
  {
109
109
  key: "fromGridSortModel",
110
110
  value: function fromGridSortModel(model) {
111
- return model.map(this.fromGridSortItem);
111
+ return model.map(SortUtils.fromGridSortItem);
112
112
  }
113
113
  }
114
114
  ]);
@@ -0,0 +1,430 @@
1
+ 'use strict';
2
+ function _array_like_to_array(arr, len) {
3
+ if (len == null || len > arr.length) len = arr.length;
4
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
5
+ return arr2;
6
+ }
7
+ function _array_with_holes(arr) {
8
+ if (Array.isArray(arr)) return arr;
9
+ }
10
+ function _class_call_check(instance, Constructor) {
11
+ if (!(instance instanceof Constructor)) {
12
+ throw new TypeError("Cannot call a class as a function");
13
+ }
14
+ }
15
+ function _defineProperties(target, props) {
16
+ for(var i = 0; i < props.length; i++){
17
+ var descriptor = props[i];
18
+ descriptor.enumerable = descriptor.enumerable || false;
19
+ descriptor.configurable = true;
20
+ if ("value" in descriptor) descriptor.writable = true;
21
+ Object.defineProperty(target, descriptor.key, descriptor);
22
+ }
23
+ }
24
+ function _create_class(Constructor, protoProps, staticProps) {
25
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
26
+ if (staticProps) _defineProperties(Constructor, staticProps);
27
+ return Constructor;
28
+ }
29
+ function _define_property(obj, key, value) {
30
+ if (key in obj) {
31
+ Object.defineProperty(obj, key, {
32
+ value: value,
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true
36
+ });
37
+ } else {
38
+ obj[key] = value;
39
+ }
40
+ return obj;
41
+ }
42
+ function _instanceof(left, right) {
43
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
44
+ return !!right[Symbol.hasInstance](left);
45
+ } else {
46
+ return left instanceof right;
47
+ }
48
+ }
49
+ function _iterable_to_array_limit(arr, i) {
50
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
51
+ if (_i == null) return;
52
+ var _arr = [];
53
+ var _n = true;
54
+ var _d = false;
55
+ var _s, _e;
56
+ try {
57
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
58
+ _arr.push(_s.value);
59
+ if (i && _arr.length === i) break;
60
+ }
61
+ } catch (err) {
62
+ _d = true;
63
+ _e = err;
64
+ } finally{
65
+ try {
66
+ if (!_n && _i["return"] != null) _i["return"]();
67
+ } finally{
68
+ if (_d) throw _e;
69
+ }
70
+ }
71
+ return _arr;
72
+ }
73
+ function _non_iterable_rest() {
74
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
75
+ }
76
+ function _object_spread(target) {
77
+ for(var i = 1; i < arguments.length; i++){
78
+ var source = arguments[i] != null ? arguments[i] : {};
79
+ var ownKeys = Object.keys(source);
80
+ if (typeof Object.getOwnPropertySymbols === "function") {
81
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
82
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
83
+ }));
84
+ }
85
+ ownKeys.forEach(function(key) {
86
+ _define_property(target, key, source[key]);
87
+ });
88
+ }
89
+ return target;
90
+ }
91
+ function ownKeys(object, enumerableOnly) {
92
+ var keys = Object.keys(object);
93
+ if (Object.getOwnPropertySymbols) {
94
+ var symbols = Object.getOwnPropertySymbols(object);
95
+ if (enumerableOnly) {
96
+ symbols = symbols.filter(function(sym) {
97
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
98
+ });
99
+ }
100
+ keys.push.apply(keys, symbols);
101
+ }
102
+ return keys;
103
+ }
104
+ function _object_spread_props(target, source) {
105
+ source = source != null ? source : {};
106
+ if (Object.getOwnPropertyDescriptors) {
107
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
108
+ } else {
109
+ ownKeys(Object(source)).forEach(function(key) {
110
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
111
+ });
112
+ }
113
+ return target;
114
+ }
115
+ function _sliced_to_array(arr, i) {
116
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
117
+ }
118
+ function _type_of(obj) {
119
+ "@swc/helpers - typeof";
120
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
121
+ }
122
+ function _unsupported_iterable_to_array(o, minLen) {
123
+ if (!o) return;
124
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
125
+ var n = Object.prototype.toString.call(o).slice(8, -1);
126
+ if (n === "Object" && o.constructor) n = o.constructor.name;
127
+ if (n === "Map" || n === "Set") return Array.from(n);
128
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
129
+ }
130
+ var chunkQHUNR4O5_cjs = require('../../chunk-QHUNR4O5.cjs');
131
+ var _TimeSeriesBucketUtils = /*#__PURE__*/ function() {
132
+ function _TimeSeriesBucketUtils() {
133
+ _class_call_check(this, _TimeSeriesBucketUtils);
134
+ }
135
+ _create_class(_TimeSeriesBucketUtils, null, [
136
+ {
137
+ key: "fillMissingUtcBuckets",
138
+ value: /**
139
+ * 시계열 데이터에서 누락된 UTC bucket row를 채운다.
140
+ *
141
+ * 특징:
142
+ * - 모든 bucket 계산은 UTC 기준으로 처리한다.
143
+ * - 출력 dateKey 값은 항상 ISO 문자열이다.
144
+ * - dateRange가 없으면 rows 내 가장 과거/미래 bucket을 사용한다.
145
+ * - dateRange 양쪽 값이 모두 있으면 순서와 무관하게 더 과거 값이 start가 된다.
146
+ * - 동일 bucket으로 정규화되는 row가 2개 이상이면 throw 한다.
147
+ *
148
+ * 주의:
149
+ * - number date input은 JavaScript Date 생성자와 동일하게 millisecond timestamp로 처리된다.
150
+ * - string date input의 파싱은 new Date(value)에 위임한다.
151
+ */ function fillMissingUtcBuckets(rows, options) {
152
+ if (!Array.isArray(rows)) {
153
+ throw new TypeError("rows must be an array.");
154
+ }
155
+ if (!_TimeSeriesBucketUtils.isRecord(options)) {
156
+ throw new TypeError("options must be an object.");
157
+ }
158
+ var dateKey = options.dateKey, unit = options.unit, fillValues = options.fillValues, dateRange = options.dateRange;
159
+ if (typeof dateKey !== "string" || dateKey.length === 0) {
160
+ throw new TypeError("dateKey must be a non-empty string.");
161
+ }
162
+ _TimeSeriesBucketUtils.assertDateBucketUnit(unit);
163
+ if (dateRange !== void 0) {
164
+ _TimeSeriesBucketUtils.assertDateRange(dateRange);
165
+ }
166
+ if (fillValues !== void 0 && typeof fillValues !== "function" && !_TimeSeriesBucketUtils.isRecord(fillValues)) {
167
+ throw new TypeError("fillValues must be an object or a function.");
168
+ }
169
+ var normalizedRows = [];
170
+ var minBucketTime;
171
+ var maxBucketTime;
172
+ for(var index = 0; index < rows.length; index += 1){
173
+ var row = rows[index];
174
+ if (!_TimeSeriesBucketUtils.isRecord(row)) {
175
+ throw new TypeError("rows[".concat(index, "] must be an object."));
176
+ }
177
+ if (!(dateKey in row)) {
178
+ throw new Error("rows[".concat(index, '] does not have dateKey "').concat(dateKey, '".'));
179
+ }
180
+ var rawDate = row[dateKey];
181
+ var bucketDate = _TimeSeriesBucketUtils.startOfUtcBucket(rawDate, unit, "rows[".concat(index, "].").concat(dateKey));
182
+ var bucketTime = bucketDate.getTime();
183
+ var isoDate = bucketDate.toISOString();
184
+ normalizedRows.push({
185
+ row: row,
186
+ isoDate: isoDate,
187
+ bucketTime: bucketTime
188
+ });
189
+ minBucketTime = minBucketTime === void 0 ? bucketTime : Math.min(minBucketTime, bucketTime);
190
+ maxBucketTime = maxBucketTime === void 0 ? bucketTime : Math.max(maxBucketTime, bucketTime);
191
+ }
192
+ var resolvedRange = _TimeSeriesBucketUtils.resolveUtcBucketRange(minBucketTime, maxBucketTime, unit, dateRange);
193
+ if (resolvedRange === null) {
194
+ return [];
195
+ }
196
+ var rangeStart = resolvedRange.start, rangeEnd = resolvedRange.end;
197
+ if (rangeStart.getTime() > rangeEnd.getTime()) {
198
+ throw new Error("Resolved dateRange start must be less than or equal to resolved dateRange end.");
199
+ }
200
+ var rangeStartTime = rangeStart.getTime();
201
+ var rangeEndTime = rangeEnd.getTime();
202
+ var bucketMap = /* @__PURE__ */ new Map();
203
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
204
+ try {
205
+ for(var _iterator = normalizedRows[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
206
+ var normalizedRow = _step.value;
207
+ if (normalizedRow.bucketTime < rangeStartTime || normalizedRow.bucketTime > rangeEndTime) {
208
+ continue;
209
+ }
210
+ if (bucketMap.has(normalizedRow.isoDate)) {
211
+ throw new Error('Duplicate UTC bucket detected for "'.concat(dateKey, '": ').concat(normalizedRow.isoDate, ". Pre-aggregate or de-duplicate rows before calling fillMissingUtcBuckets."));
212
+ }
213
+ bucketMap.set(normalizedRow.isoDate, _object_spread_props(_object_spread({}, normalizedRow.row), _define_property({}, dateKey, normalizedRow.isoDate)));
214
+ }
215
+ } catch (err) {
216
+ _didIteratorError = true;
217
+ _iteratorError = err;
218
+ } finally{
219
+ try {
220
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
221
+ _iterator.return();
222
+ }
223
+ } finally{
224
+ if (_didIteratorError) {
225
+ throw _iteratorError;
226
+ }
227
+ }
228
+ }
229
+ var result = [];
230
+ var resolvedFillValues = fillValues === void 0 ? {} : fillValues;
231
+ var cursor = rangeStart;
232
+ while(cursor.getTime() <= rangeEndTime){
233
+ var isoDate1 = cursor.toISOString();
234
+ var existingRow = bucketMap.get(isoDate1);
235
+ if (existingRow) {
236
+ result.push(existingRow);
237
+ } else {
238
+ var valuesToFill = typeof resolvedFillValues === "function" ? resolvedFillValues({
239
+ isoDate: isoDate1,
240
+ date: new Date(cursor.getTime()),
241
+ unit: unit
242
+ }) : resolvedFillValues;
243
+ if (!_TimeSeriesBucketUtils.isRecord(valuesToFill)) {
244
+ throw new TypeError("fillValues function must return an object.");
245
+ }
246
+ result.push(_object_spread_props(_object_spread({}, valuesToFill), _define_property({}, dateKey, isoDate1)));
247
+ }
248
+ cursor = _TimeSeriesBucketUtils.addUtcBucketUnit(cursor, unit);
249
+ }
250
+ return result;
251
+ }
252
+ },
253
+ {
254
+ key: "resolveUtcBucketRange",
255
+ value: function resolveUtcBucketRange(minBucketTime, maxBucketTime, unit, dateRange) {
256
+ var hasRows = minBucketTime !== void 0 && maxBucketTime !== void 0;
257
+ if (dateRange === void 0) {
258
+ if (!hasRows) {
259
+ return null;
260
+ }
261
+ return {
262
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
263
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
264
+ };
265
+ }
266
+ var _dateRange = _sliced_to_array(dateRange, 2), left = _dateRange[0], right = _dateRange[1];
267
+ var hasLeft = left !== null && left !== void 0;
268
+ var hasRight = right !== null && right !== void 0;
269
+ if (!hasLeft && !hasRight) {
270
+ if (!hasRows) {
271
+ return null;
272
+ }
273
+ return {
274
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
275
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
276
+ };
277
+ }
278
+ if (hasLeft && hasRight) {
279
+ var leftBucket = _TimeSeriesBucketUtils.startOfUtcBucket(left, unit, "dateRange[0]");
280
+ var rightBucket = _TimeSeriesBucketUtils.startOfUtcBucket(right, unit, "dateRange[1]");
281
+ if (leftBucket.getTime() <= rightBucket.getTime()) {
282
+ return {
283
+ start: leftBucket,
284
+ end: rightBucket
285
+ };
286
+ }
287
+ return {
288
+ start: rightBucket,
289
+ end: leftBucket
290
+ };
291
+ }
292
+ if (hasLeft) {
293
+ if (!hasRows) {
294
+ throw new Error("dateRange[1] is nullish, so rows are required to infer dateRange end.");
295
+ }
296
+ return {
297
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(left, unit, "dateRange[0]"),
298
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
299
+ };
300
+ }
301
+ if (!hasRows) {
302
+ throw new Error("dateRange[0] is nullish, so rows are required to infer dateRange start.");
303
+ }
304
+ return {
305
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
306
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(right, unit, "dateRange[1]")
307
+ };
308
+ }
309
+ },
310
+ {
311
+ key: "startOfUtcBucket",
312
+ value: function startOfUtcBucket(value, unit, argumentName) {
313
+ var date = _TimeSeriesBucketUtils.toDate(value, argumentName);
314
+ var year = date.getUTCFullYear();
315
+ var month = date.getUTCMonth();
316
+ var day = date.getUTCDate();
317
+ var hour = date.getUTCHours();
318
+ var minute = date.getUTCMinutes();
319
+ var second = date.getUTCSeconds();
320
+ switch(unit){
321
+ case "year":
322
+ return new Date(Date.UTC(year, 0, 1, 0, 0, 0, 0));
323
+ case "quarter":
324
+ {
325
+ var quarterStartMonth = Math.floor(month / 3) * 3;
326
+ return new Date(Date.UTC(year, quarterStartMonth, 1, 0, 0, 0, 0));
327
+ }
328
+ case "month":
329
+ return new Date(Date.UTC(year, month, 1, 0, 0, 0, 0));
330
+ case "week":
331
+ {
332
+ var dayOfWeek = new Date(Date.UTC(year, month, day)).getUTCDay();
333
+ var daysSinceMonday = (dayOfWeek + 6) % 7;
334
+ return new Date(Date.UTC(year, month, day - daysSinceMonday, 0, 0, 0, 0));
335
+ }
336
+ case "day":
337
+ return new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
338
+ case "hour":
339
+ return new Date(Date.UTC(year, month, day, hour, 0, 0, 0));
340
+ case "minute":
341
+ return new Date(Date.UTC(year, month, day, hour, minute, 0, 0));
342
+ case "second":
343
+ return new Date(Date.UTC(year, month, day, hour, minute, second, 0));
344
+ }
345
+ }
346
+ },
347
+ {
348
+ key: "addUtcBucketUnit",
349
+ value: function addUtcBucketUnit(date, unit) {
350
+ var next = new Date(date.getTime());
351
+ switch(unit){
352
+ case "year":
353
+ next.setUTCFullYear(next.getUTCFullYear() + 1);
354
+ break;
355
+ case "quarter":
356
+ next.setUTCMonth(next.getUTCMonth() + 3);
357
+ break;
358
+ case "month":
359
+ next.setUTCMonth(next.getUTCMonth() + 1);
360
+ break;
361
+ case "week":
362
+ next.setUTCDate(next.getUTCDate() + 7);
363
+ break;
364
+ case "day":
365
+ next.setUTCDate(next.getUTCDate() + 1);
366
+ break;
367
+ case "hour":
368
+ next.setUTCHours(next.getUTCHours() + 1);
369
+ break;
370
+ case "minute":
371
+ next.setUTCMinutes(next.getUTCMinutes() + 1);
372
+ break;
373
+ case "second":
374
+ next.setUTCSeconds(next.getUTCSeconds() + 1);
375
+ break;
376
+ }
377
+ return _TimeSeriesBucketUtils.startOfUtcBucket(next, unit, "date");
378
+ }
379
+ },
380
+ {
381
+ key: "toDate",
382
+ value: function toDate(value, argumentName) {
383
+ var isSupportedDateInput = typeof value === "string" || typeof value === "number" || _instanceof(value, Date);
384
+ if (!isSupportedDateInput) {
385
+ throw new TypeError("".concat(argumentName, " must be a string, number timestamp, or Date instance."));
386
+ }
387
+ var date = _instanceof(value, Date) ? new Date(value.getTime()) : new Date(value);
388
+ if (Number.isNaN(date.getTime())) {
389
+ throw new Error("".concat(argumentName, " must be a valid date value."));
390
+ }
391
+ return date;
392
+ }
393
+ },
394
+ {
395
+ key: "assertDateBucketUnit",
396
+ value: function assertDateBucketUnit(unit) {
397
+ if (!_TimeSeriesBucketUtils.DATE_BUCKET_UNITS.includes(unit)) {
398
+ throw new TypeError("unit must be one of: ".concat(_TimeSeriesBucketUtils.DATE_BUCKET_UNITS.join(", "), "."));
399
+ }
400
+ }
401
+ },
402
+ {
403
+ key: "assertDateRange",
404
+ value: function assertDateRange(dateRange) {
405
+ if (!Array.isArray(dateRange) || dateRange.length !== 2) {
406
+ throw new TypeError("dateRange must be a tuple with exactly two items.");
407
+ }
408
+ }
409
+ },
410
+ {
411
+ key: "isRecord",
412
+ value: function isRecord(value) {
413
+ return (typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && value !== null && !Array.isArray(value);
414
+ }
415
+ }
416
+ ]);
417
+ return _TimeSeriesBucketUtils;
418
+ }();
419
+ chunkQHUNR4O5_cjs.__publicField(_TimeSeriesBucketUtils, "DATE_BUCKET_UNITS", [
420
+ "year",
421
+ "quarter",
422
+ "month",
423
+ "week",
424
+ "day",
425
+ "hour",
426
+ "minute",
427
+ "second"
428
+ ]);
429
+ var TimeSeriesBucketUtils = _TimeSeriesBucketUtils;
430
+ exports.TimeSeriesBucketUtils = TimeSeriesBucketUtils;
@@ -0,0 +1,26 @@
1
+ import { FilledUtcBucketRow, FillMissingUtcBucketsOptions } from "./TimeSeriesBucketUtils.types.js";
2
+ export declare class TimeSeriesBucketUtils {
3
+ private static readonly DATE_BUCKET_UNITS;
4
+ /**
5
+ * 시계열 데이터에서 누락된 UTC bucket row를 채운다.
6
+ *
7
+ * 특징:
8
+ * - 모든 bucket 계산은 UTC 기준으로 처리한다.
9
+ * - 출력 dateKey 값은 항상 ISO 문자열이다.
10
+ * - dateRange가 없으면 rows 내 가장 과거/미래 bucket을 사용한다.
11
+ * - dateRange 양쪽 값이 모두 있으면 순서와 무관하게 더 과거 값이 start가 된다.
12
+ * - 동일 bucket으로 정규화되는 row가 2개 이상이면 throw 한다.
13
+ *
14
+ * 주의:
15
+ * - number date input은 JavaScript Date 생성자와 동일하게 millisecond timestamp로 처리된다.
16
+ * - string date input의 파싱은 new Date(value)에 위임한다.
17
+ */
18
+ static fillMissingUtcBuckets<T extends object, K extends Extract<keyof T, string>>(rows: readonly T[], options: FillMissingUtcBucketsOptions<T, K>): FilledUtcBucketRow<T, K>[];
19
+ private static resolveUtcBucketRange;
20
+ private static startOfUtcBucket;
21
+ private static addUtcBucketUnit;
22
+ private static toDate;
23
+ private static assertDateBucketUnit;
24
+ private static assertDateRange;
25
+ private static isRecord;
26
+ }
@@ -0,0 +1,430 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _class_call_check(instance, Constructor) {
10
+ if (!(instance instanceof Constructor)) {
11
+ throw new TypeError("Cannot call a class as a function");
12
+ }
13
+ }
14
+ function _defineProperties(target, props) {
15
+ for(var i = 0; i < props.length; i++){
16
+ var descriptor = props[i];
17
+ descriptor.enumerable = descriptor.enumerable || false;
18
+ descriptor.configurable = true;
19
+ if ("value" in descriptor) descriptor.writable = true;
20
+ Object.defineProperty(target, descriptor.key, descriptor);
21
+ }
22
+ }
23
+ function _create_class(Constructor, protoProps, staticProps) {
24
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
25
+ if (staticProps) _defineProperties(Constructor, staticProps);
26
+ return Constructor;
27
+ }
28
+ function _define_property(obj, key, value) {
29
+ if (key in obj) {
30
+ Object.defineProperty(obj, key, {
31
+ value: value,
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true
35
+ });
36
+ } else {
37
+ obj[key] = value;
38
+ }
39
+ return obj;
40
+ }
41
+ function _instanceof(left, right) {
42
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
43
+ return !!right[Symbol.hasInstance](left);
44
+ } else {
45
+ return left instanceof right;
46
+ }
47
+ }
48
+ function _iterable_to_array_limit(arr, i) {
49
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
50
+ if (_i == null) return;
51
+ var _arr = [];
52
+ var _n = true;
53
+ var _d = false;
54
+ var _s, _e;
55
+ try {
56
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
57
+ _arr.push(_s.value);
58
+ if (i && _arr.length === i) break;
59
+ }
60
+ } catch (err) {
61
+ _d = true;
62
+ _e = err;
63
+ } finally{
64
+ try {
65
+ if (!_n && _i["return"] != null) _i["return"]();
66
+ } finally{
67
+ if (_d) throw _e;
68
+ }
69
+ }
70
+ return _arr;
71
+ }
72
+ function _non_iterable_rest() {
73
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
74
+ }
75
+ function _object_spread(target) {
76
+ for(var i = 1; i < arguments.length; i++){
77
+ var source = arguments[i] != null ? arguments[i] : {};
78
+ var ownKeys = Object.keys(source);
79
+ if (typeof Object.getOwnPropertySymbols === "function") {
80
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
81
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
82
+ }));
83
+ }
84
+ ownKeys.forEach(function(key) {
85
+ _define_property(target, key, source[key]);
86
+ });
87
+ }
88
+ return target;
89
+ }
90
+ function ownKeys(object, enumerableOnly) {
91
+ var keys = Object.keys(object);
92
+ if (Object.getOwnPropertySymbols) {
93
+ var symbols = Object.getOwnPropertySymbols(object);
94
+ if (enumerableOnly) {
95
+ symbols = symbols.filter(function(sym) {
96
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
97
+ });
98
+ }
99
+ keys.push.apply(keys, symbols);
100
+ }
101
+ return keys;
102
+ }
103
+ function _object_spread_props(target, source) {
104
+ source = source != null ? source : {};
105
+ if (Object.getOwnPropertyDescriptors) {
106
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
107
+ } else {
108
+ ownKeys(Object(source)).forEach(function(key) {
109
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
110
+ });
111
+ }
112
+ return target;
113
+ }
114
+ function _sliced_to_array(arr, i) {
115
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
116
+ }
117
+ function _type_of(obj) {
118
+ "@swc/helpers - typeof";
119
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
120
+ }
121
+ function _unsupported_iterable_to_array(o, minLen) {
122
+ if (!o) return;
123
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
124
+ var n = Object.prototype.toString.call(o).slice(8, -1);
125
+ if (n === "Object" && o.constructor) n = o.constructor.name;
126
+ if (n === "Map" || n === "Set") return Array.from(n);
127
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
128
+ }
129
+ import { __publicField } from '../../chunk-S7EYY36U.js';
130
+ var _TimeSeriesBucketUtils = /*#__PURE__*/ function() {
131
+ "use strict";
132
+ function _TimeSeriesBucketUtils() {
133
+ _class_call_check(this, _TimeSeriesBucketUtils);
134
+ }
135
+ _create_class(_TimeSeriesBucketUtils, null, [
136
+ {
137
+ key: "fillMissingUtcBuckets",
138
+ value: /**
139
+ * 시계열 데이터에서 누락된 UTC bucket row를 채운다.
140
+ *
141
+ * 특징:
142
+ * - 모든 bucket 계산은 UTC 기준으로 처리한다.
143
+ * - 출력 dateKey 값은 항상 ISO 문자열이다.
144
+ * - dateRange가 없으면 rows 내 가장 과거/미래 bucket을 사용한다.
145
+ * - dateRange 양쪽 값이 모두 있으면 순서와 무관하게 더 과거 값이 start가 된다.
146
+ * - 동일 bucket으로 정규화되는 row가 2개 이상이면 throw 한다.
147
+ *
148
+ * 주의:
149
+ * - number date input은 JavaScript Date 생성자와 동일하게 millisecond timestamp로 처리된다.
150
+ * - string date input의 파싱은 new Date(value)에 위임한다.
151
+ */ function fillMissingUtcBuckets(rows, options) {
152
+ if (!Array.isArray(rows)) {
153
+ throw new TypeError("rows must be an array.");
154
+ }
155
+ if (!_TimeSeriesBucketUtils.isRecord(options)) {
156
+ throw new TypeError("options must be an object.");
157
+ }
158
+ var dateKey = options.dateKey, unit = options.unit, fillValues = options.fillValues, dateRange = options.dateRange;
159
+ if (typeof dateKey !== "string" || dateKey.length === 0) {
160
+ throw new TypeError("dateKey must be a non-empty string.");
161
+ }
162
+ _TimeSeriesBucketUtils.assertDateBucketUnit(unit);
163
+ if (dateRange !== void 0) {
164
+ _TimeSeriesBucketUtils.assertDateRange(dateRange);
165
+ }
166
+ if (fillValues !== void 0 && typeof fillValues !== "function" && !_TimeSeriesBucketUtils.isRecord(fillValues)) {
167
+ throw new TypeError("fillValues must be an object or a function.");
168
+ }
169
+ var normalizedRows = [];
170
+ var minBucketTime;
171
+ var maxBucketTime;
172
+ for(var index = 0; index < rows.length; index += 1){
173
+ var row = rows[index];
174
+ if (!_TimeSeriesBucketUtils.isRecord(row)) {
175
+ throw new TypeError("rows[".concat(index, "] must be an object."));
176
+ }
177
+ if (!(dateKey in row)) {
178
+ throw new Error("rows[".concat(index, '] does not have dateKey "').concat(dateKey, '".'));
179
+ }
180
+ var rawDate = row[dateKey];
181
+ var bucketDate = _TimeSeriesBucketUtils.startOfUtcBucket(rawDate, unit, "rows[".concat(index, "].").concat(dateKey));
182
+ var bucketTime = bucketDate.getTime();
183
+ var isoDate = bucketDate.toISOString();
184
+ normalizedRows.push({
185
+ row: row,
186
+ isoDate: isoDate,
187
+ bucketTime: bucketTime
188
+ });
189
+ minBucketTime = minBucketTime === void 0 ? bucketTime : Math.min(minBucketTime, bucketTime);
190
+ maxBucketTime = maxBucketTime === void 0 ? bucketTime : Math.max(maxBucketTime, bucketTime);
191
+ }
192
+ var resolvedRange = _TimeSeriesBucketUtils.resolveUtcBucketRange(minBucketTime, maxBucketTime, unit, dateRange);
193
+ if (resolvedRange === null) {
194
+ return [];
195
+ }
196
+ var rangeStart = resolvedRange.start, rangeEnd = resolvedRange.end;
197
+ if (rangeStart.getTime() > rangeEnd.getTime()) {
198
+ throw new Error("Resolved dateRange start must be less than or equal to resolved dateRange end.");
199
+ }
200
+ var rangeStartTime = rangeStart.getTime();
201
+ var rangeEndTime = rangeEnd.getTime();
202
+ var bucketMap = /* @__PURE__ */ new Map();
203
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
204
+ try {
205
+ for(var _iterator = normalizedRows[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
206
+ var normalizedRow = _step.value;
207
+ if (normalizedRow.bucketTime < rangeStartTime || normalizedRow.bucketTime > rangeEndTime) {
208
+ continue;
209
+ }
210
+ if (bucketMap.has(normalizedRow.isoDate)) {
211
+ throw new Error('Duplicate UTC bucket detected for "'.concat(dateKey, '": ').concat(normalizedRow.isoDate, ". Pre-aggregate or de-duplicate rows before calling fillMissingUtcBuckets."));
212
+ }
213
+ bucketMap.set(normalizedRow.isoDate, _object_spread_props(_object_spread({}, normalizedRow.row), _define_property({}, dateKey, normalizedRow.isoDate)));
214
+ }
215
+ } catch (err) {
216
+ _didIteratorError = true;
217
+ _iteratorError = err;
218
+ } finally{
219
+ try {
220
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
221
+ _iterator.return();
222
+ }
223
+ } finally{
224
+ if (_didIteratorError) {
225
+ throw _iteratorError;
226
+ }
227
+ }
228
+ }
229
+ var result = [];
230
+ var resolvedFillValues = fillValues === void 0 ? {} : fillValues;
231
+ var cursor = rangeStart;
232
+ while(cursor.getTime() <= rangeEndTime){
233
+ var isoDate1 = cursor.toISOString();
234
+ var existingRow = bucketMap.get(isoDate1);
235
+ if (existingRow) {
236
+ result.push(existingRow);
237
+ } else {
238
+ var valuesToFill = typeof resolvedFillValues === "function" ? resolvedFillValues({
239
+ isoDate: isoDate1,
240
+ date: new Date(cursor.getTime()),
241
+ unit: unit
242
+ }) : resolvedFillValues;
243
+ if (!_TimeSeriesBucketUtils.isRecord(valuesToFill)) {
244
+ throw new TypeError("fillValues function must return an object.");
245
+ }
246
+ result.push(_object_spread_props(_object_spread({}, valuesToFill), _define_property({}, dateKey, isoDate1)));
247
+ }
248
+ cursor = _TimeSeriesBucketUtils.addUtcBucketUnit(cursor, unit);
249
+ }
250
+ return result;
251
+ }
252
+ },
253
+ {
254
+ key: "resolveUtcBucketRange",
255
+ value: function resolveUtcBucketRange(minBucketTime, maxBucketTime, unit, dateRange) {
256
+ var hasRows = minBucketTime !== void 0 && maxBucketTime !== void 0;
257
+ if (dateRange === void 0) {
258
+ if (!hasRows) {
259
+ return null;
260
+ }
261
+ return {
262
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
263
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
264
+ };
265
+ }
266
+ var _dateRange = _sliced_to_array(dateRange, 2), left = _dateRange[0], right = _dateRange[1];
267
+ var hasLeft = left !== null && left !== void 0;
268
+ var hasRight = right !== null && right !== void 0;
269
+ if (!hasLeft && !hasRight) {
270
+ if (!hasRows) {
271
+ return null;
272
+ }
273
+ return {
274
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
275
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
276
+ };
277
+ }
278
+ if (hasLeft && hasRight) {
279
+ var leftBucket = _TimeSeriesBucketUtils.startOfUtcBucket(left, unit, "dateRange[0]");
280
+ var rightBucket = _TimeSeriesBucketUtils.startOfUtcBucket(right, unit, "dateRange[1]");
281
+ if (leftBucket.getTime() <= rightBucket.getTime()) {
282
+ return {
283
+ start: leftBucket,
284
+ end: rightBucket
285
+ };
286
+ }
287
+ return {
288
+ start: rightBucket,
289
+ end: leftBucket
290
+ };
291
+ }
292
+ if (hasLeft) {
293
+ if (!hasRows) {
294
+ throw new Error("dateRange[1] is nullish, so rows are required to infer dateRange end.");
295
+ }
296
+ return {
297
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(left, unit, "dateRange[0]"),
298
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(maxBucketTime, unit, "inferred dateRange end")
299
+ };
300
+ }
301
+ if (!hasRows) {
302
+ throw new Error("dateRange[0] is nullish, so rows are required to infer dateRange start.");
303
+ }
304
+ return {
305
+ start: _TimeSeriesBucketUtils.startOfUtcBucket(minBucketTime, unit, "inferred dateRange start"),
306
+ end: _TimeSeriesBucketUtils.startOfUtcBucket(right, unit, "dateRange[1]")
307
+ };
308
+ }
309
+ },
310
+ {
311
+ key: "startOfUtcBucket",
312
+ value: function startOfUtcBucket(value, unit, argumentName) {
313
+ var date = _TimeSeriesBucketUtils.toDate(value, argumentName);
314
+ var year = date.getUTCFullYear();
315
+ var month = date.getUTCMonth();
316
+ var day = date.getUTCDate();
317
+ var hour = date.getUTCHours();
318
+ var minute = date.getUTCMinutes();
319
+ var second = date.getUTCSeconds();
320
+ switch(unit){
321
+ case "year":
322
+ return new Date(Date.UTC(year, 0, 1, 0, 0, 0, 0));
323
+ case "quarter":
324
+ {
325
+ var quarterStartMonth = Math.floor(month / 3) * 3;
326
+ return new Date(Date.UTC(year, quarterStartMonth, 1, 0, 0, 0, 0));
327
+ }
328
+ case "month":
329
+ return new Date(Date.UTC(year, month, 1, 0, 0, 0, 0));
330
+ case "week":
331
+ {
332
+ var dayOfWeek = new Date(Date.UTC(year, month, day)).getUTCDay();
333
+ var daysSinceMonday = (dayOfWeek + 6) % 7;
334
+ return new Date(Date.UTC(year, month, day - daysSinceMonday, 0, 0, 0, 0));
335
+ }
336
+ case "day":
337
+ return new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
338
+ case "hour":
339
+ return new Date(Date.UTC(year, month, day, hour, 0, 0, 0));
340
+ case "minute":
341
+ return new Date(Date.UTC(year, month, day, hour, minute, 0, 0));
342
+ case "second":
343
+ return new Date(Date.UTC(year, month, day, hour, minute, second, 0));
344
+ }
345
+ }
346
+ },
347
+ {
348
+ key: "addUtcBucketUnit",
349
+ value: function addUtcBucketUnit(date, unit) {
350
+ var next = new Date(date.getTime());
351
+ switch(unit){
352
+ case "year":
353
+ next.setUTCFullYear(next.getUTCFullYear() + 1);
354
+ break;
355
+ case "quarter":
356
+ next.setUTCMonth(next.getUTCMonth() + 3);
357
+ break;
358
+ case "month":
359
+ next.setUTCMonth(next.getUTCMonth() + 1);
360
+ break;
361
+ case "week":
362
+ next.setUTCDate(next.getUTCDate() + 7);
363
+ break;
364
+ case "day":
365
+ next.setUTCDate(next.getUTCDate() + 1);
366
+ break;
367
+ case "hour":
368
+ next.setUTCHours(next.getUTCHours() + 1);
369
+ break;
370
+ case "minute":
371
+ next.setUTCMinutes(next.getUTCMinutes() + 1);
372
+ break;
373
+ case "second":
374
+ next.setUTCSeconds(next.getUTCSeconds() + 1);
375
+ break;
376
+ }
377
+ return _TimeSeriesBucketUtils.startOfUtcBucket(next, unit, "date");
378
+ }
379
+ },
380
+ {
381
+ key: "toDate",
382
+ value: function toDate(value, argumentName) {
383
+ var isSupportedDateInput = typeof value === "string" || typeof value === "number" || _instanceof(value, Date);
384
+ if (!isSupportedDateInput) {
385
+ throw new TypeError("".concat(argumentName, " must be a string, number timestamp, or Date instance."));
386
+ }
387
+ var date = _instanceof(value, Date) ? new Date(value.getTime()) : new Date(value);
388
+ if (Number.isNaN(date.getTime())) {
389
+ throw new Error("".concat(argumentName, " must be a valid date value."));
390
+ }
391
+ return date;
392
+ }
393
+ },
394
+ {
395
+ key: "assertDateBucketUnit",
396
+ value: function assertDateBucketUnit(unit) {
397
+ if (!_TimeSeriesBucketUtils.DATE_BUCKET_UNITS.includes(unit)) {
398
+ throw new TypeError("unit must be one of: ".concat(_TimeSeriesBucketUtils.DATE_BUCKET_UNITS.join(", "), "."));
399
+ }
400
+ }
401
+ },
402
+ {
403
+ key: "assertDateRange",
404
+ value: function assertDateRange(dateRange) {
405
+ if (!Array.isArray(dateRange) || dateRange.length !== 2) {
406
+ throw new TypeError("dateRange must be a tuple with exactly two items.");
407
+ }
408
+ }
409
+ },
410
+ {
411
+ key: "isRecord",
412
+ value: function isRecord(value) {
413
+ return (typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && value !== null && !Array.isArray(value);
414
+ }
415
+ }
416
+ ]);
417
+ return _TimeSeriesBucketUtils;
418
+ }();
419
+ __publicField(_TimeSeriesBucketUtils, "DATE_BUCKET_UNITS", [
420
+ "year",
421
+ "quarter",
422
+ "month",
423
+ "week",
424
+ "day",
425
+ "hour",
426
+ "minute",
427
+ "second"
428
+ ]);
429
+ var TimeSeriesBucketUtils = _TimeSeriesBucketUtils;
430
+ export { TimeSeriesBucketUtils };
@@ -0,0 +1 @@
1
+ 'use strict';
@@ -0,0 +1,41 @@
1
+ export type DateBucketUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second';
2
+ export type DateBucketInput = string | number | Date;
3
+ export type DateBucketRange = readonly [
4
+ DateBucketInput | null | undefined,
5
+ DateBucketInput | null | undefined
6
+ ];
7
+ export type FilledUtcBucketRow<T extends object, K extends Extract<keyof T, string>> = Omit<Partial<T>, K> & Record<K, string>;
8
+ export interface FillMissingUtcBucketsOptions<T extends object, K extends Extract<keyof T, string>> {
9
+ /**
10
+ * 날짜 값이 들어있는 row field key.
11
+ *
12
+ * 해당 field value는 runtime 기준 string | number | Date 여야 한다.
13
+ */
14
+ dateKey: K;
15
+ /**
16
+ * UTC 기준 bucket 단위.
17
+ */
18
+ unit: DateBucketUnit;
19
+ /**
20
+ * 누락된 bucket row에 채워 넣을 값.
21
+ *
22
+ * 예:
23
+ * { count: 0 }
24
+ */
25
+ fillValues?: Omit<Partial<T>, K> | ((context: {
26
+ isoDate: string;
27
+ date: Date;
28
+ unit: DateBucketUnit;
29
+ }) => Omit<Partial<T>, K>);
30
+ /**
31
+ * 출력할 bucket range.
32
+ *
33
+ * - [a, b]: 순서와 무관하게 더 과거 값이 start, 더 미래 값이 end
34
+ * - [null, b] 또는 [undefined, b]: b를 end로 사용하고 start는 rows에서 추론
35
+ * - [a, null] 또는 [a, undefined]: a를 start로 사용하고 end는 rows에서 추론
36
+ * - 생략 또는 [null, undefined]: start/end 모두 rows에서 추론
37
+ *
38
+ * number는 JavaScript Date 생성자와 동일하게 millisecond timestamp로 처리된다.
39
+ */
40
+ dateRange?: DateBucketRange;
41
+ }
@@ -3,6 +3,7 @@ var global = require('./global');
3
3
  var ArrayUtils = require('./ArrayUtils');
4
4
  var AxiosUtils = require('./AxiosUtils');
5
5
  var StringUtils = require('./StringUtils');
6
+ var TimeSeriesBucketUtils = require('./TimeSeriesBucketUtils');
6
7
  var Uint8ArrayUtils = require('./Uint8ArrayUtils');
7
8
  var UuidUtils = require('./UuidUtils');
8
9
  var BooleanUtils = require('./BooleanUtils');
@@ -55,6 +56,14 @@ Object.keys(StringUtils).forEach(function(k) {
55
56
  }
56
57
  });
57
58
  });
59
+ Object.keys(TimeSeriesBucketUtils).forEach(function(k) {
60
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
61
+ enumerable: true,
62
+ get: function get() {
63
+ return TimeSeriesBucketUtils[k];
64
+ }
65
+ });
66
+ });
58
67
  Object.keys(Uint8ArrayUtils).forEach(function(k) {
59
68
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
60
69
  enumerable: true,
@@ -2,6 +2,8 @@ export * from './global/index.js';
2
2
  export * from './ArrayUtils.js';
3
3
  export * from './AxiosUtils.js';
4
4
  export * from './StringUtils.js';
5
+ export * from "./TimeSeriesBucketUtils.js";
6
+ export type * from "./TimeSeriesBucketUtils.types.js";
5
7
  export * from './Uint8ArrayUtils.js';
6
8
  export * from './UuidUtils.js';
7
9
  export * from './BooleanUtils.js';
@@ -2,6 +2,7 @@ export * from './global/index.js';
2
2
  export * from './ArrayUtils.js';
3
3
  export * from './AxiosUtils.js';
4
4
  export * from './StringUtils.js';
5
+ export * from './TimeSeriesBucketUtils.js';
5
6
  export * from './Uint8ArrayUtils.js';
6
7
  export * from './UuidUtils.js';
7
8
  export * from './BooleanUtils.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powfix/core-js",
3
- "version": "0.30.1",
3
+ "version": "0.31.0",
4
4
  "description": "core package",
5
5
  "author": "Kwon Kyung-Min <powfix@gmail.com>",
6
6
  "private": false,