@backstage/plugin-techdocs-backend 1.11.4-next.0 → 1.11.4-next.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.
- package/CHANGELOG.md +19 -0
- package/dist/search/DefaultTechDocsCollator.cjs.js +1 -3
- package/dist/search/DefaultTechDocsCollator.cjs.js.map +1 -1
- package/dist/search/index.cjs.js +0 -1
- package/dist/search/index.cjs.js.map +1 -1
- package/dist/service/DocsSynchronizer.cjs.js +1 -3
- package/dist/service/DocsSynchronizer.cjs.js.map +1 -1
- package/package.json +10 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @backstage/plugin-techdocs-backend
|
|
2
2
|
|
|
3
|
+
## 1.11.4-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 5c9cc05: Use native fetch instead of node-fetch
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/plugin-catalog-node@1.15.0-next.1
|
|
10
|
+
- @backstage/catalog-client@1.9.0-next.1
|
|
11
|
+
- @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
|
|
12
|
+
- @backstage/backend-plugin-api@1.1.0-next.1
|
|
13
|
+
- @backstage/catalog-model@1.7.1
|
|
14
|
+
- @backstage/config@1.3.0
|
|
15
|
+
- @backstage/errors@1.2.5
|
|
16
|
+
- @backstage/integration@1.16.0-next.0
|
|
17
|
+
- @backstage/plugin-catalog-common@1.1.1
|
|
18
|
+
- @backstage/plugin-permission-common@0.8.2
|
|
19
|
+
- @backstage/plugin-techdocs-common@0.1.0
|
|
20
|
+
- @backstage/plugin-techdocs-node@1.12.15-next.1
|
|
21
|
+
|
|
3
22
|
## 1.11.4-next.0
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var catalogModel = require('@backstage/catalog-model');
|
|
4
|
-
var fetch = require('node-fetch');
|
|
5
4
|
var unescape = require('lodash/unescape');
|
|
6
5
|
var pLimit = require('p-limit');
|
|
7
6
|
var alpha = require('@backstage/plugin-catalog-common/alpha');
|
|
@@ -10,7 +9,6 @@ var pluginTechdocsCommon = require('@backstage/plugin-techdocs-common');
|
|
|
10
9
|
|
|
11
10
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
11
|
|
|
13
|
-
var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
|
|
14
12
|
var unescape__default = /*#__PURE__*/_interopDefaultCompat(unescape);
|
|
15
13
|
var pLimit__default = /*#__PURE__*/_interopDefaultCompat(pLimit);
|
|
16
14
|
|
|
@@ -70,7 +68,7 @@ class DefaultTechDocsCollator {
|
|
|
70
68
|
);
|
|
71
69
|
try {
|
|
72
70
|
const { token: newToken } = await tokenManager.getToken();
|
|
73
|
-
const searchIndexResponse = await
|
|
71
|
+
const searchIndexResponse = await fetch(
|
|
74
72
|
DefaultTechDocsCollator.constructDocsIndexUrl(
|
|
75
73
|
techDocsBaseUrl,
|
|
76
74
|
entityInfo
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultTechDocsCollator.cjs.js","sources":["../../src/search/DefaultTechDocsCollator.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TokenManager } from '@backstage/backend-common';\nimport {\n Entity,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport fetch from 'node-fetch';\nimport unescape from 'lodash/unescape';\nimport { Logger } from 'winston';\nimport pLimit from 'p-limit';\nimport { Config } from '@backstage/config';\nimport { catalogEntityReadPermission } from '@backstage/plugin-catalog-common/alpha';\nimport { Permission } from '@backstage/plugin-permission-common';\nimport {\n CatalogApi,\n CatalogClient,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport { TechDocsDocument } from '@backstage/plugin-techdocs-node';\nimport { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\ninterface MkSearchIndexDoc {\n title: string;\n text: string;\n location: string;\n}\n\n/**\n * Options to configure the TechDocs collator\n *\n * @public\n */\nexport type TechDocsCollatorOptions = {\n discovery: DiscoveryService;\n logger: Logger;\n tokenManager: TokenManager;\n locationTemplate?: string;\n catalogClient?: CatalogApi;\n parallelismLimit?: number;\n legacyPathCasing?: boolean;\n};\n\ntype EntityInfo = {\n name: string;\n namespace: string;\n kind: string;\n};\n\n/**\n * A search collator responsible for gathering and transforming TechDocs documents.\n *\n * @public\n * @deprecated Upgrade to a more recent `@backstage/plugin-search-backend-node` and\n * use `DefaultTechDocsCollatorFactory` instead.\n */\nexport class DefaultTechDocsCollator {\n public readonly type: string = 'techdocs';\n public readonly visibilityPermission: Permission =\n catalogEntityReadPermission;\n\n private constructor(\n private readonly legacyPathCasing: boolean,\n private readonly options: TechDocsCollatorOptions,\n ) {}\n\n static fromConfig(config: Config, options: TechDocsCollatorOptions) {\n const legacyPathCasing =\n config.getOptionalBoolean(\n 'techdocs.legacyUseCaseSensitiveTripletPaths',\n ) || false;\n return new DefaultTechDocsCollator(legacyPathCasing, options);\n }\n\n async execute() {\n const {\n parallelismLimit,\n discovery,\n tokenManager,\n catalogClient,\n locationTemplate,\n logger,\n } = this.options;\n const limit = pLimit(parallelismLimit ?? 10);\n const techDocsBaseUrl = await discovery.getBaseUrl('techdocs');\n const { token } = await tokenManager.getToken();\n const entities = await (\n catalogClient ?? new CatalogClient({ discoveryApi: discovery })\n ).getEntities(\n {\n filter: {\n [`metadata.annotations.${TECHDOCS_ANNOTATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'namespace',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.title',\n 'metadata.namespace',\n 'spec.type',\n 'spec.lifecycle',\n 'relations',\n ],\n },\n { token },\n );\n const docPromises = entities.items.map((entity: Entity) =>\n limit(async (): Promise<TechDocsDocument[]> => {\n const entityInfo = DefaultTechDocsCollator.handleEntityInfoCasing(\n this.legacyPathCasing ?? false,\n {\n kind: entity.kind,\n namespace: entity.metadata.namespace || 'default',\n name: entity.metadata.name,\n },\n );\n\n try {\n const { token: newToken } = await tokenManager.getToken();\n const searchIndexResponse = await fetch(\n DefaultTechDocsCollator.constructDocsIndexUrl(\n techDocsBaseUrl,\n entityInfo,\n ),\n {\n headers: {\n Authorization: `Bearer ${newToken}`,\n },\n },\n );\n const searchIndex = await searchIndexResponse.json();\n\n return searchIndex.docs.map((doc: MkSearchIndexDoc) => ({\n title: unescape(doc.title),\n text: unescape(doc.text || ''),\n location: this.applyArgsToFormat(\n locationTemplate || '/docs/:namespace/:kind/:name/:path',\n {\n ...entityInfo,\n path: doc.location,\n },\n ),\n path: doc.location,\n ...entityInfo,\n entityTitle: entity.metadata.title,\n componentType: entity.spec?.type?.toString() || 'other',\n lifecycle: (entity.spec?.lifecycle as string) || '',\n owner: getSimpleEntityOwnerString(entity),\n authorization: {\n resourceRef: stringifyEntityRef(entity),\n },\n }));\n } catch (e) {\n logger.debug(\n `Failed to retrieve tech docs search index for entity ${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}`,\n e,\n );\n return [];\n }\n }),\n );\n return (await Promise.all(docPromises)).flat();\n }\n\n protected applyArgsToFormat(\n format: string,\n args: Record<string, string>,\n ): string {\n let formatted = format;\n for (const [key, value] of Object.entries(args)) {\n formatted = formatted.replace(`:${key}`, value);\n }\n return formatted;\n }\n\n private static constructDocsIndexUrl(\n techDocsBaseUrl: string,\n entityInfo: { kind: string; namespace: string; name: string },\n ) {\n return `${techDocsBaseUrl}/static/docs/${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}/search/search_index.json`;\n }\n\n private static handleEntityInfoCasing(\n legacyPaths: boolean,\n entityInfo: EntityInfo,\n ): EntityInfo {\n return legacyPaths\n ? entityInfo\n : Object.entries(entityInfo).reduce((acc, [key, value]) => {\n return { ...acc, [key]: value.toLocaleLowerCase('en-US') };\n }, {} as EntityInfo);\n }\n}\n\nfunction getSimpleEntityOwnerString(entity: Entity): string {\n if (entity.relations) {\n const owner = entity.relations.find(r => r.type === RELATION_OWNED_BY);\n if (owner) {\n const { name } = parseEntityRef(owner.targetRef);\n return name;\n }\n }\n return '';\n}\n"],"names":["catalogEntityReadPermission","catalogClient","pLimit","CatalogClient","TECHDOCS_ANNOTATION","CATALOG_FILTER_EXISTS","fetch","unescape","stringifyEntityRef","RELATION_OWNED_BY","parseEntityRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DefaultTechDocsCollator.cjs.js","sources":["../../src/search/DefaultTechDocsCollator.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TokenManager } from '@backstage/backend-common';\nimport {\n Entity,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport unescape from 'lodash/unescape';\nimport { Logger } from 'winston';\nimport pLimit from 'p-limit';\nimport { Config } from '@backstage/config';\nimport { catalogEntityReadPermission } from '@backstage/plugin-catalog-common/alpha';\nimport { Permission } from '@backstage/plugin-permission-common';\nimport {\n CatalogApi,\n CatalogClient,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport { TechDocsDocument } from '@backstage/plugin-techdocs-node';\nimport { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\ninterface MkSearchIndexDoc {\n title: string;\n text: string;\n location: string;\n}\n\n/**\n * Options to configure the TechDocs collator\n *\n * @public\n */\nexport type TechDocsCollatorOptions = {\n discovery: DiscoveryService;\n logger: Logger;\n tokenManager: TokenManager;\n locationTemplate?: string;\n catalogClient?: CatalogApi;\n parallelismLimit?: number;\n legacyPathCasing?: boolean;\n};\n\ntype EntityInfo = {\n name: string;\n namespace: string;\n kind: string;\n};\n\n/**\n * A search collator responsible for gathering and transforming TechDocs documents.\n *\n * @public\n * @deprecated Upgrade to a more recent `@backstage/plugin-search-backend-node` and\n * use `DefaultTechDocsCollatorFactory` instead.\n */\nexport class DefaultTechDocsCollator {\n public readonly type: string = 'techdocs';\n public readonly visibilityPermission: Permission =\n catalogEntityReadPermission;\n\n private constructor(\n private readonly legacyPathCasing: boolean,\n private readonly options: TechDocsCollatorOptions,\n ) {}\n\n static fromConfig(config: Config, options: TechDocsCollatorOptions) {\n const legacyPathCasing =\n config.getOptionalBoolean(\n 'techdocs.legacyUseCaseSensitiveTripletPaths',\n ) || false;\n return new DefaultTechDocsCollator(legacyPathCasing, options);\n }\n\n async execute() {\n const {\n parallelismLimit,\n discovery,\n tokenManager,\n catalogClient,\n locationTemplate,\n logger,\n } = this.options;\n const limit = pLimit(parallelismLimit ?? 10);\n const techDocsBaseUrl = await discovery.getBaseUrl('techdocs');\n const { token } = await tokenManager.getToken();\n const entities = await (\n catalogClient ?? new CatalogClient({ discoveryApi: discovery })\n ).getEntities(\n {\n filter: {\n [`metadata.annotations.${TECHDOCS_ANNOTATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'namespace',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.title',\n 'metadata.namespace',\n 'spec.type',\n 'spec.lifecycle',\n 'relations',\n ],\n },\n { token },\n );\n const docPromises = entities.items.map((entity: Entity) =>\n limit(async (): Promise<TechDocsDocument[]> => {\n const entityInfo = DefaultTechDocsCollator.handleEntityInfoCasing(\n this.legacyPathCasing ?? false,\n {\n kind: entity.kind,\n namespace: entity.metadata.namespace || 'default',\n name: entity.metadata.name,\n },\n );\n\n try {\n const { token: newToken } = await tokenManager.getToken();\n const searchIndexResponse = await fetch(\n DefaultTechDocsCollator.constructDocsIndexUrl(\n techDocsBaseUrl,\n entityInfo,\n ),\n {\n headers: {\n Authorization: `Bearer ${newToken}`,\n },\n },\n );\n const searchIndex = await searchIndexResponse.json();\n\n return searchIndex.docs.map((doc: MkSearchIndexDoc) => ({\n title: unescape(doc.title),\n text: unescape(doc.text || ''),\n location: this.applyArgsToFormat(\n locationTemplate || '/docs/:namespace/:kind/:name/:path',\n {\n ...entityInfo,\n path: doc.location,\n },\n ),\n path: doc.location,\n ...entityInfo,\n entityTitle: entity.metadata.title,\n componentType: entity.spec?.type?.toString() || 'other',\n lifecycle: (entity.spec?.lifecycle as string) || '',\n owner: getSimpleEntityOwnerString(entity),\n authorization: {\n resourceRef: stringifyEntityRef(entity),\n },\n }));\n } catch (e) {\n logger.debug(\n `Failed to retrieve tech docs search index for entity ${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}`,\n e,\n );\n return [];\n }\n }),\n );\n return (await Promise.all(docPromises)).flat();\n }\n\n protected applyArgsToFormat(\n format: string,\n args: Record<string, string>,\n ): string {\n let formatted = format;\n for (const [key, value] of Object.entries(args)) {\n formatted = formatted.replace(`:${key}`, value);\n }\n return formatted;\n }\n\n private static constructDocsIndexUrl(\n techDocsBaseUrl: string,\n entityInfo: { kind: string; namespace: string; name: string },\n ) {\n return `${techDocsBaseUrl}/static/docs/${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}/search/search_index.json`;\n }\n\n private static handleEntityInfoCasing(\n legacyPaths: boolean,\n entityInfo: EntityInfo,\n ): EntityInfo {\n return legacyPaths\n ? entityInfo\n : Object.entries(entityInfo).reduce((acc, [key, value]) => {\n return { ...acc, [key]: value.toLocaleLowerCase('en-US') };\n }, {} as EntityInfo);\n }\n}\n\nfunction getSimpleEntityOwnerString(entity: Entity): string {\n if (entity.relations) {\n const owner = entity.relations.find(r => r.type === RELATION_OWNED_BY);\n if (owner) {\n const { name } = parseEntityRef(owner.targetRef);\n return name;\n }\n }\n return '';\n}\n"],"names":["catalogEntityReadPermission","catalogClient","pLimit","CatalogClient","TECHDOCS_ANNOTATION","CATALOG_FILTER_EXISTS","unescape","stringifyEntityRef","RELATION_OWNED_BY","parseEntityRef"],"mappings":"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"}
|
package/dist/search/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../src/search/index.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * todo(backstage/techdocs-core): stop exporting these in a future release.\n */\nexport { DefaultTechDocsCollator } from './DefaultTechDocsCollator';\nexport type { TechDocsCollatorOptions } from './DefaultTechDocsCollator';\n\nimport { DefaultTechDocsCollatorFactory as _DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs';\nimport type { TechDocsCollatorFactoryOptions as _TechDocsCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-techdocs';\n\n/**\n * @public\n * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead\n */\nexport type TechDocsCollatorFactoryOptions = _TechDocsCollatorFactoryOptions;\n\n/**\n * @public\n * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead\n */\nexport const DefaultTechDocsCollatorFactory = _DefaultTechDocsCollatorFactory;\n"],"names":["_DefaultTechDocsCollatorFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../src/search/index.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * todo(backstage/techdocs-core): stop exporting these in a future release.\n */\nexport { DefaultTechDocsCollator } from './DefaultTechDocsCollator';\nexport type { TechDocsCollatorOptions } from './DefaultTechDocsCollator';\n\nimport { DefaultTechDocsCollatorFactory as _DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs';\nimport type { TechDocsCollatorFactoryOptions as _TechDocsCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-techdocs';\n\n/**\n * @public\n * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead\n */\nexport type TechDocsCollatorFactoryOptions = _TechDocsCollatorFactoryOptions;\n\n/**\n * @public\n * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead\n */\nexport const DefaultTechDocsCollatorFactory = _DefaultTechDocsCollatorFactory;\n"],"names":["_DefaultTechDocsCollatorFactory"],"mappings":";;;;;;;;;;AAmCO,MAAM,8BAAiC,GAAAA;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var catalogModel = require('@backstage/catalog-model');
|
|
4
4
|
var errors = require('@backstage/errors');
|
|
5
|
-
var fetch = require('node-fetch');
|
|
6
5
|
var pLimit = require('p-limit');
|
|
7
6
|
var stream = require('stream');
|
|
8
7
|
var winston = require('winston');
|
|
@@ -29,7 +28,6 @@ function _interopNamespaceCompat(e) {
|
|
|
29
28
|
return Object.freeze(n);
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
|
|
33
31
|
var pLimit__default = /*#__PURE__*/_interopDefaultCompat(pLimit);
|
|
34
32
|
var winston__namespace = /*#__PURE__*/_interopNamespaceCompat(winston);
|
|
35
33
|
|
|
@@ -160,7 +158,7 @@ class DocsSynchronizer {
|
|
|
160
158
|
try {
|
|
161
159
|
const [sourceMetadata, cachedMetadata] = await Promise.all([
|
|
162
160
|
this.publisher.fetchTechDocsMetadata({ namespace, kind, name }),
|
|
163
|
-
|
|
161
|
+
fetch(
|
|
164
162
|
`${baseUrl}/static/docs/${entityTripletPath}/techdocs_metadata.json`,
|
|
165
163
|
{
|
|
166
164
|
headers: token ? { Authorization: `Bearer ${token}` } : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocsSynchronizer.cjs.js","sources":["../../src/service/DocsSynchronizer.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { assertError, NotFoundError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport {\n GeneratorBuilder,\n PreparerBuilder,\n PublisherBase,\n} from '@backstage/plugin-techdocs-node';\nimport fetch from 'node-fetch';\nimport pLimit, { Limit } from 'p-limit';\nimport { PassThrough } from 'stream';\nimport * as winston from 'winston';\nimport { TechDocsCache } from '../cache';\nimport {\n BuildMetadataStorage,\n DocsBuilder,\n shouldCheckForUpdate,\n} from '../DocsBuilder';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\nexport type DocsSynchronizerSyncOpts = {\n log: (message: string) => void;\n error: (e: Error) => void;\n finish: (result: { updated: boolean }) => void;\n};\n\nexport class DocsSynchronizer {\n private readonly publisher: PublisherBase;\n private readonly logger: winston.Logger;\n private readonly buildLogTransport?: winston.transport;\n private readonly config: Config;\n private readonly scmIntegrations: ScmIntegrationRegistry;\n private readonly cache: TechDocsCache | undefined;\n private readonly buildLimiter: Limit;\n\n constructor({\n publisher,\n logger,\n buildLogTransport,\n config,\n scmIntegrations,\n cache,\n }: {\n publisher: PublisherBase;\n logger: winston.Logger;\n buildLogTransport?: winston.transport;\n config: Config;\n scmIntegrations: ScmIntegrationRegistry;\n cache: TechDocsCache | undefined;\n }) {\n this.config = config;\n this.logger = logger;\n this.buildLogTransport = buildLogTransport;\n this.publisher = publisher;\n this.scmIntegrations = scmIntegrations;\n this.cache = cache;\n\n // Single host/process: limit concurrent builds up to 10 at a time.\n this.buildLimiter = pLimit(10);\n }\n\n async doSync({\n responseHandler: { log, error, finish },\n entity,\n preparers,\n generators,\n }: {\n responseHandler: DocsSynchronizerSyncOpts;\n entity: Entity;\n preparers: PreparerBuilder;\n generators: GeneratorBuilder;\n }) {\n // create a new logger to log data to the caller\n const taskLogger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.timestamp(),\n winston.format.simple(),\n ),\n defaultMeta: {},\n });\n\n // create an in-memory stream to forward logs to the event-stream\n const logStream = new PassThrough();\n logStream.on('data', async data => {\n log(data.toString().trim());\n });\n\n taskLogger.add(new winston.transports.Stream({ stream: logStream }));\n if (this.buildLogTransport) {\n taskLogger.add(this.buildLogTransport);\n }\n\n // check if the last update check was too recent\n if (!shouldCheckForUpdate(entity.metadata.uid!)) {\n finish({ updated: false });\n return;\n }\n\n let foundDocs = false;\n\n try {\n const docsBuilder = new DocsBuilder({\n preparers,\n generators,\n publisher: this.publisher,\n logger: taskLogger,\n entity,\n config: this.config,\n scmIntegrations: this.scmIntegrations,\n logStream,\n cache: this.cache,\n });\n\n const interval = setInterval(() => {\n taskLogger.info(\n 'The docs building process is taking a little bit longer to process this entity. Please bear with us.',\n );\n }, 10000);\n const updated = await this.buildLimiter(() => docsBuilder.build());\n clearInterval(interval);\n\n if (!updated) {\n finish({ updated: false });\n return;\n }\n } catch (e) {\n assertError(e);\n const msg = `Failed to build the docs page for entity ${stringifyEntityRef(\n entity,\n )}: ${e.message}`;\n taskLogger.error(msg);\n this.logger.error(msg, e);\n error(e);\n return;\n }\n\n // With a maximum of ~5 seconds wait, check if the files got published and if docs will be fetched\n // on the user's page. If not, respond with a message asking them to check back later.\n // The delay here is to make sure GCS/AWS/etc. registers newly uploaded files which is usually <1 second\n for (let attempt = 0; attempt < 5; attempt++) {\n if (await this.publisher.hasDocsBeenGenerated(entity)) {\n foundDocs = true;\n break;\n }\n await new Promise(r => setTimeout(r, 1000));\n }\n if (!foundDocs) {\n this.logger.error(\n 'Published files are taking longer to show up in storage. Something went wrong.',\n );\n error(\n new NotFoundError(\n 'Sorry! It took too long for the generated docs to show up in storage. Are you sure the docs project is generating an `index.html` file? Otherwise, check back later.',\n ),\n );\n return;\n }\n\n finish({ updated: true });\n }\n\n async doCacheSync({\n responseHandler: { finish },\n discovery,\n token,\n entity,\n }: {\n responseHandler: DocsSynchronizerSyncOpts;\n discovery: DiscoveryService;\n token: string | undefined;\n entity: Entity;\n }) {\n // Check if the last update check was too recent.\n if (!shouldCheckForUpdate(entity.metadata.uid!) || !this.cache) {\n finish({ updated: false });\n return;\n }\n\n // Fetch techdocs_metadata.json from the publisher and from cache.\n const baseUrl = await discovery.getBaseUrl('techdocs');\n const namespace = entity.metadata?.namespace || DEFAULT_NAMESPACE;\n const kind = entity.kind;\n const name = entity.metadata.name;\n const legacyPathCasing =\n this.config.getOptionalBoolean(\n 'techdocs.legacyUseCaseSensitiveTripletPaths',\n ) || false;\n const tripletPath = `${namespace}/${kind}/${name}`;\n const entityTripletPath = `${\n legacyPathCasing ? tripletPath : tripletPath.toLocaleLowerCase('en-US')\n }`;\n try {\n const [sourceMetadata, cachedMetadata] = await Promise.all([\n this.publisher.fetchTechDocsMetadata({ namespace, kind, name }),\n fetch(\n `${baseUrl}/static/docs/${entityTripletPath}/techdocs_metadata.json`,\n {\n headers: token ? { Authorization: `Bearer ${token}` } : {},\n },\n ).then(\n f =>\n f.json().catch(() => undefined) as ReturnType<\n PublisherBase['fetchTechDocsMetadata']\n >,\n ),\n ]);\n\n // If build timestamps differ, merge their files[] lists and invalidate all objects.\n if (sourceMetadata.build_timestamp !== cachedMetadata.build_timestamp) {\n const files = [\n ...new Set([\n ...(sourceMetadata.files || []),\n ...(cachedMetadata.files || []),\n ]),\n ].map(f => `${entityTripletPath}/${f}`);\n await this.cache.invalidateMultiple(files);\n finish({ updated: true });\n } else {\n finish({ updated: false });\n }\n } catch (e) {\n assertError(e);\n // In case of error, log and allow the user to go about their business.\n this.logger.error(\n `Error syncing cache for ${entityTripletPath}: ${e.message}`,\n );\n finish({ updated: false });\n } finally {\n // Update the last check time for the entity\n new BuildMetadataStorage(entity.metadata.uid!).setLastUpdated();\n }\n }\n}\n"],"names":["pLimit","winston","PassThrough","shouldCheckForUpdate","DocsBuilder","assertError","stringifyEntityRef","NotFoundError","DEFAULT_NAMESPACE","fetch","BuildMetadataStorage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocsSynchronizer.cjs.js","sources":["../../src/service/DocsSynchronizer.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { assertError, NotFoundError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport {\n GeneratorBuilder,\n PreparerBuilder,\n PublisherBase,\n} from '@backstage/plugin-techdocs-node';\nimport pLimit, { Limit } from 'p-limit';\nimport { PassThrough } from 'stream';\nimport * as winston from 'winston';\nimport { TechDocsCache } from '../cache';\nimport {\n BuildMetadataStorage,\n DocsBuilder,\n shouldCheckForUpdate,\n} from '../DocsBuilder';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\nexport type DocsSynchronizerSyncOpts = {\n log: (message: string) => void;\n error: (e: Error) => void;\n finish: (result: { updated: boolean }) => void;\n};\n\nexport class DocsSynchronizer {\n private readonly publisher: PublisherBase;\n private readonly logger: winston.Logger;\n private readonly buildLogTransport?: winston.transport;\n private readonly config: Config;\n private readonly scmIntegrations: ScmIntegrationRegistry;\n private readonly cache: TechDocsCache | undefined;\n private readonly buildLimiter: Limit;\n\n constructor({\n publisher,\n logger,\n buildLogTransport,\n config,\n scmIntegrations,\n cache,\n }: {\n publisher: PublisherBase;\n logger: winston.Logger;\n buildLogTransport?: winston.transport;\n config: Config;\n scmIntegrations: ScmIntegrationRegistry;\n cache: TechDocsCache | undefined;\n }) {\n this.config = config;\n this.logger = logger;\n this.buildLogTransport = buildLogTransport;\n this.publisher = publisher;\n this.scmIntegrations = scmIntegrations;\n this.cache = cache;\n\n // Single host/process: limit concurrent builds up to 10 at a time.\n this.buildLimiter = pLimit(10);\n }\n\n async doSync({\n responseHandler: { log, error, finish },\n entity,\n preparers,\n generators,\n }: {\n responseHandler: DocsSynchronizerSyncOpts;\n entity: Entity;\n preparers: PreparerBuilder;\n generators: GeneratorBuilder;\n }) {\n // create a new logger to log data to the caller\n const taskLogger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.timestamp(),\n winston.format.simple(),\n ),\n defaultMeta: {},\n });\n\n // create an in-memory stream to forward logs to the event-stream\n const logStream = new PassThrough();\n logStream.on('data', async data => {\n log(data.toString().trim());\n });\n\n taskLogger.add(new winston.transports.Stream({ stream: logStream }));\n if (this.buildLogTransport) {\n taskLogger.add(this.buildLogTransport);\n }\n\n // check if the last update check was too recent\n if (!shouldCheckForUpdate(entity.metadata.uid!)) {\n finish({ updated: false });\n return;\n }\n\n let foundDocs = false;\n\n try {\n const docsBuilder = new DocsBuilder({\n preparers,\n generators,\n publisher: this.publisher,\n logger: taskLogger,\n entity,\n config: this.config,\n scmIntegrations: this.scmIntegrations,\n logStream,\n cache: this.cache,\n });\n\n const interval = setInterval(() => {\n taskLogger.info(\n 'The docs building process is taking a little bit longer to process this entity. Please bear with us.',\n );\n }, 10000);\n const updated = await this.buildLimiter(() => docsBuilder.build());\n clearInterval(interval);\n\n if (!updated) {\n finish({ updated: false });\n return;\n }\n } catch (e) {\n assertError(e);\n const msg = `Failed to build the docs page for entity ${stringifyEntityRef(\n entity,\n )}: ${e.message}`;\n taskLogger.error(msg);\n this.logger.error(msg, e);\n error(e);\n return;\n }\n\n // With a maximum of ~5 seconds wait, check if the files got published and if docs will be fetched\n // on the user's page. If not, respond with a message asking them to check back later.\n // The delay here is to make sure GCS/AWS/etc. registers newly uploaded files which is usually <1 second\n for (let attempt = 0; attempt < 5; attempt++) {\n if (await this.publisher.hasDocsBeenGenerated(entity)) {\n foundDocs = true;\n break;\n }\n await new Promise(r => setTimeout(r, 1000));\n }\n if (!foundDocs) {\n this.logger.error(\n 'Published files are taking longer to show up in storage. Something went wrong.',\n );\n error(\n new NotFoundError(\n 'Sorry! It took too long for the generated docs to show up in storage. Are you sure the docs project is generating an `index.html` file? Otherwise, check back later.',\n ),\n );\n return;\n }\n\n finish({ updated: true });\n }\n\n async doCacheSync({\n responseHandler: { finish },\n discovery,\n token,\n entity,\n }: {\n responseHandler: DocsSynchronizerSyncOpts;\n discovery: DiscoveryService;\n token: string | undefined;\n entity: Entity;\n }) {\n // Check if the last update check was too recent.\n if (!shouldCheckForUpdate(entity.metadata.uid!) || !this.cache) {\n finish({ updated: false });\n return;\n }\n\n // Fetch techdocs_metadata.json from the publisher and from cache.\n const baseUrl = await discovery.getBaseUrl('techdocs');\n const namespace = entity.metadata?.namespace || DEFAULT_NAMESPACE;\n const kind = entity.kind;\n const name = entity.metadata.name;\n const legacyPathCasing =\n this.config.getOptionalBoolean(\n 'techdocs.legacyUseCaseSensitiveTripletPaths',\n ) || false;\n const tripletPath = `${namespace}/${kind}/${name}`;\n const entityTripletPath = `${\n legacyPathCasing ? tripletPath : tripletPath.toLocaleLowerCase('en-US')\n }`;\n try {\n const [sourceMetadata, cachedMetadata] = await Promise.all([\n this.publisher.fetchTechDocsMetadata({ namespace, kind, name }),\n fetch(\n `${baseUrl}/static/docs/${entityTripletPath}/techdocs_metadata.json`,\n {\n headers: token ? { Authorization: `Bearer ${token}` } : {},\n },\n ).then(\n f =>\n f.json().catch(() => undefined) as ReturnType<\n PublisherBase['fetchTechDocsMetadata']\n >,\n ),\n ]);\n\n // If build timestamps differ, merge their files[] lists and invalidate all objects.\n if (sourceMetadata.build_timestamp !== cachedMetadata.build_timestamp) {\n const files = [\n ...new Set([\n ...(sourceMetadata.files || []),\n ...(cachedMetadata.files || []),\n ]),\n ].map(f => `${entityTripletPath}/${f}`);\n await this.cache.invalidateMultiple(files);\n finish({ updated: true });\n } else {\n finish({ updated: false });\n }\n } catch (e) {\n assertError(e);\n // In case of error, log and allow the user to go about their business.\n this.logger.error(\n `Error syncing cache for ${entityTripletPath}: ${e.message}`,\n );\n finish({ updated: false });\n } finally {\n // Update the last check time for the entity\n new BuildMetadataStorage(entity.metadata.uid!).setLastUpdated();\n }\n }\n}\n"],"names":["pLimit","winston","PassThrough","shouldCheckForUpdate","DocsBuilder","assertError","stringifyEntityRef","NotFoundError","DEFAULT_NAMESPACE","BuildMetadataStorage"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-techdocs-backend",
|
|
3
|
-
"version": "1.11.4-next.
|
|
3
|
+
"version": "1.11.4-next.1",
|
|
4
4
|
"description": "The Backstage backend plugin that renders technical documentation for your components",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin",
|
|
@@ -69,33 +69,32 @@
|
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"@backstage/backend-common": "^0.25.0",
|
|
72
|
-
"@backstage/backend-plugin-api": "1.0
|
|
73
|
-
"@backstage/catalog-client": "1.
|
|
72
|
+
"@backstage/backend-plugin-api": "1.1.0-next.1",
|
|
73
|
+
"@backstage/catalog-client": "1.9.0-next.1",
|
|
74
74
|
"@backstage/catalog-model": "1.7.1",
|
|
75
75
|
"@backstage/config": "1.3.0",
|
|
76
76
|
"@backstage/errors": "1.2.5",
|
|
77
77
|
"@backstage/integration": "1.16.0-next.0",
|
|
78
78
|
"@backstage/plugin-catalog-common": "1.1.1",
|
|
79
|
-
"@backstage/plugin-catalog-node": "1.
|
|
79
|
+
"@backstage/plugin-catalog-node": "1.15.0-next.1",
|
|
80
80
|
"@backstage/plugin-permission-common": "0.8.2",
|
|
81
|
-
"@backstage/plugin-search-backend-module-techdocs": "0.3.4-next.
|
|
81
|
+
"@backstage/plugin-search-backend-module-techdocs": "0.3.4-next.1",
|
|
82
82
|
"@backstage/plugin-techdocs-common": "0.1.0",
|
|
83
|
-
"@backstage/plugin-techdocs-node": "1.12.15-next.
|
|
83
|
+
"@backstage/plugin-techdocs-node": "1.12.15-next.1",
|
|
84
84
|
"@types/express": "^4.17.6",
|
|
85
85
|
"express": "^4.17.1",
|
|
86
86
|
"express-promise-router": "^4.1.0",
|
|
87
87
|
"fs-extra": "^11.2.0",
|
|
88
88
|
"knex": "^3.0.0",
|
|
89
89
|
"lodash": "^4.17.21",
|
|
90
|
-
"node-fetch": "^2.7.0",
|
|
91
90
|
"p-limit": "^3.1.0",
|
|
92
91
|
"winston": "^3.2.1"
|
|
93
92
|
},
|
|
94
93
|
"devDependencies": {
|
|
95
|
-
"@backstage/backend-defaults": "0.6.0-next.
|
|
96
|
-
"@backstage/backend-test-utils": "1.2.0-next.
|
|
97
|
-
"@backstage/cli": "0.29.3-next.
|
|
98
|
-
"msw": "^
|
|
94
|
+
"@backstage/backend-defaults": "0.6.0-next.1",
|
|
95
|
+
"@backstage/backend-test-utils": "1.2.0-next.1",
|
|
96
|
+
"@backstage/cli": "0.29.3-next.1",
|
|
97
|
+
"msw": "^2.0.0",
|
|
99
98
|
"supertest": "^7.0.0"
|
|
100
99
|
},
|
|
101
100
|
"configSchema": "config.d.ts"
|