@tramvai/module-server 2.89.2 → 2.91.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.
@@ -1,6 +1,7 @@
1
1
  import { declareModule, provide } from '@tramvai/core';
2
2
  import { COMMAND_LINE_EXECUTION_END_TOKEN } from '@tramvai/tokens-core-private';
3
3
  import { RESPONSE_MANAGER_TOKEN } from '@tramvai/tokens-common';
4
+ import { FASTIFY_RESPONSE } from '@tramvai/tokens-server-private';
4
5
 
5
6
  const ServerTimingModule = declareModule({
6
7
  name: 'ServerTiming',
@@ -12,6 +13,11 @@ const ServerTimingModule = declareModule({
12
13
  var _a;
13
14
  if (type === 'server' && status === 'customer') {
14
15
  const responseManager = di.get(RESPONSE_MANAGER_TOKEN);
16
+ const reply = di.get(FASTIFY_RESPONSE);
17
+ // prevent unnecessary work
18
+ if (reply.sent) {
19
+ return;
20
+ }
15
21
  const initialHeader = (_a = responseManager.getHeader('Server-Timing')) !== null && _a !== void 0 ? _a : '';
16
22
  const entries = [];
17
23
  // index for custom sort
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var core = require('@tramvai/core');
6
6
  var tokensCorePrivate = require('@tramvai/tokens-core-private');
7
7
  var tokensCommon = require('@tramvai/tokens-common');
8
+ var tokensServerPrivate = require('@tramvai/tokens-server-private');
8
9
 
9
10
  const ServerTimingModule = core.declareModule({
10
11
  name: 'ServerTiming',
@@ -16,6 +17,11 @@ const ServerTimingModule = core.declareModule({
16
17
  var _a;
17
18
  if (type === 'server' && status === 'customer') {
18
19
  const responseManager = di.get(tokensCommon.RESPONSE_MANAGER_TOKEN);
20
+ const reply = di.get(tokensServerPrivate.FASTIFY_RESPONSE);
21
+ // prevent unnecessary work
22
+ if (reply.sent) {
23
+ return;
24
+ }
19
25
  const initialHeader = (_a = responseManager.getHeader('Server-Timing')) !== null && _a !== void 0 ? _a : '';
20
26
  const entries = [];
21
27
  // index for custom sort
@@ -1,11 +1,11 @@
1
1
  import type { FastifyInstance } from 'fastify';
2
2
  import type { LOGGER_TOKEN } from '@tramvai/module-common';
3
+ import type { FETCH_WEBPACK_STATS_TOKEN } from '@tramvai/tokens-render';
3
4
  import type { WEB_FASTIFY_APP_AFTER_ERROR_TOKEN, WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN } from '@tramvai/tokens-server-private';
4
5
  import type { ExtractDependencyType } from '@tinkoff/dippy';
5
- import type { ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN } from '@tramvai/react';
6
- export declare const errorHandler: (app: FastifyInstance, { log, beforeError, afterError, RootErrorBoundary, }: {
6
+ export declare const errorHandler: (app: FastifyInstance, { log, beforeError, afterError, fetchWebpackStats, }: {
7
7
  log: ReturnType<typeof LOGGER_TOKEN>;
8
8
  beforeError: ExtractDependencyType<typeof WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN>;
9
9
  afterError: ExtractDependencyType<typeof WEB_FASTIFY_APP_AFTER_ERROR_TOKEN>;
10
- RootErrorBoundary?: ExtractDependencyType<typeof ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN>;
10
+ fetchWebpackStats: ExtractDependencyType<typeof FETCH_WEBPACK_STATS_TOKEN>;
11
11
  }) => void;
@@ -3,8 +3,9 @@ import { createElement } from 'react';
3
3
  import { renderToString } from 'react-dom/server';
4
4
  import { parse } from '@tinkoff/url';
5
5
  import { isRedirectFoundError, isNotFoundError, isHttpError } from '@tinkoff/errors';
6
+ import { ChunkExtractor } from '@loadable/server';
6
7
 
7
- const errorHandler = (app, { log, beforeError, afterError, RootErrorBoundary, }) => {
8
+ const errorHandler = (app, { log, beforeError, afterError, fetchWebpackStats, }) => {
8
9
  // eslint-disable-next-line max-statements
9
10
  app.setErrorHandler(async (error, request, reply) => {
10
11
  const runHandlers = async (handlers) => {
@@ -26,6 +27,17 @@ const errorHandler = (app, { log, beforeError, afterError, RootErrorBoundary, })
26
27
  requestId: request.headers['x-request-id'],
27
28
  url: request.url,
28
29
  };
30
+ let RootErrorBoundary = null;
31
+ try {
32
+ // In case of direct `require` by path, e.g.
33
+ // `require(path.resolve(process.cwd(), 'src', 'error.tsx'))` file
34
+ // doesn't include in the bundle, that is why we are using a
35
+ // path alias here along with webpack config option.
36
+ // See usage of `ROOT_ERROR_BOUNDARY_ALIAS`.
37
+ // eslint-disable-next-line import/no-unresolved, import/extensions
38
+ RootErrorBoundary = require('@/__private__/error').default;
39
+ }
40
+ catch { }
29
41
  if (isRedirectFoundError(error)) {
30
42
  log.info({
31
43
  event: 'redirect-found-error',
@@ -90,7 +102,7 @@ Not Found page is common use-case with this error - https://tramvai.dev/docs/fea
90
102
  }
91
103
  }
92
104
  logMessage = `${logMessage}
93
- ${RootErrorBoundary
105
+ ${RootErrorBoundary !== null
94
106
  ? 'Root Error Boundary will be rendered for the client'
95
107
  : 'You can add Error Boundary for better UX - https://tramvai.dev/docs/features/error-boundaries'}'`;
96
108
  log[logLevel]({
@@ -104,9 +116,28 @@ ${RootErrorBoundary
104
116
  return afterErrorResult;
105
117
  }
106
118
  reply.status(httpStatus);
107
- if (RootErrorBoundary) {
119
+ if (RootErrorBoundary !== null) {
108
120
  try {
109
- const body = renderToString(createElement(RootErrorBoundary, { error, url: parse(request.url) }));
121
+ const stats = await fetchWebpackStats();
122
+ const extractor = new ChunkExtractor({ stats, entrypoints: ['rootErrorBoundary'] });
123
+ const url = parse(requestInfo.url);
124
+ const serializedError = {
125
+ status: httpStatus,
126
+ message: error.message,
127
+ stack: error.stack,
128
+ };
129
+ const body = renderToString(createElement(RootErrorBoundary, { error: serializedError, url })).replace('</head>', [
130
+ '<script>' +
131
+ `window.serverUrl = ${JSON.stringify(url)};` +
132
+ `window.serverError = new Error("${serializedError.message}");` +
133
+ `Object.assign(window.serverError, ${JSON.stringify(serializedError)});` +
134
+ '</script>',
135
+ extractor.getStyleTags(),
136
+ extractor.getScriptTags(),
137
+ '</head>',
138
+ ]
139
+ .filter(Boolean)
140
+ .join('\n'));
110
141
  log.info({
111
142
  event: 'render-root-error-boundary',
112
143
  message: 'Render Root Error Boundary for the client',
@@ -4,15 +4,16 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var isNil = require('@tinkoff/utils/is/nil');
6
6
  var react = require('react');
7
- var server = require('react-dom/server');
7
+ var server$1 = require('react-dom/server');
8
8
  var url = require('@tinkoff/url');
9
9
  var errors = require('@tinkoff/errors');
10
+ var server = require('@loadable/server');
10
11
 
11
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
13
 
13
14
  var isNil__default = /*#__PURE__*/_interopDefaultLegacy(isNil);
14
15
 
15
- const errorHandler = (app, { log, beforeError, afterError, RootErrorBoundary, }) => {
16
+ const errorHandler = (app, { log, beforeError, afterError, fetchWebpackStats, }) => {
16
17
  // eslint-disable-next-line max-statements
17
18
  app.setErrorHandler(async (error, request, reply) => {
18
19
  const runHandlers = async (handlers) => {
@@ -34,6 +35,17 @@ const errorHandler = (app, { log, beforeError, afterError, RootErrorBoundary, })
34
35
  requestId: request.headers['x-request-id'],
35
36
  url: request.url,
36
37
  };
38
+ let RootErrorBoundary = null;
39
+ try {
40
+ // In case of direct `require` by path, e.g.
41
+ // `require(path.resolve(process.cwd(), 'src', 'error.tsx'))` file
42
+ // doesn't include in the bundle, that is why we are using a
43
+ // path alias here along with webpack config option.
44
+ // See usage of `ROOT_ERROR_BOUNDARY_ALIAS`.
45
+ // eslint-disable-next-line import/no-unresolved, import/extensions
46
+ RootErrorBoundary = require('@/__private__/error').default;
47
+ }
48
+ catch { }
37
49
  if (errors.isRedirectFoundError(error)) {
38
50
  log.info({
39
51
  event: 'redirect-found-error',
@@ -98,7 +110,7 @@ Not Found page is common use-case with this error - https://tramvai.dev/docs/fea
98
110
  }
99
111
  }
100
112
  logMessage = `${logMessage}
101
- ${RootErrorBoundary
113
+ ${RootErrorBoundary !== null
102
114
  ? 'Root Error Boundary will be rendered for the client'
103
115
  : 'You can add Error Boundary for better UX - https://tramvai.dev/docs/features/error-boundaries'}'`;
104
116
  log[logLevel]({
@@ -112,9 +124,28 @@ ${RootErrorBoundary
112
124
  return afterErrorResult;
113
125
  }
114
126
  reply.status(httpStatus);
115
- if (RootErrorBoundary) {
127
+ if (RootErrorBoundary !== null) {
116
128
  try {
117
- const body = server.renderToString(react.createElement(RootErrorBoundary, { error, url: url.parse(request.url) }));
129
+ const stats = await fetchWebpackStats();
130
+ const extractor = new server.ChunkExtractor({ stats, entrypoints: ['rootErrorBoundary'] });
131
+ const url$1 = url.parse(requestInfo.url);
132
+ const serializedError = {
133
+ status: httpStatus,
134
+ message: error.message,
135
+ stack: error.stack,
136
+ };
137
+ const body = server$1.renderToString(react.createElement(RootErrorBoundary, { error: serializedError, url: url$1 })).replace('</head>', [
138
+ '<script>' +
139
+ `window.serverUrl = ${JSON.stringify(url$1)};` +
140
+ `window.serverError = new Error("${serializedError.message}");` +
141
+ `Object.assign(window.serverError, ${JSON.stringify(serializedError)});` +
142
+ '</script>',
143
+ extractor.getStyleTags(),
144
+ extractor.getScriptTags(),
145
+ '</head>',
146
+ ]
147
+ .filter(Boolean)
148
+ .join('\n'));
118
149
  log.info({
119
150
  event: 'render-root-error-boundary',
120
151
  message: 'Render Root Error Boundary for the client',
@@ -2,12 +2,12 @@ import type { EXECUTION_CONTEXT_MANAGER_TOKEN, LOGGER_TOKEN } from '@tramvai/tok
2
2
  import type { COMMAND_LINE_RUNNER_TOKEN } from '@tramvai/core';
3
3
  import type { SERVER_TOKEN } from '@tramvai/tokens-server';
4
4
  import type { WEB_FASTIFY_APP_TOKEN, WEB_FASTIFY_APP_AFTER_INIT_TOKEN, WEB_FASTIFY_APP_BEFORE_INIT_TOKEN, WEB_FASTIFY_APP_INIT_TOKEN, WEB_FASTIFY_APP_LIMITER_TOKEN, WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, WEB_FASTIFY_APP_AFTER_ERROR_TOKEN, WEB_FASTIFY_APP_METRICS_TOKEN } from '@tramvai/tokens-server-private';
5
+ import type { FETCH_WEBPACK_STATS_TOKEN } from '@tramvai/tokens-render';
5
6
  import type { ExtractDependencyType } from '@tinkoff/dippy';
6
- import type { ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN } from '@tramvai/react';
7
7
  export declare const webAppFactory: ({ server }: {
8
8
  server: typeof SERVER_TOKEN;
9
9
  }) => import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> & PromiseLike<import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
10
- export declare const webAppInitCommand: ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, RootErrorBoundary, }: {
10
+ export declare const webAppInitCommand: ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, fetchWebpackStats, }: {
11
11
  app: ExtractDependencyType<typeof WEB_FASTIFY_APP_TOKEN>;
12
12
  logger: ExtractDependencyType<typeof LOGGER_TOKEN>;
13
13
  commandLineRunner: ExtractDependencyType<typeof COMMAND_LINE_RUNNER_TOKEN>;
@@ -19,5 +19,5 @@ export declare const webAppInitCommand: ({ app, logger, commandLineRunner, execu
19
19
  afterInit: ExtractDependencyType<typeof WEB_FASTIFY_APP_AFTER_INIT_TOKEN>;
20
20
  beforeError: ExtractDependencyType<typeof WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN>;
21
21
  afterError: ExtractDependencyType<typeof WEB_FASTIFY_APP_AFTER_ERROR_TOKEN>;
22
- RootErrorBoundary?: ExtractDependencyType<typeof ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN>;
22
+ fetchWebpackStats: ExtractDependencyType<typeof FETCH_WEBPACK_STATS_TOKEN>;
23
23
  }) => () => Promise<void>;
@@ -18,13 +18,13 @@ const webAppFactory = ({ server }) => {
18
18
  });
19
19
  return app;
20
20
  };
21
- const webAppInitCommand = ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, RootErrorBoundary, }) => {
21
+ const webAppInitCommand = ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, fetchWebpackStats, }) => {
22
22
  const log = logger('server:webapp');
23
23
  const runHandlers = (instance, handlers) => {
24
24
  return Promise.all([handlers && Promise.all(handlers.map((handler) => handler(instance)))]);
25
25
  };
26
26
  return async function webAppInit() {
27
- errorHandler(app, { log, beforeError, afterError, RootErrorBoundary });
27
+ errorHandler(app, { log, beforeError, afterError, fetchWebpackStats });
28
28
  await app.register(async (instance) => {
29
29
  await runHandlers(instance, beforeInit);
30
30
  });
@@ -27,13 +27,13 @@ const webAppFactory = ({ server }) => {
27
27
  });
28
28
  return app;
29
29
  };
30
- const webAppInitCommand = ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, RootErrorBoundary, }) => {
30
+ const webAppInitCommand = ({ app, logger, commandLineRunner, executionContextManager, beforeInit, requestMetrics, limiterRequest, init, afterInit, beforeError, afterError, fetchWebpackStats, }) => {
31
31
  const log = logger('server:webapp');
32
32
  const runHandlers = (instance, handlers) => {
33
33
  return Promise.all([handlers && Promise.all(handlers.map((handler) => handler(instance)))]);
34
34
  };
35
35
  return async function webAppInit() {
36
- error.errorHandler(app, { log, beforeError, afterError, RootErrorBoundary });
36
+ error.errorHandler(app, { log, beforeError, afterError, fetchWebpackStats });
37
37
  await app.register(async (instance) => {
38
38
  await runHandlers(instance, beforeInit);
39
39
  });
package/lib/server.es.js CHANGED
@@ -4,6 +4,7 @@ import EventEmitter from 'events';
4
4
  import { Module, provide, Scope, commandLineListTokens, COMMAND_LINE_RUNNER_TOKEN, APP_INFO_TOKEN } from '@tramvai/core';
5
5
  import { SERVER_TOKEN } from '@tramvai/tokens-server';
6
6
  export * from '@tramvai/tokens-server';
7
+ import { FETCH_WEBPACK_STATS_TOKEN } from '@tramvai/tokens-render';
7
8
  import { SERVER_FACTORY_TOKEN, WEB_FASTIFY_APP_FACTORY_TOKEN, WEB_FASTIFY_APP_TOKEN, WEB_FASTIFY_APP_BEFORE_INIT_TOKEN, WEB_FASTIFY_APP_INIT_TOKEN, WEB_FASTIFY_APP_AFTER_INIT_TOKEN, WEB_FASTIFY_APP_METRICS_TOKEN, WEB_FASTIFY_APP_LIMITER_TOKEN, WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, WEB_FASTIFY_APP_AFTER_ERROR_TOKEN } from '@tramvai/tokens-server-private';
8
9
  import { LOGGER_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, ENV_MANAGER_TOKEN, ENV_USED_TOKEN } from '@tramvai/tokens-common';
9
10
  import { MetricsModule } from '@tramvai/module-metrics';
@@ -93,9 +94,27 @@ ServerModule = __decorate([
93
94
  limiterRequest: { token: WEB_FASTIFY_APP_LIMITER_TOKEN, optional: true },
94
95
  beforeError: { token: WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, optional: true },
95
96
  afterError: { token: WEB_FASTIFY_APP_AFTER_ERROR_TOKEN, optional: true },
96
- RootErrorBoundary: { token: ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
97
+ fetchWebpackStats: FETCH_WEBPACK_STATS_TOKEN,
97
98
  },
98
99
  },
100
+ provide({
101
+ provide: commandLineListTokens.init,
102
+ multi: true,
103
+ useFactory: ({ rootErrorBoundary, logger }) => () => {
104
+ if (process.env.NODE_ENV === 'development' && rootErrorBoundary) {
105
+ logger.error({
106
+ event: 'tramvai-app-init',
107
+ message: 'You are using `ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN`, which was deprecated. Your boundary will not work.' +
108
+ 'Use an `error.tsx` component instead. See more: ' +
109
+ 'https://tramvai.dev/docs/features/error-boundaries/#root-error-boundary',
110
+ });
111
+ }
112
+ },
113
+ deps: {
114
+ logger: LOGGER_TOKEN,
115
+ rootErrorBoundary: { token: ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
116
+ },
117
+ }),
99
118
  {
100
119
  provide: commandLineListTokens.listen,
101
120
  multi: true,
package/lib/server.js CHANGED
@@ -7,6 +7,7 @@ var dns = require('dns');
7
7
  var EventEmitter = require('events');
8
8
  var core = require('@tramvai/core');
9
9
  var tokensServer = require('@tramvai/tokens-server');
10
+ var tokensRender = require('@tramvai/tokens-render');
10
11
  var tokensServerPrivate = require('@tramvai/tokens-server-private');
11
12
  var tokensCommon = require('@tramvai/tokens-common');
12
13
  var moduleMetrics = require('@tramvai/module-metrics');
@@ -100,9 +101,27 @@ exports.ServerModule = tslib.__decorate([
100
101
  limiterRequest: { token: tokensServerPrivate.WEB_FASTIFY_APP_LIMITER_TOKEN, optional: true },
101
102
  beforeError: { token: tokensServerPrivate.WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN, optional: true },
102
103
  afterError: { token: tokensServerPrivate.WEB_FASTIFY_APP_AFTER_ERROR_TOKEN, optional: true },
103
- RootErrorBoundary: { token: react.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
104
+ fetchWebpackStats: tokensRender.FETCH_WEBPACK_STATS_TOKEN,
104
105
  },
105
106
  },
107
+ core.provide({
108
+ provide: core.commandLineListTokens.init,
109
+ multi: true,
110
+ useFactory: ({ rootErrorBoundary, logger }) => () => {
111
+ if (process.env.NODE_ENV === 'development' && rootErrorBoundary) {
112
+ logger.error({
113
+ event: 'tramvai-app-init',
114
+ message: 'You are using `ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN`, which was deprecated. Your boundary will not work.' +
115
+ 'Use an `error.tsx` component instead. See more: ' +
116
+ 'https://tramvai.dev/docs/features/error-boundaries/#root-error-boundary',
117
+ });
118
+ }
119
+ },
120
+ deps: {
121
+ logger: tokensCommon.LOGGER_TOKEN,
122
+ rootErrorBoundary: { token: react.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
123
+ },
124
+ }),
106
125
  {
107
126
  provide: core.commandLineListTokens.listen,
108
127
  multi: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-server",
3
- "version": "2.89.2",
3
+ "version": "2.91.1",
4
4
  "description": "",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
@@ -25,29 +25,30 @@
25
25
  "@tinkoff/monkeypatch": "2.0.5",
26
26
  "@tinkoff/terminus": "0.1.8",
27
27
  "@tinkoff/url": "0.8.6",
28
- "@tramvai/module-cache-warmup": "2.89.2",
29
- "@tramvai/module-metrics": "2.89.2",
30
- "@tramvai/papi": "2.89.2",
31
- "@tramvai/tokens-server": "2.89.2",
32
- "@tramvai/tokens-server-private": "2.89.2",
28
+ "@tramvai/module-cache-warmup": "2.91.1",
29
+ "@tramvai/module-metrics": "2.91.1",
30
+ "@tramvai/papi": "2.91.1",
31
+ "@tramvai/tokens-server": "2.91.1",
32
+ "@tramvai/tokens-server-private": "2.91.1",
33
33
  "fastify": "^4.14.1",
34
34
  "@fastify/cookie": "^8.3.0",
35
35
  "@fastify/compress": "^6.2.0",
36
36
  "@fastify/formbody": "^7.4.0",
37
37
  "@fastify/static": "^6.9.0",
38
+ "@loadable/server": "^5.15.0",
38
39
  "http-proxy-middleware": "^2.0.2"
39
40
  },
40
41
  "peerDependencies": {
41
42
  "@tinkoff/dippy": "0.8.15",
42
43
  "@tinkoff/utils": "^2.1.2",
43
- "@tramvai/cli": "2.89.2",
44
- "@tramvai/core": "2.89.2",
45
- "@tramvai/react": "2.89.2",
46
- "@tramvai/module-common": "2.89.2",
47
- "@tramvai/module-environment": "2.89.2",
48
- "@tramvai/tokens-common": "2.89.2",
49
- "@tramvai/tokens-core-private": "2.89.2",
50
- "@tramvai/tokens-render": "2.89.2",
44
+ "@tramvai/cli": "2.91.1",
45
+ "@tramvai/core": "2.91.1",
46
+ "@tramvai/react": "2.91.1",
47
+ "@tramvai/module-common": "2.91.1",
48
+ "@tramvai/module-environment": "2.91.1",
49
+ "@tramvai/tokens-common": "2.91.1",
50
+ "@tramvai/tokens-core-private": "2.91.1",
51
+ "@tramvai/tokens-render": "2.91.1",
51
52
  "react": ">=16.14.0",
52
53
  "react-dom": ">=16.14.0",
53
54
  "tslib": "^2.4.0"