sahab-utils 1.7.9 → 1.8.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.
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export * from './ts/broadcast';
3
3
  export * from './ts/calcs';
4
4
  export * from './ts/cashback';
5
5
  export * from './ts/gifts';
6
+ export * from './ts/iban';
6
7
  export * from './ts/loyalty';
7
8
  export * from './ts/orderActivity';
8
9
  export * from './ts/push';
package/dist/index.js CHANGED
@@ -19,6 +19,7 @@ __exportStar(require("./ts/broadcast"), exports);
19
19
  __exportStar(require("./ts/calcs"), exports);
20
20
  __exportStar(require("./ts/cashback"), exports);
21
21
  __exportStar(require("./ts/gifts"), exports);
22
+ __exportStar(require("./ts/iban"), exports);
22
23
  __exportStar(require("./ts/loyalty"), exports);
23
24
  __exportStar(require("./ts/orderActivity"), exports);
24
25
  __exportStar(require("./ts/push"), exports);
@@ -0,0 +1,15 @@
1
+ /** The only transfer percentages a provider can be on. */
2
+ export declare const PROVIDER_PERCENTAGES: readonly ["7%", "10%"];
3
+ export type ProviderPercentage = (typeof PROVIDER_PERCENTAGES)[number];
4
+ export declare const isProviderPercentage: (value: unknown) => value is ProviderPercentage;
5
+ /** Pasted IBANs carry spaces and lower case; every check below expects this form. */
6
+ export declare const normalizeBankAccount: (raw: string) => string;
7
+ export declare const isValidSaudiIban: (value: string) => boolean;
8
+ export declare const isSabAccountNumber: (value: string) => boolean;
9
+ /** What a provider's payout can go to: a Saudi IBAN, or a SAB in-bank account number. */
10
+ export declare const isValidProviderAccount: (value: string) => boolean;
11
+ /** Whether the payout is an in-bank SAB transfer. Decided from the account itself, never from a form flag. */
12
+ export declare const isSabBankAccount: (value: string) => boolean;
13
+ /** The two-digit bank code inside a Saudi IBAN, for showing which bank an account is with. */
14
+ export declare const saudiIbanBankCode: (value: string) => string | undefined;
15
+ export declare const PROVIDER_ACCOUNT_FORMAT_HINT = "A Saudi IBAN (SA + 22 characters) or a SAB account number (SASABB + 12 digits)";
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROVIDER_ACCOUNT_FORMAT_HINT = exports.saudiIbanBankCode = exports.isSabBankAccount = exports.isValidProviderAccount = exports.isSabAccountNumber = exports.isValidSaudiIban = exports.normalizeBankAccount = exports.isProviderPercentage = exports.PROVIDER_PERCENTAGES = void 0;
4
+ /** The only transfer percentages a provider can be on. */
5
+ exports.PROVIDER_PERCENTAGES = ['7%', '10%'];
6
+ const isProviderPercentage = (value) => exports.PROVIDER_PERCENTAGES.includes(value);
7
+ exports.isProviderPercentage = isProviderPercentage;
8
+ /** Pasted IBANs carry spaces and lower case; every check below expects this form. */
9
+ const normalizeBankAccount = (raw) => raw.replace(/\s+/g, '').toUpperCase();
10
+ exports.normalizeBankAccount = normalizeBankAccount;
11
+ // SA + 2 check digits + 2-digit bank code + 18 account characters, which may be letters.
12
+ const SAUDI_IBAN_SHAPE = /^SA\d{4}[0-9A-Z]{18}$/;
13
+ // The in-bank account form SAB transfers use instead of an IBAN.
14
+ const SAB_ACCOUNT_NUMBER = /^SASABB\d{12}$/;
15
+ /** ISO 13616 checksum: the rearranged IBAN, letters as 10-35, must leave remainder 1 modulo 97. */
16
+ const hasValidChecksum = (iban) => {
17
+ const rearranged = iban.slice(4) + iban.slice(0, 4);
18
+ let remainder = 0;
19
+ for (const char of rearranged) {
20
+ const value = parseInt(char, 36);
21
+ remainder = (value < 10 ? remainder * 10 + value : remainder * 100 + value) % 97;
22
+ }
23
+ return remainder === 1;
24
+ };
25
+ const isValidSaudiIban = (value) => SAUDI_IBAN_SHAPE.test(value) && hasValidChecksum(value);
26
+ exports.isValidSaudiIban = isValidSaudiIban;
27
+ const isSabAccountNumber = (value) => SAB_ACCOUNT_NUMBER.test(value);
28
+ exports.isSabAccountNumber = isSabAccountNumber;
29
+ /** What a provider's payout can go to: a Saudi IBAN, or a SAB in-bank account number. */
30
+ const isValidProviderAccount = (value) => (0, exports.isValidSaudiIban)(value) || (0, exports.isSabAccountNumber)(value);
31
+ exports.isValidProviderAccount = isValidProviderAccount;
32
+ /** Whether the payout is an in-bank SAB transfer. Decided from the account itself, never from a form flag. */
33
+ const isSabBankAccount = (value) => (0, exports.isSabAccountNumber)(value);
34
+ exports.isSabBankAccount = isSabBankAccount;
35
+ /** The two-digit bank code inside a Saudi IBAN, for showing which bank an account is with. */
36
+ const saudiIbanBankCode = (value) => ((0, exports.isValidSaudiIban)(value) ? value.slice(4, 6) : undefined);
37
+ exports.saudiIbanBankCode = saudiIbanBankCode;
38
+ exports.PROVIDER_ACCOUNT_FORMAT_HINT = 'A Saudi IBAN (SA + 22 characters) or a SAB account number (SASABB + 12 digits)';
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "sahab-utils",
3
- "version": "1.7.9",
3
+ "version": "1.8.0",
4
4
  "description": "This package contains types and utils functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
9
  "deploy": "npm run build && npm publish",
10
- "test": "npm run build && node tests/loyalty.test.js && node tests/gifts.test.js && node tests/cashback.test.js && node tests/utils.test.js && node tests/wheel.test.js && node tests/calcs.test.js && node tests/orderActivity.test.js && node tests/push.test.js && node tests/broadcast.test.js"
10
+ "test": "npm run build && node tests/loyalty.test.js && node tests/gifts.test.js && node tests/cashback.test.js && node tests/utils.test.js && node tests/wheel.test.js && node tests/calcs.test.js && node tests/orderActivity.test.js && node tests/push.test.js && node tests/broadcast.test.js && node tests/iban.test.js"
11
11
  },
12
12
  "repository": {
13
13
  "type": "git",