@rshval/back-kit 1.1.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 (70) hide show
  1. package/README.md +538 -0
  2. package/dist/api.d.ts +17 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +51 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/audit-log.d.ts +36 -0
  7. package/dist/audit-log.d.ts.map +1 -0
  8. package/dist/audit-log.js +45 -0
  9. package/dist/audit-log.js.map +1 -0
  10. package/dist/cache-middleware.d.ts +27 -0
  11. package/dist/cache-middleware.d.ts.map +1 -0
  12. package/dist/cache-middleware.js +72 -0
  13. package/dist/cache-middleware.js.map +1 -0
  14. package/dist/cache.d.ts +24 -0
  15. package/dist/cache.d.ts.map +1 -0
  16. package/dist/cache.js +76 -0
  17. package/dist/cache.js.map +1 -0
  18. package/dist/database.d.ts +24 -0
  19. package/dist/database.d.ts.map +1 -0
  20. package/dist/database.js +90 -0
  21. package/dist/database.js.map +1 -0
  22. package/dist/email.d.ts +34 -0
  23. package/dist/email.d.ts.map +1 -0
  24. package/dist/email.js +26 -0
  25. package/dist/email.js.map +1 -0
  26. package/dist/global.d.ts +24 -0
  27. package/dist/global.d.ts.map +1 -0
  28. package/dist/global.js +20 -0
  29. package/dist/global.js.map +1 -0
  30. package/dist/helpers.d.ts +16 -0
  31. package/dist/helpers.d.ts.map +1 -0
  32. package/dist/helpers.js +19 -0
  33. package/dist/helpers.js.map +1 -0
  34. package/dist/index.d.ts +19 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +17 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/logger.d.ts +6 -0
  39. package/dist/logger.d.ts.map +1 -0
  40. package/dist/logger.js +17 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/mail-template.d.ts +41 -0
  43. package/dist/mail-template.d.ts.map +1 -0
  44. package/dist/mail-template.js +51 -0
  45. package/dist/mail-template.js.map +1 -0
  46. package/dist/paymaster.d.ts +51 -0
  47. package/dist/paymaster.d.ts.map +1 -0
  48. package/dist/paymaster.js +127 -0
  49. package/dist/paymaster.js.map +1 -0
  50. package/dist/seed.d.ts +15 -0
  51. package/dist/seed.d.ts.map +1 -0
  52. package/dist/seed.js +57 -0
  53. package/dist/seed.js.map +1 -0
  54. package/dist/site-helpers.d.ts +15 -0
  55. package/dist/site-helpers.d.ts.map +1 -0
  56. package/dist/site-helpers.js +21 -0
  57. package/dist/site-helpers.js.map +1 -0
  58. package/dist/socket-client.d.ts +19 -0
  59. package/dist/socket-client.d.ts.map +1 -0
  60. package/dist/socket-client.js +66 -0
  61. package/dist/socket-client.js.map +1 -0
  62. package/dist/utils.d.ts +3 -0
  63. package/dist/utils.d.ts.map +1 -0
  64. package/dist/utils.js +6 -0
  65. package/dist/utils.js.map +1 -0
  66. package/dist/validation.d.ts +7 -0
  67. package/dist/validation.d.ts.map +1 -0
  68. package/dist/validation.js +26 -0
  69. package/dist/validation.js.map +1 -0
  70. package/package.json +64 -0
@@ -0,0 +1,41 @@
1
+ interface MailTemplateEntity {
2
+ subject: string;
3
+ bodyHtml?: string;
4
+ bodyText?: string;
5
+ }
6
+ interface CreateMailTemplateServiceOptions {
7
+ findTemplate: (args: {
8
+ key: string;
9
+ }) => Promise<(MailTemplateEntity & {
10
+ isActive?: boolean;
11
+ }) | null>;
12
+ sendEmail: (to: string, subject: string, text: string) => Promise<unknown>;
13
+ }
14
+ export declare const createMailTemplateService: ({ findTemplate, sendEmail, }: CreateMailTemplateServiceOptions) => {
15
+ extractVariables(template: string): string[];
16
+ renderTemplate(template: {
17
+ subject: string;
18
+ bodyHtml?: string;
19
+ bodyText?: string;
20
+ }, context?: {}): {
21
+ subject: string;
22
+ bodyHtml: string;
23
+ bodyText: string;
24
+ };
25
+ sendByKey({ key, to, context, }: {
26
+ key: string;
27
+ to: string;
28
+ context?: Record<string, unknown>;
29
+ }): Promise<{
30
+ readonly success: false;
31
+ readonly reason: "template_or_recipient_missing";
32
+ } | {
33
+ readonly success: false;
34
+ readonly reason: "empty_template";
35
+ } | {
36
+ readonly success: true;
37
+ readonly reason?: undefined;
38
+ }>;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=mail-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-template.d.ts","sourceRoot":"","sources":["../src/mail-template.ts"],"names":[],"mappings":"AAqBA,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,gCAAgC;IACxC,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,GAAG,EAAE,MAAM,CAAC;KACb,KAAK,OAAO,CAAC,CAAC,kBAAkB,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,yBAAyB,GAAI,8BAGvC,gCAAgC;+BAEJ,MAAM;6BAWrB;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;qCAclE;QACD,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC;;;;;;;;;;CA2BJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ const normalizeValue = (value) => value === undefined || value === null ? '' : String(value);
2
+ const tokenPattern = /{{\s*([a-zA-Z0-9_.-]+)\s*}}/g;
3
+ const resolveValue = (ctx, path) => {
4
+ const chunks = path.split('.');
5
+ let current = ctx;
6
+ for (const chunk of chunks) {
7
+ if (!current || typeof current !== 'object')
8
+ return '';
9
+ current = current[chunk];
10
+ }
11
+ return normalizeValue(current);
12
+ };
13
+ const render = (template, context) => normalizeValue(template).replace(tokenPattern, (_, path) => resolveValue(context, path));
14
+ export const createMailTemplateService = ({ findTemplate, sendEmail, }) => {
15
+ return {
16
+ extractVariables(template) {
17
+ const vars = new Set();
18
+ for (const match of normalizeValue(template).matchAll(tokenPattern)) {
19
+ if (match?.[1])
20
+ vars.add(String(match[1]));
21
+ }
22
+ return Array.from(vars.values()).sort();
23
+ },
24
+ renderTemplate(template, context = {}) {
25
+ const subject = render(template.subject, context);
26
+ const bodyHtml = render(template.bodyHtml || '', context);
27
+ const bodyText = render(template.bodyText || '', context);
28
+ return { subject, bodyHtml, bodyText };
29
+ },
30
+ async sendByKey({ key, to, context, }) {
31
+ const template = await findTemplate({ key });
32
+ if (!template || !to || template.isActive === false) {
33
+ return {
34
+ success: false,
35
+ reason: 'template_or_recipient_missing',
36
+ };
37
+ }
38
+ const rendered = this.renderTemplate({
39
+ subject: template.subject,
40
+ bodyHtml: template.bodyHtml,
41
+ bodyText: template.bodyText,
42
+ }, context || {});
43
+ const text = rendered.bodyText || rendered.bodyHtml || '';
44
+ if (!text.trim())
45
+ return { success: false, reason: 'empty_template' };
46
+ await sendEmail(to, rendered.subject, text);
47
+ return { success: true };
48
+ },
49
+ };
50
+ };
51
+ //# sourceMappingURL=mail-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-template.js","sourceRoot":"","sources":["../src/mail-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export type PaymasterCallbackPayload = Record<string, string | number | undefined | null>;
2
+ type PaymentStatus = 'paid' | 'cancelled';
3
+ interface PaymasterConfig {
4
+ merchantId: string;
5
+ secretKey?: string;
6
+ secretKeyDirect?: string;
7
+ signatureAlgorithm?: string;
8
+ checkoutUrl: string;
9
+ currency?: string;
10
+ successPath?: string;
11
+ failPath?: string;
12
+ notificationPathRequest?: string;
13
+ notificationPathOrder?: string;
14
+ checkSignature?: boolean;
15
+ }
16
+ interface PaymasterServiceOptions {
17
+ paymaster: PaymasterConfig;
18
+ clientServer: string;
19
+ serverBaseUrl: string;
20
+ }
21
+ export declare const createPaymasterService: ({ paymaster, clientServer, serverBaseUrl, }: PaymasterServiceOptions) => {
22
+ createPaymentLink({ requestId, amount, description, successUrl, failUrl, notificationPath, customerEmail, customerPhone, customerName, }: {
23
+ requestId: string;
24
+ amount: number;
25
+ description: string;
26
+ successUrl?: string;
27
+ failUrl?: string;
28
+ notificationPath?: string;
29
+ customerEmail?: string;
30
+ customerPhone?: string;
31
+ customerName?: string;
32
+ }): {
33
+ paymentNo: string;
34
+ paymentUrl: string;
35
+ urls: {
36
+ success: string;
37
+ fail: string;
38
+ notification: string;
39
+ };
40
+ };
41
+ validateCallback(payload: PaymasterCallbackPayload, rawBody?: string): boolean;
42
+ parseCallback(payload: PaymasterCallbackPayload): {
43
+ requestId: string;
44
+ paymentNo: string;
45
+ paidAmount: number;
46
+ status: PaymentStatus;
47
+ statusRaw: string;
48
+ };
49
+ };
50
+ export {};
51
+ //# sourceMappingURL=paymaster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymaster.d.ts","sourceRoot":"","sources":["../src/paymaster.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,MAAM,EACN,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CACnC,CAAC;AAIF,KAAK,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1C,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,uBAAuB;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AA6CD,eAAO,MAAM,sBAAsB,GAAI,6CAIpC,uBAAuB;8IA6BnB;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;;;;;;;;;8BAqDyB,wBAAwB;2BA8B3B,wBAAwB,GAAG;QAChD,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,aAAa,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB;CAwBJ,CAAC"}
@@ -0,0 +1,127 @@
1
+ import crypto from 'crypto';
2
+ const normalize = (value) => value === undefined || value === null ? '' : String(value);
3
+ const toNumber = (value) => {
4
+ const n = Number(value);
5
+ return Number.isFinite(n) ? n : 0;
6
+ };
7
+ const generateSalt = () => crypto.randomBytes(8).toString('hex');
8
+ const hash = (algo, value) => crypto.createHash(algo).update(value).digest('hex');
9
+ const isAbsoluteUrl = (value) => /^https?:\/\//i.test(value);
10
+ const joinUrl = (base, path) => `${base.replace(/\/$/, '')}/${path.replace(/^\//, '')}`;
11
+ const resolveUrl = (base, maybePathOrUrl, fallbackPath) => {
12
+ const raw = normalize(maybePathOrUrl).trim() || fallbackPath;
13
+ if (!raw)
14
+ return '';
15
+ if (isAbsoluteUrl(raw))
16
+ return raw;
17
+ return joinUrl(base, raw);
18
+ };
19
+ const buildSignBase = (payload, secret) => [
20
+ normalize(payload.LMI_MERCHANT_ID),
21
+ normalize(payload.LMI_PAYMENT_NO),
22
+ normalize(payload.LMI_SYS_PAYMENT_ID),
23
+ normalize(payload.LMI_SYS_PAYMENT_DATE),
24
+ normalize(payload.LMI_PAYMENT_AMOUNT || payload.LMI_PAID_AMOUNT),
25
+ normalize(payload.LMI_CURRENCY || payload.LMI_PAID_CURRENCY),
26
+ normalize(payload.LMI_PAID_AMOUNT),
27
+ normalize(payload.LMI_PAID_CURRENCY),
28
+ normalize(payload.LMI_PAYMENT_SYSTEM),
29
+ normalize(payload.LMI_SIM_MODE),
30
+ secret,
31
+ ].join(';');
32
+ export const createPaymasterService = ({ paymaster, clientServer, serverBaseUrl, }) => {
33
+ const getPaymasterSecrets = () => {
34
+ const direct = normalize(paymaster.secretKeyDirect).trim();
35
+ const base = normalize(paymaster.secretKey).trim();
36
+ return [direct, base].filter(Boolean);
37
+ };
38
+ const resolveSignatureAlgos = () => {
39
+ const configured = normalize(paymaster.signatureAlgorithm).toLowerCase();
40
+ if (configured === 'md5') {
41
+ return ['md5', 'sha256'];
42
+ }
43
+ return ['sha256', 'md5'];
44
+ };
45
+ return {
46
+ createPaymentLink({ requestId, amount, description, successUrl, failUrl, notificationPath, customerEmail, customerPhone, customerName, }) {
47
+ const paymentNo = `${requestId}-${Date.now()}`;
48
+ const params = new URLSearchParams();
49
+ params.set('LMI_MERCHANT_ID', paymaster.merchantId);
50
+ params.set('LMI_PAYMENT_NO', paymentNo);
51
+ params.set('LMI_PAYMENT_AMOUNT', amount.toFixed(2));
52
+ params.set('LMI_CURRENCY', paymaster.currency || 'RUB');
53
+ params.set('LMI_PAYMENT_DESC', description);
54
+ params.set('LMI_PAYER_PHONE_NUMBER', normalize(customerPhone));
55
+ params.set('LMI_PAYER_EMAIL', normalize(customerEmail));
56
+ params.set('LMI_PAYER_FULL_NAME', normalize(customerName));
57
+ params.set('LMI_PAYMENTFORM_DISABLED', '0');
58
+ params.set('LMI_SALT', generateSalt());
59
+ const resolvedSuccessUrl = resolveUrl(clientServer, successUrl || '', paymaster.successPath || '');
60
+ const resolvedFailUrl = resolveUrl(clientServer, failUrl || '', paymaster.failPath || '');
61
+ const fallbackNotificationPath = notificationPath ||
62
+ (requestId.startsWith('order_')
63
+ ? paymaster.notificationPathOrder
64
+ : paymaster.notificationPathRequest) ||
65
+ '';
66
+ const resolvedNotificationUrl = resolveUrl(serverBaseUrl, '', fallbackNotificationPath);
67
+ if (resolvedSuccessUrl)
68
+ params.set('LMI_SUCCESS_URL', resolvedSuccessUrl);
69
+ if (resolvedFailUrl)
70
+ params.set('LMI_FAIL_URL', resolvedFailUrl);
71
+ if (resolvedNotificationUrl)
72
+ params.set('LMI_NOTIFICATION_URL', resolvedNotificationUrl);
73
+ return {
74
+ paymentNo,
75
+ paymentUrl: `${paymaster.checkoutUrl}?${params.toString()}`,
76
+ urls: {
77
+ success: resolvedSuccessUrl,
78
+ fail: resolvedFailUrl,
79
+ notification: resolvedNotificationUrl,
80
+ },
81
+ };
82
+ },
83
+ validateCallback(payload, rawBody = '') {
84
+ if (!paymaster.checkSignature)
85
+ return true;
86
+ const receivedHash = normalize(payload.LMI_HASH || payload.hash).toLowerCase();
87
+ if (!receivedHash)
88
+ return false;
89
+ const algos = resolveSignatureAlgos();
90
+ const secrets = getPaymasterSecrets();
91
+ for (const secret of secrets) {
92
+ const signBase = buildSignBase(payload, secret);
93
+ for (const algo of algos) {
94
+ if (receivedHash === hash(algo, signBase))
95
+ return true;
96
+ }
97
+ if (rawBody) {
98
+ const hmac = crypto
99
+ .createHmac('sha256', secret)
100
+ .update(rawBody)
101
+ .digest('hex');
102
+ if (receivedHash === hmac)
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ },
108
+ parseCallback(payload) {
109
+ const paymentNoRaw = normalize(payload.LMI_PAYMENT_NO);
110
+ const requestId = paymentNoRaw.includes('-')
111
+ ? paymentNoRaw.split('-')[0] || ''
112
+ : paymentNoRaw;
113
+ const paidAmount = toNumber(payload.LMI_PAID_AMOUNT || payload.LMI_PAYMENT_AMOUNT);
114
+ const statusRaw = normalize(payload.LMI_PAYMENT_STATUS || payload.LMI_STATUS).toLowerCase();
115
+ const isSuccess = ['success', 'paid', 'processed'].includes(statusRaw) ||
116
+ normalize(payload.LMI_PAYMENT_SYSTEM).length > 0;
117
+ return {
118
+ requestId,
119
+ paymentNo: paymentNoRaw,
120
+ paidAmount,
121
+ status: isSuccess ? 'paid' : 'cancelled',
122
+ statusRaw,
123
+ };
124
+ },
125
+ };
126
+ };
127
+ //# sourceMappingURL=paymaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../src/paymaster.ts"],"names":[],"mappings":"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"}
package/dist/seed.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { Model } from 'mongoose';
2
+ interface CacheServiceLike {
3
+ getId: (value: object | string) => string;
4
+ get: (key: string) => Promise<any>;
5
+ }
6
+ interface CreateSeedFunctionsOptions {
7
+ cache: CacheServiceLike;
8
+ retryDelayMs?: number;
9
+ }
10
+ export declare const createSeedFunctions: ({ cache, retryDelayMs, }: CreateSeedFunctionsOptions) => {
11
+ checkDatabaseIsConnected: () => Promise<boolean>;
12
+ setSeedData: (SeedModel: typeof Model, arr: object[]) => Promise<void>;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,KAAK,EAAE,MAAM,UAAU,CAAC;AAExD,UAAU,gBAAgB;IACxB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpC;AAED,UAAU,0BAA0B;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,mBAAmB,GAAI,0BAGjC,0BAA0B;;6BAwBd,OAAO,KAAK,OAClB,MAAM,EAAE,KACZ,OAAO,CAAC,IAAI,CAAC;CAkDjB,CAAC"}
package/dist/seed.js ADDED
@@ -0,0 +1,57 @@
1
+ import chalk from 'chalk';
2
+ import delay from 'delay';
3
+ import ora from 'ora';
4
+ export const createSeedFunctions = ({ cache, retryDelayMs = 1000, }) => {
5
+ const checkDatabaseIsConnected = async () => {
6
+ const cacheIdDatabase = cache.getId({
7
+ service: 'database',
8
+ });
9
+ let cachedDatabaseData;
10
+ if (cacheIdDatabase) {
11
+ cachedDatabaseData = await cache.get(cacheIdDatabase);
12
+ }
13
+ if (cachedDatabaseData &&
14
+ cachedDatabaseData.length &&
15
+ cachedDatabaseData[0].status === 'connected') {
16
+ return true;
17
+ }
18
+ return false;
19
+ };
20
+ const setSeedData = async (SeedModel, arr) => {
21
+ const databaseIsConnected = await checkDatabaseIsConnected();
22
+ if (databaseIsConnected) {
23
+ const spinner = ora(chalk.gray('add seed data - ' + SeedModel.modelName)).start();
24
+ const arrs = [];
25
+ let done2 = 0;
26
+ for (let i = 0; i < arr.length; i++) {
27
+ const obj = await new SeedModel(arr[i]);
28
+ arrs.push(obj);
29
+ if (++done2 === arr.length) {
30
+ let done = 0;
31
+ for (const item of arrs) {
32
+ await item
33
+ .save()
34
+ .then(() => {
35
+ if (++done === arrs.length) {
36
+ return done;
37
+ }
38
+ })
39
+ .catch(() => {
40
+ return null;
41
+ });
42
+ }
43
+ }
44
+ }
45
+ spinner.start(chalk.green('seeds "' + SeedModel.modelName + '" added'));
46
+ spinner.succeed();
47
+ return;
48
+ }
49
+ await delay(retryDelayMs);
50
+ return setSeedData(SeedModel, arr);
51
+ };
52
+ return {
53
+ checkDatabaseIsConnected,
54
+ setSeedData,
55
+ };
56
+ };
57
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAatB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,KAAK,EACL,YAAY,GAAG,IAAI,GACQ,EAAE,EAAE;IAC/B,MAAM,wBAAwB,GAAG,KAAK,IAAI,EAAE;QAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,IAAI,kBAAuB,CAAC;QAE5B,IAAI,eAAe,EAAE,CAAC;YACpB,kBAAkB,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC;QAED,IACE,kBAAkB;YAClB,kBAAkB,CAAC,MAAM;YACzB,kBAAkB,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,EAC5C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EACvB,SAAuB,EACvB,GAAa,EACE,EAAE;QACjB,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAE7D,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,GAAG,CACjB,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,SAAS,CAAC,CACrD,CAAC,KAAK,EAAE,CAAC;YAIV,MAAM,IAAI,GAAU,EAAE,CAAC;YACvB,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAQ,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEf,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;oBAC3B,IAAI,IAAI,GAAG,CAAC,CAAC;oBAEb,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;wBACxB,MAAM,IAAI;6BACP,IAAI,EAAE;6BACN,IAAI,CAAC,GAAG,EAAE;4BACT,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gCAC3B,OAAO,IAAI,CAAC;4BACd,CAAC;wBACH,CAAC,CAAC;6BACD,KAAK,CAAC,GAAG,EAAE;4BACV,OAAO,IAAI,CAAC;wBACd,CAAC,CAAC,CAAC;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,OAAO,EAAE,CAAC;YAElB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAE1B,OAAO,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO;QACL,wBAAwB;QACxB,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MailOptionsBody } from './email.js';
2
+ import { sendEmailWithConfig } from './email.js';
3
+ import { createTokenByConfig, getBaseUrlByConfig } from './global.js';
4
+ type AppConfig = Parameters<typeof getBaseUrlByConfig>[0];
5
+ type User = Parameters<typeof createTokenByConfig>[0]['user'];
6
+ type ExpiresIn = Parameters<typeof createTokenByConfig>[0]['expiresIn'];
7
+ type NodemailerConfig = Parameters<typeof sendEmailWithConfig>[0]['nodemailerConfig'];
8
+ export declare const buildGetBaseUrl: (config: AppConfig) => (baseUrl?: string) => string;
9
+ export declare const buildCreateToken: (config: AppConfig) => ({ user, expiresIn }: {
10
+ user: User;
11
+ expiresIn: ExpiresIn;
12
+ }) => string;
13
+ export declare const buildSendEmail: (nodemailerConfig: NodemailerConfig) => (to: MailOptionsBody | string, subject: string, text: string) => Promise<string>;
14
+ export {};
15
+ //# sourceMappingURL=site-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-helpers.d.ts","sourceRoot":"","sources":["../src/site-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtE,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACxE,KAAK,gBAAgB,GAAG,UAAU,CAChC,OAAO,mBAAmB,CAC3B,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAEzB,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,MACvC,UAAU,MAAM,WACzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,SAAS,MACxC,qBAAqB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,WAGlE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,kBAAkB,gBAAgB,MACvD,IAAI,eAAe,GAAG,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,oBAQpE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { sendEmailWithConfig } from './email.js';
2
+ import { createTokenByConfig, getBaseUrlByConfig } from './global.js';
3
+ export const buildGetBaseUrl = (config) => {
4
+ return (baseUrl) => getBaseUrlByConfig(config, baseUrl);
5
+ };
6
+ export const buildCreateToken = (config) => {
7
+ return ({ user, expiresIn }) => {
8
+ return createTokenByConfig({ config, user, expiresIn });
9
+ };
10
+ };
11
+ export const buildSendEmail = (nodemailerConfig) => {
12
+ return (to, subject, text) => {
13
+ return sendEmailWithConfig({
14
+ nodemailerConfig,
15
+ to,
16
+ subject,
17
+ text,
18
+ });
19
+ };
20
+ };
21
+ //# sourceMappingURL=site-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-helpers.js","sourceRoot":"","sources":["../src/site-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAStE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAiB,EAAE,EAAE;IACnD,OAAO,CAAC,OAAgB,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAiB,EAAE,EAAE;IACpD,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAwC,EAAE,EAAE;QACnE,OAAO,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,gBAAkC,EAAE,EAAE;IACnE,OAAO,CAAC,EAA4B,EAAE,OAAe,EAAE,IAAY,EAAE,EAAE;QACrE,OAAO,mBAAmB,CAAC;YACzB,gBAAgB;YAChB,EAAE;YACF,OAAO;YACP,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface LoggerLike {
2
+ debug: (...args: unknown[]) => void;
3
+ error: (...args: unknown[]) => void;
4
+ }
5
+ interface CreateSocketClientServiceOptions {
6
+ wsName: string;
7
+ socketBase: string;
8
+ logger: LoggerLike;
9
+ runWorkers: () => void;
10
+ socketClientInterval?: number;
11
+ connectedTarget?: string;
12
+ }
13
+ interface SocketClientService {
14
+ doSocketClient: () => any;
15
+ getSocketClient: () => any;
16
+ }
17
+ export declare const createSocketClientService: ({ wsName, socketBase, logger, runWorkers, socketClientInterval, connectedTarget, }: CreateSocketClientServiceOptions) => SocketClientService;
18
+ export {};
19
+ //# sourceMappingURL=socket-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../src/socket-client.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC;AAED,UAAU,gCAAgC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,mBAAmB;IAC3B,cAAc,EAAE,MAAM,GAAG,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,CAAC;CAC5B;AAED,eAAO,MAAM,yBAAyB,GAAI,oFAOvC,gCAAgC,KAAG,mBA6ErC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import chalk from 'chalk';
2
+ import delay from 'delay';
3
+ import ora, {} from 'ora';
4
+ import { io } from 'socket.io-client';
5
+ export const createSocketClientService = ({ wsName, socketBase, logger, runWorkers, socketClientInterval = 300, connectedTarget, }) => {
6
+ let spinner;
7
+ let spinnerVisible = false;
8
+ let socketClient;
9
+ const buildConnectedMessage = () => {
10
+ const base = 'Websocket [ws] client connected';
11
+ return connectedTarget ? `${base} to ${connectedTarget}` : base;
12
+ };
13
+ const doSocketClient = () => {
14
+ setTimeout(() => {
15
+ spinner = ora(chalk.gray(`Connect to ${wsName} [ws] server`)).start();
16
+ }, 100);
17
+ socketClient = io(socketBase, {
18
+ secure: true,
19
+ rejectUnauthorized: false,
20
+ reconnectionDelayMax: 10000,
21
+ withCredentials: true,
22
+ });
23
+ socketClient.on('connect', () => {
24
+ const connectedMessage = buildConnectedMessage();
25
+ logger.debug(`[${new Date()}] ${connectedMessage}`);
26
+ setTimeout(() => {
27
+ spinnerVisible = false;
28
+ spinner.start(chalk.green(connectedMessage));
29
+ spinner.succeed();
30
+ }, 100);
31
+ setInterval(() => {
32
+ runWorkers();
33
+ }, socketClientInterval);
34
+ });
35
+ socketClient.on('connect_error', async (err) => {
36
+ if (err && err.context) {
37
+ const context = err.context || {};
38
+ const error = {
39
+ status: context.status,
40
+ statusText: context.statusText,
41
+ };
42
+ logger.error(`[${new Date()}] Websocket [ws] connection error:\n`, error);
43
+ }
44
+ if (!spinnerVisible) {
45
+ spinnerVisible = true;
46
+ await delay(100);
47
+ spinner.start(chalk.red('Websocket [ws] client reconnection...'));
48
+ }
49
+ });
50
+ socketClient.on('disconnect', async () => {
51
+ logger.debug(`[${new Date()}] Websocket [ws] client disconnect`);
52
+ if (!spinnerVisible) {
53
+ spinnerVisible = true;
54
+ await delay(100);
55
+ spinner.start(chalk.red('Websocket [ws] client reconnection...'));
56
+ }
57
+ });
58
+ return socketClient;
59
+ };
60
+ const getSocketClient = () => socketClient;
61
+ return {
62
+ doSocketClient,
63
+ getSocketClient,
64
+ };
65
+ };
66
+ //# sourceMappingURL=socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../src/socket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const add: (a: number, b: number) => number;
2
+ export declare const test2: () => number;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,WAAU,CAAC;AAEnD,eAAO,MAAM,KAAK,cAGjB,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,6 @@
1
+ export const add = (a, b) => a + b;
2
+ export const test2 = () => {
3
+ console.log('99');
4
+ return 8;
5
+ };
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function patternEmail(): RegExp;
2
+ export declare function patternPassword(): RegExp;
3
+ export declare function isValidEmail(val: string): boolean;
4
+ export declare function isValidPhoneNumber(val: string): boolean | undefined;
5
+ export declare function isValidCode(code: number | string, length: number): boolean;
6
+ export declare function isEmpty(val: string | object): boolean;
7
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,WAE3B;AAED,wBAAgB,eAAe,WAE9B;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,WAGvC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,uBAG7C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,WAEhE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,WAK3C"}
@@ -0,0 +1,26 @@
1
+ import { parsePhoneNumberFromString } from 'libphonenumber-js';
2
+ export function patternEmail() {
3
+ return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/u;
4
+ }
5
+ export function patternPassword() {
6
+ return /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!@#$%^&*()_+\-=[\]{};:'",.<>?]{8,}$/;
7
+ }
8
+ export function isValidEmail(val) {
9
+ const pattern = patternEmail();
10
+ return new RegExp(pattern, 'u').test(val);
11
+ }
12
+ export function isValidPhoneNumber(val) {
13
+ const phoneNumber = parsePhoneNumberFromString(val);
14
+ return phoneNumber && phoneNumber.isValid();
15
+ }
16
+ export function isValidCode(code, length) {
17
+ return String(code).length === length;
18
+ }
19
+ export function isEmpty(val) {
20
+ if (typeof val === 'string')
21
+ return val.trim().length === 0;
22
+ if (typeof val === 'object')
23
+ return Object.keys(val).length === 0;
24
+ return false;
25
+ }
26
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,UAAU,YAAY;IAC1B,OAAO,wIAAwI,CAAC;AAClJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,qEAAqE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,WAAW,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAqB,EAAE,MAAc;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAoB;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAElE,OAAO,KAAK,CAAC;AACf,CAAC"}