apeframework 0.0.0-dev.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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/api/api.d.ts +7 -0
  4. package/api/api.js +2 -0
  5. package/api/api.ts +8 -0
  6. package/api/auth.d.ts +9 -0
  7. package/api/auth.js +11 -0
  8. package/api/auth.ts +9 -0
  9. package/api/config.d.ts +13 -0
  10. package/api/config.js +59 -0
  11. package/api/config.ts +69 -0
  12. package/api/endpoint.d.ts +20 -0
  13. package/api/endpoint.js +5 -0
  14. package/api/endpoint.ts +23 -0
  15. package/api/handler.d.ts +8 -0
  16. package/api/handler.js +13 -0
  17. package/api/handler.ts +23 -0
  18. package/api/index.d.ts +7 -0
  19. package/api/index.js +187 -0
  20. package/api/index.ts +97 -0
  21. package/api/route.d.ts +6 -0
  22. package/api/route.js +2 -0
  23. package/api/route.ts +4 -0
  24. package/api/router.d.ts +4 -0
  25. package/api/router.js +111 -0
  26. package/api/router.ts +36 -0
  27. package/api/schema.d.ts +29 -0
  28. package/api/schema.js +69 -0
  29. package/api/schema.ts +98 -0
  30. package/app/app.d.ts +6 -0
  31. package/app/app.js +2 -0
  32. package/app/app.ts +7 -0
  33. package/app/boot.d.ts +4 -0
  34. package/app/boot.js +2 -0
  35. package/app/boot.ts +5 -0
  36. package/app/bundle.d.ts +14 -0
  37. package/app/bundle.js +2 -0
  38. package/app/bundle.ts +15 -0
  39. package/app/config.d.ts +4 -0
  40. package/app/config.js +9 -0
  41. package/app/config.ts +9 -0
  42. package/app/index.d.ts +9 -0
  43. package/app/index.js +103 -0
  44. package/app/index.ts +32 -0
  45. package/bin/ape-cli-ts.js +4 -0
  46. package/bin/ape-cli.js +2 -0
  47. package/cli/command.d.ts +4 -0
  48. package/cli/command.js +2 -0
  49. package/cli/command.ts +7 -0
  50. package/cli/index.d.ts +2 -0
  51. package/cli/index.js +103 -0
  52. package/cli/index.ts +41 -0
  53. package/cli/internal/api.d.ts +3 -0
  54. package/cli/internal/api.js +110 -0
  55. package/cli/internal/api.ts +38 -0
  56. package/cli/internal/index.d.ts +2 -0
  57. package/cli/internal/index.js +13 -0
  58. package/cli/internal/index.ts +9 -0
  59. package/cli/internal/migration.d.ts +3 -0
  60. package/cli/internal/migration.js +214 -0
  61. package/cli/internal/migration.ts +110 -0
  62. package/cli/internal/queue.d.ts +3 -0
  63. package/cli/internal/queue.js +147 -0
  64. package/cli/internal/queue.ts +60 -0
  65. package/cli/utils.d.ts +18 -0
  66. package/cli/utils.js +52 -0
  67. package/cli/utils.ts +48 -0
  68. package/config/config.d.ts +5 -0
  69. package/config/config.js +2 -0
  70. package/config/config.ts +6 -0
  71. package/config/configuration.d.ts +63 -0
  72. package/config/configuration.js +2 -0
  73. package/config/configuration.ts +72 -0
  74. package/config/default.d.ts +33 -0
  75. package/config/default.js +34 -0
  76. package/config/default.ts +40 -0
  77. package/config/env.d.ts +66 -0
  78. package/config/env.js +72 -0
  79. package/config/env.ts +79 -0
  80. package/config/index.d.ts +8 -0
  81. package/config/index.js +91 -0
  82. package/config/index.ts +101 -0
  83. package/config/loadFile.d.ts +2 -0
  84. package/config/loadFile.js +13 -0
  85. package/config/loadFile.ts +9 -0
  86. package/config/node.d.ts +5 -0
  87. package/config/node.js +11 -0
  88. package/config/node.ts +7 -0
  89. package/config/store.d.ts +6 -0
  90. package/config/store.js +20 -0
  91. package/config/store.ts +15 -0
  92. package/db/config/index.d.ts +10 -0
  93. package/db/config/index.js +43 -0
  94. package/db/config/index.ts +35 -0
  95. package/db/config/memory.d.ts +3 -0
  96. package/db/config/memory.js +15 -0
  97. package/db/config/memory.ts +13 -0
  98. package/db/config/mysql.d.ts +3 -0
  99. package/db/config/mysql.js +56 -0
  100. package/db/config/mysql.ts +58 -0
  101. package/db/config/postgres.d.ts +3 -0
  102. package/db/config/postgres.js +59 -0
  103. package/db/config/postgres.ts +61 -0
  104. package/db/config/sqlite.d.ts +3 -0
  105. package/db/config/sqlite.js +21 -0
  106. package/db/config/sqlite.ts +20 -0
  107. package/db/database.d.ts +3 -0
  108. package/db/database.js +3 -0
  109. package/db/database.ts +5 -0
  110. package/db/index.d.ts +10 -0
  111. package/db/index.js +32 -0
  112. package/db/index.ts +26 -0
  113. package/db/postProcess.d.ts +3 -0
  114. package/db/postProcess.js +25 -0
  115. package/db/postProcess.ts +27 -0
  116. package/db/schema/builder/_.d.ts +30 -0
  117. package/db/schema/builder/_.js +87 -0
  118. package/db/schema/builder/_.ts +101 -0
  119. package/db/schema/builder/columnBuilder.d.ts +7 -0
  120. package/db/schema/builder/columnBuilder.js +14 -0
  121. package/db/schema/builder/columnBuilder.ts +15 -0
  122. package/db/schema/builder/dataType.d.ts +28 -0
  123. package/db/schema/builder/dataType.js +170 -0
  124. package/db/schema/builder/dataType.ts +184 -0
  125. package/db/schema/builder/index.d.ts +15 -0
  126. package/db/schema/builder/index.js +42 -0
  127. package/db/schema/builder/index.ts +50 -0
  128. package/db/schema/builder/tableBuilder.d.ts +45 -0
  129. package/db/schema/builder/tableBuilder.js +307 -0
  130. package/db/schema/builder/tableBuilder.ts +409 -0
  131. package/db/schema/config.d.ts +4 -0
  132. package/db/schema/config.js +5 -0
  133. package/db/schema/config.ts +3 -0
  134. package/db/schema/index.d.ts +7 -0
  135. package/db/schema/index.js +252 -0
  136. package/db/schema/index.ts +88 -0
  137. package/db/schema/migration.d.ts +6 -0
  138. package/db/schema/migration.js +2 -0
  139. package/db/schema/migration.ts +7 -0
  140. package/db/schema/migrationList.d.ts +5 -0
  141. package/db/schema/migrationList.js +2 -0
  142. package/db/schema/migrationList.ts +5 -0
  143. package/db/schema/migrationSource.d.ts +10 -0
  144. package/db/schema/migrationSource.js +60 -0
  145. package/db/schema/migrationSource.ts +24 -0
  146. package/db/schema/schema.d.ts +6 -0
  147. package/db/schema/schema.js +2 -0
  148. package/db/schema/schema.ts +7 -0
  149. package/db/utils/index.d.ts +7 -0
  150. package/db/utils/index.js +10 -0
  151. package/db/utils/index.ts +8 -0
  152. package/db/utils/insertGetKey.d.ts +8 -0
  153. package/db/utils/insertGetKey.js +109 -0
  154. package/db/utils/insertGetKey.ts +80 -0
  155. package/i18n/config.d.ts +4 -0
  156. package/i18n/config.js +9 -0
  157. package/i18n/config.ts +9 -0
  158. package/i18n/i18n.d.ts +5 -0
  159. package/i18n/i18n.js +2 -0
  160. package/i18n/i18n.ts +6 -0
  161. package/i18n/index.d.ts +8 -0
  162. package/i18n/index.js +155 -0
  163. package/i18n/index.ts +42 -0
  164. package/i18n/internationalization.d.ts +3 -0
  165. package/i18n/internationalization.js +2 -0
  166. package/i18n/internationalization.ts +5 -0
  167. package/i18n/translation.d.ts +4 -0
  168. package/i18n/translation.js +2 -0
  169. package/i18n/translation.ts +4 -0
  170. package/jwt/config.d.ts +5 -0
  171. package/jwt/config.js +12 -0
  172. package/jwt/config.ts +11 -0
  173. package/jwt/index.d.ts +8 -0
  174. package/jwt/index.js +90 -0
  175. package/jwt/index.ts +60 -0
  176. package/jwt/jwt.d.ts +6 -0
  177. package/jwt/jwt.js +2 -0
  178. package/jwt/jwt.ts +19 -0
  179. package/jwt/user.d.ts +4 -0
  180. package/jwt/user.js +2 -0
  181. package/jwt/user.ts +4 -0
  182. package/log/config.d.ts +23 -0
  183. package/log/config.js +47 -0
  184. package/log/config.ts +43 -0
  185. package/log/index.d.ts +4 -0
  186. package/log/index.js +9 -0
  187. package/log/index.ts +9 -0
  188. package/log/logger.d.ts +3 -0
  189. package/log/logger.js +2 -0
  190. package/log/logger.ts +5 -0
  191. package/mail/config.d.ts +4 -0
  192. package/mail/config.js +5 -0
  193. package/mail/config.ts +3 -0
  194. package/mail/email.d.ts +20 -0
  195. package/mail/email.js +2 -0
  196. package/mail/email.ts +21 -0
  197. package/mail/index.d.ts +2 -0
  198. package/mail/index.js +4 -0
  199. package/mail/index.ts +3 -0
  200. package/mail/mail.d.ts +12 -0
  201. package/mail/mail.js +2 -0
  202. package/mail/mail.ts +13 -0
  203. package/mail/module/bypass/index.d.ts +6 -0
  204. package/mail/module/bypass/index.js +74 -0
  205. package/mail/module/bypass/index.ts +9 -0
  206. package/mail/module/config.d.ts +11 -0
  207. package/mail/module/config.js +24 -0
  208. package/mail/module/config.ts +25 -0
  209. package/mail/module/index.d.ts +8 -0
  210. package/mail/module/index.js +107 -0
  211. package/mail/module/index.ts +61 -0
  212. package/mail/module/smtp/config.d.ts +6 -0
  213. package/mail/module/smtp/config.js +25 -0
  214. package/mail/module/smtp/config.ts +25 -0
  215. package/mail/module/smtp/index.d.ts +9 -0
  216. package/mail/module/smtp/index.js +104 -0
  217. package/mail/module/smtp/index.ts +36 -0
  218. package/mq/index.d.ts +3 -0
  219. package/mq/index.js +27 -0
  220. package/mq/index.ts +4 -0
  221. package/mq/module/bypass/index.d.ts +13 -0
  222. package/mq/module/bypass/index.js +86 -0
  223. package/mq/module/bypass/index.ts +20 -0
  224. package/mq/module/config.d.ts +6 -0
  225. package/mq/module/config.js +15 -0
  226. package/mq/module/config.ts +14 -0
  227. package/mq/module/index.d.ts +9 -0
  228. package/mq/module/index.js +93 -0
  229. package/mq/module/index.ts +24 -0
  230. package/mq/module/redis/config.d.ts +27 -0
  231. package/mq/module/redis/config.js +37 -0
  232. package/mq/module/redis/config.ts +34 -0
  233. package/mq/module/redis/index.d.ts +15 -0
  234. package/mq/module/redis/index.js +132 -0
  235. package/mq/module/redis/index.ts +60 -0
  236. package/mq/mq.d.ts +15 -0
  237. package/mq/mq.js +2 -0
  238. package/mq/mq.ts +18 -0
  239. package/mq/queue.d.ts +9 -0
  240. package/mq/queue.js +2 -0
  241. package/mq/queue.ts +11 -0
  242. package/package.json +53 -0
  243. package/pwd/config.d.ts +4 -0
  244. package/pwd/config.js +9 -0
  245. package/pwd/config.ts +9 -0
  246. package/pwd/index.d.ts +6 -0
  247. package/pwd/index.js +21 -0
  248. package/pwd/index.ts +20 -0
  249. package/pwd/pwd.d.ts +4 -0
  250. package/pwd/pwd.js +2 -0
  251. package/pwd/pwd.ts +4 -0
  252. package/utils/index.d.ts +25 -0
  253. package/utils/index.js +72 -0
  254. package/utils/index.ts +56 -0
package/api/route.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/api/route.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Endpoint } from './endpoint'
2
+ import type { Handler } from './handler'
3
+
4
+ export interface Route { endpoint: Endpoint, handler: Handler }
@@ -0,0 +1,4 @@
1
+ import type { FastifyPluginCallback as Plugin } from 'fastify';
2
+ export declare const getRequiredRoles: (path: string) => string[] | undefined;
3
+ declare const router: Plugin;
4
+ export default router;
package/api/router.js ADDED
@@ -0,0 +1,111 @@
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
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.getRequiredRoles = void 0;
43
+ var app_1 = require("../app");
44
+ var schema_1 = __importDefault(require("./schema"));
45
+ var protectedRoutes = [];
46
+ var getRequiredRoles = function (path) {
47
+ var _a;
48
+ return (_a = protectedRoutes.find(function (route) { return route.path === path; })) === null || _a === void 0 ? void 0 : _a.roles;
49
+ };
50
+ exports.getRequiredRoles = getRequiredRoles;
51
+ var router = function (server, options, done) {
52
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
53
+ var _loop_1, _i, _a, bundle;
54
+ return __generator(this, function (_b) {
55
+ switch (_b.label) {
56
+ case 0:
57
+ _loop_1 = function (bundle) {
58
+ var _c;
59
+ return __generator(this, function (_d) {
60
+ switch (_d.label) {
61
+ case 0:
62
+ if (!bundle.routes) return [3 /*break*/, 2];
63
+ return [4 /*yield*/, bundle.routes()];
64
+ case 1:
65
+ _c = _d.sent();
66
+ return [3 /*break*/, 3];
67
+ case 2:
68
+ _c = [];
69
+ _d.label = 3;
70
+ case 3:
71
+ (_c).forEach(function (route) {
72
+ if (route.endpoint.requiredRoles) {
73
+ protectedRoutes.push({
74
+ path: route.endpoint.path,
75
+ roles: route.endpoint.requiredRoles,
76
+ });
77
+ }
78
+ server.route({
79
+ url: route.endpoint.path,
80
+ method: route.endpoint.method,
81
+ schema: (0, schema_1.default)(bundle, route.endpoint),
82
+ handler: route.handler,
83
+ });
84
+ });
85
+ return [2 /*return*/];
86
+ }
87
+ });
88
+ };
89
+ _i = 0;
90
+ return [4 /*yield*/, (0, app_1.getBundles)()];
91
+ case 1:
92
+ _a = _b.sent();
93
+ _b.label = 2;
94
+ case 2:
95
+ if (!(_i < _a.length)) return [3 /*break*/, 5];
96
+ bundle = _a[_i];
97
+ return [5 /*yield**/, _loop_1(bundle)];
98
+ case 3:
99
+ _b.sent();
100
+ _b.label = 4;
101
+ case 4:
102
+ _i++;
103
+ return [3 /*break*/, 2];
104
+ case 5:
105
+ done();
106
+ return [2 /*return*/];
107
+ }
108
+ });
109
+ }); })();
110
+ };
111
+ exports.default = router;
package/api/router.ts ADDED
@@ -0,0 +1,36 @@
1
+ import type { FastifyPluginCallback as Plugin } from 'fastify'
2
+ import { getBundles } from '../app'
3
+ import schema from './schema'
4
+
5
+ const protectedRoutes: {
6
+ path: string,
7
+ roles: string[],
8
+ }[] = []
9
+
10
+ export const getRequiredRoles = (path: string) => {
11
+ return protectedRoutes.find((route) => route.path === path)?.roles
12
+ }
13
+
14
+ const router: Plugin = (server, options, done) => {
15
+ (async () => {
16
+ for (const bundle of await getBundles()) {
17
+ (bundle.routes ? await bundle.routes() : []).forEach((route) => {
18
+ if (route.endpoint.requiredRoles) {
19
+ protectedRoutes.push({
20
+ path: route.endpoint.path,
21
+ roles: route.endpoint.requiredRoles,
22
+ })
23
+ }
24
+ server.route({
25
+ url: route.endpoint.path,
26
+ method: route.endpoint.method,
27
+ schema: schema(bundle, route.endpoint),
28
+ handler: route.handler,
29
+ })
30
+ })
31
+ }
32
+ done()
33
+ })()
34
+ }
35
+
36
+ export default router
@@ -0,0 +1,29 @@
1
+ import { Endpoint } from './endpoint';
2
+ import type { Bundle } from '../app';
3
+ interface RouteSchema {
4
+ tags: string[];
5
+ summary: string;
6
+ description?: string;
7
+ headers?: ObjectSchema;
8
+ querystring?: ObjectSchema;
9
+ body?: ObjectSchema;
10
+ response: {
11
+ 200: NullSchema | ObjectSchema;
12
+ 400?: NullSchema;
13
+ 401?: NullSchema;
14
+ 403?: NullSchema;
15
+ };
16
+ }
17
+ interface NullSchema {
18
+ type: 'null';
19
+ description?: string;
20
+ }
21
+ interface ObjectSchema {
22
+ type: 'object';
23
+ additionalProperties: false;
24
+ required: string[];
25
+ properties: any;
26
+ description?: string;
27
+ }
28
+ declare const schema: (bundle: Bundle, endpoint: Endpoint) => RouteSchema;
29
+ export default schema;
package/api/schema.js ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var endpoint_1 = require("./endpoint");
15
+ var nullSchema = {
16
+ type: 'null',
17
+ };
18
+ var authSchema = function (roles) { return ({
19
+ type: 'object',
20
+ additionalProperties: false,
21
+ required: ['authorization'],
22
+ properties: {
23
+ authorization: {
24
+ type: 'string',
25
+ pattern: '^Bearer [0-9A-Za-z]+\\.[0-9A-Za-z]+\\.[0-9A-Za-z-_]+$',
26
+ description: "Required roles: `".concat(roles.join('`, `'), "`"),
27
+ },
28
+ },
29
+ }); };
30
+ var schema = function (bundle, endpoint) {
31
+ var replySchema = endpoint.replySchema
32
+ ? __assign(__assign({}, endpoint.replySchema), { examples: endpoint.replyExample ? [endpoint.replyExample] : undefined }) : nullSchema;
33
+ var routeSchema = {
34
+ tags: [bundle.name],
35
+ summary: endpoint.path,
36
+ description: endpoint.description,
37
+ response: { 200: __assign(__assign({}, replySchema), { description: 'OK' }) },
38
+ };
39
+ if (endpoint.requestSchema) {
40
+ if (endpoint_1.querystringMethods.includes(endpoint.method)) {
41
+ var requestSchema_1 = endpoint.requestSchema;
42
+ if (endpoint.requestExample) {
43
+ Object.keys(requestSchema_1.properties).forEach(function (property) {
44
+ requestSchema_1.properties[property].examples = endpoint.requestExample[property]
45
+ ? [endpoint.requestExample[property]]
46
+ : undefined;
47
+ });
48
+ }
49
+ routeSchema.querystring = requestSchema_1;
50
+ }
51
+ if (endpoint_1.bodyMethods.includes(endpoint.method)) {
52
+ var requestSchema = endpoint.requestSchema;
53
+ if (endpoint.requestExample) {
54
+ requestSchema.examples = [endpoint.requestExample];
55
+ }
56
+ routeSchema.body = requestSchema;
57
+ }
58
+ routeSchema.response[400] = __assign(__assign({}, nullSchema), { description: 'Bad Request' });
59
+ }
60
+ if (endpoint.requiredRoles) {
61
+ routeSchema.headers = authSchema(endpoint.requiredRoles);
62
+ routeSchema.response[401] = __assign(__assign({}, nullSchema), { description: 'Unauthorized' });
63
+ }
64
+ if (endpoint.forbidden) {
65
+ routeSchema.response[403] = __assign(__assign({}, nullSchema), { description: 'Forbidden' });
66
+ }
67
+ return routeSchema;
68
+ };
69
+ exports.default = schema;
package/api/schema.ts ADDED
@@ -0,0 +1,98 @@
1
+ import { bodyMethods, querystringMethods, Endpoint } from './endpoint'
2
+ import type { Bundle } from '../app'
3
+
4
+ interface RouteSchema {
5
+ tags: string[],
6
+ summary: string,
7
+ description?: string,
8
+ headers?: ObjectSchema,
9
+ querystring?: ObjectSchema,
10
+ body?: ObjectSchema,
11
+ response: {
12
+ 200: NullSchema | ObjectSchema,
13
+ 400?: NullSchema,
14
+ 401?: NullSchema,
15
+ 403?: NullSchema,
16
+ },
17
+ }
18
+
19
+ interface NullSchema {
20
+ type: 'null',
21
+ description?: string,
22
+ }
23
+
24
+ interface ObjectSchema {
25
+ type: 'object',
26
+ additionalProperties: false,
27
+ required: string[],
28
+ properties: any,
29
+ description?: string,
30
+ }
31
+
32
+ const nullSchema: NullSchema = {
33
+ type: 'null',
34
+ }
35
+
36
+ const authSchema = (roles: string[]): ObjectSchema => ({
37
+ type: 'object',
38
+ additionalProperties: false,
39
+ required: ['authorization'],
40
+ properties: {
41
+ authorization: {
42
+ type: 'string',
43
+ pattern: '^Bearer [0-9A-Za-z]+\\.[0-9A-Za-z]+\\.[0-9A-Za-z-_]+$',
44
+ description: `Required roles: \`${roles.join('`, `')}\``,
45
+ },
46
+ },
47
+ })
48
+
49
+ const schema = (bundle: Bundle, endpoint: Endpoint): RouteSchema => {
50
+ const replySchema = endpoint.replySchema
51
+ ? {
52
+ ...endpoint.replySchema,
53
+ examples: endpoint.replyExample ? [endpoint.replyExample] : undefined,
54
+ }
55
+ : nullSchema
56
+
57
+ const routeSchema: RouteSchema = {
58
+ tags: [bundle.name],
59
+ summary: endpoint.path,
60
+ description: endpoint.description,
61
+ response: { 200: { ...replySchema, description: 'OK' } },
62
+ }
63
+
64
+ if (endpoint.requestSchema) {
65
+ if (querystringMethods.includes(endpoint.method)) {
66
+ const { requestSchema } = endpoint
67
+ if (endpoint.requestExample) {
68
+ Object.keys(requestSchema.properties).forEach((property) => {
69
+ requestSchema.properties[property].examples = endpoint.requestExample[property]
70
+ ? [endpoint.requestExample[property]]
71
+ : undefined
72
+ })
73
+ }
74
+ routeSchema.querystring = requestSchema
75
+ }
76
+ if (bodyMethods.includes(endpoint.method)) {
77
+ const { requestSchema }: any = endpoint
78
+ if (endpoint.requestExample) {
79
+ requestSchema.examples = [endpoint.requestExample]
80
+ }
81
+ routeSchema.body = requestSchema
82
+ }
83
+ routeSchema.response[400] = { ...nullSchema, description: 'Bad Request' }
84
+ }
85
+
86
+ if (endpoint.requiredRoles) {
87
+ routeSchema.headers = authSchema(endpoint.requiredRoles)
88
+ routeSchema.response[401] = { ...nullSchema, description: 'Unauthorized' }
89
+ }
90
+
91
+ if (endpoint.forbidden) {
92
+ routeSchema.response[403] = { ...nullSchema, description: 'Forbidden' }
93
+ }
94
+
95
+ return routeSchema
96
+ }
97
+
98
+ export default schema
package/app/app.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { Bundle } from './bundle';
2
+ export interface App {
3
+ getBundle: (bundleId: string) => Promise<Bundle | undefined>;
4
+ getBundles: () => Promise<Bundle[]>;
5
+ initBundles: () => Promise<Bundle[]>;
6
+ }
package/app/app.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/app/app.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { Bundle } from './bundle'
2
+
3
+ export interface App {
4
+ getBundle: (bundleId: string) => Promise<Bundle | undefined>,
5
+ getBundles: () => Promise<Bundle[]>,
6
+ initBundles: () => Promise<Bundle[]>,
7
+ }
package/app/boot.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Bundle } from './bundle';
2
+ export interface Boot {
3
+ bundles: () => Promise<Bundle[]>;
4
+ }
package/app/boot.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/app/boot.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { Bundle } from './bundle'
2
+
3
+ export interface Boot {
4
+ bundles: () => Promise<Bundle[]>,
5
+ }
@@ -0,0 +1,14 @@
1
+ import type { Command } from '../cli/command';
2
+ import type { Migration } from '../db/schema/migration';
3
+ import type { Queue } from '../mq/queue';
4
+ import type { Route } from '../api/route';
5
+ import type { Translation } from '../i18n/translation';
6
+ export interface Bundle {
7
+ bundleId: string;
8
+ name: string;
9
+ commands?: () => Promise<Command[]>;
10
+ migrations?: () => Promise<Migration[]>;
11
+ queues?: () => Promise<Queue[]>;
12
+ routes?: () => Promise<Route[]>;
13
+ translations?: () => Promise<Translation[]>;
14
+ }
package/app/bundle.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/app/bundle.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { Command } from '../cli/command'
2
+ import type { Migration } from '../db/schema/migration'
3
+ import type { Queue } from '../mq/queue'
4
+ import type { Route } from '../api/route'
5
+ import type { Translation } from '../i18n/translation'
6
+
7
+ export interface Bundle {
8
+ bundleId: string,
9
+ name: string,
10
+ commands?: () => Promise<Command[]>,
11
+ migrations?: () => Promise<Migration[]>,
12
+ queues?: () => Promise<Queue[]>,
13
+ routes?: () => Promise<Route[]>,
14
+ translations?: () => Promise<Translation[]>,
15
+ }
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ boot: string;
3
+ };
4
+ export default _default;
package/app/config.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var config_1 = require("../config");
4
+ var config = (0, config_1.getConfig)();
5
+ if (!config.appBoot)
6
+ throw new Error('app: boot not provided');
7
+ exports.default = {
8
+ boot: config.appBoot,
9
+ };
package/app/config.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { getConfig } from '../config'
2
+
3
+ const config = getConfig()
4
+
5
+ if (!config.appBoot) throw new Error('app: boot not provided')
6
+
7
+ export default {
8
+ boot: config.appBoot,
9
+ }
package/app/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { App } from './app';
2
+ import type { Boot } from './boot';
3
+ import type { Bundle } from './bundle';
4
+ export { App, Boot, Bundle };
5
+ export declare const initBundles: () => Promise<Bundle[]>;
6
+ export declare const getBundles: () => Promise<Bundle[]>;
7
+ export declare const getBundle: (bundleId: string) => Promise<Bundle | undefined>;
8
+ declare const app: App;
9
+ export default app;
package/app/index.js ADDED
@@ -0,0 +1,103 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ var __importDefault = (this && this.__importDefault) || function (mod) {
62
+ return (mod && mod.__esModule) ? mod : { "default": mod };
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.getBundle = exports.getBundles = exports.initBundles = void 0;
66
+ var path_1 = __importDefault(require("path"));
67
+ var config_1 = __importDefault(require("./config"));
68
+ var node_1 = __importDefault(require("../config/node"));
69
+ var bundles;
70
+ var initBundles = function () { return __awaiter(void 0, void 0, void 0, function () {
71
+ var boot;
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, Promise.resolve("".concat(path_1.default.join(process.cwd(), node_1.default.path, config_1.default.boot))).then(function (s) { return __importStar(require(s)); })];
75
+ case 1:
76
+ boot = (_a.sent()).default;
77
+ return [4 /*yield*/, boot.bundles()];
78
+ case 2:
79
+ bundles = _a.sent();
80
+ return [2 /*return*/, bundles];
81
+ }
82
+ });
83
+ }); };
84
+ exports.initBundles = initBundles;
85
+ var getBundles = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
86
+ return [2 /*return*/, bundles !== null && bundles !== void 0 ? bundles : (0, exports.initBundles)()];
87
+ }); }); };
88
+ exports.getBundles = getBundles;
89
+ var getBundle = function (bundleId) { return __awaiter(void 0, void 0, void 0, function () {
90
+ return __generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0: return [4 /*yield*/, (0, exports.getBundles)()];
93
+ case 1: return [2 /*return*/, (_a.sent()).find(function (bundle) { return bundle.bundleId === bundleId; })];
94
+ }
95
+ });
96
+ }); };
97
+ exports.getBundle = getBundle;
98
+ var app = {
99
+ getBundle: exports.getBundle,
100
+ getBundles: exports.getBundles,
101
+ initBundles: exports.initBundles,
102
+ };
103
+ exports.default = app;
package/app/index.ts ADDED
@@ -0,0 +1,32 @@
1
+ import path from 'path'
2
+ import config from './config'
3
+ import node from '../config/node'
4
+ import type { App } from './app'
5
+ import type { Boot } from './boot'
6
+ import type { Bundle } from './bundle'
7
+
8
+ export { App, Boot, Bundle }
9
+
10
+ let bundles: Bundle[] | undefined
11
+
12
+ export const initBundles = async () => {
13
+ const boot: Boot = (await import(
14
+ path.join(process.cwd(), node.path, config.boot)
15
+ )).default
16
+ bundles = await boot.bundles()
17
+ return bundles
18
+ }
19
+
20
+ export const getBundles = async () => bundles ?? initBundles()
21
+
22
+ export const getBundle = async (bundleId: string) => {
23
+ return (await getBundles()).find((bundle) => bundle.bundleId === bundleId)
24
+ }
25
+
26
+ const app: App = {
27
+ getBundle,
28
+ getBundles,
29
+ initBundles,
30
+ }
31
+
32
+ export default app
@@ -0,0 +1,4 @@
1
+ #! /usr/bin/env node
2
+ require('tsconfig-paths').register();
3
+ require('ts-node').register();
4
+ require('../cli').default;
package/bin/ape-cli.js ADDED
@@ -0,0 +1,2 @@
1
+ #! /usr/bin/env node
2
+ require('../cli').default;
@@ -0,0 +1,4 @@
1
+ export interface Command {
2
+ name: string;
3
+ handler: (args: (any)[], options: Record<string, any>) => Promise<void>;
4
+ }
package/cli/command.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/cli/command.ts ADDED
@@ -0,0 +1,7 @@
1
+ export interface Command {
2
+ name: string,
3
+ handler: (
4
+ args: (any)[],
5
+ options: Record<string, any>,
6
+ ) => Promise<void>,
7
+ }
package/cli/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const exec: () => Promise<void>;
2
+ export default exec;