pangea-server 1.0.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 (150) hide show
  1. package/README.md +1 -0
  2. package/dist/authentication/access-token.class.d.ts +13 -0
  3. package/dist/authentication/access-token.class.js +28 -0
  4. package/dist/authentication/authentication.helpers.d.ts +17 -0
  5. package/dist/authentication/authentication.helpers.js +77 -0
  6. package/dist/authentication/authentication.types.d.ts +11 -0
  7. package/dist/authentication/authentication.types.js +2 -0
  8. package/dist/authentication/base-auth.class.d.ts +9 -0
  9. package/dist/authentication/base-auth.class.js +29 -0
  10. package/dist/authentication/index.d.ts +4 -0
  11. package/dist/authentication/index.js +20 -0
  12. package/dist/database/base-service.class.d.ts +15 -0
  13. package/dist/database/base-service.class.js +28 -0
  14. package/dist/database/database.helpers.d.ts +4 -0
  15. package/dist/database/database.helpers.js +19 -0
  16. package/dist/database/database.types.d.ts +59 -0
  17. package/dist/database/database.types.js +2 -0
  18. package/dist/database/db-client.d.ts +11 -0
  19. package/dist/database/db-client.js +69 -0
  20. package/dist/database/db.class.d.ts +64 -0
  21. package/dist/database/db.class.js +270 -0
  22. package/dist/database/decorators/columns/column.d.ts +10 -0
  23. package/dist/database/decorators/columns/column.js +47 -0
  24. package/dist/database/decorators/columns/date.columns.d.ts +4 -0
  25. package/dist/database/decorators/columns/date.columns.js +16 -0
  26. package/dist/database/decorators/columns/general.columns.d.ts +4 -0
  27. package/dist/database/decorators/columns/general.columns.js +54 -0
  28. package/dist/database/decorators/columns/json.columns.d.ts +3 -0
  29. package/dist/database/decorators/columns/json.columns.js +22 -0
  30. package/dist/database/decorators/columns/number.columns.d.ts +10 -0
  31. package/dist/database/decorators/columns/number.columns.js +33 -0
  32. package/dist/database/decorators/columns/string.columns.d.ts +10 -0
  33. package/dist/database/decorators/columns/string.columns.js +55 -0
  34. package/dist/database/decorators/index.d.ts +23 -0
  35. package/dist/database/decorators/index.js +50 -0
  36. package/dist/database/decorators/relations.d.ts +12 -0
  37. package/dist/database/decorators/relations.js +42 -0
  38. package/dist/database/decorators/table.d.ts +6 -0
  39. package/dist/database/decorators/table.js +57 -0
  40. package/dist/database/index.d.ts +8 -0
  41. package/dist/database/index.js +26 -0
  42. package/dist/database/init-database.d.ts +11 -0
  43. package/dist/database/init-database.js +69 -0
  44. package/dist/database/model-decorators/column.d.ts +11 -0
  45. package/dist/database/model-decorators/column.js +51 -0
  46. package/dist/database/model-decorators/date-columns.d.ts +6 -0
  47. package/dist/database/model-decorators/date-columns.js +41 -0
  48. package/dist/database/model-decorators/decorators.types.d.ts +20 -0
  49. package/dist/database/model-decorators/decorators.types.js +2 -0
  50. package/dist/database/model-decorators/general-columns.d.ts +4 -0
  51. package/dist/database/model-decorators/general-columns.js +54 -0
  52. package/dist/database/model-decorators/index.d.ts +23 -0
  53. package/dist/database/model-decorators/index.js +50 -0
  54. package/dist/database/model-decorators/json-columns.d.ts +3 -0
  55. package/dist/database/model-decorators/json-columns.js +46 -0
  56. package/dist/database/model-decorators/number-columns.d.ts +10 -0
  57. package/dist/database/model-decorators/number-columns.js +58 -0
  58. package/dist/database/model-decorators/relations.d.ts +12 -0
  59. package/dist/database/model-decorators/relations.js +42 -0
  60. package/dist/database/model-decorators/string-columns.d.ts +9 -0
  61. package/dist/database/model-decorators/string-columns.js +51 -0
  62. package/dist/database/model-decorators/table.d.ts +6 -0
  63. package/dist/database/model-decorators/table.js +57 -0
  64. package/dist/database/models/base-model.class.d.ts +33 -0
  65. package/dist/database/models/base-model.class.js +76 -0
  66. package/dist/database/models/index.d.ts +2 -0
  67. package/dist/database/models/index.js +18 -0
  68. package/dist/database/models/user.model.d.ts +5 -0
  69. package/dist/database/models/user.model.js +25 -0
  70. package/dist/database/seed.helpers.d.ts +4 -0
  71. package/dist/database/seed.helpers.js +44 -0
  72. package/dist/helpers/console.helpers.d.ts +8 -0
  73. package/dist/helpers/console.helpers.js +29 -0
  74. package/dist/helpers/controllers.helpers.d.ts +2 -0
  75. package/dist/helpers/controllers.helpers.js +6 -0
  76. package/dist/helpers/env.helpers.d.ts +4 -0
  77. package/dist/helpers/env.helpers.js +32 -0
  78. package/dist/helpers/error.helpers.d.ts +20 -0
  79. package/dist/helpers/error.helpers.js +29 -0
  80. package/dist/helpers/file.helpers.d.ts +4 -0
  81. package/dist/helpers/file.helpers.js +78 -0
  82. package/dist/helpers/hashing.helpers.d.ts +2 -0
  83. package/dist/helpers/hashing.helpers.js +16 -0
  84. package/dist/helpers/html-sanitize.helpers.d.ts +4 -0
  85. package/dist/helpers/html-sanitize.helpers.js +30 -0
  86. package/dist/helpers/index.d.ts +11 -0
  87. package/dist/helpers/index.js +27 -0
  88. package/dist/helpers/job.helpers.d.ts +8 -0
  89. package/dist/helpers/job.helpers.js +20 -0
  90. package/dist/helpers/mailer.helpers.d.ts +33 -0
  91. package/dist/helpers/mailer.helpers.js +34 -0
  92. package/dist/helpers/multer.helpers.d.ts +2 -0
  93. package/dist/helpers/multer.helpers.js +52 -0
  94. package/dist/helpers/print.helpers.d.ts +8 -0
  95. package/dist/helpers/print.helpers.js +29 -0
  96. package/dist/helpers/random.helpers.d.ts +4 -0
  97. package/dist/helpers/random.helpers.js +27 -0
  98. package/dist/index.d.ts +8 -0
  99. package/dist/index.js +26 -0
  100. package/dist/main.d.ts +13 -0
  101. package/dist/main.js +65 -0
  102. package/dist/middlewares/delay-request.middleware.d.ts +1 -0
  103. package/dist/middlewares/delay-request.middleware.js +16 -0
  104. package/dist/middlewares/handle-error.middleware.d.ts +1 -0
  105. package/dist/middlewares/handle-error.middleware.js +13 -0
  106. package/dist/resources/color.resources.d.ts +18 -0
  107. package/dist/resources/color.resources.js +20 -0
  108. package/dist/resources/index.d.ts +2 -0
  109. package/dist/resources/index.js +18 -0
  110. package/dist/resources/refs.d.ts +32 -0
  111. package/dist/resources/refs.js +35 -0
  112. package/dist/resources/string.resources.d.ts +15 -0
  113. package/dist/resources/string.resources.js +16 -0
  114. package/dist/router/app-router.class.d.ts +18 -0
  115. package/dist/router/app-router.class.js +34 -0
  116. package/dist/router/call-controller.d.ts +5 -0
  117. package/dist/router/call-controller.js +47 -0
  118. package/dist/router/index.d.ts +1 -0
  119. package/dist/router/index.js +17 -0
  120. package/dist/router/router.types.d.ts +15 -0
  121. package/dist/router/router.types.js +2 -0
  122. package/dist/types/error.types.d.ts +4 -0
  123. package/dist/types/error.types.js +2 -0
  124. package/dist/types/global.types.d.ts +22 -0
  125. package/dist/types/global.types.js +2 -0
  126. package/dist/types/index.d.ts +2 -0
  127. package/dist/types/index.js +4 -0
  128. package/dist/validations/general-schemas.d.ts +20 -0
  129. package/dist/validations/general-schemas.js +15 -0
  130. package/dist/validations/index.d.ts +3 -0
  131. package/dist/validations/index.js +19 -0
  132. package/dist/validations/validate-request.middleware.d.ts +2 -0
  133. package/dist/validations/validate-request.middleware.js +33 -0
  134. package/dist/validations/validation-locations.d.ts +1 -0
  135. package/dist/validations/validation-locations.js +4 -0
  136. package/dist/validations/validations.types.d.ts +23 -0
  137. package/dist/validations/validations.types.js +21 -0
  138. package/dist/validator/general-schemas.d.ts +1 -0
  139. package/dist/validator/general-schemas.js +25 -0
  140. package/dist/validator/index.d.ts +1 -0
  141. package/dist/validator/index.js +17 -0
  142. package/dist/validator/tags.d.ts +1 -0
  143. package/dist/validator/tags.js +5 -0
  144. package/dist/validator/validate-request.d.ts +2 -0
  145. package/dist/validator/validate-request.js +71 -0
  146. package/dist/validator/validator.types.d.ts +6 -0
  147. package/dist/validator/validator.types.js +2 -0
  148. package/dist/validator/validators.helpers.d.ts +38 -0
  149. package/dist/validator/validators.helpers.js +8 -0
  150. package/package.json +78 -0
@@ -0,0 +1,42 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.HasMany = exports.HasOne = exports.BelongsTo = void 0;
27
+ const seq = __importStar(require("sequelize-typescript"));
28
+ exports.BelongsTo = getRelation(seq.BelongsTo);
29
+ exports.HasOne = getRelation(seq.HasOne);
30
+ exports.HasMany = getRelation(seq.HasMany);
31
+ // internal functions
32
+ function getRelation(relationFn) {
33
+ return function (getModelFn, options = {}) {
34
+ return function (target, propertyName) {
35
+ const { foreignKey, ...relOptions } = options;
36
+ relationFn(getModelFn, { as: propertyName, ...(foreignKey && { foreignKey }) })(target, propertyName);
37
+ const model = target.constructor;
38
+ const { eager = relationFn !== seq.HasMany, required = relationFn === seq.BelongsTo ? !model.Columns[`${propertyName}Id`].allowNull : false, paranoid = relationFn !== seq.BelongsTo, joinDepth = 1, ...restOptions } = relOptions;
39
+ model.AddRelation(propertyName, { model: getModelFn(), eager, required, paranoid, joinDepth, ...restOptions });
40
+ };
41
+ };
42
+ }
@@ -0,0 +1,9 @@
1
+ import type { ColGeneralOptions, ColNullable, ColOptional } from './decorators.types';
2
+ type ColStrOptions = ColGeneralOptions & ColOptional & {
3
+ minLength?: number;
4
+ maxLength?: number;
5
+ regex?: RegExp;
6
+ };
7
+ export declare function ColStr(options?: ColStrOptions & ColNullable): (target: any, propertyName: string) => void;
8
+ export declare function ColText(options?: ColStrOptions): (target: any, propertyName: string) => void;
9
+ export {};
@@ -0,0 +1,51 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ColText = exports.ColStr = void 0;
27
+ const seq = __importStar(require("sequelize-typescript"));
28
+ const column_1 = require("./column");
29
+ // resources
30
+ const refs_1 = require("../../resources/refs");
31
+ function ColStr(options = {}) {
32
+ const { maxLength = refs_1.refs.stringLengths.medium, ...restOptions } = options;
33
+ return getStrColumn(seq.DataType.STRING(maxLength), { ...restOptions, maxLength });
34
+ }
35
+ exports.ColStr = ColStr;
36
+ function ColText(options) {
37
+ return getStrColumn(seq.DataType.TEXT, options);
38
+ }
39
+ exports.ColText = ColText;
40
+ // internal functions
41
+ function getStrColumn(type, options = {}) {
42
+ const { minLength = 0, maxLength = Infinity, regex, ...restOptions } = options;
43
+ return (0, column_1.Column)(type, {
44
+ ...restOptions,
45
+ fallbackDefaultValue: '',
46
+ validate: {
47
+ len: [minLength, maxLength],
48
+ ...(regex ? { is: regex } : {}),
49
+ },
50
+ });
51
+ }
@@ -0,0 +1,6 @@
1
+ import type { Index } from '../database.types';
2
+ type TableOptions = {
3
+ indexes?: Index[];
4
+ };
5
+ export declare function Table(tableName: string, options?: TableOptions): (target: BaseModelCtor) => void;
6
+ export {};
@@ -0,0 +1,57 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Table = void 0;
27
+ const seq = __importStar(require("sequelize-typescript"));
28
+ // helpers
29
+ const pangea_helpers_1 = require("pangea-helpers");
30
+ function Table(tableName, options = {}) {
31
+ const { indexes } = options;
32
+ return function (target) {
33
+ const tableIndexes = indexes || [];
34
+ const columnIndexes = target.ColumnIndexes;
35
+ const allIndexes = [...tableIndexes, ...columnIndexes];
36
+ seq.Table({
37
+ tableName,
38
+ charset: 'utf8mb4',
39
+ collate: 'utf8mb4_general_ci',
40
+ underscored: true,
41
+ timestamps: true,
42
+ paranoid: true,
43
+ indexes: allIndexes.map(({ field, fields, ...restIndex }) => {
44
+ return {
45
+ ...restIndex,
46
+ fields: fields ? fields.map(pangea_helpers_1.camelToSnake) : field ? [(0, pangea_helpers_1.camelToSnake)(field)] : [],
47
+ };
48
+ }),
49
+ })(target);
50
+ const excludedAttributes = target.ExcludedAttributes;
51
+ if (!excludedAttributes.length)
52
+ return;
53
+ seq.DefaultScope(() => ({ attributes: { exclude: excludedAttributes } }))(target);
54
+ seq.Scopes(() => ({ withExcludedAttributes: { attributes: { include: excludedAttributes } } }))(target);
55
+ };
56
+ }
57
+ exports.Table = Table;
@@ -0,0 +1,33 @@
1
+ import { Model, Column } from 'sequelize-typescript';
2
+ import type { Index, DefaultValue, GetModelFn } from '../database.types';
3
+ type Column = {
4
+ allowNull: boolean;
5
+ defaultValue: DefaultValue | undefined;
6
+ };
7
+ type Columns = Record<string, Column>;
8
+ type Relation = {
9
+ getModelFn: GetModelFn;
10
+ eager: boolean;
11
+ required: boolean;
12
+ paranoid: boolean;
13
+ joinDepth: number;
14
+ };
15
+ type Relations = Record<string, Relation>;
16
+ export declare abstract class BaseModel extends Model {
17
+ private static __ExcludedAttributes?;
18
+ private static __Columns?;
19
+ private static __ColumnIndexes?;
20
+ private static __Relations?;
21
+ id: ModelId;
22
+ static get ExcludedAttributes(): string[];
23
+ static get Columns(): Columns;
24
+ static get ColumnIndexes(): Index[];
25
+ static get Relations(): Relations;
26
+ static AddExcludedAttribute(attribute: string): void;
27
+ static AddColumn(colName: string, col: Column): void;
28
+ static AddColumnIndex(index: Index): void;
29
+ static AddRelation(relName: string, rel: Relation): void;
30
+ static __SetObject(key: string): void;
31
+ static __SetArray(key: string): void;
32
+ }
33
+ export {};
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BaseModel = void 0;
13
+ const sequelize_typescript_1 = require("sequelize-typescript");
14
+ class BaseModel extends sequelize_typescript_1.Model {
15
+ static get ExcludedAttributes() {
16
+ return this.__ExcludedAttributes || [];
17
+ }
18
+ static get Columns() {
19
+ return this.__Columns || {};
20
+ }
21
+ static get ColumnIndexes() {
22
+ return this.__ColumnIndexes || [];
23
+ }
24
+ static get Relations() {
25
+ return this.__Relations || {};
26
+ }
27
+ static AddExcludedAttribute(attribute) {
28
+ this.__SetArray('__ExcludedAttributes');
29
+ this.__ExcludedAttributes.push(attribute);
30
+ }
31
+ static AddColumn(colName, col) {
32
+ this.__SetObject('__Columns');
33
+ this.__Columns[colName] = col;
34
+ }
35
+ static AddColumnIndex(index) {
36
+ this.__SetArray('__ColumnIndexes');
37
+ this.__ColumnIndexes.push(index);
38
+ }
39
+ static AddRelation(relName, rel) {
40
+ this.__SetObject('__Relations');
41
+ this.__Relations[relName] = rel;
42
+ }
43
+ static __SetObject(key) {
44
+ if (Object.prototype.hasOwnProperty.call(this, key))
45
+ return;
46
+ const result = {};
47
+ let current = Object.getPrototypeOf(this);
48
+ while (current && current !== Function.prototype) {
49
+ const inherited = current[key];
50
+ if (inherited)
51
+ Object.assign(result, inherited);
52
+ current = Object.getPrototypeOf(current);
53
+ }
54
+ this[key] = result;
55
+ }
56
+ static __SetArray(key) {
57
+ if (Object.prototype.hasOwnProperty.call(this, key))
58
+ return;
59
+ const result = [];
60
+ let current = Object.getPrototypeOf(this);
61
+ while (current && current !== Function.prototype) {
62
+ const inherited = current[key];
63
+ if (inherited)
64
+ result.unshift(...inherited);
65
+ current = Object.getPrototypeOf(current);
66
+ }
67
+ this[key] = result;
68
+ }
69
+ }
70
+ exports.BaseModel = BaseModel;
71
+ __decorate([
72
+ sequelize_typescript_1.PrimaryKey,
73
+ sequelize_typescript_1.AutoIncrement,
74
+ sequelize_typescript_1.Column,
75
+ __metadata("design:type", Number)
76
+ ], BaseModel.prototype, "id", void 0);
@@ -0,0 +1,2 @@
1
+ export * from './base-model.class';
2
+ export * from './user.model';
@@ -0,0 +1,18 @@
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("./base-model.class"), exports);
18
+ __exportStar(require("./user.model"), exports);
@@ -0,0 +1,5 @@
1
+ import { BaseModel } from './base-model.class';
2
+ export declare abstract class User extends BaseModel {
3
+ username: string;
4
+ password?: ColExcluded<string>;
5
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.User = void 0;
13
+ const base_model_class_1 = require("./base-model.class");
14
+ const decorators_1 = require("../decorators");
15
+ class User extends base_model_class_1.BaseModel {
16
+ }
17
+ exports.User = User;
18
+ __decorate([
19
+ decorators_1.col.Str({ unique: true, minLength: 8, maxLength: 'short' }),
20
+ __metadata("design:type", String)
21
+ ], User.prototype, "username", void 0);
22
+ __decorate([
23
+ decorators_1.col.Str({ exclude: true, maxLength: 'medium' }),
24
+ __metadata("design:type", Object)
25
+ ], User.prototype, "password", void 0);
@@ -0,0 +1,4 @@
1
+ import type { Models, Seeds } from './database.types';
2
+ export declare function dropTables(): Promise<void>;
3
+ export declare function syncTables(): Promise<void>;
4
+ export declare function seedTables<M extends Models>(models: M, seeds: Seeds<M>): Promise<void>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seedTables = exports.syncTables = exports.dropTables = void 0;
4
+ const db_client_1 = require("./db-client");
5
+ const db_class_1 = require("./db.class");
6
+ // helpers
7
+ const helpers_1 = require("../helpers");
8
+ async function dropTables() {
9
+ (0, helpers_1.printInfo)('database', 'dropping tables...');
10
+ const dbClient = (0, db_client_1.getDbClient)();
11
+ await dbClient.drop();
12
+ (0, helpers_1.printSuccess)('database', 'tables dropped');
13
+ }
14
+ exports.dropTables = dropTables;
15
+ async function syncTables() {
16
+ const dbClient = (0, db_client_1.getDbClient)();
17
+ await dbClient.sync();
18
+ }
19
+ exports.syncTables = syncTables;
20
+ async function seedTables(models, seeds) {
21
+ (0, helpers_1.printInfo)('database', 'seeding tables...');
22
+ const modelsToSeed = Object.values(models)
23
+ .filter(() => (0, helpers_1.getEnvBool)('DB_INCLUDE_TESTING_SEEDS'))
24
+ .map((model) => model.name);
25
+ const modelsWithData = modelsToSeed.filter((modelName) => seeds[modelName]?.length);
26
+ const tx = await (0, db_client_1.getDbClient)().transaction();
27
+ const db = new db_class_1.Db(tx);
28
+ try {
29
+ await db.disableForeignKeyChecks();
30
+ await Promise.all(modelsWithData.map(async (modelName) => {
31
+ const data = seeds[modelName];
32
+ await db.insertMany(models[modelName], data);
33
+ }));
34
+ await db.enableForeignKeyChecks();
35
+ await tx.commit();
36
+ }
37
+ catch (err) {
38
+ await db.enableForeignKeyChecks();
39
+ await tx.rollback();
40
+ throw err;
41
+ }
42
+ (0, helpers_1.printSuccess)('database', 'tables seeded');
43
+ }
44
+ exports.seedTables = seedTables;
@@ -0,0 +1,8 @@
1
+ export declare function printInfo(label: string | undefined, msg: string): void;
2
+ export declare function printSuccess(label: string | undefined, msg: string): void;
3
+ export declare function printWarning(label: string | undefined, warning: string | Error): void;
4
+ type PrintDangerConfig = {
5
+ printError?: boolean;
6
+ };
7
+ export declare function printDanger(label: string | undefined, danger: string | Error, config?: PrintDangerConfig): void;
8
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printDanger = exports.printWarning = exports.printSuccess = exports.printInfo = void 0;
4
+ function printInfo(label, msg) {
5
+ const finalLabel = label || 'info';
6
+ console.log(`\x1b[34m[${finalLabel}]\x1b[0m`, msg);
7
+ }
8
+ exports.printInfo = printInfo;
9
+ function printSuccess(label, msg) {
10
+ const finalLabel = label || 'success';
11
+ console.log(`\x1b[32m[${finalLabel}]\x1b[0m`, msg);
12
+ }
13
+ exports.printSuccess = printSuccess;
14
+ function printWarning(label, warning) {
15
+ const finalLabel = label || 'warning';
16
+ const msg = warning instanceof Error ? `${warning.name}: ${warning.message}` : warning;
17
+ console.warn(`\x1b[33m[${finalLabel}]\x1b[0m`, msg);
18
+ }
19
+ exports.printWarning = printWarning;
20
+ function printDanger(label, danger, config) {
21
+ const { printError } = config || {};
22
+ const finalLabel = label || 'danger';
23
+ const isError = danger instanceof Error;
24
+ const msg = isError ? `${danger.name}: ${danger.message}` : danger;
25
+ console.error(`\x1b[31m[${finalLabel}]\x1b[0m`, msg);
26
+ if (isError && printError)
27
+ console.error(danger);
28
+ }
29
+ exports.printDanger = printDanger;
@@ -0,0 +1,2 @@
1
+ export declare abstract class BaseController {
2
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseController = void 0;
4
+ class BaseController {
5
+ }
6
+ exports.BaseController = BaseController;
@@ -0,0 +1,4 @@
1
+ export declare function getEnvStr(key: string, raiseException?: boolean): string;
2
+ export declare function getEnvInt(key: string, raiseException?: boolean): number;
3
+ export declare function getEnvFloat(key: string, raiseException?: boolean): number;
4
+ export declare function getEnvBool(key: string, raiseException?: boolean): boolean;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEnvBool = exports.getEnvFloat = exports.getEnvInt = exports.getEnvStr = void 0;
4
+ const dotenv_1 = require("dotenv");
5
+ // init dotenv
6
+ (0, dotenv_1.config)();
7
+ function __getEnv(key, raiseException) {
8
+ const value = process.env[key];
9
+ if (value === undefined) {
10
+ if (raiseException)
11
+ throw new Error(`${key} key is required in the .env file`);
12
+ return '';
13
+ }
14
+ return value;
15
+ }
16
+ function getEnvStr(key, raiseException = true) {
17
+ return __getEnv(key, raiseException);
18
+ }
19
+ exports.getEnvStr = getEnvStr;
20
+ function getEnvInt(key, raiseException = true) {
21
+ return parseInt(__getEnv(key, raiseException));
22
+ }
23
+ exports.getEnvInt = getEnvInt;
24
+ function getEnvFloat(key, raiseException = true) {
25
+ return parseFloat(__getEnv(key, raiseException));
26
+ }
27
+ exports.getEnvFloat = getEnvFloat;
28
+ function getEnvBool(key, raiseException = false) {
29
+ const value = __getEnv(key, raiseException);
30
+ return value.toLowerCase() === 'true';
31
+ }
32
+ exports.getEnvBool = getEnvBool;
@@ -0,0 +1,20 @@
1
+ import type { StatusCodeName, StatusCode, ErrorCode } from '../types/error.types';
2
+ type AppErrorCtor = {
3
+ statusCodeName: StatusCodeName;
4
+ errorCode: ErrorCode;
5
+ err?: Error;
6
+ message?: string;
7
+ };
8
+ export declare class AppError extends Error {
9
+ name: string;
10
+ statusCode: StatusCode;
11
+ errorCode: ErrorCode;
12
+ originalError?: Error;
13
+ message: string;
14
+ constructor(config: AppErrorCtor);
15
+ static Throw(config: AppErrorCtor): never;
16
+ static ThrowEntityNotFound(): never;
17
+ static ThrowUnauthorized(): never;
18
+ static ThrowInvalidCredentials(): never;
19
+ }
20
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppError = void 0;
4
+ const http_status_codes_1 = require("http-status-codes");
5
+ class AppError extends Error {
6
+ constructor(config) {
7
+ super();
8
+ this.name = 'AppError';
9
+ const { statusCodeName, errorCode, err, message } = config;
10
+ this.statusCode = http_status_codes_1.StatusCodes[statusCodeName];
11
+ this.errorCode = errorCode;
12
+ if (err)
13
+ this.originalError = err;
14
+ this.message = message || err?.message || errorCode;
15
+ }
16
+ static Throw(config) {
17
+ throw new AppError(config);
18
+ }
19
+ static ThrowEntityNotFound() {
20
+ this.Throw({ statusCodeName: 'NOT_FOUND', errorCode: 'ENTITY_NOT_FOUND' });
21
+ }
22
+ static ThrowUnauthorized() {
23
+ this.Throw({ statusCodeName: 'UNAUTHORIZED', errorCode: 'UNAUTHORIZED', message: 'Unauthorized access' });
24
+ }
25
+ static ThrowInvalidCredentials() {
26
+ this.Throw({ statusCodeName: 'UNAUTHORIZED', errorCode: 'INVALID_CREDENTIALS', message: 'Invalid credentials' });
27
+ }
28
+ }
29
+ exports.AppError = AppError;
@@ -0,0 +1,4 @@
1
+ export declare function deleteFile(fileName: string | null | undefined): Promise<void>;
2
+ export declare function deleteFiles(fileNames: string[]): Promise<void[]>;
3
+ export declare function uploadImage(image: UploadableImage | undefined, previousImage: string | null | undefined, ...folders: string[]): Promise<string>;
4
+ export declare function uploadImages(images: UploadableImage[] | undefined, ...folders: string[]): Promise<string[]>;
@@ -0,0 +1,78 @@
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
+ exports.uploadImages = exports.uploadImage = exports.deleteFiles = exports.deleteFile = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const aws_sdk_1 = __importDefault(require("aws-sdk"));
10
+ const sharp_1 = __importDefault(require("sharp"));
11
+ // helpers
12
+ const error_helpers_1 = require("./error.helpers");
13
+ const print_helpers_1 = require("./print.helpers");
14
+ const env_helpers_1 = require("./env.helpers");
15
+ const random_helpers_1 = require("./random.helpers");
16
+ const bucketName = (() => {
17
+ const appName = (0, env_helpers_1.getEnvStr)('APP_NAME');
18
+ const environment = (0, env_helpers_1.getEnvStr)('ENVIRONMENT');
19
+ if (environment === 'production')
20
+ return appName;
21
+ return `${appName}-${environment}`;
22
+ })();
23
+ const endpointUrl = 'nyc3.digitaloceanspaces.com';
24
+ const s3 = new aws_sdk_1.default.S3({
25
+ endpoint: new aws_sdk_1.default.Endpoint(endpointUrl),
26
+ accessKeyId: (0, env_helpers_1.getEnvStr)('DIGITAL_OCEAN_SPACES_ACCESS_KEY'),
27
+ secretAccessKey: (0, env_helpers_1.getEnvStr)('DIGITAL_OCEAN_SPACES_SECRET_KEY'),
28
+ });
29
+ async function deleteFile(fileName) {
30
+ if (!fileName)
31
+ return;
32
+ await s3
33
+ .deleteObject({
34
+ Bucket: bucketName,
35
+ Key: fileName,
36
+ })
37
+ .promise();
38
+ (0, print_helpers_1.printInfo)('file', `file deleted from ${fileName}`);
39
+ }
40
+ exports.deleteFile = deleteFile;
41
+ async function deleteFiles(fileNames) {
42
+ return Promise.all(fileNames.map((fileName) => deleteFile(fileName)));
43
+ }
44
+ exports.deleteFiles = deleteFiles;
45
+ async function uploadImage(image, previousImage, ...folders) {
46
+ if (!image)
47
+ error_helpers_1.AppError.Throw({ statusCodeName: 'BAD_REQUEST', errorCode: 'IMAGE_NOT_SENT' });
48
+ await deleteFile(previousImage);
49
+ const imageBuffer = typeof image === 'string' ? await promises_1.default.readFile(path_1.default.join(process.cwd(), image)) : image.buffer;
50
+ const max_size_kb = 200;
51
+ const max_size_bytes = max_size_kb * 1024;
52
+ const qualityRatio = imageBuffer.length > max_size_bytes ? max_size_bytes / imageBuffer.length : 1;
53
+ const qualityMultiplier = 2;
54
+ const targetQuality = Math.floor(qualityRatio * 100 * qualityMultiplier);
55
+ const quality = Math.max(10, Math.min(100, targetQuality));
56
+ const bufferCompressed = await (0, sharp_1.default)(imageBuffer)
57
+ .png({
58
+ quality,
59
+ })
60
+ .toBuffer();
61
+ const params = {
62
+ Bucket: bucketName,
63
+ Key: `${folders.join('/')}/${(0, random_helpers_1.getRandomString)('short')}`,
64
+ Body: bufferCompressed,
65
+ ContentType: 'image/jpeg',
66
+ ACL: 'public-read',
67
+ };
68
+ const res = await s3.upload(params).promise();
69
+ (0, print_helpers_1.printInfo)('file', `file uploaded to ${res.Location}`);
70
+ return res.Key;
71
+ }
72
+ exports.uploadImage = uploadImage;
73
+ async function uploadImages(images, ...folders) {
74
+ if (!images)
75
+ error_helpers_1.AppError.Throw({ statusCodeName: 'BAD_REQUEST', errorCode: 'IMAGES_NOT_SENT' });
76
+ return Promise.all(images.map((image) => uploadImage(image, undefined, ...folders)));
77
+ }
78
+ exports.uploadImages = uploadImages;
@@ -0,0 +1,2 @@
1
+ export declare function hashPassword(pass: string): Promise<string>;
2
+ export declare function comparePasswords(plainPass: string, encryptedPass: string): Promise<boolean>;
@@ -0,0 +1,16 @@
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
+ exports.comparePasswords = exports.hashPassword = void 0;
7
+ const bcrypt_1 = __importDefault(require("bcrypt"));
8
+ async function hashPassword(pass) {
9
+ const saltRounds = 10;
10
+ return await bcrypt_1.default.hash(pass, saltRounds);
11
+ }
12
+ exports.hashPassword = hashPassword;
13
+ async function comparePasswords(plainPass, encryptedPass) {
14
+ return await bcrypt_1.default.compare(plainPass, encryptedPass);
15
+ }
16
+ exports.comparePasswords = comparePasswords;
@@ -0,0 +1,4 @@
1
+ import { type StringLength } from '../resources';
2
+ export declare function sanitizeHtml(html: string): string;
3
+ export declare function removeHtmlTags(html: string): string;
4
+ export declare function getHtmlSanitized(html: string | null, maxLength?: StringLength | number): string | null;