@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.
@@ -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 {UtilityClass,logger}from'../../utils/index.js';import features from'../../modules.js';import {createApolloClient}from'../../config/base-apollo-client.js';import {config}from'../../config/env-config.js';const TYPES = {
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.js';import'../../config/client.service.js';import'../../config/redux-config.js';/* eslint-disable jest/require-hook */
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';
1
+ import { InMemoryCache } from '@apollo/client/cache/index.js';
2
2
  import { CdmLogger } from '@cdm-logger/core';
3
3
  interface CreateCacheParams {
4
4
  getDataIdFromObject: (x?: any) => string;
@@ -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
1
  import 'reflect-metadata';
2
+ /**
3
+ * This is for backend only
4
+ */
2
5
  export declare const config: Readonly<{
3
6
  SENTRY_DSN_FRONTEND: string;
4
7
  NODE_ENV: string;
@@ -1,4 +1,7 @@
1
- import'reflect-metadata';import {cleanEnv,str,json,bool}from'envalid';const config = cleanEnv(process.env, {
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__ }),
@@ -1,3 +1,2 @@
1
- export * from './env-config';
2
1
  export * from './client.service';
3
2
  export * from './redux-config';
@@ -1 +1,2 @@
1
- export declare function getRedisClient(): any;
1
+ import Redis from 'ioredis';
2
+ export declare function getRedisClient(): Redis;
@@ -1,4 +1,4 @@
1
- import Redis from'ioredis';import {config}from'./env-config.js';let redisClient;
1
+ import Redis from'ioredis';import {config}from'./env-config.server.js';let redisClient;
2
2
  function getRedisClient() {
3
3
  if (!redisClient) {
4
4
  // Initialize Redis client if it doesn't exist
@@ -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: import("redux-persist").WebStorage;
19
- stateReconciler: typeof autoMergeLevel2;
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
@@ -1,5 +1,6 @@
1
1
  export * from './utils';
2
2
  export * from './config';
3
+ export * from './tools';
3
4
  export * from './backend/middlewares/cors';
4
5
  export * from './backend/middlewares/container';
5
6
  export * from './backend/middlewares/error';
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- export{UtilityClass,logger}from'./utils/index.js';export{config}from'./config/env-config.js';export{createClientContainer}from'./config/client.service.js';export{createReduxStore,epicMiddlewareFunc,persistConfig}from'./config/redux-config.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';
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
- export declare const loadContext: (req: Request, res: Response) => Promise<{
3
- modules: import("@common-stack/client-react").Feature;
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,4 @@
1
+ import { MiddlewareFunction, MiddlewareOptions } from '../interfaces/middleware';
2
+ export declare function clientLoaderWithMiddleware(params: any, middlewareOptions: MiddlewareOptions, middlewareStack: {
3
+ func: MiddlewareFunction;
4
+ }[]): Promise<MiddlewareOptions>;
@@ -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,2 @@
1
+ export * from './clientLoaderWithMiddleware';
2
+ export * from './loaderWithMiddleware';
@@ -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};
@@ -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 logger = ClientLogger.create(process.env.APP_NAME || 'Fullstack-Pro', {
28
- level: process.env.LOG_LEVEL || 'info',
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.12",
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": "cb43cb1ed2941d6bd66b43ad4825cda7a2ed5abc"
53
+ "gitHead": "6e563e11afff4587f965457c1a1bd868562a1688"
54
54
  }
@@ -1,3 +0,0 @@
1
- /// <reference path="../../../../typings/index.d.ts" />
2
- declare const env: any;
3
- export default env;