minimonolith 0.14.3 → 0.15.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.
package/README.md CHANGED
@@ -82,7 +82,7 @@ Here, we declare the method handlers for the `todo` service:
82
82
 
83
83
  ```js
84
84
  // todo/index.js
85
- export const methods = ['getAll', 'get:id', 'post', 'patch:id', 'delete:id'];
85
+ export default ['getAll', 'get:id', 'post', 'patch:id', 'delete:id'];
86
86
  ```
87
87
 
88
88
  ### todo/model.js
@@ -91,7 +91,7 @@ In this file, we define a Sequelize model for the `todo` service:
91
91
 
92
92
  ```js
93
93
  // todo/model.js
94
- export const modelSchema = serviceName => (orm, types) => {
94
+ export default serviceName => (orm, types) => {
95
95
  const schema = orm.define(serviceName, {
96
96
  name: {
97
97
  type: types.STRING,
@@ -153,10 +153,10 @@ For SQLite:
153
153
 
154
154
  ```makefile
155
155
  MM_API_DB_DIALECT=sqlite
156
- MM_API_DB_DATABASE=<your_database_name>
157
156
  MM_API_DB_STORAGE=:memory: # For in-memory SQLite database
158
157
  # Or
159
158
  MM_API_DB_STORAGE=path/to/your/sqlite/file.db # For file-based SQLite database
159
+ MM_API_DB_DATABASE=<your_database_name>
160
160
  MM_API_LOCAL_ENV=true
161
161
  MM_API_PROD_ENV=false
162
162
  ```
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "minimonolith",
3
3
  "type": "module",
4
- "version": "0.14.3",
4
+ "version": "0.15.1",
5
5
  "main": "index.js",
6
6
  "license": "MIT",
7
7
  "scripts": {
@@ -6,7 +6,7 @@ const modelSchemas = {};
6
6
 
7
7
  const registerModel = async (SERVICE_NAME, SERVICE_URL) => {
8
8
  const SERVICE_MODEL_MODULE = await import(`${SERVICE_URL}model.js`);
9
- modelSchemas[SERVICE_NAME] = SERVICE_MODEL_MODULE.modelSchema(SERVICE_NAME);
9
+ modelSchemas[SERVICE_NAME] = SERVICE_MODEL_MODULE.default(SERVICE_NAME);
10
10
  }
11
11
 
12
12
  const loadAndSyncModels = async API => {
@@ -12,8 +12,7 @@ const registerMethods = methodPathCodes => async (SERVICE_NAME, SERVICE_URL) =>
12
12
  try {
13
13
  const methods = await methodPathCodes.reduce(async (prevMethods, METHOD_PATH_CODE) => {
14
14
  const methods = await prevMethods;
15
- //console.log('pathCodes', methodPathCodes, METHOD_PATH_CODE);
16
- const { METHOD_NAME, METHOD_PATH } = parseMethodPathCode(METHOD_PATH_CODE);
15
+ const { METHOD_NAME } = parseMethodPathCode(METHOD_PATH_CODE);
17
16
  ROUTE_CODE = 'REGISTER_METHODS_' + getMethodRouteCode(SERVICE_NAME, METHOD_NAME);
18
17
  console.log(' FOUND_METHOD', METHOD_NAME);
19
18
 
@@ -0,0 +1,13 @@
1
+ export const parseMethodCode = (SERVICE_NAME, METHOD_CODE) => {
2
+ const methodPathParts = METHOD_CODE.split(":");
3
+ const pathParams = methodPathParts.slice(1).map(param => `:${param}`);
4
+ const rawMethodName = methodPathParts[0];
5
+ const METHOD_NAME = rawMethodName[0] === '!' ? rawMethodName.substring(1) : rawMethodName;
6
+
7
+ const relativeMethodRoute = `${rawMethodName}${pathParams.length > 0 ? '/' : ''}${pathParams.join("/")}`;
8
+ const METHOD_ROUTE = relativeMethodRoute[0]==='!' ?
9
+ `/${relativeMethodRoute.substring(1)}/${SERVICE_NAME}` :
10
+ `/${SERVICE_NAME}/${relativeMethodRoute}`;
11
+
12
+ return { METHOD_NAME, METHOD_ROUTE };
13
+ };
@@ -0,0 +1,32 @@
1
+ import fs from 'fs';
2
+ import url from 'url';
3
+ import path from 'path';
4
+ import { z } from 'zod';
5
+
6
+ const registerMethod = async (SERVICE_NAME, SERVICE_URL, METHOD_NAME, METHOD_ROUTE_CODE) => {
7
+
8
+ const ROUTE_CODE = 'REGISTER_METHOD_' + METHOD_ROUTE_CODE;
9
+ const method = { VALIDATOR: MODELS => z.undefined() };
10
+
11
+ try {
12
+ console.log(' FOUND_METHOD', METHOD_NAME);
13
+
14
+ method.handler = (await import(new URL(`${METHOD_NAME}/index.js`, SERVICE_URL))).default;
15
+
16
+ const VALIDATOR_URL = new URL(`${METHOD_NAME}/valid.js`, SERVICE_URL);
17
+ if (fs.existsSync(url.fileURLToPath(VALIDATOR_URL))) {
18
+
19
+ console.log(' FOUND_VALIDATOR');
20
+
21
+ const VALIDATOR_BODY = (await import(VALIDATOR_URL)).default;
22
+ method.VALIDATOR = MODELS => z.object(VALIDATOR_BODY(MODELS)).strict();
23
+ }
24
+
25
+ return method;
26
+
27
+ } catch (REGISTER_METHOD_ERROR) {
28
+ console.error({ ROUTE_CODE, REGISTER_METHOD_ERROR, STACK_TRASE: REGISTER_METHOD_ERROR.stack });
29
+ }
30
+ };
31
+
32
+ export { registerMethod };
@@ -6,8 +6,8 @@ import { registerModel } from '../model/index.js';
6
6
  import { exposedMethodHandler, validatedMethodHandler } from './methodHandler.js';
7
7
  import { getMethodType } from './getMethodType.js';
8
8
  import { getMethodRouteCode } from './getMethodRouteCode.js';
9
- import { parseMethodPathCode } from './parseMethodPathCode.js';
10
- import { registerMethods } from './registerMethods.js';
9
+ import { parseMethodCode } from './parseMethodCode.js';
10
+ import { registerMethod } from './registerMethod.js';
11
11
 
12
12
  const ROUTE_CODE = 'REGISTER_SERVICE';
13
13
 
@@ -24,32 +24,33 @@ const registerService = async (API, SERVICE_NAME, SRC_FOLDER, MODULE_FOLDER) =>
24
24
  registerModel(SERVICE_NAME, SERVICE_URL);
25
25
  }
26
26
 
27
- const SERVICE_METHODS =
28
- await registerMethods(SERVICE_MODULE.methods)(SERVICE_NAME, SERVICE_URL);
27
+ console.log('METHODS_TO_BE_REGISTERED', SERVICE_MODULE.default);
29
28
 
30
- API.SERVICES[SERVICE_NAME] = {};
31
- Object.keys(SERVICE_METHODS).forEach(METHOD_PATH_CODE => {
32
- const { METHOD_NAME, METHOD_PATH } = parseMethodPathCode(METHOD_PATH_CODE);
33
- //console.log('first', METHOD_PATH_CODE, METHOD_NAME, METHOD_PATH);
34
- const ROUTE_CODE = getMethodRouteCode(SERVICE_NAME, METHOD_NAME);
29
+ API.SERVICES[SERVICE_NAME] = {}; const SERVICE_METHODS = [];
30
+ for (const METHOD_CODE of SERVICE_MODULE.default) {
31
+ const { METHOD_NAME, METHOD_ROUTE } = parseMethodCode(SERVICE_NAME, METHOD_CODE);
32
+ console.log('REGISTERING_ROUTE', METHOD_ROUTE);
33
+
34
+ const METHOD_ROUTE_CODE = getMethodRouteCode(SERVICE_NAME, METHOD_NAME);
35
+
36
+ SERVICE_METHODS[METHOD_CODE] = await registerMethod(SERVICE_NAME, SERVICE_URL,
37
+ METHOD_NAME, METHOD_ROUTE_CODE);
35
38
 
36
39
  API.SERVICES[SERVICE_NAME][METHOD_NAME] = async (body, claims=undefined) => {
37
40
  return await validatedMethodHandler(body, claims, API,
38
- SERVICE_METHODS[METHOD_PATH_CODE], ROUTE_CODE);
41
+ SERVICE_METHODS[METHOD_CODE], METHOD_ROUTE_CODE);
39
42
  }
40
43
 
41
44
  const methodType = getMethodType(METHOD_NAME);
42
- //console.log('second', METHOD_PATH_CODE, METHOD_NAME, METHOD_PATH);
43
- console.log('REGISTERING_ROUTE', `/${SERVICE_NAME}/${METHOD_PATH}`);
44
- API[methodType](`/${SERVICE_NAME}/${METHOD_PATH}`, async (event, res) => {
45
+ API[methodType](METHOD_ROUTE, async (event, res) => {
45
46
  const { body, params, queryStringParameters } = event;
46
47
  const claims = event.requestContext.authorizer?.jwt?.claims;
47
48
  const parsedBody = body || Object.keys(params).length > 0 || queryStringParameters ?
48
49
  { ...body, ...params, ...queryStringParameters } : undefined;
49
50
  await exposedMethodHandler(parsedBody, res, claims, API,
50
- SERVICE_METHODS[METHOD_PATH_CODE], ROUTE_CODE);
51
+ SERVICE_METHODS[METHOD_CODE], METHOD_ROUTE_CODE);
51
52
  });
52
- });
53
+ };
53
54
  } catch (SERVICE_HANDLER_ERROR) {
54
55
  console.error({
55
56
  ROUTE_CODE,
@@ -1,11 +0,0 @@
1
- export const parseMethodPathCode = (METHOD_PATH_CODE) => {
2
- const methodPathParts = METHOD_PATH_CODE.split(":");
3
- const METHOD_NAME = methodPathParts[0];
4
- const pathParams = methodPathParts.slice(1).map(param => `:${param}`);
5
- const METHOD_PATH = `${METHOD_NAME}${pathParams.length > 0 ? '/' : ''}${pathParams.join("/")}`;
6
-
7
- return {
8
- METHOD_NAME,
9
- METHOD_PATH
10
- };
11
- };