@drodil/backstage-plugin-search-backend-module-qeta 1.17.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/README.md +50 -0
- package/config.d.ts +17 -0
- package/dist/index.cjs.js +173 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# backstage-plugin-search-backend-module-qeta
|
|
2
|
+
|
|
3
|
+
This package exports a module that extends the search backend to also indexing the tools exposed
|
|
4
|
+
by the [`qeta` service](https://github.com/drodil/backstage-plugin-qeta/tree/main/plugins/qeta-backend).
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
Add the module package as a dependency:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# From your Backstage root directory
|
|
12
|
+
yarn add --cwd packages/backend @drodil/backstage-plugin-search-backend-module-qeta
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Add the collator to your backend instance, along with the search plugin itself:
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
// packages/backend/src/index.ts
|
|
19
|
+
import { createBackend } from '@backstage/backend-defaults';
|
|
20
|
+
import { searchPlugin } from '@backstage/plugin-search-backend/alpha';
|
|
21
|
+
import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha';
|
|
22
|
+
|
|
23
|
+
const backend = createBackend();
|
|
24
|
+
backend.add(searchPlugin());
|
|
25
|
+
backend.add(searchModuleQetaCollator());
|
|
26
|
+
backend.start();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
You may also want to add configuration parameters to your app-config, for example for controlling the scheduled
|
|
30
|
+
indexing interval. These parameters should be placed under the `search.collators.qeta` key.
|
|
31
|
+
See [the config definition file](https://github.com/drodil/backstage-plugin-qeta/blob/master/plugins/search-backend-module-qeta/config.d.ts)
|
|
32
|
+
for more details.
|
|
33
|
+
|
|
34
|
+
## Using Auth Middleware
|
|
35
|
+
|
|
36
|
+
If your Backstage instance uses service-to-service authentication, the collator will need to have access to a `tokenManager`.
|
|
37
|
+
This is automatically injected by the collator module when using the new backend system.
|
|
38
|
+
But if you are using the old backend system, you will want to add it manually to ensure that the collator makes
|
|
39
|
+
authenticated requests to the explore backend.
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
indexBuilder.addCollator({
|
|
43
|
+
schedule: every10MinutesSchedule,
|
|
44
|
+
factory: DefaultQetaCollatorFactory.fromConfig(env.config, {
|
|
45
|
+
discovery: env.discovery,
|
|
46
|
+
logger: env.logger,
|
|
47
|
+
tokenManager: env.tokenManager,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
```
|
package/config.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TaskScheduleDefinitionConfig } from '@backstage/backend-tasks';
|
|
2
|
+
|
|
3
|
+
export interface Config {
|
|
4
|
+
search?: {
|
|
5
|
+
collators?: {
|
|
6
|
+
/**
|
|
7
|
+
* Configuration options for `@backstage/plugin-search-backend-module-explore`
|
|
8
|
+
*/
|
|
9
|
+
qeta?: {
|
|
10
|
+
/**
|
|
11
|
+
* The schedule for how often to run the collation job.
|
|
12
|
+
*/
|
|
13
|
+
schedule?: TaskScheduleDefinitionConfig;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
6
|
+
var alpha = require('@backstage/plugin-search-backend-node/alpha');
|
|
7
|
+
var backendTasks = require('@backstage/backend-tasks');
|
|
8
|
+
var errors = require('@backstage/errors');
|
|
9
|
+
var stream = require('stream');
|
|
10
|
+
|
|
11
|
+
const configKey = "search.collators.qeta";
|
|
12
|
+
const defaults = {
|
|
13
|
+
schedule: {
|
|
14
|
+
frequency: { minutes: 10 },
|
|
15
|
+
timeout: { minutes: 15 },
|
|
16
|
+
initialDelay: { seconds: 3 }
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
function readScheduleConfigOptions(configRoot) {
|
|
20
|
+
let schedule = void 0;
|
|
21
|
+
const config = configRoot.getOptionalConfig(configKey);
|
|
22
|
+
if (config) {
|
|
23
|
+
const scheduleConfig = config.getOptionalConfig("schedule");
|
|
24
|
+
if (scheduleConfig) {
|
|
25
|
+
try {
|
|
26
|
+
schedule = backendTasks.readTaskScheduleDefinitionFromConfig(scheduleConfig);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
throw new errors.InputError(`Invalid schedule at ${configKey}, ${error}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return schedule != null ? schedule : defaults.schedule;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var __defProp = Object.defineProperty;
|
|
36
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
37
|
+
var __publicField = (obj, key, value) => {
|
|
38
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
39
|
+
return value;
|
|
40
|
+
};
|
|
41
|
+
class DefaultQetaCollatorFactory {
|
|
42
|
+
constructor(_config, options) {
|
|
43
|
+
__publicField(this, "type", "qeta");
|
|
44
|
+
__publicField(this, "logger");
|
|
45
|
+
__publicField(this, "discovery");
|
|
46
|
+
__publicField(this, "tokenManager");
|
|
47
|
+
this.logger = options.logger;
|
|
48
|
+
this.discovery = options.discovery;
|
|
49
|
+
this.tokenManager = options.tokenManager;
|
|
50
|
+
}
|
|
51
|
+
static fromConfig(config, options) {
|
|
52
|
+
return new DefaultQetaCollatorFactory(config, options);
|
|
53
|
+
}
|
|
54
|
+
async getCollator() {
|
|
55
|
+
return stream.Readable.from(this.execute());
|
|
56
|
+
}
|
|
57
|
+
async *execute() {
|
|
58
|
+
var _a, _b, _c;
|
|
59
|
+
this.logger.info("Executing QetaCollator");
|
|
60
|
+
let headers = {};
|
|
61
|
+
if (this.tokenManager) {
|
|
62
|
+
const { token } = await this.tokenManager.getToken();
|
|
63
|
+
headers = {
|
|
64
|
+
Authorization: `Bearer ${token}`
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const baseUrl = await this.discovery.getBaseUrl("qeta");
|
|
68
|
+
const params = new URLSearchParams();
|
|
69
|
+
params.append("includeAnswers", "true");
|
|
70
|
+
params.append("includeComments", "true");
|
|
71
|
+
const response = await fetch(
|
|
72
|
+
`${baseUrl}/questions?${params.toString()}`,
|
|
73
|
+
headers
|
|
74
|
+
);
|
|
75
|
+
const data = await response.json();
|
|
76
|
+
if ("errors" in data) {
|
|
77
|
+
this.logger.error(
|
|
78
|
+
`Error while fetching questions from qeta: ${JSON.stringify(
|
|
79
|
+
data.errors
|
|
80
|
+
)}`
|
|
81
|
+
);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const questions = data.questions;
|
|
85
|
+
this.logger.info(`Indexing ${questions.length} questions`);
|
|
86
|
+
for (const question of questions) {
|
|
87
|
+
yield {
|
|
88
|
+
title: question.title,
|
|
89
|
+
text: question.content,
|
|
90
|
+
location: `/qeta/questions/${question.id}`,
|
|
91
|
+
docType: "qeta",
|
|
92
|
+
author: question.author,
|
|
93
|
+
score: question.score,
|
|
94
|
+
answerCount: question.answersCount,
|
|
95
|
+
views: question.views,
|
|
96
|
+
tags: question.tags
|
|
97
|
+
};
|
|
98
|
+
for (const answer of (_a = question.answers) != null ? _a : []) {
|
|
99
|
+
yield {
|
|
100
|
+
title: `Answer for ${question.title}`,
|
|
101
|
+
text: answer.content,
|
|
102
|
+
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
103
|
+
docType: "qeta",
|
|
104
|
+
author: answer.author,
|
|
105
|
+
score: answer.score,
|
|
106
|
+
tags: question.tags
|
|
107
|
+
};
|
|
108
|
+
for (const comment of (_b = answer.comments) != null ? _b : []) {
|
|
109
|
+
yield {
|
|
110
|
+
title: `Comment for ${question.title}`,
|
|
111
|
+
text: comment.content,
|
|
112
|
+
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
113
|
+
docType: "qeta",
|
|
114
|
+
author: comment.author,
|
|
115
|
+
score: answer.score,
|
|
116
|
+
tags: question.tags
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const comment of (_c = question.comments) != null ? _c : []) {
|
|
121
|
+
yield {
|
|
122
|
+
title: `Comment for ${question.title}`,
|
|
123
|
+
text: comment.content,
|
|
124
|
+
location: `/qeta/questions/${question.id}`,
|
|
125
|
+
docType: "qeta",
|
|
126
|
+
author: comment.author,
|
|
127
|
+
score: question.score,
|
|
128
|
+
tags: question.tags
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const searchModuleQetaCollator = backendPluginApi.createBackendModule({
|
|
136
|
+
pluginId: "search",
|
|
137
|
+
moduleId: "qeta-collator",
|
|
138
|
+
register(reg) {
|
|
139
|
+
reg.registerInit({
|
|
140
|
+
deps: {
|
|
141
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
142
|
+
logger: backendPluginApi.coreServices.logger,
|
|
143
|
+
discovery: backendPluginApi.coreServices.discovery,
|
|
144
|
+
tokenManager: backendPluginApi.coreServices.tokenManager,
|
|
145
|
+
scheduler: backendPluginApi.coreServices.scheduler,
|
|
146
|
+
indexRegistry: alpha.searchIndexRegistryExtensionPoint
|
|
147
|
+
},
|
|
148
|
+
async init({
|
|
149
|
+
config,
|
|
150
|
+
logger,
|
|
151
|
+
discovery,
|
|
152
|
+
tokenManager,
|
|
153
|
+
scheduler,
|
|
154
|
+
indexRegistry
|
|
155
|
+
}) {
|
|
156
|
+
indexRegistry.addCollator({
|
|
157
|
+
schedule: scheduler.createScheduledTaskRunner(
|
|
158
|
+
readScheduleConfigOptions(config)
|
|
159
|
+
),
|
|
160
|
+
factory: DefaultQetaCollatorFactory.fromConfig(config, {
|
|
161
|
+
discovery,
|
|
162
|
+
tokenManager,
|
|
163
|
+
logger
|
|
164
|
+
})
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
exports.DefaultQetaCollatorFactory = DefaultQetaCollatorFactory;
|
|
172
|
+
exports.searchModuleQetaCollator = searchModuleQetaCollator;
|
|
173
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/collators/config.ts","../src/collators/DefaultQetaCollatorFactory.ts","../src/module.ts"],"sourcesContent":["import { Config } from '@backstage/config';\nimport {\n readTaskScheduleDefinitionFromConfig,\n TaskScheduleDefinition,\n} from '@backstage/backend-tasks';\nimport { InputError } from '@backstage/errors';\n\nconst configKey = 'search.collators.qeta';\n\nexport const defaults = {\n schedule: {\n frequency: { minutes: 10 },\n timeout: { minutes: 15 },\n initialDelay: { seconds: 3 },\n },\n};\n\nexport function readScheduleConfigOptions(\n configRoot: Config,\n): TaskScheduleDefinition {\n let schedule: TaskScheduleDefinition | undefined = undefined;\n\n const config = configRoot.getOptionalConfig(configKey);\n if (config) {\n const scheduleConfig = config.getOptionalConfig('schedule');\n if (scheduleConfig) {\n try {\n schedule = readTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (error) {\n throw new InputError(`Invalid schedule at ${configKey}, ${error}`);\n }\n }\n }\n\n return schedule ?? defaults.schedule;\n}\n","import { Config } from '@backstage/config';\nimport {\n PluginEndpointDiscovery,\n TokenManager,\n} from '@backstage/backend-common';\nimport { Readable } from 'stream';\nimport { DocumentCollatorFactory } from '@backstage/plugin-search-common';\nimport {\n QetaDocument,\n QuestionsResponseBody,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport type QetaCollatorFactoryOptions = {\n logger: LoggerService;\n discovery: PluginEndpointDiscovery;\n tokenManager?: TokenManager;\n};\n\nexport class DefaultQetaCollatorFactory implements DocumentCollatorFactory {\n public readonly type: string = 'qeta';\n private readonly logger: LoggerService;\n private readonly discovery: PluginEndpointDiscovery;\n private readonly tokenManager?: TokenManager;\n\n private constructor(_config: Config, options: QetaCollatorFactoryOptions) {\n this.logger = options.logger;\n this.discovery = options.discovery;\n this.tokenManager = options.tokenManager;\n }\n\n static fromConfig(config: Config, options: QetaCollatorFactoryOptions) {\n return new DefaultQetaCollatorFactory(config, options);\n }\n\n async getCollator() {\n return Readable.from(this.execute());\n }\n\n async *execute(): AsyncGenerator<QetaDocument> {\n this.logger.info('Executing QetaCollator');\n let headers = {};\n\n if (this.tokenManager) {\n const { token } = await this.tokenManager.getToken();\n headers = {\n Authorization: `Bearer ${token}`,\n };\n }\n const baseUrl = await this.discovery.getBaseUrl('qeta');\n\n const params = new URLSearchParams();\n params.append('includeAnswers', 'true');\n params.append('includeComments', 'true');\n const response = await fetch(\n `${baseUrl}/questions?${params.toString()}`,\n headers,\n );\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n this.logger.error(\n `Error while fetching questions from qeta: ${JSON.stringify(\n data.errors,\n )}`,\n );\n return;\n }\n\n const questions = data.questions;\n\n this.logger.info(`Indexing ${questions.length} questions`);\n\n for (const question of questions) {\n yield {\n title: question.title,\n text: question.content,\n location: `/qeta/questions/${question.id}`,\n docType: 'qeta',\n author: question.author,\n score: question.score,\n answerCount: question.answersCount,\n views: question.views,\n tags: question.tags,\n };\n\n for (const answer of question.answers ?? []) {\n yield {\n title: `Answer for ${question.title}`,\n text: answer.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n author: answer.author,\n score: answer.score,\n tags: question.tags,\n };\n\n for (const comment of answer.comments ?? []) {\n yield {\n title: `Comment for ${question.title}`,\n text: comment.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n author: comment.author,\n score: answer.score,\n tags: question.tags,\n };\n }\n }\n\n for (const comment of question.comments ?? []) {\n yield {\n title: `Comment for ${question.title}`,\n text: comment.content,\n location: `/qeta/questions/${question.id}`,\n docType: 'qeta',\n author: comment.author,\n score: question.score,\n tags: question.tags,\n };\n }\n }\n }\n}\n","import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha';\nimport { readScheduleConfigOptions } from './collators/config';\nimport { DefaultQetaCollatorFactory } from './collators/DefaultQetaCollatorFactory';\n\nexport const searchModuleQetaCollator = createBackendModule({\n pluginId: 'search',\n moduleId: 'qeta-collator',\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n scheduler: coreServices.scheduler,\n indexRegistry: searchIndexRegistryExtensionPoint,\n },\n async init({\n config,\n logger,\n discovery,\n tokenManager,\n scheduler,\n indexRegistry,\n }) {\n indexRegistry.addCollator({\n schedule: scheduler.createScheduledTaskRunner(\n readScheduleConfigOptions(config),\n ),\n factory: DefaultQetaCollatorFactory.fromConfig(config, {\n discovery,\n tokenManager,\n logger,\n }),\n });\n },\n });\n },\n});\n"],"names":["readTaskScheduleDefinitionFromConfig","InputError","Readable","createBackendModule","coreServices","searchIndexRegistryExtensionPoint"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
3
|
+
import { LoggerService } from '@backstage/backend-plugin-api';
|
|
4
|
+
import { Config } from '@backstage/config';
|
|
5
|
+
import { PluginEndpointDiscovery, TokenManager } from '@backstage/backend-common';
|
|
6
|
+
import { Readable } from 'stream';
|
|
7
|
+
import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
|
|
8
|
+
import { QetaDocument } from '@drodil/backstage-plugin-qeta-common';
|
|
9
|
+
|
|
10
|
+
declare const searchModuleQetaCollator: () => _backstage_backend_plugin_api.BackendFeature;
|
|
11
|
+
|
|
12
|
+
type QetaCollatorFactoryOptions = {
|
|
13
|
+
logger: LoggerService;
|
|
14
|
+
discovery: PluginEndpointDiscovery;
|
|
15
|
+
tokenManager?: TokenManager;
|
|
16
|
+
};
|
|
17
|
+
declare class DefaultQetaCollatorFactory implements DocumentCollatorFactory {
|
|
18
|
+
readonly type: string;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private readonly discovery;
|
|
21
|
+
private readonly tokenManager?;
|
|
22
|
+
private constructor();
|
|
23
|
+
static fromConfig(config: Config, options: QetaCollatorFactoryOptions): DefaultQetaCollatorFactory;
|
|
24
|
+
getCollator(): Promise<Readable>;
|
|
25
|
+
execute(): AsyncGenerator<QetaDocument>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { DefaultQetaCollatorFactory, searchModuleQetaCollator };
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@drodil/backstage-plugin-search-backend-module-qeta",
|
|
3
|
+
"description": "The qeta backend module for the search plugin.",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"backstage",
|
|
6
|
+
"plugin",
|
|
7
|
+
"search",
|
|
8
|
+
"backstage.io"
|
|
9
|
+
],
|
|
10
|
+
"version": "1.17.0",
|
|
11
|
+
"main": "dist/index.cjs.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"prepublishOnly": "yarn tsc && yarn build",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://github.com/drodil/backstage-plugin-qeta",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/drodil/backstage-plugin-qeta/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/drodil/backstage-plugin-qeta.git"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public",
|
|
25
|
+
"main": "dist/index.cjs.js",
|
|
26
|
+
"types": "dist/index.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"backstage": {
|
|
29
|
+
"role": "backend-plugin-module"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"start": "backstage-cli package start",
|
|
33
|
+
"build": "backstage-cli package build",
|
|
34
|
+
"lint": "backstage-cli package lint",
|
|
35
|
+
"test": "backstage-cli package test",
|
|
36
|
+
"clean": "backstage-cli package clean",
|
|
37
|
+
"prepack": "backstage-cli package prepack",
|
|
38
|
+
"postpack": "backstage-cli package postpack",
|
|
39
|
+
"tsc": "tsc"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@backstage/backend-common": "^0.20.0",
|
|
43
|
+
"@backstage/backend-plugin-api": "^0.6.8",
|
|
44
|
+
"@backstage/backend-tasks": "^0.5.13",
|
|
45
|
+
"@backstage/config": "^1.1.1",
|
|
46
|
+
"@backstage/core-plugin-api": "^1.8.1",
|
|
47
|
+
"@backstage/errors": "^1.2.3",
|
|
48
|
+
"@backstage/plugin-search-backend-node": "^1.2.12",
|
|
49
|
+
"@backstage/plugin-search-common": "^1.2.9",
|
|
50
|
+
"@drodil/backstage-plugin-qeta-common": "^1.18.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@backstage/backend-test-utils": "^0.2.9",
|
|
54
|
+
"@backstage/cli": "^0.25.0",
|
|
55
|
+
"msw": "^1.2.1"
|
|
56
|
+
},
|
|
57
|
+
"files": [
|
|
58
|
+
"dist",
|
|
59
|
+
"config.d.ts"
|
|
60
|
+
],
|
|
61
|
+
"configSchema": "config.d.ts",
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"react-router-dom": "^6.3.0"
|
|
64
|
+
}
|
|
65
|
+
}
|