@volcanicminds/backend 0.1.3 → 0.1.5

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 (44) hide show
  1. package/NPM.md +24 -0
  2. package/TODO.md +1 -3
  3. package/dist/api/me/controller/me.js +32 -0
  4. package/dist/api/me/controller/me.js.map +1 -0
  5. package/dist/api/me/routes.js +101 -0
  6. package/dist/api/me/routes.js.map +1 -0
  7. package/dist/apollo/context.js +19 -0
  8. package/dist/apollo/context.js.map +1 -0
  9. package/dist/apollo/resolvers.js +9 -0
  10. package/dist/apollo/resolvers.js.map +1 -0
  11. package/dist/apollo/type-defs.js +9 -0
  12. package/dist/apollo/type-defs.js.map +1 -0
  13. package/dist/config/roles.js +21 -0
  14. package/dist/config/roles.js.map +1 -0
  15. package/dist/index.js +245 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/loader/roles.js +13 -0
  18. package/dist/loader/roles.js.map +1 -0
  19. package/dist/loader/router.js +133 -0
  20. package/dist/loader/router.js.map +1 -0
  21. package/dist/middleware/example.js +13 -0
  22. package/dist/middleware/example.js.map +1 -0
  23. package/dist/middleware/isAdmin.js +18 -0
  24. package/dist/middleware/isAdmin.js.map +1 -0
  25. package/dist/middleware/isAuthenticated.js +18 -0
  26. package/dist/middleware/isAuthenticated.js.map +1 -0
  27. package/dist/server.js +5 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/util/logger.js +52 -0
  30. package/dist/util/logger.js.map +1 -0
  31. package/dist/util/mark.js +25 -0
  32. package/dist/util/mark.js.map +1 -0
  33. package/dist/util/yn.js +17 -0
  34. package/dist/util/yn.js.map +1 -0
  35. package/index.d.ts +12 -0
  36. package/lib/config/roles.ts +1 -0
  37. package/lib/index.ts +29 -23
  38. package/lib/loader/roles.ts +1 -0
  39. package/lib/loader/router.ts +13 -34
  40. package/lib/server.ts +7 -0
  41. package/package.json +7 -7
  42. package/tsconfig.json +25 -17
  43. package/types/global.d.ts +86 -0
  44. package/lib/types/global.d.ts +0 -66
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.apply = exports.load = void 0;
13
+ const glob = require('glob');
14
+ const path = require('path');
15
+ const methods = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS'];
16
+ function load() {
17
+ const validRoutes = [];
18
+ const patterns = [`${__dirname}/../api/**/routes.{ts,js}`, `${process.cwd()}/src/api/**/routes.{ts,js}`];
19
+ patterns.forEach((pattern) => {
20
+ log.i && log.info('Looking for ' + pattern);
21
+ glob.sync(pattern).forEach((f, index, values) => {
22
+ const base = path.dirname(f);
23
+ const dir = path.basename(base);
24
+ const file = path.join(dir, path.basename(f));
25
+ const routesjs = require(f);
26
+ const { routes = [], config: defaultConfig = {} } = routesjs === null || routesjs === void 0 ? void 0 : routesjs.default;
27
+ if (!defaultConfig.enable)
28
+ defaultConfig.enable = true;
29
+ if (defaultConfig.deprecated == null)
30
+ defaultConfig.deprecated = false;
31
+ if (defaultConfig.controller == null)
32
+ defaultConfig.controller = 'controller';
33
+ log.i && log.info(`Load ${file} with ${routes.length} routes defined`);
34
+ log.d && log.debug(`Valid routes loaded from ${file}`);
35
+ routes.forEach((route, index) => {
36
+ const errors = [];
37
+ const { method: methodCase, path: pathName = '/', handler, config, middlewares = [], roles = [] } = route;
38
+ const { title = '', description = '', enable = defaultConfig.enable || true, deprecated = defaultConfig.deprecated || false, version = defaultConfig.version || '', params, body, response } = config || {};
39
+ const endpoint = `${dir}${pathName.replace(/\/+$/, '')}`;
40
+ const method = methodCase.toUpperCase();
41
+ const num = index + 1;
42
+ const handlerParts = handler.split('.');
43
+ if (enable) {
44
+ if (!pathName.startsWith('/')) {
45
+ errors.push(`Error in [${file}] bad path [${pathName}] at route n. ${num}`);
46
+ }
47
+ if (!methods.includes(method)) {
48
+ errors.push(`Error in [${file}] bad method [${method}] at route n. ${num}`);
49
+ }
50
+ if (handlerParts.length !== 2) {
51
+ errors.push(`Error in [${file}] bad handler [${handler}] at route n. ${num}`);
52
+ }
53
+ const key = method + endpoint + version;
54
+ if (validRoutes.some((r) => { var _a; return `${r.method}${r.path}${(_a = r.doc) === null || _a === void 0 ? void 0 : _a.version}` === key; })) {
55
+ errors.push(`Error in [${file}] duplicated path [${pathName}] at route n. ${num}`);
56
+ }
57
+ if (errors.length > 0) {
58
+ log.e && errors.forEach((error) => log.error(error));
59
+ }
60
+ }
61
+ if (errors.length == 0) {
62
+ enable
63
+ ? log.d &&
64
+ log.debug(`* Method [${method}] path ${endpoint} handler ${handler} enabled with ${(middlewares === null || middlewares === void 0 ? void 0 : middlewares.length) || 0} middlewares`)
65
+ : log.w && log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`);
66
+ validRoutes.push({
67
+ handler,
68
+ method,
69
+ path: '/' + endpoint,
70
+ middlewares,
71
+ roles,
72
+ enable,
73
+ base,
74
+ file: path.join(base, defaultConfig.controller, handlerParts[0]),
75
+ func: handlerParts[1],
76
+ doc: {
77
+ summary: title,
78
+ description,
79
+ deprecated,
80
+ version,
81
+ params,
82
+ body,
83
+ response
84
+ }
85
+ });
86
+ }
87
+ });
88
+ });
89
+ });
90
+ return validRoutes;
91
+ }
92
+ exports.load = load;
93
+ function normalizeMiddlewarePath(base, middleware = '') {
94
+ const key = 'global.';
95
+ const idx = middleware.indexOf(key);
96
+ return idx == 0
97
+ ? path.resolve(__dirname + '/../middleware/' + middleware.substring(key.length))
98
+ : path.resolve(base + '/middleware/' + middleware);
99
+ }
100
+ function apply(server, routes) {
101
+ log.t && log.trace(`Apply ${routes.length} routes to server with pid ${process.pid}`);
102
+ routes.forEach(({ handler, method, path, middlewares, roles, enable, base, file, func, doc }) => __awaiter(this, void 0, void 0, function* () {
103
+ if (enable) {
104
+ log.t && log.trace(`Add path ${method} ${path} on handle ${handler}`);
105
+ const allMiddlewares = (middlewares === null || middlewares === void 0 ? void 0 : middlewares.length) > 0 ? middlewares.map((m) => require(normalizeMiddlewarePath(base, m))) : [];
106
+ server.route({
107
+ method: method,
108
+ path: path,
109
+ schema: doc,
110
+ handler: (request, reply) => {
111
+ var _a;
112
+ try {
113
+ if ((roles === null || roles === void 0 ? void 0 : roles.length) > 0) {
114
+ const userRoles = ((_a = request.user) === null || _a === void 0 ? void 0 : _a.roles) || [];
115
+ const resolvedRole = roles.filter((r) => userRoles.includes(r.code));
116
+ if (!resolvedRole || resolvedRole.length === 0) {
117
+ log.w && log.warn(`Not allowed to call ${method.toUpperCase()} ${path}`);
118
+ return reply.code(403).send();
119
+ }
120
+ }
121
+ return require(file)[func](request, reply);
122
+ }
123
+ catch (err) {
124
+ log.e && log.error(`Cannot find ${file}.js or method ${func}: ${err}`);
125
+ return reply.code(500).send(`Invalid handler ${handler}`);
126
+ }
127
+ }
128
+ });
129
+ }
130
+ }));
131
+ }
132
+ exports.apply = apply;
133
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../lib/loader/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const log = global.log;
4
+ module.exports = (req, res, next) => {
5
+ try {
6
+ return next();
7
+ }
8
+ catch (err) {
9
+ log.e && log.error(`Upps, something just happened ${err}`);
10
+ res.code(403).send(err);
11
+ }
12
+ };
13
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../../lib/middleware/example.ts"],"names":[],"mappings":";;AAEA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;AACtB,MAAM,CAAC,OAAO,GAAG,CAAC,GAAmB,EAAE,GAAiB,EAAE,IAAS,EAAE,EAAE;IACrE,IAAI;QAEF,OAAO,IAAI,EAAE,CAAA;KACd;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;KACxB;AACH,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const log = global.log;
4
+ module.exports = (req, res, next) => {
5
+ var _a, _b, _c;
6
+ try {
7
+ if (!!((_a = req.user) === null || _a === void 0 ? void 0 : _a.id) && (((_b = req.user) === null || _b === void 0 ? void 0 : _b.roles) || []).includes(roles.admin.code)) {
8
+ log.d && log.trace('isAdmin - user id ' + ((_c = req.user) === null || _c === void 0 ? void 0 : _c.id));
9
+ return next();
10
+ }
11
+ throw new Error('User not valid');
12
+ }
13
+ catch (err) {
14
+ log.e && log.error(`Upps, something just happened ${err}`);
15
+ res.code(403).send(err);
16
+ }
17
+ };
18
+ //# sourceMappingURL=isAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAdmin.js","sourceRoot":"","sources":["../../lib/middleware/isAdmin.ts"],"names":[],"mappings":";;AAEA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;AACtB,MAAM,CAAC,OAAO,GAAG,CAAC,GAAmB,EAAE,GAAiB,EAAE,IAAS,EAAE,EAAE;;IACrE,IAAI;QACF,IAAI,CAAC,CAAC,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,IAAI,CAAC,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,KAAK,KAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACxE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAG,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAC,CAAA;YACvD,OAAO,IAAI,EAAE,CAAA;SACd;QACD,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;KAClC;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;KACxB;AACH,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const log = global.log;
4
+ module.exports = (req, res, next) => {
5
+ var _a, _b;
6
+ try {
7
+ if (!!((_a = req.user) === null || _a === void 0 ? void 0 : _a.id)) {
8
+ log.d && log.trace('isAuthenticated - user id ' + ((_b = req.user) === null || _b === void 0 ? void 0 : _b.id));
9
+ return next();
10
+ }
11
+ throw new Error('User not authenticated');
12
+ }
13
+ catch (err) {
14
+ log.e && log.error(`Upps, something just happened ${err}`);
15
+ res.code(403).send(err);
16
+ }
17
+ };
18
+ //# sourceMappingURL=isAuthenticated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAuthenticated.js","sourceRoot":"","sources":["../../lib/middleware/isAuthenticated.ts"],"names":[],"mappings":";;AAEA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;AACtB,MAAM,CAAC,OAAO,GAAG,CAAC,GAAmB,EAAE,GAAiB,EAAE,IAAS,EAAE,EAAE;;IACrE,IAAI;QAEF,IAAI,CAAC,CAAC,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,EAAE;YAClB,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,4BAA4B,IAAG,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAC,CAAA;YAC/D,OAAO,IAAI,EAAE,CAAA;SACd;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC1C;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;KACxB;AACH,CAAC,CAAA"}
package/dist/server.js ADDED
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+ const server = require('./index');
3
+ server();
4
+ console.log('As soon as possible');
5
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../lib/server.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,MAAM,EAAE,CAAA;AAGR,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA"}
@@ -0,0 +1,52 @@
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 pino_1 = __importDefault(require("pino"));
7
+ const yn_1 = __importDefault(require("./yn"));
8
+ const logLevels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
9
+ const { LOG_LEVEL, LOG_COLORIZE, LOG_TIMESTAMP, LOG_TIMESTAMP_READABLE } = process.env;
10
+ function getLogLevel() {
11
+ const lvl = LOG_LEVEL === null || LOG_LEVEL === void 0 ? void 0 : LOG_LEVEL.toLowerCase();
12
+ return LOG_LEVEL && logLevels.includes(lvl) ? lvl : 'debug';
13
+ }
14
+ const logColorize = (0, yn_1.default)(LOG_COLORIZE, true);
15
+ const logTimestamp = (0, yn_1.default)(LOG_TIMESTAMP, true);
16
+ const logTimestampReadable = (0, yn_1.default)(LOG_TIMESTAMP_READABLE, true);
17
+ const loggerConfig = {
18
+ level: getLogLevel(),
19
+ timestamp: logTimestamp,
20
+ transport: {
21
+ target: 'pino-pretty',
22
+ options: {
23
+ translateTime: logTimestampReadable ? 'yyyymmdd HH:MM:ss.l' : false,
24
+ colorize: logColorize
25
+ }
26
+ }
27
+ };
28
+ let logger = (0, pino_1.default)(loggerConfig);
29
+ const logLevel = logger.levels.values[loggerConfig.level];
30
+ const loggerExt = Object.assign(logger, {
31
+ t: logLevel < 11,
32
+ d: logLevel < 21,
33
+ i: logLevel < 31,
34
+ w: logLevel < 41,
35
+ e: logLevel < 51,
36
+ f: logLevel < 61,
37
+ getLogLevel: getLogLevel,
38
+ loggerConfig: loggerConfig,
39
+ updateLevel: () => {
40
+ loggerExt.t = loggerExt.levelVal < 11;
41
+ loggerExt.d = loggerExt.levelVal < 21;
42
+ loggerExt.i = loggerExt.levelVal < 31;
43
+ loggerExt.w = loggerExt.levelVal < 41;
44
+ loggerExt.e = loggerExt.levelVal < 51;
45
+ loggerExt.f = loggerExt.levelVal < 61;
46
+ }
47
+ });
48
+ loggerExt.on('level-change', () => {
49
+ log.trace('Log level changed');
50
+ });
51
+ exports.default = loggerExt;
52
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../lib/util/logger.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;AAaZ,gDAAuB;AACvB,8CAAqB;AAErB,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAEtE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAA;AAEtF,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,EAAE,CAAA;IACpC,OAAO,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC,CAAC,OAAO,CAAA;AAC/D,CAAC;AAED,MAAM,WAAW,GAAG,IAAA,YAAE,EAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAC1C,MAAM,YAAY,GAAG,IAAA,YAAE,EAAC,aAAa,EAAE,IAAI,CAAC,CAAA;AAC5C,MAAM,oBAAoB,GAAG,IAAA,YAAE,EAAC,sBAAsB,EAAE,IAAI,CAAC,CAAA;AAE7D,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,WAAW,EAAE;IACpB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE;QACT,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE;YACP,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK;YACnE,QAAQ,EAAE,WAAW;SACtB;KACF;CACF,CAAA;AAED,IAAI,MAAM,GAAG,IAAA,cAAI,EAAC,YAAY,CAAC,CAAA;AAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;AAKzD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;IACtC,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,CAAC,EAAE,QAAQ,GAAG,EAAE;IAChB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,GAAG,EAAE;QAChB,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;QACrC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;QACrC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;QACrC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;QACrC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;QACrC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAA;IACvC,CAAC;CACF,CAAC,CAAA;AAEF,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;IAChC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEF,kBAAe,SAAS,CAAA"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.print = void 0;
4
+ const pkg = require('../../package.json');
5
+ function print(logg = log) {
6
+ logg.i && logg.info('Ciao');
7
+ logg.i && logg.info(` ,--. ,--. `);
8
+ logg.i && logg.info(`.--. ,--,---.| |,---.,--,--,--,--\\\`--',---. `);
9
+ logg.i && logg.info(` \\ '' | .-. | / .--' ,-. | ,--/ .--' `);
10
+ logg.i && logg.info(` \\ /' '-' | \\ \`--\\ '-' | || | \\ \`--. `);
11
+ logg.i && logg.info(` \`--' \`---'\`--'\`---'\`--\`--\`--''--\`--'\`---' `);
12
+ logg.i && logg.info('');
13
+ logg.t && logg.trace(`Package ${pkg.name}`);
14
+ logg.i && logg.info(`License ${pkg.license}`);
15
+ logg.i && logg.info(`Version ${pkg.version}`);
16
+ logg.i && logg.info(`Codename ${pkg.codename}`);
17
+ logg.i && logg.info(`Environment ${process.env.NODE_ENV}`);
18
+ logg.t && logg.trace(`Platform ${process.platform} ${process.arch}`);
19
+ logg.t && logg.trace(`Root path ${process.cwd()}`);
20
+ logg.t && logg.trace(`Node ${process.version}`);
21
+ logg.t && logg.trace(`Release ${JSON.stringify(process.release)}`);
22
+ logg.t && logg.trace(`Versions ${JSON.stringify(process.versions)}`);
23
+ }
24
+ exports.print = print;
25
+ //# sourceMappingURL=mark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark.js","sourceRoot":"","sources":["../../lib/util/mark.ts"],"names":[],"mappings":";;;AAAA,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAMzC,SAAgB,KAAK,CAAC,OAAY,GAAG;IACnC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IACrE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IACvE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACtE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;IAC3E,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAA;IAC9E,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IAC3C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC/C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACpE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC;AAlBD,sBAkBC"}
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function yn(value, defaultValue) {
4
+ if (value === undefined || value === null) {
5
+ return defaultValue;
6
+ }
7
+ const val = String(value).trim();
8
+ if (/^(?:y|yes|true|1|on)$/i.test(val)) {
9
+ return true;
10
+ }
11
+ if (/^(?:n|no|false|0|off)$/i.test(val)) {
12
+ return false;
13
+ }
14
+ return defaultValue || false;
15
+ }
16
+ exports.default = yn;
17
+ //# sourceMappingURL=yn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yn.js","sourceRoot":"","sources":["../../lib/util/yn.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,SAAwB,EAAE,CAAC,KAAU,EAAE,YAAqB;IAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;QACzC,OAAO,YAAY,CAAA;KACpB;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAEhC,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACtC,OAAO,IAAI,CAAA;KACZ;IAED,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACvC,OAAO,KAAK,CAAA;KACb;IAED,OAAO,YAAY,IAAI,KAAK,CAAA;AAC9B,CAAC;AAhBD,qBAgBC"}
package/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export {
2
+ global,
3
+ FastifyReply,
4
+ FastifyRequest,
5
+ AuthenticatedUser,
6
+ Role,
7
+ RoleKey,
8
+ Roles,
9
+ Route,
10
+ RouteConfig,
11
+ ConfiguredRoute
12
+ } from './types/global'
@@ -1,3 +1,4 @@
1
+ import { Role } from '../../types/global'
1
2
  export {}
2
3
 
3
4
  // additional roles
package/lib/index.ts CHANGED
@@ -24,24 +24,6 @@ import { myContextFunction, MyContext } from './apollo/context'
24
24
  import resolvers from './apollo/resolvers'
25
25
  import typeDefs from './apollo/type-defs'
26
26
 
27
- const begin = new Date().getTime()
28
- mark.print(logger)
29
-
30
- export interface global {}
31
- declare global {
32
- var log: any
33
- var roles: Roles
34
- }
35
-
36
- global.log = logger
37
- global.roles = loaderRoles.load()
38
-
39
- declare module 'fastify' {
40
- export interface FastifyRequest {
41
- user?: AuthenticatedUser
42
- }
43
- }
44
-
45
27
  async function attachApollo(fastify: FastifyInstance) {
46
28
  log.info('Attach ApolloServer to Fastify')
47
29
  const apollo = new ApolloServer<MyContext>({
@@ -210,8 +192,17 @@ async function addFastifySwagger(fastify: FastifyInstance) {
210
192
  )
211
193
  }
212
194
  }
213
- const opts = yn(process.env.LOG_FASTIFY, false) ? { logger: logger } : {}
214
- Fastify(opts).then(async (fastify) => {
195
+
196
+ const start = async () => {
197
+ const begin = new Date().getTime()
198
+ mark.print(logger)
199
+
200
+ global.log = logger
201
+ global.roles = loaderRoles.load()
202
+
203
+ const opts = yn(process.env.LOG_FASTIFY, false) ? { logger: logger } : {}
204
+ const fastify = await Fastify(opts)
205
+
215
206
  const { HOST: host = '0.0.0.0', PORT: port = '2230', GRAPHQL } = process.env
216
207
  const { SRV_CORS, SRV_HELMET, SRV_RATELIMIT, SRV_COMPRESS } = process.env
217
208
 
@@ -240,7 +231,7 @@ Fastify(opts).then(async (fastify) => {
240
231
  await addApolloRouting(fastify, apollo)
241
232
  await addFastifyRouting(fastify)
242
233
 
243
- fastify
234
+ await fastify
244
235
  .listen({
245
236
  port: Number(port),
246
237
  host: host
@@ -250,6 +241,21 @@ Fastify(opts).then(async (fastify) => {
250
241
  log.info(`All stuff loaded in ${elapsed} sec`)
251
242
  log.info(`🚀 Server ready at ${address}`)
252
243
  })
253
- })
254
244
 
255
- module.exports = this
245
+ return fastify
246
+ }
247
+
248
+ /**
249
+ * These export configurations enable JS and TS developers
250
+ * to consumer BE in whatever way best suits their needs.
251
+ * Some examples of supported import syntax includes:
252
+ * - `const server = require('@volcanicminds/backend')`
253
+ * - `const { server } = require('@volcanicminds/backend')`
254
+ * - `import * as Server from '@volcanicminds/backend'`
255
+ * - `import { server, TSC_definition } from '@volcanicminds/backend'`
256
+ * - `import server from '@volcanicminds/backend'`
257
+ * - `import server, { TSC_definition } from '@volcanicminds/backend'`
258
+ */
259
+ module.exports = start
260
+ module.exports.server = start
261
+ module.exports.default = start
@@ -1,3 +1,4 @@
1
+ import { Role, RoleKey, Roles } from '../../types/global'
1
2
  import { roles as configRoles } from '../config/roles'
2
3
 
3
4
  export function load() {
@@ -1,3 +1,4 @@
1
+ import { Route, ConfiguredRoute } from '../../types/global'
1
2
  import { FastifyReply, FastifyRequest } from 'fastify'
2
3
 
3
4
  const glob = require('glob')
@@ -5,15 +6,11 @@ const path = require('path')
5
6
  const methods = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS']
6
7
 
7
8
  export function load(): ConfiguredRoute[] {
8
- const check = true,
9
- print = true,
10
- load = true
11
-
12
9
  const validRoutes: ConfiguredRoute[] = []
13
10
  const patterns = [`${__dirname}/../api/**/routes.{ts,js}`, `${process.cwd()}/src/api/**/routes.{ts,js}`]
14
11
 
15
12
  patterns.forEach((pattern) => {
16
- check && log.i && log.info('Looking for ' + pattern)
13
+ log.i && log.info('Looking for ' + pattern)
17
14
  glob.sync(pattern).forEach((f: string, index: number, values: string[]) => {
18
15
  const base = path.dirname(f)
19
16
  const dir = path.basename(base)
@@ -28,11 +25,11 @@ export function load(): ConfiguredRoute[] {
28
25
  if (defaultConfig.deprecated == null) defaultConfig.deprecated = false
29
26
  if (defaultConfig.controller == null) defaultConfig.controller = 'controller'
30
27
 
31
- check && log.i && log.info(`Load ${file} with ${routes.length} routes defined`)
32
- print && log.d && log.debug(`Valid routes loaded from ${file}`)
28
+ log.i && log.info(`Load ${file} with ${routes.length} routes defined`)
29
+ log.d && log.debug(`Valid routes loaded from ${file}`)
33
30
 
34
31
  routes.forEach((route: Route, index: number) => {
35
- const errors = []
32
+ const errors: string[] = []
36
33
  const { method: methodCase, path: pathName = '/', handler, config, middlewares = [], roles = [] } = route
37
34
 
38
35
  // specific route config
@@ -72,21 +69,19 @@ export function load(): ConfiguredRoute[] {
72
69
  }
73
70
 
74
71
  if (errors.length > 0) {
75
- check && log.e && errors.forEach((error) => log.error(error))
72
+ log.e && errors.forEach((error) => log.error(error))
76
73
  }
77
74
  }
78
75
 
79
76
  if (errors.length == 0) {
80
- enable && print
77
+ enable
81
78
  ? log.d &&
82
79
  log.debug(
83
- `* Method [${method}] path ${endpoint} handler ${handler}, has middleware? ${
84
- (middlewares && middlewares.length) || 'no'
85
- }`
80
+ `* Method [${method}] path ${endpoint} handler ${handler} enabled with ${
81
+ middlewares?.length || 0
82
+ } middlewares`
86
83
  )
87
- : !enable
88
- ? log.w && log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`)
89
- : log.i && log.info(`* Method [${method}] path ${endpoint} handler ${handler} enabled.`)
84
+ : log.w && log.warn(`* Method [${method}] path ${endpoint} handler ${handler} disabled. Skip.`)
90
85
 
91
86
  validRoutes.push({
92
87
  handler,
@@ -150,30 +145,14 @@ export function apply(server: any, routes: ConfiguredRoute[]): void {
150
145
  return reply.code(403).send()
151
146
  }
152
147
  }
153
- return require(file + '.ts')[func](request, reply)
148
+
149
+ return require(file)[func](request, reply)
154
150
  } catch (err) {
155
151
  log.e && log.error(`Cannot find ${file}.js or method ${func}: ${err}`)
156
152
  return reply.code(500).send(`Invalid handler ${handler}`)
157
153
  }
158
154
  }
159
155
  })
160
-
161
- // server[method](path, (request: FastifyRequest, reply: FastifyReply) => {
162
- // try {
163
- // if (roles?.length > 0) {
164
- // const userRoles = request.user?.roles || []
165
- // const resolvedRole = roles.filter((r) => userRoles.includes(r.code))
166
- // if (!resolvedRole || resolvedRole.length === 0) {
167
- // log.w && log.warn(`Not allowed to call ${method.toUpperCase()} ${path}`)
168
- // return reply.code(403).send()
169
- // }
170
- // }
171
- // return require(file + '.ts')[func](request, reply)
172
- // } catch (err) {
173
- // log.e && log.error(`Cannot find ${file}.js or method ${func}: ${err}`)
174
- // return reply.code(500).send(`Invalid handler ${handler}`)
175
- // }
176
- // })
177
156
  }
178
157
  })
179
158
  }
package/lib/server.ts ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict'
2
+
3
+ const server = require('./index')
4
+ server()
5
+
6
+ // as soon as possible
7
+ console.log('As soon as possible')
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@volcanicminds/backend",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "codename": "turin",
5
- "type": "module",
6
5
  "license": "MIT",
7
6
  "description": "The volcanic (minds) backend",
8
7
  "keywords": [],
9
- "main": "./lib/index.ts",
8
+ "main": "dist/index",
9
+ "typings": "dist/index",
10
10
  "engines": {
11
11
  "node": ">=16"
12
12
  },
13
13
  "scripts": {
14
14
  "compile": "tsc",
15
15
  "preprod": "npm run compile",
16
- "prod": "node ./dist/index.js",
17
- "start": "ts-node ./lib/index.ts",
18
- "dev": "nodemon --exec \"ts-node\" ./lib/index.ts",
16
+ "prod": "node ./dist/server.js",
17
+ "start": "ts-node ./lib/server.ts",
18
+ "dev": "nodemon --exec \"ts-node\" ./lib/server.ts",
19
19
  "test": "jest test --config ./jest.config.js",
20
20
  "upgrade-deps": "npm-upgrade"
21
21
  },
@@ -46,7 +46,7 @@
46
46
  "type": "git",
47
47
  "url": "git+https://github.com/volcanicminds/volcanic-backend.git"
48
48
  },
49
- "homepage": "https://github.com/volcanicminds/volcanic-backend#readme",
49
+ "homepage": "https://volcanicminds.com",
50
50
  "bugs": {
51
51
  "url": "https://github.com/volcanicminds/volcanic-backend/issues"
52
52
  },
package/tsconfig.json CHANGED
@@ -5,24 +5,32 @@
5
5
  "files": true
6
6
  },
7
7
  "compilerOptions": {
8
- "target": "es2022",
8
+ "module": "commonjs",
9
+ "declaration": false,
10
+ "noImplicitAny": false,
11
+ "noUnusedLocals": false,
12
+ "removeComments": true,
13
+ "noLib": false,
14
+ "emitDecoratorMetadata": true,
15
+ "experimentalDecorators": true,
16
+ "useUnknownInCatchVariables": false,
17
+ "target": "es6",
18
+ "sourceMap": true,
9
19
  "allowJs": true,
10
- "module": "CommonJS",
11
- "esModuleInterop": true,
12
- "lib": ["es2020"],
13
- "resolveJsonModule": true,
14
- "preserveConstEnums": true,
15
- "skipLibCheck": true /* Skip type checking of declaration files. */,
16
- "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
17
- "moduleResolution": "node",
18
- "allowSyntheticDefaultImports": true,
19
- "strict": true,
20
- // "sourceMap": true,
21
- // "types": ["node"],
22
- "typeRoots": ["./node_modules/@types", "./types", "./lib/types"],
23
20
  "outDir": "dist",
24
- "rootDirs": ["lib", "config", "types"]
21
+ "lib": ["es7"],
22
+
23
+ "paths": {
24
+ "@types": ["./types"]
25
+ }
26
+ // "types": ["node"],
27
+ // "typeRoots": ["./node_modules/@types", "./types", "./lib/types"],
28
+ // "rootDirs": ["lib", "config", "types"],
29
+ // "baseUrl": ".",
30
+ // "paths": {
31
+ // "*": ["*", "components/*"]
32
+ // }
25
33
  },
26
- "include": ["./lib/*", "./lib/**/*", "./config/*", "./config/**/*", "./types/*", "./types/**/*"],
27
- "exclude": ["node_modules"]
34
+ "include": ["lib/**/*", "config/**/*", "types/**/*"],
35
+ "exclude": ["node_modules", "test/**/*"]
28
36
  }