@common-stack/frontend-stack-react 4.0.1-alpha.12 → 4.0.1-alpha.20
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/lib/backend/middlewares/container.js +1 -1
- package/lib/backend/middlewares/cors.js +1 -1
- package/lib/config/base-apollo-cache.d.ts +1 -1
- package/lib/config/base-apollo-cache.js +1 -1
- package/lib/config/base-apollo-client.js +1 -1
- package/lib/config/{env-config.d.ts → env-config.server.d.ts} +3 -0
- package/lib/config/{env-config.js → env-config.server.js} +4 -1
- package/lib/config/index.d.ts +0 -1
- package/lib/config/redis-config.server.d.ts +2 -1
- package/lib/config/redis-config.server.js +1 -1
- package/lib/config/redux-config.d.ts +2 -6
- package/lib/config/redux-config.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -1
- package/lib/interfaces/loaderContext.d.ts +15 -0
- package/lib/interfaces/middleware.d.ts +10 -0
- package/lib/load-context.server.d.ts +2 -9
- package/lib/load-context.server.js +2 -1
- package/lib/tools/clientLoaderWithMiddleware.d.ts +4 -0
- package/lib/tools/clientLoaderWithMiddleware.js +11 -0
- package/lib/tools/index.d.ts +2 -0
- package/lib/tools/loaderWithMiddleware.d.ts +3 -0
- package/lib/tools/loaderWithMiddleware.js +23 -0
- package/lib/utils/index.js +4 -3
- package/package.json +2 -2
- package/lib/config/public-config.d.ts +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {v4}from'uuid';import {ClientTypes}from'@common-stack/core';import {merge}from'lodash-es';import {ScopedContainer}from'@common-stack/client-core/lib/connector/ScopedContainer.js';import {createReduxStore}from'../../config/redux-config.js';import {
|
|
1
|
+
import {v4}from'uuid';import {ClientTypes}from'@common-stack/core';import {merge}from'lodash-es';import {ScopedContainer}from'@common-stack/client-core/lib/connector/ScopedContainer.js';import {createReduxStore}from'../../config/redux-config.js';import {logger}from'@cdm-logger/server';import {UtilityClass}from'../../utils/index.js';import features from'../../modules.js';import {createApolloClient}from'../../config/base-apollo-client.js';import {config}from'../../config/env-config.server.js';const TYPES = {
|
|
2
2
|
HttpRequest: Symbol.for('HttpRequest'),
|
|
3
3
|
};
|
|
4
4
|
const utility = new UtilityClass(features);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import cors from'cors';import {logger}from'@cdm-logger/server';import {config}from'../../config/env-config.
|
|
1
|
+
import cors from'cors';import {logger}from'@cdm-logger/server';import {config}from'../../config/env-config.server.js';/* eslint-disable jest/require-hook */
|
|
2
2
|
const { CLIENT_URL, BACKEND_URL, LOCAL_GRAPHQL_URL } = config;
|
|
3
3
|
const corsWhitelist = [CLIENT_URL, BACKEND_URL, LOCAL_GRAPHQL_URL];
|
|
4
4
|
logger.info('corsWhitelist (%j)', corsWhitelist);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {InMemoryCache}from'@apollo/client/cache';// cache.ts
|
|
1
|
+
import {InMemoryCache}from'@apollo/client/cache/index.js';// cache.ts
|
|
2
2
|
const createCache = ({ getDataIdFromObject, clientState }) => {
|
|
3
3
|
const cache = new InMemoryCache({
|
|
4
4
|
dataIdFromObject: getDataIdFromObject,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {isBoolean,merge}from'lodash-es';import {ApolloLink,ApolloClient}from'@apollo/client/index.js';import {HttpLink}from'@apollo/client/link/http';import {BatchHttpLink}from'@apollo/client/link/batch-http';import {onError}from'@apollo/client/link/error';import {GraphQLWsLink}from'@apollo/client/link/subscriptions';import {getOperationAST}from'graphql';import {invariant}from'ts-invariant';import {RetryLink}from'@apollo/client/link/retry';import {createClient}from'graphql-ws';import fetch from'cross-fetch';import {createCache,initializeCache}from'./base-apollo-cache.js';// apolloClient.ts
|
|
1
|
+
import {isBoolean,merge}from'lodash-es';import {ApolloLink,ApolloClient}from'@apollo/client/index.js';import {HttpLink}from'@apollo/client/link/http/index.js';import {BatchHttpLink}from'@apollo/client/link/batch-http/index.js';import {onError}from'@apollo/client/link/error/index.js';import {GraphQLWsLink}from'@apollo/client/link/subscriptions/index.js';import {getOperationAST}from'graphql';import {invariant}from'ts-invariant';import {RetryLink}from'@apollo/client/link/retry/index.js';import {createClient}from'graphql-ws';import fetch from'cross-fetch';import {createCache,initializeCache}from'./base-apollo-cache.js';// apolloClient.ts
|
|
2
2
|
const schema = `
|
|
3
3
|
# Add your schema here
|
|
4
4
|
`;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import'reflect-metadata';import {cleanEnv,str,json,bool}from'envalid'
|
|
1
|
+
import'reflect-metadata';import {cleanEnv,str,json,bool}from'envalid';/**
|
|
2
|
+
* This is for backend only
|
|
3
|
+
*/
|
|
4
|
+
const config = cleanEnv(process.env, {
|
|
2
5
|
SENTRY_DSN_FRONTEND: str({ default: 'https://64defc5ee0bd467aa28888f9860f18ee@sentry.io/2158332' }),
|
|
3
6
|
NODE_ENV: str({ default: 'production', choices: ['production', 'staging', 'development', 'test'] }),
|
|
4
7
|
BACKEND_URL: str({ devDefault: __BACKEND_URL__ }),
|
package/lib/config/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import Redis from 'ioredis';
|
|
2
|
+
export declare function getRedisClient(): Redis;
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/// <reference types="redux-persist/types/stateReconciler/autoMergeLevel2" />
|
|
2
|
-
/// <reference types="redux-persist/types/types" />
|
|
3
|
-
/// <reference types="redux-persist" />
|
|
4
1
|
import "reflect-metadata";
|
|
5
|
-
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';
|
|
6
2
|
export declare const epicMiddlewareFunc: (apolloClient: any, services: any, container: any) => import("redux-observable").EpicMiddleware<import("redux").Action<any>, import("redux").Action<any>, void, {
|
|
7
3
|
apolloClient: any;
|
|
8
4
|
routes: any;
|
|
@@ -15,8 +11,8 @@ export declare const epicMiddlewareFunc: (apolloClient: any, services: any, cont
|
|
|
15
11
|
}>;
|
|
16
12
|
export declare const persistConfig: {
|
|
17
13
|
key: string;
|
|
18
|
-
storage:
|
|
19
|
-
stateReconciler:
|
|
14
|
+
storage: any;
|
|
15
|
+
stateReconciler: any;
|
|
20
16
|
transforms: any[];
|
|
21
17
|
blacklist: string[];
|
|
22
18
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import'reflect-metadata';import storage from'redux-persist/lib/storage';import {combineReducers}from'@reduxjs/toolkit';import autoMergeLevel2 from'redux-persist/lib/stateReconciler/autoMergeLevel2';import {createEpicMiddleware}from'redux-observable';import {createRouterReducer}from'@common-stack/remix-router-redux';import {persistReducer}from'redux-persist';import {REDUX_PERSIST_KEY}from'@common-stack/client-core';import {createReduxStore as createReduxStore$1}from'./base-redux-config.js';import {logger}from'../utils/index.js';import features from'../modules.js';import {rootEpic}from'./epic-config.js';const epicMiddlewareFunc = (apolloClient, services, container) => createEpicMiddleware({
|
|
1
|
+
import'reflect-metadata';import storage from'redux-persist/lib/storage/index.js';import {combineReducers}from'@reduxjs/toolkit';import autoMergeLevel2 from'redux-persist/lib/stateReconciler/autoMergeLevel2.js';import {createEpicMiddleware}from'redux-observable';import {createRouterReducer}from'@common-stack/remix-router-redux';import {persistReducer}from'redux-persist';import {REDUX_PERSIST_KEY}from'@common-stack/client-core';import {createReduxStore as createReduxStore$1}from'./base-redux-config.js';import {logger}from'../utils/index.js';import features from'../modules.js';import {rootEpic}from'./epic-config.js';const epicMiddlewareFunc = (apolloClient, services, container) => createEpicMiddleware({
|
|
2
2
|
dependencies: {
|
|
3
3
|
apolloClient,
|
|
4
4
|
routes: features.getConfiguredRoutes(),
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{UtilityClass,logger}from'./utils/index.js';export{config}from'./config/
|
|
1
|
+
export{UtilityClass,logger}from'./utils/index.js';export{createClientContainer}from'./config/client.service.js';export{createReduxStore,epicMiddlewareFunc,persistConfig}from'./config/redux-config.js';export{clientLoaderWithMiddleware}from'./tools/clientLoaderWithMiddleware.js';export{loaderWithMiddleware}from'./tools/loaderWithMiddleware.js';export{corsMiddleware}from'./backend/middlewares/cors.js';export{TYPES,containerMiddleware}from'./backend/middlewares/container.js';export{errorMiddleware}from'./backend/middlewares/error.js';export{loadContext}from'./load-context.server.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Feature } from '@common-stack/client-react';
|
|
2
|
+
import type { CdmLogger } from '@cdm-logger/core';
|
|
3
|
+
import type { Redis } from 'ioredis';
|
|
4
|
+
import type { Container } from 'inversify';
|
|
5
|
+
import type { ApolloClient, NormalizedCache } from '@apollo/client/index';
|
|
6
|
+
export interface IAppLoadContext<S = any> {
|
|
7
|
+
modules: Feature;
|
|
8
|
+
routeConfig: any;
|
|
9
|
+
store: any;
|
|
10
|
+
container: Container;
|
|
11
|
+
apolloClient: ApolloClient<NormalizedCache>;
|
|
12
|
+
services: S;
|
|
13
|
+
redisClient: Redis;
|
|
14
|
+
logger?: CdmLogger.ILogger;
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface MiddlewareOptions {
|
|
2
|
+
[key: string]: any;
|
|
3
|
+
}
|
|
4
|
+
export interface MiddlewareFunction {
|
|
5
|
+
(params: any, loaderData: MiddlewareOptions, next: () => Promise<void>): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface Middleware {
|
|
8
|
+
name: string;
|
|
9
|
+
func: MiddlewareFunction;
|
|
10
|
+
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
routeConfig: any;
|
|
5
|
-
store: any;
|
|
6
|
-
container: any;
|
|
7
|
-
apolloClient: any;
|
|
8
|
-
services: any;
|
|
9
|
-
redisClient: any;
|
|
10
|
-
}>;
|
|
2
|
+
import { IAppLoadContext } from './interfaces/loaderContext';
|
|
3
|
+
export declare const loadContext: (req: Request, res: Response) => Promise<IAppLoadContext>;
|
|
@@ -2,7 +2,7 @@ import'reflect-metadata';import features from'./modules.js';import {getRedisClie
|
|
|
2
2
|
const routeConfig = features.getConfiguredRoutes();
|
|
3
3
|
const redisClient = getRedisClient();
|
|
4
4
|
const loadContext = async (req, res) => {
|
|
5
|
-
const { container, store, apolloClient, services } = req;
|
|
5
|
+
const { container, store, apolloClient, services, logger } = req;
|
|
6
6
|
return {
|
|
7
7
|
modules: features,
|
|
8
8
|
routeConfig,
|
|
@@ -11,5 +11,6 @@ const loadContext = async (req, res) => {
|
|
|
11
11
|
apolloClient,
|
|
12
12
|
services,
|
|
13
13
|
redisClient,
|
|
14
|
+
logger,
|
|
14
15
|
};
|
|
15
16
|
};export{loadContext};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
async function clientLoaderWithMiddleware(params, middlewareOptions = {}, middlewareStack) {
|
|
2
|
+
const loaderData = middlewareOptions;
|
|
3
|
+
const executeMiddlewares = async (index) => {
|
|
4
|
+
if (index < middlewareStack.length) {
|
|
5
|
+
const { func } = middlewareStack[index];
|
|
6
|
+
await func(params, loaderData, async () => await executeMiddlewares(index + 1));
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
await executeMiddlewares(0); // Start middleware execution from the first one
|
|
10
|
+
return loaderData;
|
|
11
|
+
}export{clientLoaderWithMiddleware};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IAppLoadContext } from '../interfaces/loaderContext';
|
|
2
|
+
import { Middleware, MiddlewareOptions } from '../interfaces/middleware';
|
|
3
|
+
export declare function loaderWithMiddleware(params: IAppLoadContext, middlewareOptions: MiddlewareOptions | undefined, middlewareStack: Middleware[]): Promise<MiddlewareOptions>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
2
|
+
async function loaderWithMiddleware(params, middlewareOptions, middlewareStack) {
|
|
3
|
+
const { logger } = params;
|
|
4
|
+
logger.debug('middlewares [%j]', middlewareStack);
|
|
5
|
+
const loaderData = middlewareOptions ? middlewareOptions : {};
|
|
6
|
+
const executeMiddlewares = async (index) => {
|
|
7
|
+
if (index < middlewareStack.length) {
|
|
8
|
+
const middleware = middlewareStack[index];
|
|
9
|
+
const start = process.hrtime(); // Get start time
|
|
10
|
+
if (isDevelopment) {
|
|
11
|
+
console.log(`[[Middleware ${middleware.name}]] starts to run`); // Log start
|
|
12
|
+
}
|
|
13
|
+
await middleware.func(params, loaderData, async () => await executeMiddlewares(index + 1));
|
|
14
|
+
if (isDevelopment) {
|
|
15
|
+
const end = process.hrtime(start); // Get end time
|
|
16
|
+
const elapsedTime = (end[0] * 1e9 + end[1]) / 1e6; // Convert to milliseconds
|
|
17
|
+
console.log(`[[Middleware ${middleware.name}]] took ${elapsedTime} ms`); // Log time taken
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
await executeMiddlewares(0); // Start middleware execution from the first one
|
|
22
|
+
return loaderData;
|
|
23
|
+
}export{loaderWithMiddleware};
|
package/lib/utils/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {ClientLogger}from'@cdm-logger/client';export{default}from'../modules.js';class UtilityClass {
|
|
1
|
+
import {ClientLogger}from'@cdm-logger/client';import {getEnvironment}from'@common-stack/core';export{default}from'../modules.js';class UtilityClass {
|
|
2
2
|
modules;
|
|
3
3
|
cache = { key: null, modules: null };
|
|
4
4
|
constructor(modules) {
|
|
@@ -24,6 +24,7 @@ import {ClientLogger}from'@cdm-logger/client';export{default}from'../modules.js'
|
|
|
24
24
|
return this.cache.key;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
27
|
+
const appEnv = getEnvironment();
|
|
28
|
+
const logger = ClientLogger.create(appEnv.APP_NAME || 'Fullstack-Pro', {
|
|
29
|
+
level: appEnv.LOG_LEVEL || 'info',
|
|
29
30
|
});export{UtilityClass,logger};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@common-stack/frontend-stack-react",
|
|
3
|
-
"version": "4.0.1-alpha.
|
|
3
|
+
"version": "4.0.1-alpha.20",
|
|
4
4
|
"description": "Client Module for react app",
|
|
5
5
|
"homepage": "https://github.com/cdmbase/fullstack-pro#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"typescript": {
|
|
51
51
|
"definition": "lib/index.d.ts"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "6e563e11afff4587f965457c1a1bd868562a1688"
|
|
54
54
|
}
|