@nymphjs/tilmeld 1.0.0-beta.1 → 1.0.0-beta.100

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 (78) hide show
  1. package/CHANGELOG.md +505 -0
  2. package/README.md +15 -2
  3. package/dist/AbleObject.d.ts +15 -0
  4. package/dist/AbleObject.js +18 -6
  5. package/dist/AbleObject.js.map +1 -1
  6. package/dist/Group.d.ts +181 -15
  7. package/dist/Group.js +551 -192
  8. package/dist/Group.js.map +1 -1
  9. package/dist/Group.test.js +83 -13
  10. package/dist/Group.test.js.map +1 -1
  11. package/dist/Tilmeld.d.ts +241 -12
  12. package/dist/Tilmeld.js +657 -259
  13. package/dist/Tilmeld.js.map +1 -1
  14. package/dist/Tilmeld.types.d.ts +2 -2
  15. package/dist/Tilmeld.types.js +1 -2
  16. package/dist/User.d.ts +405 -32
  17. package/dist/User.js +1361 -372
  18. package/dist/User.js.map +1 -1
  19. package/dist/User.test.js +130 -13
  20. package/dist/User.test.js.map +1 -1
  21. package/dist/conf/d.d.ts +306 -7
  22. package/dist/conf/d.js +1 -2
  23. package/dist/conf/defaults.d.ts +1 -1
  24. package/dist/conf/defaults.js +196 -141
  25. package/dist/conf/defaults.js.map +1 -1
  26. package/dist/conf/index.d.ts +2 -2
  27. package/dist/conf/index.js +2 -8
  28. package/dist/conf/index.js.map +1 -1
  29. package/dist/enforceTilmeld.d.ts +3 -0
  30. package/dist/enforceTilmeld.js +18 -0
  31. package/dist/enforceTilmeld.js.map +1 -0
  32. package/dist/errors/AccessControlError.d.ts +2 -1
  33. package/dist/errors/AccessControlError.js +3 -6
  34. package/dist/errors/AccessControlError.js.map +1 -1
  35. package/dist/errors/BadDataError.d.ts +2 -1
  36. package/dist/errors/BadDataError.js +3 -6
  37. package/dist/errors/BadDataError.js.map +1 -1
  38. package/dist/errors/BadEmailError.d.ts +2 -1
  39. package/dist/errors/BadEmailError.js +3 -6
  40. package/dist/errors/BadEmailError.js.map +1 -1
  41. package/dist/errors/BadUsernameError.d.ts +2 -1
  42. package/dist/errors/BadUsernameError.js +3 -6
  43. package/dist/errors/BadUsernameError.js.map +1 -1
  44. package/dist/errors/CouldNotChangeDefaultPrimaryGroupError.js +1 -5
  45. package/dist/errors/CouldNotChangeDefaultPrimaryGroupError.js.map +1 -1
  46. package/dist/errors/EmailChangeRateLimitExceededError.js +1 -5
  47. package/dist/errors/EmailChangeRateLimitExceededError.js.map +1 -1
  48. package/dist/errors/index.d.ts +6 -6
  49. package/dist/errors/index.js +6 -22
  50. package/dist/errors/index.js.map +1 -1
  51. package/dist/index.d.ts +11 -10
  52. package/dist/index.js +16 -35
  53. package/dist/index.js.map +1 -1
  54. package/dist/tilmeldJoiProps.js +13 -18
  55. package/dist/tilmeldJoiProps.js.map +1 -1
  56. package/jest.config.js +11 -2
  57. package/package.json +34 -31
  58. package/src/AbleObject.ts +2 -2
  59. package/src/Group.test.ts +104 -6
  60. package/src/Group.ts +661 -226
  61. package/src/Tilmeld.ts +449 -260
  62. package/src/Tilmeld.types.ts +2 -2
  63. package/src/User.test.ts +160 -7
  64. package/src/User.ts +1615 -468
  65. package/src/conf/d.ts +83 -17
  66. package/src/conf/defaults.ts +172 -109
  67. package/src/conf/index.ts +2 -2
  68. package/src/enforceTilmeld.ts +20 -0
  69. package/src/errors/AccessControlError.ts +4 -2
  70. package/src/errors/BadDataError.ts +4 -2
  71. package/src/errors/BadEmailError.ts +4 -2
  72. package/src/errors/BadUsernameError.ts +4 -2
  73. package/src/errors/index.ts +6 -6
  74. package/src/index.ts +12 -10
  75. package/src/tilmeldJoiProps.ts +11 -11
  76. package/src/type/locutus.d.ts +3 -0
  77. package/tsconfig.json +5 -3
  78. package/typedoc.json +4 -0
@@ -1,3 +1,4 @@
1
- export declare class BadUsernameError extends Error {
1
+ import { HttpError } from '@nymphjs/server';
2
+ export declare class BadUsernameError extends HttpError {
2
3
  constructor(message: string);
3
4
  }
@@ -1,11 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BadUsernameError = void 0;
4
- class BadUsernameError extends Error {
1
+ import { HttpError } from '@nymphjs/server';
2
+ export class BadUsernameError extends HttpError {
5
3
  constructor(message) {
6
- super(message);
4
+ super(message, 400);
7
5
  this.name = 'BadUsernameError';
8
6
  }
9
7
  }
10
- exports.BadUsernameError = BadUsernameError;
11
8
  //# sourceMappingURL=BadUsernameError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BadUsernameError.js","sourceRoot":"","sources":["../../src/errors/BadUsernameError.ts"],"names":[],"mappings":";;;AAAA,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AALD,4CAKC"}
1
+ {"version":3,"file":"BadUsernameError.js","sourceRoot":"","sources":["../../src/errors/BadUsernameError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
@@ -1,11 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CouldNotChangeDefaultPrimaryGroupError = void 0;
4
- class CouldNotChangeDefaultPrimaryGroupError extends Error {
1
+ export class CouldNotChangeDefaultPrimaryGroupError extends Error {
5
2
  constructor(message) {
6
3
  super(message);
7
4
  this.name = 'CouldNotChangeDefaultPrimaryGroupError';
8
5
  }
9
6
  }
10
- exports.CouldNotChangeDefaultPrimaryGroupError = CouldNotChangeDefaultPrimaryGroupError;
11
7
  //# sourceMappingURL=CouldNotChangeDefaultPrimaryGroupError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CouldNotChangeDefaultPrimaryGroupError.js","sourceRoot":"","sources":["../../src/errors/CouldNotChangeDefaultPrimaryGroupError.ts"],"names":[],"mappings":";;;AAAA,MAAa,sCAAuC,SAAQ,KAAK;IAC/D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wCAAwC,CAAC;IACvD,CAAC;CACF;AALD,wFAKC"}
1
+ {"version":3,"file":"CouldNotChangeDefaultPrimaryGroupError.js","sourceRoot":"","sources":["../../src/errors/CouldNotChangeDefaultPrimaryGroupError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sCAAuC,SAAQ,KAAK;IAC/D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wCAAwC,CAAC;IACvD,CAAC;CACF"}
@@ -1,11 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EmailChangeRateLimitExceededError = void 0;
4
- class EmailChangeRateLimitExceededError extends Error {
1
+ export class EmailChangeRateLimitExceededError extends Error {
5
2
  constructor(message) {
6
3
  super(message);
7
4
  this.name = 'EmailChangeRateLimitExceededError';
8
5
  }
9
6
  }
10
- exports.EmailChangeRateLimitExceededError = EmailChangeRateLimitExceededError;
11
7
  //# sourceMappingURL=EmailChangeRateLimitExceededError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmailChangeRateLimitExceededError.js","sourceRoot":"","sources":["../../src/errors/EmailChangeRateLimitExceededError.ts"],"names":[],"mappings":";;;AAAA,MAAa,iCAAkC,SAAQ,KAAK;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF;AALD,8EAKC"}
1
+ {"version":3,"file":"EmailChangeRateLimitExceededError.js","sourceRoot":"","sources":["../../src/errors/EmailChangeRateLimitExceededError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
- export * from './AccessControlError';
2
- export * from './BadDataError';
3
- export * from './BadEmailError';
4
- export * from './BadUsernameError';
5
- export * from './CouldNotChangeDefaultPrimaryGroupError';
6
- export * from './EmailChangeRateLimitExceededError';
1
+ export * from './AccessControlError.js';
2
+ export * from './BadDataError.js';
3
+ export * from './BadEmailError.js';
4
+ export * from './BadUsernameError.js';
5
+ export * from './CouldNotChangeDefaultPrimaryGroupError.js';
6
+ export * from './EmailChangeRateLimitExceededError.js';
@@ -1,23 +1,7 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./AccessControlError"), exports);
18
- __exportStar(require("./BadDataError"), exports);
19
- __exportStar(require("./BadEmailError"), exports);
20
- __exportStar(require("./BadUsernameError"), exports);
21
- __exportStar(require("./CouldNotChangeDefaultPrimaryGroupError"), exports);
22
- __exportStar(require("./EmailChangeRateLimitExceededError"), exports);
1
+ export * from './AccessControlError.js';
2
+ export * from './BadDataError.js';
3
+ export * from './BadEmailError.js';
4
+ export * from './BadUsernameError.js';
5
+ export * from './CouldNotChangeDefaultPrimaryGroupError.js';
6
+ export * from './EmailChangeRateLimitExceededError.js';
23
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AAErC,iDAA+B;AAE/B,kDAAgC;AAEhC,qDAAmC;AAEnC,2EAAyD;AAEzD,sEAAoD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AAExC,cAAc,mBAAmB,CAAC;AAElC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,6CAA6C,CAAC;AAE5D,cAAc,wCAAwC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,16 @@
1
- export * from './conf';
2
- export * from './errors';
3
- import AbleObject from './AbleObject';
1
+ export * from './conf/index.js';
2
+ export * from './enforceTilmeld.js';
3
+ export * from './errors/index.js';
4
+ import AbleObject from './AbleObject.js';
4
5
  export { AbleObject };
5
- export * from './Group';
6
- import Group from './Group';
6
+ export * from './Group.js';
7
+ import Group from './Group.js';
7
8
  export { Group };
8
- import Tilmeld from './Tilmeld';
9
+ import Tilmeld from './Tilmeld.js';
9
10
  export { Tilmeld };
10
- export * from './Tilmeld.types';
11
- import tilmeldJoiProps from './tilmeldJoiProps';
11
+ export * from './Tilmeld.types.js';
12
+ import tilmeldJoiProps from './tilmeldJoiProps.js';
12
13
  export { tilmeldJoiProps };
13
- export * from './User';
14
- import User from './User';
14
+ export * from './User.js';
15
+ import User from './User.js';
15
16
  export { User };
package/dist/index.js CHANGED
@@ -1,36 +1,17 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
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("./errors"), exports);
23
- const AbleObject_1 = __importDefault(require("./AbleObject"));
24
- exports.AbleObject = AbleObject_1.default;
25
- __exportStar(require("./Group"), exports);
26
- const Group_1 = __importDefault(require("./Group"));
27
- exports.Group = Group_1.default;
28
- const Tilmeld_1 = __importDefault(require("./Tilmeld"));
29
- exports.Tilmeld = Tilmeld_1.default;
30
- __exportStar(require("./Tilmeld.types"), exports);
31
- const tilmeldJoiProps_1 = __importDefault(require("./tilmeldJoiProps"));
32
- exports.tilmeldJoiProps = tilmeldJoiProps_1.default;
33
- __exportStar(require("./User"), exports);
34
- const User_1 = __importDefault(require("./User"));
35
- 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 };
36
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":";;;;;;;;;;;;;;;;;;;;AAAA,yCAAuB;AAEvB,2CAAyB;AAEzB,8DAAsC;AAC7B,qBADF,oBAAU,CACE;AAEnB,0CAAwB;AACxB,oDAA4B;AACnB,gBADF,eAAK,CACE;AAEd,wDAAgC;AACvB,kBADF,iBAAO,CACE;AAEhB,kDAAgC;AAEhC,wEAAgD;AACvC,0BADF,yBAAe,CACE;AAExB,yCAAuB;AACvB,kDAA0B;AACjB,eADF,cAAI,CACE"}
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"}
@@ -1,20 +1,15 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const nymph_1 = require("@nymphjs/nymph");
7
- const joi_1 = __importDefault(require("joi"));
8
- const User_1 = __importDefault(require("./User"));
9
- const Group_1 = __importDefault(require("./Group"));
10
- exports.default = {
11
- user: joi_1.default.object().instance(User_1.default),
12
- group: joi_1.default.object().instance(Group_1.default),
13
- acUser: 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),
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":";;;;;AAAA,0CAAqD;AACrD,8CAAsB;AAEtB,kDAA0B;AAC1B,oDAA4B;AAE5B,kBAAe;IACb,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAI,CAAC;IACjC,KAAK,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC;IACnC,MAAM,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACxB,2BAAmB,CAAC,SAAS,EAC7B,2BAAmB,CAAC,WAAW,EAC/B,2BAAmB,CAAC,YAAY,EAChC,2BAAmB,CAAC,WAAW,CAChC;IACD,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACzB,2BAAmB,CAAC,SAAS,EAC7B,2BAAmB,CAAC,WAAW,EAC/B,2BAAmB,CAAC,YAAY,EAChC,2BAAmB,CAAC,WAAW,CAChC;IACD,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CACzB,2BAAmB,CAAC,SAAS,EAC7B,2BAAmB,CAAC,WAAW,EAC/B,2BAAmB,CAAC,YAAY,EAChC,2BAAmB,CAAC,WAAW,CAChC;IACD,MAAM,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACvB,aAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,EAC3B,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC,CAC7B,CACF;IACD,OAAO,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACxB,aAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,EAC3B,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC,CAC7B,CACF;IACD,MAAM,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CACvB,aAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CACpB,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,EAC3B,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC,CAC7B,CACF;CACF,CAAC"}
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
- module.exports = {
3
- preset: 'ts-jest',
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.1",
4
- "description": "NymphJS - Tilmeld User and Group System",
5
- "type": "commonjs",
3
+ "version": "1.0.0-beta.100",
4
+ "description": "Nymph.js - Tilmeld User and Group System",
5
+ "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "keywords": [
@@ -14,9 +14,9 @@
14
14
  "clean": "test -d dist && rm -r dist || true",
15
15
  "build": "tsc",
16
16
  "watch": "tsc --watch",
17
- "prepare": "npm run clean && npm run build",
18
- "test": "jest",
19
- "test:watch": "jest --watch"
17
+ "prepublish": "npm run clean && npm run build",
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,32 +31,35 @@
31
31
  },
32
32
  "license": "Apache-2.0",
33
33
  "dependencies": {
34
- "@nymphjs/guid": "^1.0.0-beta.1",
35
- "@nymphjs/nymph": "^1.0.0-beta.1",
36
- "crypto-js": "^4.1.1",
37
- "email-templates": "^10.0.1",
38
- "express": "^4.18.2",
39
- "joi": "^17.7.0",
40
- "jsonwebtoken": "^8.5.1",
41
- "locutus": "^2.0.16",
42
- "lodash": "^4.17.21",
43
- "pug": "^3.0.2"
34
+ "@nymphjs/guid": "^1.0.0-beta.100",
35
+ "@nymphjs/nymph": "^1.0.0-beta.100",
36
+ "@nymphjs/server": "^1.0.0-beta.100",
37
+ "@sciactive/splitn": "^3.1.0",
38
+ "email-templates": "^12.0.1",
39
+ "express": "^4.21.2",
40
+ "joi": "^17.13.3",
41
+ "jsonwebtoken": "^9.0.2",
42
+ "locutus": "^2.0.32",
43
+ "lodash-es": "^4.17.21",
44
+ "otpauth": "^9.3.5",
45
+ "pug": "^3.0.3",
46
+ "qrcode": "^1.5.4"
44
47
  },
45
48
  "devDependencies": {
46
- "@nymphjs/client": "^1.0.0-beta.1",
47
- "@nymphjs/client-node": "^1.0.0-beta.1",
48
- "@nymphjs/driver-sqlite3": "^1.0.0-beta.1",
49
- "@tsconfig/recommended": "^1.0.1",
50
- "@types/crypto-js": "^4.1.1",
51
- "@types/email-templates": "^10.0.1",
52
- "@types/express": "^4.17.14",
53
- "@types/jest": "^29.2.3",
54
- "@types/jsonwebtoken": "^8.5.9",
55
- "@types/locutus": "^0.0.6",
56
- "@types/lodash": "^4.14.189",
57
- "jest": "^29.3.1",
58
- "ts-jest": "^29.0.3",
59
- "typescript": "^4.9.3"
49
+ "@nymphjs/client": "^1.0.0-beta.100",
50
+ "@nymphjs/driver-sqlite3": "^1.0.0-beta.100",
51
+ "@tsconfig/recommended": "^1.0.8",
52
+ "@types/email-templates": "^10.0.4",
53
+ "@types/express": "^5.0.0",
54
+ "@types/jest": "^29.5.14",
55
+ "@types/jsonwebtoken": "^9.0.7",
56
+ "@types/locutus": "^0.0.8",
57
+ "@types/lodash-es": "^4.17.12",
58
+ "@types/qrcode": "^1.5.5",
59
+ "jest": "^29.7.0",
60
+ "ts-jest": "^29.2.5",
61
+ "ts-node": "^10.9.2",
62
+ "typescript": "^5.7.2"
60
63
  },
61
- "gitHead": "648d901c504d57f2d439cd751b60af0ebd4d63b8"
64
+ "gitHead": "254b2ccd1cc7838dcbf08e860d2833475a15b244"
62
65
  }
package/src/AbleObject.ts CHANGED
@@ -6,7 +6,7 @@ import { Entity } from '@nymphjs/nymph';
6
6
  * Used in entities which support abilities, such as users and groups.
7
7
  */
8
8
  export default abstract class AbleObject<
9
- T extends { abilities?: string[] }
9
+ T extends { abilities?: string[] },
10
10
  > extends Entity<T> {
11
11
  /**
12
12
  * Grant an ability.
@@ -17,7 +17,7 @@ export default abstract class AbleObject<
17
17
  if (!Array.isArray(this.$data.abilities)) {
18
18
  this.$data.abilities = [];
19
19
  }
20
- if (this.$data.abilities.indexOf(ability) === -1) {
20
+ if (!this.$data.abilities.includes(ability)) {
21
21
  this.$data.abilities.push(ability);
22
22
  }
23
23
  }
package/src/Group.test.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { SQLite3Driver } from '@nymphjs/driver-sqlite3';
2
- import { Nymph } from '@nymphjs/nymph';
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',
@@ -21,7 +21,7 @@ const _nymph = new Nymph(
21
21
  new SQLite3Driver({
22
22
  filename: ':memory:',
23
23
  }),
24
- tilmeld
24
+ tilmeld,
25
25
  );
26
26
 
27
27
  const Group = tilmeld.Group;
@@ -41,7 +41,7 @@ describe('Group', () => {
41
41
  const validGroup = await makeNewGroup();
42
42
 
43
43
  expect(() => {
44
- defaults.validatorGroup(validGroup);
44
+ defaults.validatorGroup({ config: defaults } as Tilmeld, validGroup);
45
45
  }).not.toThrow();
46
46
  });
47
47
 
@@ -52,7 +52,105 @@ describe('Group', () => {
52
52
  invalidGroup.unknown = 'I should cause an error.';
53
53
 
54
54
  expect(() => {
55
- defaults.validatorGroup(invalidGroup);
55
+ defaults.validatorGroup({ config: defaults } as Tilmeld, invalidGroup);
56
56
  }).toThrow('Invalid Group: "unknown" is not allowed');
57
57
  });
58
+
59
+ it("doesn't allow duplicate groupnames", async () => {
60
+ const newGroupA = await Group.factory();
61
+
62
+ newGroupA.groupname = 'new-group';
63
+ newGroupA.email = 'newgroupa@localhost';
64
+ newGroupA.name = 'New Group';
65
+
66
+ const newGroupB = await Group.factory();
67
+
68
+ newGroupB.groupname = 'new-group';
69
+ newGroupB.email = 'newgroupb@localhost';
70
+ newGroupB.name = 'New Group';
71
+
72
+ const promises = [newGroupA.$saveSkipAC(), newGroupB.$saveSkipAC()];
73
+
74
+ try {
75
+ await Promise.all(promises);
76
+
77
+ throw new Error("Shouldn't get here because of unique constraint.");
78
+ } catch (e: any) {
79
+ expect(e).toBeInstanceOf(EntityUniqueConstraintError);
80
+ }
81
+
82
+ await Promise.allSettled(promises);
83
+
84
+ for (const group of [newGroupA, newGroupB]) {
85
+ if (group.guid != null) {
86
+ expect(await group.$deleteSkipAC()).toEqual(true);
87
+ }
88
+ }
89
+ });
90
+
91
+ it("doesn't allow duplicate emails", async () => {
92
+ const newGroupA = await Group.factory();
93
+
94
+ newGroupA.groupname = 'new-group-a';
95
+ newGroupA.email = 'newgroup@localhost';
96
+ newGroupA.name = 'New Group';
97
+
98
+ const newGroupB = await Group.factory();
99
+
100
+ newGroupB.groupname = 'new-group-b';
101
+ newGroupB.email = 'newgroup@localhost';
102
+ newGroupB.name = 'New Group';
103
+
104
+ const promises = [newGroupA.$saveSkipAC(), newGroupB.$saveSkipAC()];
105
+
106
+ try {
107
+ await Promise.all(promises);
108
+
109
+ throw new Error("Shouldn't get here because of unique constraint.");
110
+ } catch (e: any) {
111
+ expect(e).toBeInstanceOf(EntityUniqueConstraintError);
112
+ }
113
+
114
+ await Promise.allSettled(promises);
115
+
116
+ for (const group of [newGroupA, newGroupB]) {
117
+ if (group.guid != null) {
118
+ expect(await group.$deleteSkipAC()).toEqual(true);
119
+ }
120
+ }
121
+ });
122
+
123
+ it("doesn't allow two default primary groups", async () => {
124
+ const newGroupA = await Group.factory();
125
+
126
+ newGroupA.groupname = 'new-group-a';
127
+ newGroupA.email = 'newgroupa@localhost';
128
+ newGroupA.name = 'New Group';
129
+ newGroupA.defaultPrimary = true;
130
+
131
+ const newGroupB = await Group.factory();
132
+
133
+ newGroupB.groupname = 'new-group-b';
134
+ newGroupB.email = 'newgroupb@localhost';
135
+ newGroupB.name = 'New Group';
136
+ newGroupB.defaultPrimary = true;
137
+
138
+ const promises = [newGroupA.$saveSkipAC(), newGroupB.$saveSkipAC()];
139
+
140
+ try {
141
+ await Promise.all(promises);
142
+
143
+ throw new Error("Shouldn't get here because of unique constraint.");
144
+ } catch (e: any) {
145
+ expect(e).toBeInstanceOf(EntityUniqueConstraintError);
146
+ }
147
+
148
+ await Promise.allSettled(promises);
149
+
150
+ for (const group of [newGroupA, newGroupB]) {
151
+ if (group.guid != null) {
152
+ expect(await group.$deleteSkipAC()).toEqual(true);
153
+ }
154
+ }
155
+ });
58
156
  });