minimonolith 0.8.0 → 0.9.0
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/index.js +1 -1
- package/package.json +1 -1
- package/src/service/methodHandler.js +8 -6
- package/src/service/parseMethodPathCode.js +11 -0
- package/src/service/registerMethods.js +11 -7
- package/src/service/registerService.js +18 -5
- package/src/service/validationHandler.js +2 -2
- package/npm_publish.yml +0 -32
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
3
|
import { createAPI } from './src/api/index.js';
|
|
4
|
-
import { runLambdaServer, loadEnvFile } from './src/
|
|
4
|
+
import { runLambdaServer, loadEnvFile } from './src/local/index.js';
|
|
5
5
|
|
|
6
6
|
export { runLambdaServer, loadEnvFile, createAPI, z };
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { validationHandler } from './validationHandler.js';
|
|
2
2
|
|
|
3
|
-
const validatedMethodHandler = async (
|
|
4
|
-
await validationHandler(
|
|
3
|
+
const validatedMethodHandler = async (body, API, METHOD, ROUTE_CODE) => {
|
|
4
|
+
await validationHandler(body, METHOD, API.MODELS, ROUTE_CODE);
|
|
5
5
|
|
|
6
|
-
const EVENT_CONTEXT = {
|
|
6
|
+
const EVENT_CONTEXT = { body, MODELS: API.MODELS, SERVICES: API.SERVICES, ROUTE_CODE };
|
|
7
7
|
const METHOD_RESPONSE = await METHOD.handler(EVENT_CONTEXT);
|
|
8
8
|
|
|
9
9
|
return METHOD_RESPONSE;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
const exposedMethodHandler = async (
|
|
12
|
+
const exposedMethodHandler = async (body, res, API, METHOD, ROUTE_CODE) => {
|
|
13
13
|
try {
|
|
14
|
-
const METHOD_RESPONSE = await validatedMethodHandler(
|
|
14
|
+
const METHOD_RESPONSE = await validatedMethodHandler(body, API, METHOD, ROUTE_CODE);
|
|
15
15
|
console.log({ ROUTE_CODE, METHOD_RESPONSE: METHOD_RESPONSE.toString() });
|
|
16
16
|
//console.log({ ROUTE_CODE, METHOD_RESPONSE: JSON.stringify(METHOD_RESPONSE, null, 2) });
|
|
17
17
|
res.status(200).json(METHOD_RESPONSE);
|
|
@@ -24,8 +24,10 @@ const exposedMethodHandler = async (event, res, API, METHOD, ROUTE_CODE) => {
|
|
|
24
24
|
break;
|
|
25
25
|
default:
|
|
26
26
|
//console.error({ ROUTE_CODE, METHOD_ERROR: JSON.stringify(METHOD_ERROR, null, 2) });
|
|
27
|
-
console.error({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.toString() });
|
|
27
|
+
//console.error({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.toString() });
|
|
28
|
+
console.error({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.stack });
|
|
28
29
|
res.status(500).json({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.toString() });
|
|
30
|
+
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
};
|
|
@@ -3,26 +3,29 @@ import url from 'url';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
|
|
6
|
+
import { parseMethodPathCode } from './parseMethodPathCode.js';
|
|
6
7
|
import { getMethodRouteCode } from './getMethodRouteCode.js';
|
|
7
8
|
|
|
8
|
-
const registerMethods =
|
|
9
|
+
const registerMethods = methodPathCodes => async (SERVICE_NAME, SERVICE_URL) => {
|
|
9
10
|
let ROUTE_CODE = 'REGISTER_METHODS';
|
|
10
11
|
|
|
11
12
|
try {
|
|
12
|
-
const methods = await
|
|
13
|
+
const methods = await methodPathCodes.reduce(async (prevMethods, METHOD_PATH_CODE) => {
|
|
13
14
|
const methods = await prevMethods;
|
|
15
|
+
//console.log('pathCodes', methodPathCodes, METHOD_PATH_CODE);
|
|
16
|
+
const { METHOD_NAME, METHOD_PATH } = parseMethodPathCode(METHOD_PATH_CODE);
|
|
14
17
|
ROUTE_CODE = 'REGISTER_METHODS_' + getMethodRouteCode(SERVICE_NAME, METHOD_NAME);
|
|
15
18
|
console.log(' FOUND_METHOD', METHOD_NAME);
|
|
16
19
|
|
|
17
|
-
methods[
|
|
18
|
-
methods[
|
|
20
|
+
methods[METHOD_PATH_CODE] = { VALIDATOR: (MODELS, ROUTE_CODE) => z.undefined() };
|
|
21
|
+
methods[METHOD_PATH_CODE].handler =
|
|
19
22
|
(await import(new URL(`${METHOD_NAME}/handler.js`, SERVICE_URL))).default;
|
|
20
23
|
|
|
21
24
|
const VALIDATOR_URL = new URL(`${METHOD_NAME}/valid.js`, SERVICE_URL);
|
|
22
25
|
if (fs.existsSync(url.fileURLToPath(VALIDATOR_URL))) {
|
|
23
26
|
console.log(' FOUND_VALIDATOR');
|
|
24
27
|
const VALIDATOR_BODY = (await import(VALIDATOR_URL)).default;
|
|
25
|
-
methods[
|
|
28
|
+
methods[METHOD_PATH_CODE].VALIDATOR = (MODELS, ROUTE_CODE) =>
|
|
26
29
|
z.object(VALIDATOR_BODY(MODELS, ROUTE_CODE)).strict();
|
|
27
30
|
}
|
|
28
31
|
|
|
@@ -30,8 +33,9 @@ const registerMethods = methodNames => async (SERVICE_NAME, SERVICE_URL) => {
|
|
|
30
33
|
}, Promise.resolve({}));
|
|
31
34
|
|
|
32
35
|
return methods;
|
|
33
|
-
} catch (
|
|
34
|
-
console.error({ ROUTE_CODE,
|
|
36
|
+
} catch (REGISTER_METHOD_ERROR) {
|
|
37
|
+
console.error({ ROUTE_CODE, REGISTER_METHOD_ERROR,
|
|
38
|
+
STACK_TRASE: REGISTER_METHOD_ERROR.stack });
|
|
35
39
|
}
|
|
36
40
|
};
|
|
37
41
|
|
|
@@ -6,6 +6,7 @@ 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';
|
|
9
10
|
import { registerMethods } from './registerMethods.js';
|
|
10
11
|
|
|
11
12
|
const ROUTE_CODE = 'REGISTER_SERVICE';
|
|
@@ -23,19 +24,31 @@ const registerService = async (API, SERVICE_NAME, SRC_FOLDER, MODULE_FOLDER) =>
|
|
|
23
24
|
registerModel(SERVICE_NAME, SERVICE_URL);
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
const SERVICE_METHODS =
|
|
27
|
+
const SERVICE_METHODS =
|
|
28
|
+
await registerMethods(SERVICE_MODULE.methods)(SERVICE_NAME, SERVICE_URL);
|
|
27
29
|
|
|
28
30
|
API.SERVICES[SERVICE_NAME] = {};
|
|
29
|
-
Object.keys(SERVICE_METHODS).forEach(
|
|
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);
|
|
30
34
|
const ROUTE_CODE = getMethodRouteCode(SERVICE_NAME, METHOD_NAME);
|
|
31
35
|
|
|
32
36
|
API.SERVICES[SERVICE_NAME][METHOD_NAME] = async body => {
|
|
33
|
-
return await validatedMethodHandler(
|
|
37
|
+
return await validatedMethodHandler(body, API,
|
|
38
|
+
SERVICE_METHODS[METHOD_PATH_CODE], ROUTE_CODE);
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
const methodType = getMethodType(METHOD_NAME);
|
|
37
|
-
|
|
38
|
-
|
|
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
|
+
const { body, params, queryStringParameters } = event;
|
|
46
|
+
const parsedBody = body || Object.keys(params).length > 0 || queryStringParameters ?
|
|
47
|
+
{ ...body, ...params, ...queryStringParameters } : undefined;
|
|
48
|
+
//console.log({ RECEIVED_BODY: parsedBody.toString() });
|
|
49
|
+
console.log({ RECEIVED_BODY: JSON.stringify(parsedBody) });
|
|
50
|
+
await exposedMethodHandler(parsedBody, res, API,
|
|
51
|
+
SERVICE_METHODS[METHOD_PATH_CODE], ROUTE_CODE);
|
|
39
52
|
});
|
|
40
53
|
});
|
|
41
54
|
} catch (SERVICE_HANDLER_ERROR) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const validationHandler = async (
|
|
1
|
+
const validationHandler = async (body, METHOD, MODELS, ROUTE_CODE) => {
|
|
2
2
|
|
|
3
|
-
const validation = await METHOD.VALIDATOR(MODELS, ROUTE_CODE).safeParseAsync(
|
|
3
|
+
const validation = await METHOD.VALIDATOR(MODELS, ROUTE_CODE).safeParseAsync(body);
|
|
4
4
|
if (validation.success) return;
|
|
5
5
|
|
|
6
6
|
const VALIDATION_ERROR = new Error('VALIDATION_ERROR');
|
package/npm_publish.yml
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
name: NPM Publish
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- master # Change this to the branch where you want to trigger the workflow
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
build:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
|
|
12
|
-
steps:
|
|
13
|
-
- uses: actions/checkout@v3
|
|
14
|
-
|
|
15
|
-
- name: Set up Node.js
|
|
16
|
-
uses: actions/setup-node@v3
|
|
17
|
-
with:
|
|
18
|
-
node-version: 18 # Change this to the Node.js version you need
|
|
19
|
-
|
|
20
|
-
- name: Install dependencies
|
|
21
|
-
run: yarn install
|
|
22
|
-
|
|
23
|
-
- name: Run tests
|
|
24
|
-
run: yarn test
|
|
25
|
-
|
|
26
|
-
- name: Upload coverage to Codecov
|
|
27
|
-
uses: codecov/codecov-action@v3
|
|
28
|
-
|
|
29
|
-
- name: Publish to NPM
|
|
30
|
-
run: yarn publish
|
|
31
|
-
env:
|
|
32
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # Set up the NPM_TOKEN in your GitHub repository secrets
|