asma-helpers 0.37.2 → 0.37.4
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/lib/helpers/validateNorwegianPersonalNumber.d.ts +9 -0
- package/lib/helpers/validateNorwegianPersonalNumber.d.ts.map +1 -1
- package/lib/helpers/validateNorwegianPersonalNumber.js +28 -0
- package/lib/helpers/validateNorwegianPersonalNumber.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/validateNorwegianPersonalNumber.ts +31 -3
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
export declare const NORWEGIAN_PERSONAL_NUMBER: readonly ["REAL", "DNUMBER", "SYNTHETIC", "TEMPORARY"];
|
|
2
2
|
export type NORWEGIAN_PERSONAL_NUMBER_TYPES = (typeof NORWEGIAN_PERSONAL_NUMBER)[number] | 'INVALID';
|
|
3
|
+
export declare function isNorwegianTemporaryNumber(number: string): boolean;
|
|
4
|
+
export declare function isNorwegianDnumber(number: string): boolean;
|
|
5
|
+
export declare function isNorwegianSyntheticNumber(number: string): boolean;
|
|
6
|
+
export declare function isNorwegianRealNumber(number: string): boolean;
|
|
3
7
|
export declare function validateNorwegianPersonalNumber(number: string): NORWEGIAN_PERSONAL_NUMBER_TYPES;
|
|
8
|
+
export declare function generateUniqueToken(user: {
|
|
9
|
+
actno: string;
|
|
10
|
+
fnr: string;
|
|
11
|
+
salt: string;
|
|
12
|
+
}): string;
|
|
4
13
|
//# sourceMappingURL=validateNorwegianPersonalNumber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateNorwegianPersonalNumber.d.ts","sourceRoot":"","sources":["../../src/helpers/validateNorwegianPersonalNumber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validateNorwegianPersonalNumber.d.ts","sourceRoot":"","sources":["../../src/helpers/validateNorwegianPersonalNumber.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,wDAAyD,CAAA;AAE/F,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;AACpG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElE;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1D;AACD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElE;AACD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AACD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,+BAA+B,CAuE/F;AAmCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,UAOrF"}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
|
+
import { subdomain } from './getSubdomain';
|
|
2
|
+
import { sha256 } from './sha256';
|
|
1
3
|
export const NORWEGIAN_PERSONAL_NUMBER = ['REAL', 'DNUMBER', 'SYNTHETIC', 'TEMPORARY'];
|
|
4
|
+
export function isNorwegianTemporaryNumber(number) {
|
|
5
|
+
return validateNorwegianPersonalNumber(number) === 'TEMPORARY';
|
|
6
|
+
}
|
|
7
|
+
export function isNorwegianDnumber(number) {
|
|
8
|
+
return validateNorwegianPersonalNumber(number) === 'DNUMBER';
|
|
9
|
+
}
|
|
10
|
+
export function isNorwegianSyntheticNumber(number) {
|
|
11
|
+
return validateNorwegianPersonalNumber(number) === 'SYNTHETIC';
|
|
12
|
+
}
|
|
13
|
+
export function isNorwegianRealNumber(number) {
|
|
14
|
+
return validateNorwegianPersonalNumber(number) === 'REAL';
|
|
15
|
+
}
|
|
2
16
|
export function validateNorwegianPersonalNumber(number) {
|
|
3
17
|
// Check if the number has the correct format (11 digits)
|
|
4
18
|
if (!/^\d{11}$/.test(number))
|
|
@@ -61,9 +75,16 @@ function isValidDate(year, month, day) {
|
|
|
61
75
|
function isLeapYear(year) {
|
|
62
76
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
63
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
* Is considered valid synthetic month if syntheticMonth is one of these: 41-52, 53-64, 65, 66-77, 81-92
|
|
81
|
+
*/
|
|
64
82
|
function getAddedNumberForSyntheticMonth(syntheticMonth) {
|
|
65
83
|
if (syntheticMonth === 65)
|
|
66
84
|
return 60; // Special case for 65
|
|
85
|
+
/**
|
|
86
|
+
* dead numbers 78,79,80
|
|
87
|
+
*/
|
|
67
88
|
const possibleAdds = [40, 52, 65, 80];
|
|
68
89
|
for (let add of possibleAdds) {
|
|
69
90
|
const calculatedMonth = syntheticMonth - add;
|
|
@@ -73,4 +94,11 @@ function getAddedNumberForSyntheticMonth(syntheticMonth) {
|
|
|
73
94
|
}
|
|
74
95
|
return 'INVALID'; // Return INVALID if no valid result found
|
|
75
96
|
}
|
|
97
|
+
export function generateUniqueToken(user) {
|
|
98
|
+
if (validateNorwegianPersonalNumber(user.fnr) === 'TEMPORARY') {
|
|
99
|
+
return sha256(`${subdomain}-${user.fnr}-${user.actno}`);
|
|
100
|
+
}
|
|
101
|
+
// ha256(`${recipient.fnr}AvansTheBest`)
|
|
102
|
+
return sha256(`${user.fnr}${user.salt}`);
|
|
103
|
+
}
|
|
76
104
|
//# sourceMappingURL=validateNorwegianPersonalNumber.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateNorwegianPersonalNumber.js","sourceRoot":"","sources":["../../src/helpers/validateNorwegianPersonalNumber.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"validateNorwegianPersonalNumber.js","sourceRoot":"","sources":["../../src/helpers/validateNorwegianPersonalNumber.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
|
+
import { subdomain } from './getSubdomain'
|
|
2
|
+
import { sha256 } from './sha256'
|
|
3
|
+
|
|
1
4
|
export const NORWEGIAN_PERSONAL_NUMBER = ['REAL', 'DNUMBER', 'SYNTHETIC', 'TEMPORARY'] as const
|
|
2
5
|
|
|
3
6
|
export type NORWEGIAN_PERSONAL_NUMBER_TYPES = (typeof NORWEGIAN_PERSONAL_NUMBER)[number] | 'INVALID'
|
|
4
|
-
|
|
7
|
+
export function isNorwegianTemporaryNumber(number: string): boolean {
|
|
8
|
+
return validateNorwegianPersonalNumber(number) === 'TEMPORARY'
|
|
9
|
+
}
|
|
10
|
+
export function isNorwegianDnumber(number: string): boolean {
|
|
11
|
+
return validateNorwegianPersonalNumber(number) === 'DNUMBER'
|
|
12
|
+
}
|
|
13
|
+
export function isNorwegianSyntheticNumber(number: string): boolean {
|
|
14
|
+
return validateNorwegianPersonalNumber(number) === 'SYNTHETIC'
|
|
15
|
+
}
|
|
16
|
+
export function isNorwegianRealNumber(number: string): boolean {
|
|
17
|
+
return validateNorwegianPersonalNumber(number) === 'REAL'
|
|
18
|
+
}
|
|
5
19
|
export function validateNorwegianPersonalNumber(number: string): NORWEGIAN_PERSONAL_NUMBER_TYPES {
|
|
6
20
|
// Check if the number has the correct format (11 digits)
|
|
7
21
|
if (!/^\d{11}$/.test(number)) return 'INVALID'
|
|
@@ -87,10 +101,15 @@ function isValidDate(year: number, month: number, day: number): boolean {
|
|
|
87
101
|
function isLeapYear(year: number): boolean {
|
|
88
102
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0
|
|
89
103
|
}
|
|
90
|
-
|
|
104
|
+
/**
|
|
105
|
+
*
|
|
106
|
+
* Is considered valid synthetic month if syntheticMonth is one of these: 41-52, 53-64, 65, 66-77, 81-92
|
|
107
|
+
*/
|
|
91
108
|
function getAddedNumberForSyntheticMonth(syntheticMonth: number): number | 'INVALID' {
|
|
92
109
|
if (syntheticMonth === 65) return 60 // Special case for 65
|
|
93
|
-
|
|
110
|
+
/**
|
|
111
|
+
* dead numbers 78,79,80
|
|
112
|
+
*/
|
|
94
113
|
const possibleAdds = [40, 52, 65, 80]
|
|
95
114
|
|
|
96
115
|
for (let add of possibleAdds) {
|
|
@@ -102,3 +121,12 @@ function getAddedNumberForSyntheticMonth(syntheticMonth: number): number | 'INVA
|
|
|
102
121
|
|
|
103
122
|
return 'INVALID' // Return INVALID if no valid result found
|
|
104
123
|
}
|
|
124
|
+
|
|
125
|
+
export function generateUniqueToken(user: { actno: string; fnr: string; salt: string }) {
|
|
126
|
+
if (validateNorwegianPersonalNumber(user.fnr) === 'TEMPORARY') {
|
|
127
|
+
return sha256(`${subdomain}-${user.fnr}-${user.actno}`)
|
|
128
|
+
}
|
|
129
|
+
// ha256(`${recipient.fnr}AvansTheBest`)
|
|
130
|
+
|
|
131
|
+
return sha256(`${user.fnr}${user.salt}`)
|
|
132
|
+
}
|