@tramvai/module-page-render-mode 2.70.0 → 2.72.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.
@@ -0,0 +1,238 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var isEmpty = require('@tinkoff/utils/is/empty');
6
+ var core = require('@tramvai/core');
7
+ var tokensCommon = require('@tramvai/tokens-common');
8
+ var tokensServerPrivate = require('@tramvai/tokens-server-private');
9
+ var tokensRender = require('@tramvai/tokens-render');
10
+ var tokensRouter = require('@tramvai/tokens-router');
11
+ var moduleClientHints = require('@tramvai/module-client-hints');
12
+ var tokensServer = require('@tramvai/tokens-server');
13
+ var tokensMetrics = require('@tramvai/tokens-metrics');
14
+ var papi = require('@tramvai/papi');
15
+ var error = require('./error.js');
16
+ var tokens = require('./tokens.js');
17
+ var getPageRenderMode = require('./utils/getPageRenderMode.js');
18
+ var cacheKey = require('./utils/cacheKey.js');
19
+ var backgroundFetchService = require('./staticPages/backgroundFetchService.js');
20
+ var staticPagesService = require('./staticPages/staticPagesService.js');
21
+
22
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
+
24
+ var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
25
+
26
+ const STATIC_PAGES_BACKGROUND_FETCH_SERVICE = core.createToken();
27
+ const STATIC_PAGES_GET_CACHE_KEY_TOKEN = core.createToken();
28
+ const STATIC_PAGES_CACHE_HIT_METRIC_TOKEN = core.createToken();
29
+ const STATIC_PAGES_SERVICE = core.createToken();
30
+ const staticPagesProviders = [
31
+ core.provide({
32
+ provide: STATIC_PAGES_CACHE_HIT_METRIC_TOKEN,
33
+ scope: core.Scope.SINGLETON,
34
+ useFactory: ({ metrics }) => {
35
+ return metrics.counter({
36
+ name: 'static_pages_cache_hit',
37
+ help: 'Total static pages returned from cache',
38
+ labelNames: [],
39
+ });
40
+ },
41
+ deps: {
42
+ metrics: tokensMetrics.METRICS_MODULE_TOKEN,
43
+ },
44
+ }),
45
+ core.provide({
46
+ provide: tokens.STATIC_PAGES_CACHE_TOKEN,
47
+ scope: core.Scope.SINGLETON,
48
+ useFactory: ({ createCache, staticPagesOptions }) => {
49
+ return createCache('memory', {
50
+ max: staticPagesOptions.maxSize,
51
+ });
52
+ },
53
+ deps: {
54
+ createCache: tokensCommon.CREATE_CACHE_TOKEN,
55
+ staticPagesOptions: tokens.STATIC_PAGES_OPTIONS_TOKEN,
56
+ },
57
+ }),
58
+ core.provide({
59
+ provide: tokens.STATIC_PAGES_OPTIONS_TOKEN,
60
+ useValue: {
61
+ // @TODO: свой ttl для отдельных страниц
62
+ ttl: 60 * 1000,
63
+ maxSize: 1000,
64
+ },
65
+ }),
66
+ core.provide({
67
+ provide: STATIC_PAGES_GET_CACHE_KEY_TOKEN,
68
+ useFactory: ({ requestManager, userAgent, modern }) => {
69
+ return () => {
70
+ const deviceType = userAgent.mobileOS ? 'mobile' : 'desktop';
71
+ return cacheKey.getCacheKey({
72
+ method: requestManager.getMethod(),
73
+ host: requestManager.getHost(),
74
+ path: requestManager.getParsedUrl().pathname,
75
+ deviceType,
76
+ modern,
77
+ });
78
+ };
79
+ },
80
+ deps: {
81
+ requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
82
+ userAgent: moduleClientHints.USER_AGENT_TOKEN,
83
+ modern: tokensRender.MODERN_SATISFIES_TOKEN,
84
+ },
85
+ }),
86
+ core.provide({
87
+ provide: tokens.STATIC_PAGES_SHOULD_SET_TO_CACHE,
88
+ useFactory: ({ requestManager }) => {
89
+ return () => {
90
+ return isEmpty__default["default"](requestManager.getCookies());
91
+ };
92
+ },
93
+ deps: {
94
+ requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
95
+ },
96
+ }),
97
+ core.provide({
98
+ provide: tokens.STATIC_PAGES_SHOULD_USE_CACHE,
99
+ useFactory: ({ requestManager }) => {
100
+ return () => {
101
+ return !requestManager.getHeader('x-tramvai-static-page-revalidate');
102
+ };
103
+ },
104
+ deps: {
105
+ requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
106
+ },
107
+ }),
108
+ core.provide({
109
+ provide: tokens.STATIC_PAGES_BACKGROUND_FETCH_ENABLED,
110
+ useValue: () => {
111
+ return true;
112
+ },
113
+ }),
114
+ core.provide({
115
+ provide: tokens.STATIC_PAGES_CACHE_5xx_RESPONSE,
116
+ useValue: () => {
117
+ return false;
118
+ },
119
+ }),
120
+ core.provide({
121
+ provide: STATIC_PAGES_BACKGROUND_FETCH_SERVICE,
122
+ scope: core.Scope.REQUEST,
123
+ useClass: backgroundFetchService.BackgroundFetchService,
124
+ deps: {
125
+ logger: tokensCommon.LOGGER_TOKEN,
126
+ backgroundFetchEnabled: tokens.STATIC_PAGES_BACKGROUND_FETCH_ENABLED,
127
+ },
128
+ }),
129
+ core.provide({
130
+ provide: STATIC_PAGES_SERVICE,
131
+ scope: core.Scope.REQUEST,
132
+ useClass: staticPagesService.StaticPagesService,
133
+ deps: {
134
+ getCacheKey: STATIC_PAGES_GET_CACHE_KEY_TOKEN,
135
+ requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
136
+ responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
137
+ response: tokensServerPrivate.FASTIFY_RESPONSE,
138
+ environmentManager: tokensCommon.ENV_MANAGER_TOKEN,
139
+ userAgent: moduleClientHints.USER_AGENT_TOKEN,
140
+ modern: tokensRender.MODERN_SATISFIES_TOKEN,
141
+ logger: tokensCommon.LOGGER_TOKEN,
142
+ cache: tokens.STATIC_PAGES_CACHE_TOKEN,
143
+ modifyCache: { token: tokens.STATIC_PAGES_MODIFY_CACHE, optional: true },
144
+ shouldUseCache: tokens.STATIC_PAGES_SHOULD_USE_CACHE,
145
+ shouldSetToCache: tokens.STATIC_PAGES_SHOULD_SET_TO_CACHE,
146
+ backgroundFetchService: STATIC_PAGES_BACKGROUND_FETCH_SERVICE,
147
+ options: tokens.STATIC_PAGES_OPTIONS_TOKEN,
148
+ cache5xxResponse: tokens.STATIC_PAGES_CACHE_5xx_RESPONSE,
149
+ },
150
+ }),
151
+ core.provide({
152
+ provide: core.commandLineListTokens.init,
153
+ multi: true,
154
+ scope: core.Scope.SINGLETON,
155
+ useFactory: ({ di, staticPagesCommandLine }) => {
156
+ return function registerResponseCacheHandler() {
157
+ di.register({
158
+ provide: staticPagesCommandLine
159
+ ? core.commandLineListTokens[staticPagesCommandLine]
160
+ : core.commandLineListTokens.customerStart,
161
+ useFactory: ({ staticPagesService, staticPagesCacheHitMetric, logger }) => {
162
+ logger('static-pages');
163
+ return function staticPagesFromCache() {
164
+ if (staticPagesService.shouldUseCache()) {
165
+ staticPagesService.respond(() => {
166
+ // @TODO: маска урла на этом этапе?
167
+ staticPagesCacheHitMetric.inc();
168
+ throw new error.StopCommandLineRunnerError();
169
+ });
170
+ }
171
+ };
172
+ },
173
+ deps: {
174
+ staticPagesService: STATIC_PAGES_SERVICE,
175
+ staticPagesCacheHitMetric: STATIC_PAGES_CACHE_HIT_METRIC_TOKEN,
176
+ logger: tokensCommon.LOGGER_TOKEN,
177
+ },
178
+ });
179
+ };
180
+ },
181
+ deps: {
182
+ di: core.DI_TOKEN,
183
+ staticPagesCommandLine: { token: tokens.STATIC_PAGES_COMMAND_LINE, optional: true },
184
+ },
185
+ }),
186
+ core.provide({
187
+ provide: core.commandLineListTokens.clear,
188
+ useFactory: ({ staticPagesService, pageService, defaultRenderMode }) => {
189
+ return function cacheStaticPages() {
190
+ const isStaticPage = getPageRenderMode.getPageRenderMode({ pageService, defaultRenderMode }) === 'static';
191
+ if (!isStaticPage) {
192
+ return;
193
+ }
194
+ if (staticPagesService.shouldSetToCache()) {
195
+ staticPagesService.saveResponse();
196
+ }
197
+ else {
198
+ staticPagesService.revalidate();
199
+ }
200
+ };
201
+ },
202
+ deps: {
203
+ staticPagesService: STATIC_PAGES_SERVICE,
204
+ pageService: tokensRouter.PAGE_SERVICE_TOKEN,
205
+ defaultRenderMode: tokens.PAGE_RENDER_DEFAULT_MODE,
206
+ },
207
+ }),
208
+ core.provide({
209
+ provide: tokensServer.SERVER_MODULE_PAPI_PRIVATE_ROUTE,
210
+ useFactory: ({ staticPagesCache }) => {
211
+ return papi.createPapiMethod({
212
+ path: '/revalidate/',
213
+ method: 'post',
214
+ async handler({ body = {} }) {
215
+ const { path } = body;
216
+ const pathKey = `/${path}/`;
217
+ if (!path) {
218
+ staticPagesCache.clear();
219
+ }
220
+ else if (staticPagesCache.has(pathKey)) {
221
+ staticPagesCache.set(pathKey, new Map());
222
+ // @TODO: revalidate request with background fetch?
223
+ }
224
+ return 'Success';
225
+ },
226
+ });
227
+ },
228
+ deps: {
229
+ staticPagesCache: tokens.STATIC_PAGES_CACHE_TOKEN,
230
+ },
231
+ }),
232
+ ];
233
+
234
+ exports.STATIC_PAGES_BACKGROUND_FETCH_SERVICE = STATIC_PAGES_BACKGROUND_FETCH_SERVICE;
235
+ exports.STATIC_PAGES_CACHE_HIT_METRIC_TOKEN = STATIC_PAGES_CACHE_HIT_METRIC_TOKEN;
236
+ exports.STATIC_PAGES_GET_CACHE_KEY_TOKEN = STATIC_PAGES_GET_CACHE_KEY_TOKEN;
237
+ exports.STATIC_PAGES_SERVICE = STATIC_PAGES_SERVICE;
238
+ exports.staticPagesProviders = staticPagesProviders;
@@ -0,0 +1,19 @@
1
+ import { createToken } from '@tinkoff/dippy';
2
+
3
+ const PAGE_RENDER_FALLBACK_COMPONENT_PREFIX = createToken('pageRenderFallbackComponentName');
4
+ /**
5
+ * @deprecated Use token `TRAMVAI_RENDER_MODE` from `@tramvai/tokens-render`
6
+ */
7
+ const PAGE_RENDER_DEFAULT_MODE = createToken('pageRenderDefaultMode');
8
+ const PAGE_RENDER_WRAPPER_TYPE = createToken('pageRenderWrapperType');
9
+ const PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT = createToken('pageRenderDefaultFallbackComponent');
10
+ const STATIC_PAGES_CACHE_TOKEN = createToken('static pages cache');
11
+ const STATIC_PAGES_SHOULD_USE_CACHE = createToken('static pages should use cache');
12
+ const STATIC_PAGES_SHOULD_SET_TO_CACHE = createToken('static pages should set to cache');
13
+ const STATIC_PAGES_BACKGROUND_FETCH_ENABLED = createToken('static pages can fetch page');
14
+ const STATIC_PAGES_OPTIONS_TOKEN = createToken('static pages options');
15
+ const STATIC_PAGES_COMMAND_LINE = createToken('static pages command line');
16
+ const STATIC_PAGES_MODIFY_CACHE = createToken('static pages modify cache', { multi: true });
17
+ const STATIC_PAGES_CACHE_5xx_RESPONSE = createToken('static pages cache 5xx response');
18
+
19
+ export { PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, PAGE_RENDER_DEFAULT_MODE, PAGE_RENDER_FALLBACK_COMPONENT_PREFIX, PAGE_RENDER_WRAPPER_TYPE, STATIC_PAGES_BACKGROUND_FETCH_ENABLED, STATIC_PAGES_CACHE_5xx_RESPONSE, STATIC_PAGES_CACHE_TOKEN, STATIC_PAGES_COMMAND_LINE, STATIC_PAGES_MODIFY_CACHE, STATIC_PAGES_OPTIONS_TOKEN, STATIC_PAGES_SHOULD_SET_TO_CACHE, STATIC_PAGES_SHOULD_USE_CACHE };
@@ -0,0 +1,19 @@
1
+ import { createToken } from '@tinkoff/dippy';
2
+
3
+ const PAGE_RENDER_FALLBACK_COMPONENT_PREFIX = createToken('pageRenderFallbackComponentName');
4
+ /**
5
+ * @deprecated Use token `TRAMVAI_RENDER_MODE` from `@tramvai/tokens-render`
6
+ */
7
+ const PAGE_RENDER_DEFAULT_MODE = createToken('pageRenderDefaultMode');
8
+ const PAGE_RENDER_WRAPPER_TYPE = createToken('pageRenderWrapperType');
9
+ const PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT = createToken('pageRenderDefaultFallbackComponent');
10
+ const STATIC_PAGES_CACHE_TOKEN = createToken('static pages cache');
11
+ const STATIC_PAGES_SHOULD_USE_CACHE = createToken('static pages should use cache');
12
+ const STATIC_PAGES_SHOULD_SET_TO_CACHE = createToken('static pages should set to cache');
13
+ const STATIC_PAGES_BACKGROUND_FETCH_ENABLED = createToken('static pages can fetch page');
14
+ const STATIC_PAGES_OPTIONS_TOKEN = createToken('static pages options');
15
+ const STATIC_PAGES_COMMAND_LINE = createToken('static pages command line');
16
+ const STATIC_PAGES_MODIFY_CACHE = createToken('static pages modify cache', { multi: true });
17
+ const STATIC_PAGES_CACHE_5xx_RESPONSE = createToken('static pages cache 5xx response');
18
+
19
+ export { PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, PAGE_RENDER_DEFAULT_MODE, PAGE_RENDER_FALLBACK_COMPONENT_PREFIX, PAGE_RENDER_WRAPPER_TYPE, STATIC_PAGES_BACKGROUND_FETCH_ENABLED, STATIC_PAGES_CACHE_5xx_RESPONSE, STATIC_PAGES_CACHE_TOKEN, STATIC_PAGES_COMMAND_LINE, STATIC_PAGES_MODIFY_CACHE, STATIC_PAGES_OPTIONS_TOKEN, STATIC_PAGES_SHOULD_SET_TO_CACHE, STATIC_PAGES_SHOULD_USE_CACHE };
package/lib/tokens.js ADDED
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var dippy = require('@tinkoff/dippy');
6
+
7
+ const PAGE_RENDER_FALLBACK_COMPONENT_PREFIX = dippy.createToken('pageRenderFallbackComponentName');
8
+ /**
9
+ * @deprecated Use token `TRAMVAI_RENDER_MODE` from `@tramvai/tokens-render`
10
+ */
11
+ const PAGE_RENDER_DEFAULT_MODE = dippy.createToken('pageRenderDefaultMode');
12
+ const PAGE_RENDER_WRAPPER_TYPE = dippy.createToken('pageRenderWrapperType');
13
+ const PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT = dippy.createToken('pageRenderDefaultFallbackComponent');
14
+ const STATIC_PAGES_CACHE_TOKEN = dippy.createToken('static pages cache');
15
+ const STATIC_PAGES_SHOULD_USE_CACHE = dippy.createToken('static pages should use cache');
16
+ const STATIC_PAGES_SHOULD_SET_TO_CACHE = dippy.createToken('static pages should set to cache');
17
+ const STATIC_PAGES_BACKGROUND_FETCH_ENABLED = dippy.createToken('static pages can fetch page');
18
+ const STATIC_PAGES_OPTIONS_TOKEN = dippy.createToken('static pages options');
19
+ const STATIC_PAGES_COMMAND_LINE = dippy.createToken('static pages command line');
20
+ const STATIC_PAGES_MODIFY_CACHE = dippy.createToken('static pages modify cache', { multi: true });
21
+ const STATIC_PAGES_CACHE_5xx_RESPONSE = dippy.createToken('static pages cache 5xx response');
22
+
23
+ exports.PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT = PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT;
24
+ exports.PAGE_RENDER_DEFAULT_MODE = PAGE_RENDER_DEFAULT_MODE;
25
+ exports.PAGE_RENDER_FALLBACK_COMPONENT_PREFIX = PAGE_RENDER_FALLBACK_COMPONENT_PREFIX;
26
+ exports.PAGE_RENDER_WRAPPER_TYPE = PAGE_RENDER_WRAPPER_TYPE;
27
+ exports.STATIC_PAGES_BACKGROUND_FETCH_ENABLED = STATIC_PAGES_BACKGROUND_FETCH_ENABLED;
28
+ exports.STATIC_PAGES_CACHE_5xx_RESPONSE = STATIC_PAGES_CACHE_5xx_RESPONSE;
29
+ exports.STATIC_PAGES_CACHE_TOKEN = STATIC_PAGES_CACHE_TOKEN;
30
+ exports.STATIC_PAGES_COMMAND_LINE = STATIC_PAGES_COMMAND_LINE;
31
+ exports.STATIC_PAGES_MODIFY_CACHE = STATIC_PAGES_MODIFY_CACHE;
32
+ exports.STATIC_PAGES_OPTIONS_TOKEN = STATIC_PAGES_OPTIONS_TOKEN;
33
+ exports.STATIC_PAGES_SHOULD_SET_TO_CACHE = STATIC_PAGES_SHOULD_SET_TO_CACHE;
34
+ exports.STATIC_PAGES_SHOULD_USE_CACHE = STATIC_PAGES_SHOULD_USE_CACHE;
@@ -0,0 +1,5 @@
1
+ const getCacheKey = ({ method, host, path, deviceType, modern, }) => {
2
+ return `${method}=${host}=${path}=${deviceType}=${modern ? 'modern' : 'default'}`;
3
+ };
4
+
5
+ export { getCacheKey };
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const getCacheKey = ({ method, host, path, deviceType, modern, }) => {
6
+ return `${method}=${host}=${path}=${deviceType}=${modern ? 'modern' : 'default'}`;
7
+ };
8
+
9
+ exports.getCacheKey = getCacheKey;
@@ -0,0 +1,9 @@
1
+ const getPageRenderMode = ({ pageService, defaultRenderMode, }) => {
2
+ var _a;
3
+ const { pageComponent, pageRenderMode } = pageService.getConfig();
4
+ const { renderMode } = (_a = pageService.getComponent(pageComponent)) !== null && _a !== void 0 ? _a : {};
5
+ const mode = pageRenderMode || renderMode || defaultRenderMode;
6
+ return mode;
7
+ };
8
+
9
+ export { getPageRenderMode };
@@ -0,0 +1,9 @@
1
+ const getPageRenderMode = ({ pageService, defaultRenderMode, }) => {
2
+ var _a;
3
+ const { pageComponent, pageRenderMode } = pageService.getConfig();
4
+ const { renderMode } = (_a = pageService.getComponent(pageComponent)) !== null && _a !== void 0 ? _a : {};
5
+ const mode = pageRenderMode || renderMode || defaultRenderMode;
6
+ return mode;
7
+ };
8
+
9
+ export { getPageRenderMode };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const getPageRenderMode = ({ pageService, defaultRenderMode, }) => {
6
+ var _a;
7
+ const { pageComponent, pageRenderMode } = pageService.getConfig();
8
+ const { renderMode } = (_a = pageService.getComponent(pageComponent)) !== null && _a !== void 0 ? _a : {};
9
+ const mode = pageRenderMode || renderMode || defaultRenderMode;
10
+ return mode;
11
+ };
12
+
13
+ exports.getPageRenderMode = getPageRenderMode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-page-render-mode",
3
- "version": "2.70.0",
3
+ "version": "2.72.0",
4
4
  "description": "Enable different rendering modes for pages",
5
5
  "main": "./lib/server.js",
6
6
  "module": "./lib/server.es.js",
@@ -16,33 +16,32 @@
16
16
  },
17
17
  "license": "Apache-2.0",
18
18
  "scripts": {
19
- "build": "tramvai-build --for-publish",
20
- "watch": "tsc -w",
21
- "build-for-publish": "true"
19
+ "build": "tramvai-build --forPublish --preserveModules",
20
+ "watch": "tsc -w"
22
21
  },
23
22
  "publishConfig": {
24
23
  "registry": "https://registry.npmjs.org/"
25
24
  },
26
25
  "dependencies": {
27
26
  "node-fetch": "^2.6.1",
28
- "@tinkoff/errors": "0.3.5",
29
- "@tinkoff/url": "0.8.4"
27
+ "@tinkoff/errors": "0.3.6",
28
+ "@tinkoff/url": "0.8.5"
30
29
  },
31
30
  "peerDependencies": {
32
31
  "@tinkoff/utils": "^2.1.2",
33
- "@tinkoff/dippy": "0.8.12",
34
- "@tramvai/core": "2.70.0",
35
- "@tramvai/react": "2.70.0",
36
- "@tramvai/papi": "2.70.0",
37
- "@tramvai/module-router": "2.70.0",
38
- "@tramvai/module-client-hints": "2.70.0",
39
- "@tramvai/tokens-common": "2.70.0",
40
- "@tramvai/tokens-core": "2.70.0",
41
- "@tramvai/tokens-render": "2.70.0",
42
- "@tramvai/tokens-router": "2.70.0",
43
- "@tramvai/tokens-server": "2.70.0",
44
- "@tramvai/tokens-server-private": "2.70.0",
45
- "@tramvai/tokens-metrics": "2.70.0",
32
+ "@tinkoff/dippy": "0.8.13",
33
+ "@tramvai/core": "2.72.0",
34
+ "@tramvai/react": "2.72.0",
35
+ "@tramvai/papi": "2.72.0",
36
+ "@tramvai/module-router": "2.72.0",
37
+ "@tramvai/module-client-hints": "2.72.0",
38
+ "@tramvai/tokens-common": "2.72.0",
39
+ "@tramvai/tokens-core": "2.72.0",
40
+ "@tramvai/tokens-render": "2.72.0",
41
+ "@tramvai/tokens-router": "2.72.0",
42
+ "@tramvai/tokens-server": "2.72.0",
43
+ "@tramvai/tokens-server-private": "2.72.0",
44
+ "@tramvai/tokens-metrics": "2.72.0",
46
45
  "prom-client": "^12.0.0",
47
46
  "react": ">=16.14.0",
48
47
  "tslib": "^2.4.0"