@nymphjs/tilmeld 1.0.0-beta.81 → 1.0.0-beta.83
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/CHANGELOG.md +10 -0
- package/README.md +1 -1
- package/dist/AbleObject.js +2 -5
- package/dist/AbleObject.js.map +1 -1
- package/dist/Group.d.ts +3 -3
- package/dist/Group.js +42 -44
- package/dist/Group.js.map +1 -1
- package/dist/Group.test.js +11 -16
- package/dist/Group.test.js.map +1 -1
- package/dist/Tilmeld.d.ts +3 -4
- package/dist/Tilmeld.js +70 -76
- package/dist/Tilmeld.js.map +1 -1
- package/dist/Tilmeld.types.d.ts +2 -2
- package/dist/Tilmeld.types.js +1 -2
- package/dist/User.d.ts +4 -4
- package/dist/User.js +95 -89
- package/dist/User.js.map +1 -1
- package/dist/User.test.js +10 -15
- package/dist/User.test.js.map +1 -1
- package/dist/conf/d.d.ts +6 -4
- package/dist/conf/d.js +1 -2
- package/dist/conf/defaults.d.ts +1 -1
- package/dist/conf/defaults.js +59 -63
- package/dist/conf/defaults.js.map +1 -1
- package/dist/conf/index.d.ts +2 -2
- package/dist/conf/index.js +2 -8
- package/dist/conf/index.js.map +1 -1
- package/dist/enforceTilmeld.d.ts +1 -1
- package/dist/enforceTilmeld.js +4 -8
- package/dist/enforceTilmeld.js.map +1 -1
- package/dist/errors/AccessControlError.js +2 -6
- package/dist/errors/AccessControlError.js.map +1 -1
- package/dist/errors/BadDataError.js +2 -6
- package/dist/errors/BadDataError.js.map +1 -1
- package/dist/errors/BadEmailError.js +2 -6
- package/dist/errors/BadEmailError.js.map +1 -1
- package/dist/errors/BadUsernameError.js +2 -6
- package/dist/errors/BadUsernameError.js.map +1 -1
- package/dist/errors/CouldNotChangeDefaultPrimaryGroupError.js +1 -5
- package/dist/errors/CouldNotChangeDefaultPrimaryGroupError.js.map +1 -1
- package/dist/errors/EmailChangeRateLimitExceededError.js +1 -5
- package/dist/errors/EmailChangeRateLimitExceededError.js.map +1 -1
- package/dist/errors/index.d.ts +6 -6
- package/dist/errors/index.js +6 -22
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.js +16 -36
- package/dist/index.js.map +1 -1
- package/dist/tilmeldJoiProps.js +13 -18
- package/dist/tilmeldJoiProps.js.map +1 -1
- package/jest.config.js +11 -2
- package/package.json +27 -28
- package/src/Group.test.ts +2 -2
- package/src/Group.ts +12 -8
- package/src/Tilmeld.ts +9 -9
- package/src/Tilmeld.types.ts +2 -2
- package/src/User.test.ts +2 -2
- package/src/User.ts +77 -65
- package/src/conf/d.ts +6 -4
- package/src/conf/defaults.ts +7 -5
- package/src/conf/index.ts +2 -2
- package/src/enforceTilmeld.ts +1 -1
- package/src/errors/index.ts +6 -6
- package/src/index.ts +11 -11
- package/src/tilmeldJoiProps.ts +2 -2
- package/src/type/locutus.d.ts +3 -0
- package/tsconfig.json +3 -1
package/dist/index.js
CHANGED
|
@@ -1,37 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.User = exports.tilmeldJoiProps = exports.Tilmeld = exports.Group = exports.AbleObject = void 0;
|
|
21
|
-
__exportStar(require("./conf"), exports);
|
|
22
|
-
__exportStar(require("./enforceTilmeld"), exports);
|
|
23
|
-
__exportStar(require("./errors"), exports);
|
|
24
|
-
const AbleObject_1 = __importDefault(require("./AbleObject"));
|
|
25
|
-
exports.AbleObject = AbleObject_1.default;
|
|
26
|
-
__exportStar(require("./Group"), exports);
|
|
27
|
-
const Group_1 = __importDefault(require("./Group"));
|
|
28
|
-
exports.Group = Group_1.default;
|
|
29
|
-
const Tilmeld_1 = __importDefault(require("./Tilmeld"));
|
|
30
|
-
exports.Tilmeld = Tilmeld_1.default;
|
|
31
|
-
__exportStar(require("./Tilmeld.types"), exports);
|
|
32
|
-
const tilmeldJoiProps_1 = __importDefault(require("./tilmeldJoiProps"));
|
|
33
|
-
exports.tilmeldJoiProps = tilmeldJoiProps_1.default;
|
|
34
|
-
__exportStar(require("./User"), exports);
|
|
35
|
-
const User_1 = __importDefault(require("./User"));
|
|
36
|
-
exports.User = User_1.default;
|
|
1
|
+
export * from './conf/index.js';
|
|
2
|
+
export * from './enforceTilmeld.js';
|
|
3
|
+
export * from './errors/index.js';
|
|
4
|
+
import AbleObject from './AbleObject.js';
|
|
5
|
+
export { AbleObject };
|
|
6
|
+
export * from './Group.js';
|
|
7
|
+
import Group from './Group.js';
|
|
8
|
+
export { Group };
|
|
9
|
+
import Tilmeld from './Tilmeld.js';
|
|
10
|
+
export { Tilmeld };
|
|
11
|
+
export * from './Tilmeld.types.js';
|
|
12
|
+
import tilmeldJoiProps from './tilmeldJoiProps.js';
|
|
13
|
+
export { tilmeldJoiProps };
|
|
14
|
+
export * from './User.js';
|
|
15
|
+
import User from './User.js';
|
|
16
|
+
export { User };
|
|
37
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAEhC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,mBAAmB,CAAC;AAElC,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,cAAc,oBAAoB,CAAC;AAEnC,OAAO,eAAe,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,cAAc,WAAW,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/tilmeldJoiProps.js
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
acGroup: joi_1.default.number().valid(nymph_1.TilmeldAccessLevels.NO_ACCESS, nymph_1.TilmeldAccessLevels.READ_ACCESS, nymph_1.TilmeldAccessLevels.WRITE_ACCESS, nymph_1.TilmeldAccessLevels.FULL_ACCESS),
|
|
15
|
-
acOther: joi_1.default.number().valid(nymph_1.TilmeldAccessLevels.NO_ACCESS, nymph_1.TilmeldAccessLevels.READ_ACCESS, nymph_1.TilmeldAccessLevels.WRITE_ACCESS, nymph_1.TilmeldAccessLevels.FULL_ACCESS),
|
|
16
|
-
acRead: joi_1.default.array().items(joi_1.default.alternatives().try(joi_1.default.object().instance(User_1.default), joi_1.default.object().instance(Group_1.default))),
|
|
17
|
-
acWrite: joi_1.default.array().items(joi_1.default.alternatives().try(joi_1.default.object().instance(User_1.default), joi_1.default.object().instance(Group_1.default))),
|
|
18
|
-
acFull: joi_1.default.array().items(joi_1.default.alternatives().try(joi_1.default.object().instance(User_1.default), joi_1.default.object().instance(Group_1.default))),
|
|
1
|
+
import { TilmeldAccessLevels } from '@nymphjs/nymph';
|
|
2
|
+
import Joi from 'joi';
|
|
3
|
+
import User from './User.js';
|
|
4
|
+
import Group from './Group.js';
|
|
5
|
+
export default {
|
|
6
|
+
user: Joi.object().instance(User),
|
|
7
|
+
group: Joi.object().instance(Group),
|
|
8
|
+
acUser: Joi.number().valid(TilmeldAccessLevels.NO_ACCESS, TilmeldAccessLevels.READ_ACCESS, TilmeldAccessLevels.WRITE_ACCESS, TilmeldAccessLevels.FULL_ACCESS),
|
|
9
|
+
acGroup: Joi.number().valid(TilmeldAccessLevels.NO_ACCESS, TilmeldAccessLevels.READ_ACCESS, TilmeldAccessLevels.WRITE_ACCESS, TilmeldAccessLevels.FULL_ACCESS),
|
|
10
|
+
acOther: Joi.number().valid(TilmeldAccessLevels.NO_ACCESS, TilmeldAccessLevels.READ_ACCESS, TilmeldAccessLevels.WRITE_ACCESS, TilmeldAccessLevels.FULL_ACCESS),
|
|
11
|
+
acRead: Joi.array().items(Joi.alternatives().try(Joi.object().instance(User), Joi.object().instance(Group))),
|
|
12
|
+
acWrite: Joi.array().items(Joi.alternatives().try(Joi.object().instance(User), Joi.object().instance(Group))),
|
|
13
|
+
acFull: Joi.array().items(Joi.alternatives().try(Joi.object().instance(User), Joi.object().instance(Group))),
|
|
19
14
|
};
|
|
20
15
|
//# sourceMappingURL=tilmeldJoiProps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tilmeldJoiProps.js","sourceRoot":"","sources":["../src/tilmeldJoiProps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tilmeldJoiProps.js","sourceRoot":"","sources":["../src/tilmeldJoiProps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,eAAe;IACb,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;IACjC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACxB,mBAAmB,CAAC,SAAS,EAC7B,mBAAmB,CAAC,WAAW,EAC/B,mBAAmB,CAAC,YAAY,EAChC,mBAAmB,CAAC,WAAW,CAChC;IACD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACzB,mBAAmB,CAAC,SAAS,EAC7B,mBAAmB,CAAC,WAAW,EAC/B,mBAAmB,CAAC,YAAY,EAChC,mBAAmB,CAAC,WAAW,CAChC;IACD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACzB,mBAAmB,CAAC,SAAS,EAC7B,mBAAmB,CAAC,WAAW,EAC/B,mBAAmB,CAAC,YAAY,EAChC,mBAAmB,CAAC,WAAW,CAChC;IACD,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACvB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7B,CACF;IACD,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACxB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7B,CACF;IACD,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACvB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7B,CACF;CACF,CAAC"}
|
package/jest.config.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
import { createDefaultEsmPreset } from 'ts-jest';
|
|
2
|
+
|
|
3
|
+
const presetConfig = createDefaultEsmPreset();
|
|
4
|
+
|
|
1
5
|
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
|
2
|
-
|
|
3
|
-
|
|
6
|
+
const jestConfig = {
|
|
7
|
+
...presetConfig,
|
|
4
8
|
testEnvironment: 'node',
|
|
5
9
|
rootDir: 'src/',
|
|
10
|
+
moduleNameMapper: {
|
|
11
|
+
'^(\\.|\\.\\.)\\/(.+)\\.js': '$1/$2',
|
|
12
|
+
},
|
|
6
13
|
};
|
|
14
|
+
|
|
15
|
+
export default jestConfig;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nymphjs/tilmeld",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.83",
|
|
4
4
|
"description": "Nymph.js - Tilmeld User and Group System",
|
|
5
|
-
"type": "
|
|
5
|
+
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"keywords": [
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"build": "tsc",
|
|
16
16
|
"watch": "tsc --watch",
|
|
17
17
|
"prepublish": "npm run clean && npm run build",
|
|
18
|
-
"test": "jest",
|
|
19
|
-
"test:watch": "jest --watch"
|
|
18
|
+
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" npx jest",
|
|
19
|
+
"test:watch": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" npx jest --watch"
|
|
20
20
|
},
|
|
21
21
|
"publishConfig": {
|
|
22
22
|
"access": "public"
|
|
@@ -31,36 +31,35 @@
|
|
|
31
31
|
},
|
|
32
32
|
"license": "Apache-2.0",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@nymphjs/guid": "^1.0.0-beta.
|
|
35
|
-
"@nymphjs/nymph": "^1.0.0-beta.
|
|
36
|
-
"@nymphjs/server": "^1.0.0-beta.
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"joi": "^17.12.2",
|
|
34
|
+
"@nymphjs/guid": "^1.0.0-beta.83",
|
|
35
|
+
"@nymphjs/nymph": "^1.0.0-beta.83",
|
|
36
|
+
"@nymphjs/server": "^1.0.0-beta.83",
|
|
37
|
+
"email-templates": "^12.0.1",
|
|
38
|
+
"express": "^4.21.2",
|
|
39
|
+
"joi": "^17.13.3",
|
|
41
40
|
"jsonwebtoken": "^9.0.2",
|
|
42
|
-
"locutus": "^2.0.
|
|
43
|
-
"lodash": "^4.17.21",
|
|
44
|
-
"otpauth": "^9.
|
|
45
|
-
"pug": "^3.0.
|
|
46
|
-
"qrcode": "^1.5.
|
|
41
|
+
"locutus": "^2.0.32",
|
|
42
|
+
"lodash-es": "^4.17.21",
|
|
43
|
+
"otpauth": "^9.3.5",
|
|
44
|
+
"pug": "^3.0.3",
|
|
45
|
+
"qrcode": "^1.5.4"
|
|
47
46
|
},
|
|
48
47
|
"devDependencies": {
|
|
49
|
-
"@nymphjs/client": "^1.0.0-beta.
|
|
50
|
-
"@nymphjs/client-node": "^1.0.0-beta.
|
|
51
|
-
"@nymphjs/driver-sqlite3": "^1.0.0-beta.
|
|
52
|
-
"@tsconfig/recommended": "^1.0.
|
|
53
|
-
"@types/crypto-js": "^4.2.2",
|
|
48
|
+
"@nymphjs/client": "^1.0.0-beta.83",
|
|
49
|
+
"@nymphjs/client-node": "^1.0.0-beta.83",
|
|
50
|
+
"@nymphjs/driver-sqlite3": "^1.0.0-beta.83",
|
|
51
|
+
"@tsconfig/recommended": "^1.0.8",
|
|
54
52
|
"@types/email-templates": "^10.0.4",
|
|
55
|
-
"@types/express": "^
|
|
56
|
-
"@types/jest": "^29.5.
|
|
57
|
-
"@types/jsonwebtoken": "^9.0.
|
|
53
|
+
"@types/express": "^5.0.0",
|
|
54
|
+
"@types/jest": "^29.5.14",
|
|
55
|
+
"@types/jsonwebtoken": "^9.0.7",
|
|
58
56
|
"@types/locutus": "^0.0.8",
|
|
59
|
-
"@types/lodash": "^4.
|
|
57
|
+
"@types/lodash-es": "^4.17.12",
|
|
60
58
|
"@types/qrcode": "^1.5.5",
|
|
61
59
|
"jest": "^29.7.0",
|
|
62
|
-
"ts-jest": "^29.
|
|
63
|
-
"
|
|
60
|
+
"ts-jest": "^29.2.5",
|
|
61
|
+
"ts-node": "^10.9.2",
|
|
62
|
+
"typescript": "^5.7.2"
|
|
64
63
|
},
|
|
65
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "2ec166e118cef5358fefadac2fa8ba205213f75d"
|
|
66
65
|
}
|
package/src/Group.test.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SQLite3Driver } from '@nymphjs/driver-sqlite3';
|
|
2
2
|
import { Nymph, EntityUniqueConstraintError } from '@nymphjs/nymph';
|
|
3
3
|
|
|
4
|
-
import Tilmeld from './Tilmeld';
|
|
5
|
-
import defaults from './conf/defaults';
|
|
4
|
+
import Tilmeld from './Tilmeld.js';
|
|
5
|
+
import defaults from './conf/defaults.js';
|
|
6
6
|
|
|
7
7
|
const tilmeld = new Tilmeld({
|
|
8
8
|
appName: 'My App',
|
package/src/Group.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
1
2
|
import type {
|
|
2
3
|
Nymph,
|
|
3
4
|
EntityData,
|
|
@@ -7,19 +8,18 @@ import type {
|
|
|
7
8
|
Selector,
|
|
8
9
|
SerializedEntityData,
|
|
9
10
|
} from '@nymphjs/nymph';
|
|
10
|
-
import
|
|
11
|
-
import { difference } from 'lodash';
|
|
11
|
+
import { difference } from 'lodash-es';
|
|
12
12
|
|
|
13
|
-
import { enforceTilmeld } from './enforceTilmeld';
|
|
14
|
-
import AbleObject from './AbleObject';
|
|
13
|
+
import { enforceTilmeld } from './enforceTilmeld.js';
|
|
14
|
+
import AbleObject from './AbleObject.js';
|
|
15
15
|
import {
|
|
16
16
|
BadDataError,
|
|
17
17
|
BadEmailError,
|
|
18
18
|
BadUsernameError,
|
|
19
19
|
CouldNotChangeDefaultPrimaryGroupError,
|
|
20
|
-
} from './errors';
|
|
21
|
-
import type User from './User';
|
|
22
|
-
import type { UserData } from './User';
|
|
20
|
+
} from './errors/index.js';
|
|
21
|
+
import type User from './User.js';
|
|
22
|
+
import type { UserData } from './User.js';
|
|
23
23
|
|
|
24
24
|
export type GroupData = {
|
|
25
25
|
/**
|
|
@@ -271,7 +271,11 @@ export default class Group extends AbleObject<GroupData> {
|
|
|
271
271
|
}
|
|
272
272
|
return (
|
|
273
273
|
'https://secure.gravatar.com/avatar/' +
|
|
274
|
-
|
|
274
|
+
crypto
|
|
275
|
+
.createHash('sha256')
|
|
276
|
+
.update(this.$data.email.trim().toLowerCase())
|
|
277
|
+
.digest('hex')
|
|
278
|
+
.toLowerCase() +
|
|
275
279
|
'?d=identicon&s=40'
|
|
276
280
|
);
|
|
277
281
|
}
|
package/src/Tilmeld.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { URL } from 'node:url';
|
|
1
2
|
import {
|
|
2
3
|
Nymph,
|
|
3
4
|
EntityInterface,
|
|
@@ -7,16 +8,15 @@ import {
|
|
|
7
8
|
TilmeldAccessLevels,
|
|
8
9
|
ACProperties,
|
|
9
10
|
} from '@nymphjs/nymph';
|
|
10
|
-
import { URL } from 'url';
|
|
11
11
|
import { Request, Response } from 'express';
|
|
12
|
-
import { xor } from 'lodash';
|
|
13
|
-
|
|
14
|
-
import { Config, ConfigDefaults as defaults } from './conf';
|
|
15
|
-
import { AccessControlError } from './errors';
|
|
16
|
-
import Group from './Group';
|
|
17
|
-
import User, { UserData } from './User';
|
|
18
|
-
import { AccessControlData } from './Tilmeld.types';
|
|
19
|
-
import { enforceTilmeld } from './enforceTilmeld';
|
|
12
|
+
import { xor } from 'lodash-es';
|
|
13
|
+
|
|
14
|
+
import { Config, ConfigDefaults as defaults } from './conf/index.js';
|
|
15
|
+
import { AccessControlError } from './errors/index.js';
|
|
16
|
+
import Group from './Group.js';
|
|
17
|
+
import User, { UserData } from './User.js';
|
|
18
|
+
import { AccessControlData } from './Tilmeld.types.js';
|
|
19
|
+
import { enforceTilmeld } from './enforceTilmeld.js';
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* A user and group system for Nymph.js.
|
package/src/Tilmeld.types.ts
CHANGED
package/src/User.test.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SQLite3Driver } from '@nymphjs/driver-sqlite3';
|
|
2
2
|
import { Nymph, EntityUniqueConstraintError } from '@nymphjs/nymph';
|
|
3
3
|
|
|
4
|
-
import Tilmeld from './Tilmeld';
|
|
5
|
-
import defaults from './conf/defaults';
|
|
4
|
+
import Tilmeld from './Tilmeld.js';
|
|
5
|
+
import defaults from './conf/defaults.js';
|
|
6
6
|
|
|
7
7
|
const tilmeld = new Tilmeld({
|
|
8
8
|
appName: 'My App',
|
package/src/User.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
1
2
|
import type {
|
|
2
3
|
Nymph,
|
|
3
4
|
EntityData,
|
|
@@ -8,24 +9,21 @@ import type {
|
|
|
8
9
|
} from '@nymphjs/nymph';
|
|
9
10
|
import { humanSecret, nanoid } from '@nymphjs/guid';
|
|
10
11
|
import type { EmailOptions } from 'email-templates';
|
|
11
|
-
import strtotime from 'locutus/php/datetime/strtotime';
|
|
12
|
-
import
|
|
13
|
-
import sha256 from 'crypto-js/sha256';
|
|
14
|
-
import md5 from 'crypto-js/md5';
|
|
15
|
-
import { difference } from 'lodash';
|
|
12
|
+
import strtotime from 'locutus/php/datetime/strtotime.js';
|
|
13
|
+
import { difference } from 'lodash-es';
|
|
16
14
|
import { TOTP, Secret } from 'otpauth';
|
|
17
15
|
import { toDataURL } from 'qrcode';
|
|
18
16
|
|
|
19
|
-
import { enforceTilmeld } from './enforceTilmeld';
|
|
20
|
-
import AbleObject from './AbleObject';
|
|
21
|
-
import type Group from './Group';
|
|
22
|
-
import type { GroupData } from './Group';
|
|
17
|
+
import { enforceTilmeld } from './enforceTilmeld.js';
|
|
18
|
+
import AbleObject from './AbleObject.js';
|
|
19
|
+
import type Group from './Group.js';
|
|
20
|
+
import type { GroupData } from './Group.js';
|
|
23
21
|
import {
|
|
24
22
|
BadDataError,
|
|
25
23
|
BadEmailError,
|
|
26
24
|
BadUsernameError,
|
|
27
25
|
EmailChangeRateLimitExceededError,
|
|
28
|
-
} from './errors';
|
|
26
|
+
} from './errors/index.js';
|
|
29
27
|
|
|
30
28
|
export type EventType =
|
|
31
29
|
| 'checkUsername'
|
|
@@ -764,7 +762,11 @@ export default class User extends AbleObject<UserData> {
|
|
|
764
762
|
}
|
|
765
763
|
return (
|
|
766
764
|
'https://secure.gravatar.com/avatar/' +
|
|
767
|
-
|
|
765
|
+
crypto
|
|
766
|
+
.createHash('sha256')
|
|
767
|
+
.update(this.$data.email.trim().toLowerCase())
|
|
768
|
+
.digest('hex')
|
|
769
|
+
.toLowerCase() +
|
|
768
770
|
'?d=identicon&s=40'
|
|
769
771
|
);
|
|
770
772
|
}
|
|
@@ -1206,12 +1208,18 @@ export default class User extends AbleObject<UserData> {
|
|
|
1206
1208
|
case 'plain':
|
|
1207
1209
|
return this.$data.password === password;
|
|
1208
1210
|
case 'digest':
|
|
1209
|
-
return
|
|
1211
|
+
return (
|
|
1212
|
+
this.$data.password ===
|
|
1213
|
+
crypto.createHash('sha256').update(password).digest('base64')
|
|
1214
|
+
);
|
|
1210
1215
|
case 'salt':
|
|
1211
1216
|
default:
|
|
1212
1217
|
return (
|
|
1213
1218
|
this.$data.password ===
|
|
1214
|
-
|
|
1219
|
+
crypto
|
|
1220
|
+
.createHash('sha256')
|
|
1221
|
+
.update(password + this.$data.salt)
|
|
1222
|
+
.digest('base64')
|
|
1215
1223
|
);
|
|
1216
1224
|
}
|
|
1217
1225
|
}
|
|
@@ -1341,14 +1349,18 @@ export default class User extends AbleObject<UserData> {
|
|
|
1341
1349
|
break;
|
|
1342
1350
|
case 'digest':
|
|
1343
1351
|
delete this.$data.salt;
|
|
1344
|
-
this.$data.password =
|
|
1352
|
+
this.$data.password = crypto
|
|
1353
|
+
.createHash('sha256')
|
|
1354
|
+
.update(password)
|
|
1355
|
+
.digest('base64');
|
|
1345
1356
|
break;
|
|
1346
1357
|
case 'salt':
|
|
1347
1358
|
default:
|
|
1348
1359
|
this.$data.salt = nanoid();
|
|
1349
|
-
this.$data.password =
|
|
1350
|
-
|
|
1351
|
-
|
|
1360
|
+
this.$data.password = crypto
|
|
1361
|
+
.createHash('sha256')
|
|
1362
|
+
.update(password + this.$data.salt)
|
|
1363
|
+
.digest('base64');
|
|
1352
1364
|
break;
|
|
1353
1365
|
}
|
|
1354
1366
|
return this.$data.password;
|
|
@@ -2466,34 +2478,34 @@ export default class User extends AbleObject<UserData> {
|
|
|
2466
2478
|
callback: T extends 'checkUsername'
|
|
2467
2479
|
? TilmeldCheckUsernameCallback
|
|
2468
2480
|
: T extends 'beforeRegister'
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
+
? TilmeldBeforeRegisterCallback
|
|
2482
|
+
: T extends 'afterRegister'
|
|
2483
|
+
? TilmeldAfterRegisterCallback
|
|
2484
|
+
: T extends 'beforeLogin'
|
|
2485
|
+
? TilmeldBeforeLoginCallback
|
|
2486
|
+
: T extends 'afterLogin'
|
|
2487
|
+
? TilmeldAfterLoginCallback
|
|
2488
|
+
: T extends 'beforeLogout'
|
|
2489
|
+
? TilmeldBeforeLogoutCallback
|
|
2490
|
+
: T extends 'afterLogout'
|
|
2491
|
+
? TilmeldAfterLogoutCallback
|
|
2492
|
+
: never,
|
|
2481
2493
|
) {
|
|
2482
2494
|
const prop = (event + 'Callbacks') as T extends 'checkUsername'
|
|
2483
2495
|
? 'checkUsernameCallbacks'
|
|
2484
2496
|
: T extends 'beforeRegister'
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
+
? 'beforeRegisterCallbacks'
|
|
2498
|
+
: T extends 'afterRegister'
|
|
2499
|
+
? 'afterRegisterCallbacks'
|
|
2500
|
+
: T extends 'beforeLogin'
|
|
2501
|
+
? 'beforeLoginCallbacks'
|
|
2502
|
+
: T extends 'afterLogin'
|
|
2503
|
+
? 'afterLoginCallbacks'
|
|
2504
|
+
: T extends 'beforeLogout'
|
|
2505
|
+
? 'beforeLogoutCallbacks'
|
|
2506
|
+
: T extends 'afterLogout'
|
|
2507
|
+
? 'afterLogoutCallbacks'
|
|
2508
|
+
: never;
|
|
2497
2509
|
if (!(prop in this)) {
|
|
2498
2510
|
throw new Error('Invalid event type.');
|
|
2499
2511
|
}
|
|
@@ -2507,34 +2519,34 @@ export default class User extends AbleObject<UserData> {
|
|
|
2507
2519
|
callback: T extends 'checkUsername'
|
|
2508
2520
|
? TilmeldCheckUsernameCallback
|
|
2509
2521
|
: T extends 'beforeRegister'
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
+
? TilmeldBeforeRegisterCallback
|
|
2523
|
+
: T extends 'afterRegister'
|
|
2524
|
+
? TilmeldAfterRegisterCallback
|
|
2525
|
+
: T extends 'beforeLogin'
|
|
2526
|
+
? TilmeldBeforeLoginCallback
|
|
2527
|
+
: T extends 'afterLogin'
|
|
2528
|
+
? TilmeldAfterLoginCallback
|
|
2529
|
+
: T extends 'beforeLogout'
|
|
2530
|
+
? TilmeldBeforeLogoutCallback
|
|
2531
|
+
: T extends 'afterLogout'
|
|
2532
|
+
? TilmeldAfterLogoutCallback
|
|
2533
|
+
: never,
|
|
2522
2534
|
) {
|
|
2523
2535
|
const prop = (event + 'Callbacks') as T extends 'checkUsername'
|
|
2524
2536
|
? 'checkUsernameCallbacks'
|
|
2525
2537
|
: T extends 'beforeRegister'
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
+
? 'beforeRegisterCallbacks'
|
|
2539
|
+
: T extends 'afterRegister'
|
|
2540
|
+
? 'afterRegisterCallbacks'
|
|
2541
|
+
: T extends 'beforeLogin'
|
|
2542
|
+
? 'beforeLoginCallbacks'
|
|
2543
|
+
: T extends 'afterLogin'
|
|
2544
|
+
? 'afterLoginCallbacks'
|
|
2545
|
+
: T extends 'beforeLogout'
|
|
2546
|
+
? 'beforeLogoutCallbacks'
|
|
2547
|
+
: T extends 'afterLogout'
|
|
2548
|
+
? 'afterLogoutCallbacks'
|
|
2549
|
+
: never;
|
|
2538
2550
|
if (!(prop in this)) {
|
|
2539
2551
|
return false;
|
|
2540
2552
|
}
|
package/src/conf/d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { EmailOptions, EmailConfig } from 'email-templates';
|
|
1
|
+
import type { EmailOptions, EmailConfig } from 'email-templates';
|
|
2
2
|
|
|
3
|
-
import type Tilmeld from '../Tilmeld';
|
|
4
|
-
import Group
|
|
5
|
-
import
|
|
3
|
+
import type Tilmeld from '../Tilmeld.js';
|
|
4
|
+
import type Group from '../Group.js';
|
|
5
|
+
import type { GroupData } from '../Group.js';
|
|
6
|
+
import type User from '../User.js';
|
|
7
|
+
import type { UserData } from '../User.js';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Tilmeld Config
|
package/src/conf/defaults.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { URL } from 'url';
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { URL, fileURLToPath } from 'node:url';
|
|
3
3
|
import jwt from 'jsonwebtoken';
|
|
4
4
|
import Email from 'email-templates';
|
|
5
5
|
import Joi from 'joi';
|
|
6
6
|
import { nanoid } from '@nymphjs/guid';
|
|
7
7
|
import { nymphJoiProps } from '@nymphjs/nymph';
|
|
8
8
|
|
|
9
|
-
import { Config } from './d';
|
|
10
|
-
import User from '../User';
|
|
11
|
-
import Group from '../Group';
|
|
9
|
+
import type { Config } from './d.js';
|
|
10
|
+
import User from '../User.js';
|
|
11
|
+
import Group from '../Group.js';
|
|
12
|
+
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
14
|
|
|
13
15
|
export default {
|
|
14
16
|
appName: 'My Nymph App',
|
package/src/conf/index.ts
CHANGED
package/src/enforceTilmeld.ts
CHANGED
package/src/errors/index.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export * from './AccessControlError';
|
|
1
|
+
export * from './AccessControlError.js';
|
|
2
2
|
|
|
3
|
-
export * from './BadDataError';
|
|
3
|
+
export * from './BadDataError.js';
|
|
4
4
|
|
|
5
|
-
export * from './BadEmailError';
|
|
5
|
+
export * from './BadEmailError.js';
|
|
6
6
|
|
|
7
|
-
export * from './BadUsernameError';
|
|
7
|
+
export * from './BadUsernameError.js';
|
|
8
8
|
|
|
9
|
-
export * from './CouldNotChangeDefaultPrimaryGroupError';
|
|
9
|
+
export * from './CouldNotChangeDefaultPrimaryGroupError.js';
|
|
10
10
|
|
|
11
|
-
export * from './EmailChangeRateLimitExceededError';
|
|
11
|
+
export * from './EmailChangeRateLimitExceededError.js';
|
package/src/index.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
export * from './conf';
|
|
1
|
+
export * from './conf/index.js';
|
|
2
2
|
|
|
3
|
-
export * from './enforceTilmeld';
|
|
3
|
+
export * from './enforceTilmeld.js';
|
|
4
4
|
|
|
5
|
-
export * from './errors';
|
|
5
|
+
export * from './errors/index.js';
|
|
6
6
|
|
|
7
|
-
import AbleObject from './AbleObject';
|
|
7
|
+
import AbleObject from './AbleObject.js';
|
|
8
8
|
export { AbleObject };
|
|
9
9
|
|
|
10
|
-
export * from './Group';
|
|
11
|
-
import Group from './Group';
|
|
10
|
+
export * from './Group.js';
|
|
11
|
+
import Group from './Group.js';
|
|
12
12
|
export { Group };
|
|
13
13
|
|
|
14
|
-
import Tilmeld from './Tilmeld';
|
|
14
|
+
import Tilmeld from './Tilmeld.js';
|
|
15
15
|
export { Tilmeld };
|
|
16
16
|
|
|
17
|
-
export * from './Tilmeld.types';
|
|
17
|
+
export * from './Tilmeld.types.js';
|
|
18
18
|
|
|
19
|
-
import tilmeldJoiProps from './tilmeldJoiProps';
|
|
19
|
+
import tilmeldJoiProps from './tilmeldJoiProps.js';
|
|
20
20
|
export { tilmeldJoiProps };
|
|
21
21
|
|
|
22
|
-
export * from './User';
|
|
23
|
-
import User from './User';
|
|
22
|
+
export * from './User.js';
|
|
23
|
+
import User from './User.js';
|
|
24
24
|
export { User };
|