@powfix/core-js 0.9.24 → 0.9.26

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.
@@ -1,304 +0,0 @@
1
- import EventEmitter3 from 'eventemitter3';
2
-
3
- const LOG_TAG: string = 'TimeService';
4
-
5
- export enum TimeServiceStatus {
6
- STOPPED = 0,
7
- RUNNING = 1,
8
- }
9
-
10
- export enum TimeServiceEvent {
11
- SYNCED = 'SYNCED',
12
- SYNC_INTERVAL_CHANGED = 'SYNC_INTERVAL_CHANGED',
13
- }
14
-
15
- export class TimeService {
16
- private static readonly DEFAULT_SYNC_INTERVAL: number = 60000;
17
-
18
- protected status: TimeServiceStatus = TimeServiceStatus.STOPPED;
19
- private offset?: TimeService.Offset | undefined;
20
- private option: TimeService.Option;
21
- private syncedAt?: TimeService.TimeStamp | undefined;
22
-
23
- // Emitter
24
- private emitter = new EventEmitter3();
25
- public readonly on = this.emitter.on;
26
- public readonly off = this.emitter.off;
27
- private readonly emit = this.emitter.emit;
28
-
29
- public static calculateNTPResultOffset(ntpResult: TimeService.NTPResult): TimeService.Offset {
30
- const {t1, t2, t3, t4} = ntpResult;
31
- return ((t2 - t1) + (t3 - t4)) / 2;
32
- }
33
-
34
- constructor(option: TimeService.Option) {
35
- this.option = option;
36
-
37
- if (option.autoStart) {
38
- this.start();
39
- }
40
-
41
- // Binding
42
- this.start = this.start.bind(this);
43
- this.stop = this.stop.bind(this);
44
- this.sync = this.sync.bind(this);
45
- this.getOption = this.getOption.bind(this);
46
- this.setOption = this.setOption.bind(this);
47
- }
48
-
49
- public getOption(): TimeService.Option {
50
- return this.option;
51
- }
52
-
53
- public setOption(option: TimeService.Option): TimeService.Option {
54
- return this.option = option;
55
- }
56
-
57
- public getOffset(defaultValue: TimeService.Offset): TimeService.Offset;
58
- public getOffset(): TimeService.Offset | undefined;
59
- public getOffset(defaultValue?: TimeService.Offset): TimeService.Offset | undefined {
60
- if (this.offset !== undefined) {
61
- return this.offset;
62
- }
63
- if (defaultValue !== undefined) {
64
- return defaultValue;
65
- }
66
- return undefined;
67
- }
68
-
69
- public setOffset(offset: TimeService.Offset): TimeService.Offset
70
- public setOffset(offset: TimeService.Offset | undefined): TimeService.Offset
71
- public setOffset(offset?: TimeService.Offset): TimeService.Offset | undefined {
72
- return this.offset = offset;
73
- }
74
-
75
- public getSyncedAt(): TimeService.TimeStamp | undefined {
76
- return this.syncedAt;
77
- }
78
-
79
- private setSyncedAt(syncedAt: TimeService.TimeStamp | undefined): TimeService.TimeStamp | undefined {
80
- this.syncedAt = syncedAt;
81
-
82
- // Emit
83
- this.emit(TimeServiceEvent.SYNCED, syncedAt);
84
-
85
- return syncedAt;
86
- }
87
-
88
- public getSyncInterval(): number | null {
89
- if (this.option.syncInterval === undefined) {
90
- // If option is undefined using default value
91
- return TimeService.DEFAULT_SYNC_INTERVAL;
92
- }
93
-
94
- if (this.option.syncInterval === null || this.option.syncInterval === -1) {
95
- // If option is null, do not sync automatically
96
- return null;
97
- }
98
-
99
- return this.option.syncInterval;
100
- }
101
-
102
- public setSyncInterval(interval: TimeService.Option['syncInterval']) {
103
- this.option.syncInterval = interval;
104
-
105
- // Emit
106
- this.emit(TimeServiceEvent.SYNC_INTERVAL_CHANGED, interval);
107
-
108
- if (this.status === TimeServiceStatus.RUNNING) {
109
- if (this.syncHandler !== undefined) {
110
- this.stopSync();
111
- this.startSync();
112
- }
113
- }
114
- }
115
-
116
- public getClientTime(defaultValue: TimeService.TimeStamp = Date.now()): TimeService.TimeStamp {
117
- try {
118
- if (typeof this.option.clientTimeProvider === 'function') {
119
- return this.option.clientTimeProvider();
120
- }
121
- } catch (e) {
122
- console.error(e);
123
- }
124
- return defaultValue;
125
- }
126
-
127
- public getServerTime(): TimeService.TimeStamp | null {
128
- const offset = this.getOffset();
129
- if (offset === undefined) {
130
- return null;
131
- }
132
-
133
- const clientTime = this.getClientTime();
134
- return clientTime + offset;
135
- }
136
-
137
- public getTime(): number {
138
- return this.getServerTime() || this.getClientTime();
139
- }
140
-
141
- private readonly fetchServerNTPResult = async (t1: TimeService.NTPResult['t1']): Promise<TimeService.ServerNTPResult | null> => {
142
- try {
143
- if (typeof this.option.serverTimeProvider === 'function') {
144
- return await this.option.serverTimeProvider(t1);
145
- }
146
- } catch (e) {
147
- console.error(e);
148
- }
149
- return null;
150
- }
151
-
152
- public getStatus(): TimeServiceStatus {
153
- return this.status;
154
- }
155
-
156
- public start() {
157
- if (this.status !== TimeServiceStatus.STOPPED) {
158
- console.warn(LOG_TAG, 'service is not stopped');
159
- return;
160
- }
161
-
162
- // Change status
163
- this.status = TimeServiceStatus.RUNNING;
164
-
165
- // Sync immediately
166
- this.sync().finally(() => {});
167
-
168
- // Start sync
169
- this.startSync();
170
- }
171
-
172
- public stop() {
173
- if (this.status !== TimeServiceStatus.RUNNING) {
174
- console.warn(LOG_TAG, 'service is not running');
175
- return;
176
- }
177
-
178
- // Change status
179
- this.status = TimeServiceStatus.RUNNING;
180
-
181
- // Stop sync
182
- this.stopSync();
183
-
184
- // Reset offset
185
- this.setOffset(undefined);
186
-
187
- // Reset synced at
188
- this.setSyncedAt(undefined);
189
- }
190
-
191
- public async sync(): Promise<TimeService.Offset | null> {
192
- try {
193
- // T1 (Client Request Time)
194
- const requestedAt: number = Date.now();
195
-
196
- // Fetch server time from server
197
- const serverNtpResult = await this.fetchServerNTPResult(requestedAt);
198
-
199
- // Check is null
200
- if (serverNtpResult === null) {
201
- console.warn(LOG_TAG, 'Failed to get server time');
202
- return null;
203
- }
204
-
205
- // T2 (Server Receive Time)
206
- const {t2} = serverNtpResult;
207
-
208
- // Check is not a number
209
- if (isNaN(Number(t2))) {
210
- // Not a Number
211
- console.error(LOG_TAG, 'invalid server time(t2), not a number', t2);
212
- return null;
213
- }
214
-
215
- // T3 (Server Transmit Time)
216
- const {t3} = serverNtpResult;
217
-
218
- // Check is not a number
219
- if (isNaN(Number(t3))) {
220
- // Not a Number
221
- console.error(LOG_TAG, 'invalid server time(t2), not a number', t2);
222
- return null;
223
- }
224
-
225
- // T4 (Client Receive Time)
226
- const receivedAt: number = Date.now();
227
-
228
- const ntpResult: TimeService.NTPResult = {
229
- t1: requestedAt,
230
- t2: t2,
231
- t3: t3,
232
- t4: receivedAt,
233
- };
234
-
235
- // Calculate offset
236
- const offset = TimeService.calculateNTPResultOffset(ntpResult);
237
-
238
- // Save calculated offset
239
- this.setOffset(offset);
240
-
241
- // Mark synced timestamp
242
- this.setSyncedAt(Date.now());
243
- } catch (e) {
244
- console.error(e);
245
- }
246
-
247
- return null;
248
- }
249
-
250
- private syncHandler?: ReturnType<typeof setInterval> | undefined;
251
- private startSync() {
252
- if (this.syncHandler !== undefined) {
253
- console.warn('sync handler is not undefined', this.syncHandler);
254
- return;
255
- }
256
-
257
- const syncInterval = this.getSyncInterval();
258
- if (syncInterval === null) {
259
- return;
260
- }
261
-
262
- this.syncHandler = setInterval(this.sync, syncInterval);
263
- };
264
-
265
- private stopSync() {
266
- if (this.syncHandler === undefined) {
267
- return;
268
- }
269
- clearInterval(this.syncHandler);
270
- this.syncHandler = undefined;
271
- };
272
- }
273
-
274
- export namespace TimeService {
275
- export type Offset = number;
276
- export type TimeStamp = number;
277
-
278
- export interface NTPResult {
279
- // T1 (Client Request Time)
280
- t1: TimeStamp;
281
-
282
- // T2 (Server Receive Time)
283
- t2: TimeStamp;
284
-
285
- // T3 (Server Transmit Time)
286
- t3: TimeStamp;
287
-
288
- // T4 (Client Receive Time)
289
- t4: TimeStamp;
290
- }
291
-
292
- export interface ServerNTPResult extends Pick<NTPResult, 't2' | 't3'> {}
293
-
294
- export type ClientTimeProvider = () => TimeStamp;
295
- // export type ServerTimeProvider = ((t1: NTPResult['t1']) => ServerNTPResult) | ((t1: NTPResult['t1']) => Promise<ServerNTPResult>);
296
- export type ServerTimeProvider = (t1: NTPResult['t1']) => (ServerNTPResult | null) | (Promise<ServerNTPResult | null>);
297
-
298
- export interface Option {
299
- autoStart?: boolean;
300
- syncInterval?: number | null | undefined; // Sync interval in milliseconds
301
- clientTimeProvider?: ClientTimeProvider | undefined;
302
- serverTimeProvider?: ServerTimeProvider | undefined;
303
- }
304
- }
@@ -1 +0,0 @@
1
- export * from "./TimeService";
@@ -1,5 +0,0 @@
1
- type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N
2
- ? Acc[number]
3
- : Enumerate<N, [...Acc, Acc['length']]>
4
-
5
- export type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>> | T;
@@ -1,25 +0,0 @@
1
- export class ArrayUtils {
2
-
3
- /**
4
- * 객체를 요소로 가지는 배열에서 가장 큰 값(Property)를 가지는 객체를 반환한다
5
- * @param e 객체 배열
6
- * @param key 값을 비교할 Property 키
7
- */
8
- static getGreatestObject(e: any[], key: string) {
9
- return e.reduce((prev, current) => (
10
- (prev[key] > current[key] ? prev : current)
11
- ));
12
- }
13
-
14
- static removeDuplicate<T>(arr: T[]): T[] {
15
- return [...new Set(arr)]
16
- }
17
-
18
- static removeObjectDuplicate(arr: any[], key: string) {
19
- return arr.filter((v, i, self) => (
20
- i === self.findIndex(e => (
21
- e[key] === v[key]
22
- ))
23
- ))
24
- }
25
- }
@@ -1,4 +0,0 @@
1
- export function parseBoolean(value: any, defaultValue: boolean): boolean {
2
- if (value === undefined || value === null) return defaultValue;
3
- return (value === 'true' || value === true) || (value === 1 || value === '1');
4
- }
@@ -1,50 +0,0 @@
1
- import {Coordinate} from "../interfaces/Coordinate";
2
-
3
- export class CoordinateUtils {
4
- public static isValidLatitude(latitude: Coordinate['latitude'] | string) {
5
- return /^-?([0-8]?[0-9]|90)(\.[0-9]{1,15})$/.test(latitude.toString());
6
- }
7
-
8
- public static isValidLongitude(longitude: Coordinate['longitude'] | string) {
9
- return /^-?([0-9]{1,2}|1[0-7][0-9]|180)(\.[0-9]{1,14})$/.test(longitude.toString());
10
- }
11
-
12
- public static isValidLatitudeLongitude(latitude: Coordinate['latitude'] | string, longitude: Coordinate['longitude'] | string) {
13
- return CoordinateUtils.isValidLatitude(latitude) && CoordinateUtils.isValidLongitude(longitude);
14
- }
15
-
16
- public static isValidCoordinate(coordinate: Coordinate): boolean {
17
- return this.isValidLatitudeLongitude(coordinate.latitude, coordinate.longitude);
18
- }
19
-
20
- public static crowDistance(...coordinates: Coordinate[]): number {
21
- if (coordinates.length <= 2) {
22
- const toRad = (value: number) => value * Math.PI / 180;
23
-
24
- const c1 = coordinates[0];
25
- const c2 = coordinates[1];
26
- if (!c1 || !c2) {
27
- return 0;
28
- }
29
-
30
- const R = 6371e3;
31
- const dLat = toRad(c2.latitude - c1.latitude);
32
- const dLon = toRad(c2.longitude - c1.longitude);
33
- const lat1 = toRad(c1.latitude);
34
- const lat2 = toRad(c2.latitude);
35
-
36
- const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
37
- Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
38
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
39
-
40
- return R * c;
41
- }
42
-
43
- let totalDistance: number = 0;
44
- for (let i = 0; i < coordinates.length - 1; ++i) {
45
- totalDistance += this.crowDistance(coordinates[i], coordinates[i + 1]);
46
- }
47
-
48
- return totalDistance;
49
- }
50
- }
@@ -1,213 +0,0 @@
1
- import moment, {Moment, MomentInput, RelativeTimeSpec} from "moment";
2
-
3
- export class DateUtils {
4
- public static relativeDate = (input: MomentInput, from: MomentInput = Date.now()): string => {
5
- // Create new moment instance to apply new locale
6
- const datetime = moment.isMoment(input) ? moment(input.toDate()) : moment(input);
7
-
8
- if (!datetime.isValid()) {
9
- console.error('core-js:DateUtils.relativeDate() datetime is invalid', datetime);
10
- return '<INVALID DATE>';
11
- }
12
-
13
- return datetime.from(from);
14
- };
15
-
16
- public static setLocale = (language: DateUtils.Locale) => {
17
- const relativeTime = DateUtils.getRelativeTimeSpec(language);
18
- if (relativeTime !== undefined) {
19
- moment.updateLocale(language, {relativeTime});
20
- }
21
- moment.locale(language);
22
- };
23
-
24
- private static getRelativeTimeSpec = (locale: DateUtils.Locale): RelativeTimeSpec | undefined => {
25
- if (locale in DateUtils.relativeTimeSpecs) {
26
- return DateUtils.relativeTimeSpecs[locale];
27
- }
28
- return undefined;
29
- };
30
- }
31
-
32
- export namespace DateUtils {
33
- export type Locale = string;
34
-
35
- export const relativeTimeSpecs: {[key: Locale]: RelativeTimeSpec} = {
36
- ko: {
37
- future: "%s 후",
38
- past: "%s 전",
39
- s: number => `${number}초`,
40
- ss: number => `${number}초`,
41
- m: number => `${number}분`,
42
- mm: number => `${number}분`,
43
- h: number => `${number}시간`,
44
- hh: number => `${number}시간`,
45
- d: number => `${number}일`,
46
- dd: number => `${number}일`,
47
- M: number => `${number}개월`,
48
- MM: number => `${number}개월`,
49
- y: number => `${number}년`,
50
- yy: number => `${number}년`
51
- } as RelativeTimeSpec,
52
- en: {
53
- future: "in %s",
54
- past: "%s ago",
55
- s: number => number === 1 ? `${number} second`: `${number} seconds`,
56
- ss: number => `${number} seconds`,
57
- m: number => number === 1 ? `${number} minute`: `${number} minutes`,
58
- mm: number => `${number} minutes`,
59
- h: number => number === 1 ? `${number} hour`: `${number} hours`,
60
- hh: number => `${number} hours`,
61
- d: number => number === 1 ? `${number} day`: `${number} days`,
62
- dd: number => `${number} days`,
63
- M: number => number === 1 ? `${number} month`: `${number} months`,
64
- MM: number => `${number} months`,
65
- y: number => number === 1 ? `${number} year`: `${number} years`,
66
- yy: number => `${number} years`
67
- } as RelativeTimeSpec,
68
- ja: {
69
- future: "%s後",
70
- past: "%s前",
71
- s: number => `${number}秒`,
72
- ss: number => `${number}秒`,
73
- m: number => `${number}分`,
74
- mm: number => `${number}分`,
75
- h: number => `${number}時`,
76
- hh: number => `${number}時`,
77
- d: number => `${number}日`,
78
- dd: number => `${number}日`,
79
- M: number => `${number}月`,
80
- MM: number => `${number}月`,
81
- y: number => `${number}年`,
82
- yy: number => `${number}年`
83
- } as RelativeTimeSpec,
84
- zh: {
85
- future: "%s后",
86
- past: "%s前",
87
- s: number => `${number}秒`,
88
- ss: number => `${number}秒`,
89
- m: number => `${number}分钟`,
90
- mm: number => `${number}分钟`,
91
- h: number => `${number}个小时`,
92
- hh: number => `${number}个小时`,
93
- d: number => `${number}天`,
94
- dd: number => `${number}天`,
95
- M: number => `${number}个月`,
96
- MM: number => `${number}个月`,
97
- y: number => `${number}年`,
98
- yy: number => `${number}年`
99
- } as RelativeTimeSpec,
100
- ru: {
101
- future: "через %s",
102
- past: "%s назад",
103
- s: number => `${number} секунд`,
104
- ss: number => `${number} секунд`,
105
- m: number => `${number} минута`,
106
- mm: number => `${number} минут`,
107
- h: number => `${number} час`,
108
- hh: number => `${number} часов`,
109
- d: number => `${number} день`,
110
- dd: number => `${number} дней`,
111
- M: number => `${number} месяц`,
112
- MM: number => `${number} месяцев`,
113
- y: number => `${number} год`,
114
- yy: number => `${number} лет`
115
- } as RelativeTimeSpec,
116
- uz: {
117
- future: "%sdan keyin",
118
- past: "%s avval",
119
- s: number => `${number} soniya`,
120
- ss: number => `${number} soniya`,
121
- m: number => `${number} daqiqa`,
122
- mm: number => `${number} daqiqa`,
123
- h: number => `${number} soat`,
124
- hh: number => `${number} soat`,
125
- d: number => `${number} kun`,
126
- dd: number => `${number} kun`,
127
- M: number => `${number} oy`,
128
- MM: number => `${number} oy`,
129
- y: number => `${number} yil`,
130
- yy: number => `${number} yil`
131
- } as RelativeTimeSpec,
132
- de: {
133
- future: "in %s",
134
- past: "vor %s",
135
- s: number => `${number === 1 ? "einer" : number} Sekunde${number === 1 ? "" : "n"}`,
136
- ss: number => `${number} Sekunde${number === 1 ? "" : "n"}`,
137
- m: number => `${number === 1 ? "einer" : number} Minute${number === 1 ? "" : "n"}`,
138
- mm: number => `${number} Minute${number === 1 ? "" : "n"}`,
139
- h: number => `${number === 1 ? "einer" : number} Stunde${number === 1 ? "" : "n"}`,
140
- hh: number => `${number} Stunde${number === 1 ? "" : "n"}`,
141
- d: number => `${number === 1 ? "einem" : number} Tag${number === 1 ? "" : "en"}`,
142
- dd: number => `${number} Tag${number === 1 ? "" : "en"}`,
143
- M: number => `${number === 1 ? "einem" : number} Monat${number === 1 ? "" : "en"}`,
144
- MM: number => `${number} Monat${number === 1 ? "" : "en"}`,
145
- y: number => `${number === 1 ? "einem" : number} Jahr${number === 1 ? "" : "en"}`,
146
- yy: number => `${number} Jahr${number === 1 ? "" : "en"}`
147
- } as RelativeTimeSpec,
148
- fr: {
149
- future: "dans %s",
150
- past: "il y a %s",
151
- s: number => `quelques secondes`,
152
- ss: number => `${number} secondes`,
153
- m: number => `une minute`,
154
- mm: number => `${number} minutes`,
155
- h: number => `une heure`,
156
- hh: number => `${number} heures`,
157
- d: number => `un jour`,
158
- dd: number => `${number} jours`,
159
- M: number => `un mois`,
160
- MM: number => `${number} mois`,
161
- y: number => `un an`,
162
- yy: number => `${number} ans`
163
- } as RelativeTimeSpec,
164
- vi: {
165
- future: "sau %s",
166
- past: "%s trước",
167
- s: number => `${number} giây`,
168
- ss: number => `${number} giây`,
169
- m: number => `${number} phút`,
170
- mm: number => `${number} phút`,
171
- h: number => `${number} giờ`,
172
- hh: number => `${number} giờ`,
173
- d: number => `${number} ngày`,
174
- dd: number => `${number} ngày`,
175
- M: number => `${number} tháng`,
176
- MM: number => `${number} tháng`,
177
- y: number => `${number} năm`,
178
- yy: number => `${number} năm`
179
- } as RelativeTimeSpec,
180
- th: {
181
- future: "ใน %s",
182
- past: "%s ที่แล้ว",
183
- s: number => `${number} วินาที`,
184
- ss: number => `${number} วินาที`,
185
- m: number => `${number} นาที`,
186
- mm: number => `${number} นาที`,
187
- h: number => `${number} ชั่วโมง`,
188
- hh: number => `${number} ชั่วโมง`,
189
- d: number => `${number} วัน`,
190
- dd: number => `${number} วัน`,
191
- M: number => `${number} เดือน`,
192
- MM: number => `${number} เดือน`,
193
- y: number => `${number} ปี`,
194
- yy: number => `${number} ปี`
195
- } as RelativeTimeSpec,
196
- fil: {
197
- future: "sa loob ng %s",
198
- past: "%s ang nakalipas",
199
- s: number => `${number} segundo`,
200
- ss: number => `${number} segundo`,
201
- m: number => `${number} minuto`,
202
- mm: number => `${number} minuto`,
203
- h: number => `${number} oras`,
204
- hh: number => `${number} oras`,
205
- d: number => `${number} araw`,
206
- dd: number => `${number} araw`,
207
- M: number => `${number} buwan`,
208
- MM: number => `${number} buwan`,
209
- y: number => `${number} taon`,
210
- yy: number => `${number} taon`
211
- } as RelativeTimeSpec,
212
- };
213
- }
@@ -1,47 +0,0 @@
1
- import {between} from "./global/between";
2
-
3
- export class JuminNumberUtils {
4
- public static calculateX(juminNumber: string): number {
5
- const replacedJuminNumber = juminNumber.replace(/\D/g, '');
6
- if (!between(replacedJuminNumber.length, 12, 13)) {
7
- throw new Error('Jumin number length must be 12 to 13(without dash)');
8
- }
9
-
10
- const numbers = replacedJuminNumber.split('').map(e => parseInt(e, 10));
11
- const sum = 2 * numbers[0] + 3 * numbers[1] + 4 * numbers[2] + 5 * numbers[3]
12
- + 6 * numbers[4] + 7 * numbers[5] + 8 * numbers[6] + 9 * numbers[7]
13
- + 2 * numbers[8] + 3 * numbers[9] + 4 * numbers[10] + 5 * numbers[11];
14
- return (11 - (sum % 11)) % 10;
15
- }
16
-
17
- public static isValid(juminNumber: string): boolean {
18
- const replacedJuminNumber = juminNumber.replace(/\D/g, '');
19
- if (replacedJuminNumber.length !== 13) {
20
- return false;
21
- }
22
-
23
- // 연도에 해당하는 숫자와 성별에 해당하는 숫자 비교
24
- const TODAY_YEAR = parseInt(new Date().getFullYear().toString().slice(-2), 10);
25
- const yearNum = parseInt(replacedJuminNumber.slice(0, 2), 10);
26
- const sexNum = replacedJuminNumber.slice(6, 7); // 대시 있는경우 7로 변경
27
- if (sexNum === '1' || sexNum === '2') {
28
- if (yearNum < TODAY_YEAR) return false;
29
- } else if (sexNum === '3' || sexNum === '4') {
30
- if (yearNum > TODAY_YEAR) return false;
31
- } else return false;
32
-
33
- // 월과 일에 해당하는 숫자 조건 검사 (정규식으로)
34
- const regex = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{7}$/;
35
- if (!regex.test(replacedJuminNumber)) return false;
36
-
37
- // Validation X
38
- const currentX = parseInt(replacedJuminNumber.slice(-1), 10);
39
- const calculatedX = JuminNumberUtils.calculateX(replacedJuminNumber);
40
- if (currentX !== calculatedX) {
41
- console.log('Invalid X', currentX, calculatedX);
42
- return false;
43
- }
44
-
45
- return true;
46
- }
47
- }
@@ -1,23 +0,0 @@
1
- export class NumberUtils {
2
- public static formatWithThousandsSeparator(value: number, separator: string = ','): string {
3
- return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, separator);
4
- }
5
-
6
- public static formatBigNumber(value: number, precision: number = 2): string {
7
- const map: {suffix: string, threshold: number}[] = [
8
- {suffix: 'Qi', threshold: 1e18},
9
- {suffix: 'Q', threshold: 1e15},
10
- {suffix: 'T', threshold: 1e12},
11
- {suffix: 'B', threshold: 1e9},
12
- {suffix: 'M', threshold: 1e6},
13
- {suffix: 'K', threshold: 1e3},
14
- {suffix: '', threshold: 1},
15
- ];
16
-
17
- const found = map.find(e => Math.abs(value) >= e.threshold);
18
- if (found) {
19
- return Number((value / found.threshold).toFixed(precision)) + found.suffix;
20
- }
21
- return value.toString();
22
- }
23
- }
@@ -1,11 +0,0 @@
1
- import {Point3} from "../interfaces/Point3";
2
-
3
- export class Point3Utils {
4
- static distance(p1: Point3, p2: Point3): number {
5
- const dx = p1.x - p2.x;
6
- const dy = p1.y - p2.y;
7
- const dz = p1.z - p2.z;
8
-
9
- return Math.sqrt( dx * dx + dy * dy + dz * dz );
10
- }
11
- }