@backstage/plugin-techdocs-backend 2.1.4-next.2 → 2.1.5-next.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/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @backstage/plugin-techdocs-backend
2
2
 
3
+ ## 2.1.5-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 7455dae: Use node prefix on native imports
8
+ - Updated dependencies
9
+ - @backstage/plugin-catalog-node@1.21.0-next.0
10
+ - @backstage/backend-plugin-api@1.7.0-next.0
11
+ - @backstage/backend-defaults@0.15.1-next.0
12
+ - @backstage/plugin-techdocs-node@1.14.1-next.0
13
+ - @backstage/integration@1.19.3-next.0
14
+ - @backstage/catalog-client@1.12.1
15
+ - @backstage/catalog-model@1.7.6
16
+ - @backstage/config@1.3.6
17
+ - @backstage/errors@1.2.7
18
+ - @backstage/types@1.2.2
19
+
20
+ ## 2.1.4
21
+
22
+ ### Patch Changes
23
+
24
+ - b6ff2a5: Some AWS `publisher` config options such as `region`, `endpoint`, `accountId` are now marked as `@visibility backend` instead of `secret`.
25
+ - Updated dependencies
26
+ - @backstage/backend-defaults@0.15.0
27
+ - @backstage/backend-plugin-api@1.6.1
28
+ - @backstage/integration@1.19.2
29
+ - @backstage/plugin-techdocs-node@1.14.0
30
+
3
31
  ## 2.1.4-next.2
4
32
 
5
33
  ### Patch Changes
@@ -4,8 +4,8 @@ var catalogModel = require('@backstage/catalog-model');
4
4
  var errors = require('@backstage/errors');
5
5
  var pluginTechdocsNode = require('@backstage/plugin-techdocs-node');
6
6
  var fs = require('fs-extra');
7
- var os = require('os');
8
- var path = require('path');
7
+ var os = require('node:os');
8
+ var path = require('node:path');
9
9
  var BuildMetadataStorage = require('./BuildMetadataStorage.cjs.js');
10
10
 
11
11
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -1 +1 @@
1
- {"version":3,"file":"builder.cjs.js","sources":["../../src/DocsBuilder/builder.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { assertError, isError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport {\n GeneratorBase,\n GeneratorBuilder,\n getLocationForEntity,\n PreparerBase,\n PreparerBuilder,\n PublisherBase,\n} from '@backstage/plugin-techdocs-node';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\nimport { Writable } from 'stream';\nimport { Logger } from 'winston';\nimport { BuildMetadataStorage } from './BuildMetadataStorage';\nimport { TechDocsCache } from '../cache';\n\ntype DocsBuilderArguments = {\n preparers: PreparerBuilder;\n generators: GeneratorBuilder;\n publisher: PublisherBase;\n entity: Entity;\n logger: Logger;\n config: Config;\n scmIntegrations: ScmIntegrationRegistry;\n logStream?: Writable;\n cache?: TechDocsCache;\n};\n\nexport class DocsBuilder {\n private preparer: PreparerBase;\n private generator: GeneratorBase;\n private publisher: PublisherBase;\n private entity: Entity;\n private logger: Logger;\n private config: Config;\n private scmIntegrations: ScmIntegrationRegistry;\n private logStream: Writable | undefined;\n private cache?: TechDocsCache;\n\n constructor({\n preparers,\n generators,\n publisher,\n entity,\n logger,\n config,\n scmIntegrations,\n logStream,\n cache,\n }: DocsBuilderArguments) {\n this.preparer = preparers.get(entity);\n this.generator = generators.get(entity);\n this.publisher = publisher;\n this.entity = entity;\n this.logger = logger;\n this.config = config;\n this.scmIntegrations = scmIntegrations;\n this.logStream = logStream;\n this.cache = cache;\n }\n\n /**\n * Build the docs and return whether they have been newly generated or have been cached\n * @returns true, if the docs have been built. false, if the cached docs are still up-to-date.\n */\n public async build(): Promise<boolean> {\n if (!this.entity.metadata.uid) {\n throw new Error(\n 'Trying to build documentation for entity not in software catalog',\n );\n }\n\n /**\n * Prepare (and cache check)\n */\n\n this.logger.info(\n `Step 1 of 3: Preparing docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n // If available, use the etag stored in techdocs_metadata.json to\n // check if docs are outdated and need to be regenerated.\n let storedEtag: string | undefined;\n if (await this.publisher.hasDocsBeenGenerated(this.entity)) {\n try {\n storedEtag = (\n await this.publisher.fetchTechDocsMetadata({\n namespace: this.entity.metadata.namespace ?? DEFAULT_NAMESPACE,\n kind: this.entity.kind,\n name: this.entity.metadata.name,\n })\n ).etag;\n } catch (err) {\n // Proceed with a fresh build\n this.logger.warn(\n `Unable to read techdocs_metadata.json, proceeding with fresh build, error ${err}.`,\n );\n }\n }\n\n let preparedDir: string | undefined;\n let outputDir: string | undefined;\n\n try {\n let newEtag: string;\n try {\n const preparerResponse = await this.preparer.prepare(this.entity, {\n etag: storedEtag,\n logger: this.logger,\n });\n\n preparedDir = preparerResponse.preparedDir;\n newEtag = preparerResponse.etag;\n } catch (err) {\n if (isError(err) && err.name === 'NotModifiedError') {\n // No need to prepare anymore since cache is valid.\n // Set last check happened to now\n new BuildMetadataStorage(this.entity.metadata.uid).setLastUpdated();\n this.logger.debug(\n `Docs for ${stringifyEntityRef(\n this.entity,\n )} are unmodified. Using cache, skipping generate and prepare`,\n );\n return false;\n }\n throw err;\n }\n\n this.logger.info(\n `Prepare step completed for entity ${stringifyEntityRef(\n this.entity,\n )}, stored at ${preparedDir}`,\n );\n\n /**\n * Generate\n */\n\n this.logger.info(\n `Step 2 of 3: Generating docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n const workingDir = this.config.getOptionalString(\n 'backend.workingDirectory',\n );\n const tmpdirPath = workingDir || os.tmpdir();\n // Fixes a problem with macOS returning a path that is a symlink\n const tmpdirResolvedPath = fs.realpathSync(tmpdirPath);\n outputDir = await fs.mkdtemp(\n path.join(tmpdirResolvedPath, 'techdocs-tmp-'),\n );\n\n const parsedLocationAnnotation = getLocationForEntity(\n this.entity,\n this.scmIntegrations,\n );\n await this.generator.run({\n inputDir: preparedDir,\n outputDir,\n parsedLocationAnnotation,\n etag: newEtag,\n logger: this.logger,\n logStream: this.logStream,\n siteOptions: {\n name: this.entity.metadata.title ?? this.entity.metadata.name,\n },\n });\n\n /**\n * Publish\n */\n\n this.logger.info(\n `Step 3 of 3: Publishing docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n const published = await this.publisher.publish({\n entity: this.entity,\n directory: outputDir,\n });\n\n // Invalidate the cache for any published objects.\n if (this.cache && published && published?.objects?.length) {\n this.logger.debug(\n `Invalidating ${published.objects.length} cache objects`,\n );\n await this.cache.invalidateMultiple(published.objects);\n }\n } finally {\n // Remove Prepared directory since it is no longer needed.\n // Caveat: Can not remove prepared directory in case of git preparer since the\n // local git repository is used to get etag on subsequent requests.\n if (preparedDir && this.preparer.shouldCleanPreparedDirectory()) {\n this.logger.debug(`Removing prepared directory ${preparedDir}`);\n try {\n // Not a blocker hence no need to await this.\n fs.remove(preparedDir);\n } catch (error) {\n assertError(error);\n this.logger.debug(\n `Error removing prepared directory ${error.message}`,\n );\n }\n }\n\n if (outputDir) {\n this.logger.debug(`Removing generated directory ${outputDir}`);\n try {\n // Not a blocker hence no need to await this.\n fs.remove(outputDir);\n } catch (error) {\n assertError(error);\n this.logger.debug(\n `Error removing generated directory ${error.message}`,\n );\n }\n }\n }\n\n // Update the last check time for the entity\n new BuildMetadataStorage(this.entity.metadata.uid).setLastUpdated();\n\n return true;\n }\n}\n"],"names":["stringifyEntityRef","DEFAULT_NAMESPACE","isError","BuildMetadataStorage","os","fs","path","getLocationForEntity","assertError"],"mappings":"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"}
1
+ {"version":3,"file":"builder.cjs.js","sources":["../../src/DocsBuilder/builder.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\nimport {\n DEFAULT_NAMESPACE,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { assertError, isError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport {\n GeneratorBase,\n GeneratorBuilder,\n getLocationForEntity,\n PreparerBase,\n PreparerBuilder,\n PublisherBase,\n} from '@backstage/plugin-techdocs-node';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Writable } from 'node:stream';\nimport { Logger } from 'winston';\nimport { BuildMetadataStorage } from './BuildMetadataStorage';\nimport { TechDocsCache } from '../cache';\n\ntype DocsBuilderArguments = {\n preparers: PreparerBuilder;\n generators: GeneratorBuilder;\n publisher: PublisherBase;\n entity: Entity;\n logger: Logger;\n config: Config;\n scmIntegrations: ScmIntegrationRegistry;\n logStream?: Writable;\n cache?: TechDocsCache;\n};\n\nexport class DocsBuilder {\n private preparer: PreparerBase;\n private generator: GeneratorBase;\n private publisher: PublisherBase;\n private entity: Entity;\n private logger: Logger;\n private config: Config;\n private scmIntegrations: ScmIntegrationRegistry;\n private logStream: Writable | undefined;\n private cache?: TechDocsCache;\n\n constructor({\n preparers,\n generators,\n publisher,\n entity,\n logger,\n config,\n scmIntegrations,\n logStream,\n cache,\n }: DocsBuilderArguments) {\n this.preparer = preparers.get(entity);\n this.generator = generators.get(entity);\n this.publisher = publisher;\n this.entity = entity;\n this.logger = logger;\n this.config = config;\n this.scmIntegrations = scmIntegrations;\n this.logStream = logStream;\n this.cache = cache;\n }\n\n /**\n * Build the docs and return whether they have been newly generated or have been cached\n * @returns true, if the docs have been built. false, if the cached docs are still up-to-date.\n */\n public async build(): Promise<boolean> {\n if (!this.entity.metadata.uid) {\n throw new Error(\n 'Trying to build documentation for entity not in software catalog',\n );\n }\n\n /**\n * Prepare (and cache check)\n */\n\n this.logger.info(\n `Step 1 of 3: Preparing docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n // If available, use the etag stored in techdocs_metadata.json to\n // check if docs are outdated and need to be regenerated.\n let storedEtag: string | undefined;\n if (await this.publisher.hasDocsBeenGenerated(this.entity)) {\n try {\n storedEtag = (\n await this.publisher.fetchTechDocsMetadata({\n namespace: this.entity.metadata.namespace ?? DEFAULT_NAMESPACE,\n kind: this.entity.kind,\n name: this.entity.metadata.name,\n })\n ).etag;\n } catch (err) {\n // Proceed with a fresh build\n this.logger.warn(\n `Unable to read techdocs_metadata.json, proceeding with fresh build, error ${err}.`,\n );\n }\n }\n\n let preparedDir: string | undefined;\n let outputDir: string | undefined;\n\n try {\n let newEtag: string;\n try {\n const preparerResponse = await this.preparer.prepare(this.entity, {\n etag: storedEtag,\n logger: this.logger,\n });\n\n preparedDir = preparerResponse.preparedDir;\n newEtag = preparerResponse.etag;\n } catch (err) {\n if (isError(err) && err.name === 'NotModifiedError') {\n // No need to prepare anymore since cache is valid.\n // Set last check happened to now\n new BuildMetadataStorage(this.entity.metadata.uid).setLastUpdated();\n this.logger.debug(\n `Docs for ${stringifyEntityRef(\n this.entity,\n )} are unmodified. Using cache, skipping generate and prepare`,\n );\n return false;\n }\n throw err;\n }\n\n this.logger.info(\n `Prepare step completed for entity ${stringifyEntityRef(\n this.entity,\n )}, stored at ${preparedDir}`,\n );\n\n /**\n * Generate\n */\n\n this.logger.info(\n `Step 2 of 3: Generating docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n const workingDir = this.config.getOptionalString(\n 'backend.workingDirectory',\n );\n const tmpdirPath = workingDir || os.tmpdir();\n // Fixes a problem with macOS returning a path that is a symlink\n const tmpdirResolvedPath = fs.realpathSync(tmpdirPath);\n outputDir = await fs.mkdtemp(\n path.join(tmpdirResolvedPath, 'techdocs-tmp-'),\n );\n\n const parsedLocationAnnotation = getLocationForEntity(\n this.entity,\n this.scmIntegrations,\n );\n await this.generator.run({\n inputDir: preparedDir,\n outputDir,\n parsedLocationAnnotation,\n etag: newEtag,\n logger: this.logger,\n logStream: this.logStream,\n siteOptions: {\n name: this.entity.metadata.title ?? this.entity.metadata.name,\n },\n });\n\n /**\n * Publish\n */\n\n this.logger.info(\n `Step 3 of 3: Publishing docs for entity ${stringifyEntityRef(\n this.entity,\n )}`,\n );\n\n const published = await this.publisher.publish({\n entity: this.entity,\n directory: outputDir,\n });\n\n // Invalidate the cache for any published objects.\n if (this.cache && published && published?.objects?.length) {\n this.logger.debug(\n `Invalidating ${published.objects.length} cache objects`,\n );\n await this.cache.invalidateMultiple(published.objects);\n }\n } finally {\n // Remove Prepared directory since it is no longer needed.\n // Caveat: Can not remove prepared directory in case of git preparer since the\n // local git repository is used to get etag on subsequent requests.\n if (preparedDir && this.preparer.shouldCleanPreparedDirectory()) {\n this.logger.debug(`Removing prepared directory ${preparedDir}`);\n try {\n // Not a blocker hence no need to await this.\n fs.remove(preparedDir);\n } catch (error) {\n assertError(error);\n this.logger.debug(\n `Error removing prepared directory ${error.message}`,\n );\n }\n }\n\n if (outputDir) {\n this.logger.debug(`Removing generated directory ${outputDir}`);\n try {\n // Not a blocker hence no need to await this.\n fs.remove(outputDir);\n } catch (error) {\n assertError(error);\n this.logger.debug(\n `Error removing generated directory ${error.message}`,\n );\n }\n }\n }\n\n // Update the last check time for the entity\n new BuildMetadataStorage(this.entity.metadata.uid).setLastUpdated();\n\n return true;\n }\n}\n"],"names":["stringifyEntityRef","DEFAULT_NAMESPACE","isError","BuildMetadataStorage","os","fs","path","getLocationForEntity","assertError"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  var catalogModel = require('@backstage/catalog-model');
4
4
  var errors = require('@backstage/errors');
5
5
  var pLimit = require('p-limit');
6
- var stream = require('stream');
6
+ var node_stream = require('node:stream');
7
7
  var winston = require('winston');
8
8
  var BuildMetadataStorage = require('../DocsBuilder/BuildMetadataStorage.cjs.js');
9
9
  var builder = require('../DocsBuilder/builder.cjs.js');
@@ -70,7 +70,7 @@ class DocsSynchronizer {
70
70
  ),
71
71
  defaultMeta: {}
72
72
  });
73
- const logStream = new stream.PassThrough();
73
+ const logStream = new node_stream.PassThrough();
74
74
  logStream.on("data", async (data) => {
75
75
  log(data.toString().trim());
76
76
  });
@@ -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 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, LoggerService } 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: LoggerService;\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: LoggerService;\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CO,MAAM,gBAAA,CAAiB;AAAA,EACX,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAEjB,WAAA,CAAY;AAAA,IACV,SAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,EAOG;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAGb,IAAA,IAAA,CAAK,YAAA,GAAeA,wBAAO,EAAE,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX,eAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAAA,IACtC,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAKG;AAED,IAAA,MAAM,UAAA,GAAaC,mBAAQ,YAAA,CAAa;AAAA,MACtC,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,MAAA;AAAA,MAChC,MAAA,EAAQA,mBAAQ,MAAA,CAAO,OAAA;AAAA,QACrBA,kBAAA,CAAQ,OAAO,QAAA,EAAS;AAAA,QACxBA,kBAAA,CAAQ,OAAO,SAAA,EAAU;AAAA,QACzBA,kBAAA,CAAQ,OAAO,MAAA;AAAO,OACxB;AAAA,MACA,aAAa;AAAC,KACf,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,IAAIC,kBAAA,EAAY;AAClC,IAAA,SAAA,CAAU,EAAA,CAAG,MAAA,EAAQ,OAAM,IAAA,KAAQ;AACjC,MAAA,GAAA,CAAI,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,EAAM,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,UAAA,CAAW,GAAA,CAAI,IAAID,kBAAA,CAAQ,UAAA,CAAW,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA;AACnE,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,iBAAiB,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,CAACE,yCAAA,CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,IAAIC,mBAAA,CAAY;AAAA,QAClC,SAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,iBAAiB,IAAA,CAAK,eAAA;AAAA,QACtB,SAAA;AAAA,QACA,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,QAAA,UAAA,CAAW,IAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF,GAAG,GAAK,CAAA;AACR,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,aAAa,MAAM,WAAA,CAAY,OAAO,CAAA;AACjE,MAAA,aAAA,CAAc,QAAQ,CAAA;AAEtB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,QAAA;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAAC,kBAAA,CAAY,CAAC,CAAA;AACb,MAAA,MAAM,MAAM,CAAA,yCAAA,EAA4CC,+BAAA;AAAA,QACtD;AAAA,OACD,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AACf,MAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACxB,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA;AAAA,IACF;AAKA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAA,EAAA,EAAW;AAC5C,MAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,MAAM,CAAA,EAAG;AACrD,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,KAAA;AAAA,QACE,IAAIC,oBAAA;AAAA,UACF;AAAA;AACF,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAA,CAAY;AAAA,IAChB,eAAA,EAAiB,EAAE,MAAA,EAAO;AAAA,IAC1B,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,EAKG;AAED,IAAA,IAAI,CAACJ,0CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,CAAA,IAAK,CAAC,KAAK,KAAA,EAAO;AAC9D,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,EAAU,SAAA,IAAaK,8BAAA;AAChD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,IAAA;AAC7B,IAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,MACV;AAAA,KACF,IAAK,KAAA;AACP,IAAA,MAAM,cAAc,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,IAAI,IAAI,CAAA,CAAA;AAChD,IAAA,MAAM,oBAAoB,CAAA,EACxB,gBAAA,GAAmB,cAAc,WAAA,CAAY,iBAAA,CAAkB,OAAO,CACxE,CAAA,CAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,cAAA,EAAgB,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACzD,KAAK,SAAA,CAAU,qBAAA,CAAsB,EAAE,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,QAC9D,KAAA;AAAA,UACE,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,iBAAiB,CAAA,uBAAA,CAAA;AAAA,UAC3C;AAAA,YACE,OAAA,EAAS,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO;AAAC;AAC3D,SACF,CAAE,IAAA;AAAA,UACA,OACE,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS;AAAA;AAGlC,OACD,CAAA;AAGD,MAAA,IAAI,cAAA,CAAe,eAAA,KAAoB,cAAA,CAAe,eAAA,EAAiB;AACrE,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,uBAAO,GAAA,CAAI;AAAA,YACT,GAAI,cAAA,CAAe,KAAA,IAAS,EAAC;AAAA,YAC7B,GAAI,cAAA,CAAe,KAAA,IAAS;AAAC,WAC9B;AAAA,UACD,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,iBAAiB,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACtC,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,KAAK,CAAA;AACzC,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,MAC3B;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAAH,kBAAA,CAAY,CAAC,CAAA;AAEb,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,wBAAA,EAA2B,iBAAiB,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA;AAAA,OAC5D;AACA,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IAC3B,CAAA,SAAE;AAEA,MAAA,IAAII,yCAAA,CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,EAAE,cAAA,EAAe;AAAA,IAChE;AAAA,EACF;AACF;;;;"}
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 'node:stream';\nimport * as winston from 'winston';\nimport { TechDocsCache } from '../cache';\nimport {\n BuildMetadataStorage,\n DocsBuilder,\n shouldCheckForUpdate,\n} from '../DocsBuilder';\nimport { DiscoveryService, LoggerService } 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: LoggerService;\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: LoggerService;\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CO,MAAM,gBAAA,CAAiB;AAAA,EACX,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAEjB,WAAA,CAAY;AAAA,IACV,SAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,EAOG;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAGb,IAAA,IAAA,CAAK,YAAA,GAAeA,wBAAO,EAAE,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX,eAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAAA,IACtC,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAKG;AAED,IAAA,MAAM,UAAA,GAAaC,mBAAQ,YAAA,CAAa;AAAA,MACtC,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,MAAA;AAAA,MAChC,MAAA,EAAQA,mBAAQ,MAAA,CAAO,OAAA;AAAA,QACrBA,kBAAA,CAAQ,OAAO,QAAA,EAAS;AAAA,QACxBA,kBAAA,CAAQ,OAAO,SAAA,EAAU;AAAA,QACzBA,kBAAA,CAAQ,OAAO,MAAA;AAAO,OACxB;AAAA,MACA,aAAa;AAAC,KACf,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,IAAIC,uBAAA,EAAY;AAClC,IAAA,SAAA,CAAU,EAAA,CAAG,MAAA,EAAQ,OAAM,IAAA,KAAQ;AACjC,MAAA,GAAA,CAAI,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,EAAM,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,UAAA,CAAW,GAAA,CAAI,IAAID,kBAAA,CAAQ,UAAA,CAAW,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA;AACnE,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,iBAAiB,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,CAACE,yCAAA,CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,IAAIC,mBAAA,CAAY;AAAA,QAClC,SAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,iBAAiB,IAAA,CAAK,eAAA;AAAA,QACtB,SAAA;AAAA,QACA,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,QAAA,UAAA,CAAW,IAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF,GAAG,GAAK,CAAA;AACR,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,aAAa,MAAM,WAAA,CAAY,OAAO,CAAA;AACjE,MAAA,aAAA,CAAc,QAAQ,CAAA;AAEtB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,QAAA;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAAC,kBAAA,CAAY,CAAC,CAAA;AACb,MAAA,MAAM,MAAM,CAAA,yCAAA,EAA4CC,+BAAA;AAAA,QACtD;AAAA,OACD,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AACf,MAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACxB,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA;AAAA,IACF;AAKA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAA,EAAA,EAAW;AAC5C,MAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,MAAM,CAAA,EAAG;AACrD,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,KAAA;AAAA,QACE,IAAIC,oBAAA;AAAA,UACF;AAAA;AACF,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAA,CAAY;AAAA,IAChB,eAAA,EAAiB,EAAE,MAAA,EAAO;AAAA,IAC1B,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,EAKG;AAED,IAAA,IAAI,CAACJ,0CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,CAAA,IAAK,CAAC,KAAK,KAAA,EAAO;AAC9D,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,EAAU,SAAA,IAAaK,8BAAA;AAChD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,IAAA;AAC7B,IAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,MACV;AAAA,KACF,IAAK,KAAA;AACP,IAAA,MAAM,cAAc,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,IAAI,IAAI,CAAA,CAAA;AAChD,IAAA,MAAM,oBAAoB,CAAA,EACxB,gBAAA,GAAmB,cAAc,WAAA,CAAY,iBAAA,CAAkB,OAAO,CACxE,CAAA,CAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,cAAA,EAAgB,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACzD,KAAK,SAAA,CAAU,qBAAA,CAAsB,EAAE,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,QAC9D,KAAA;AAAA,UACE,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,iBAAiB,CAAA,uBAAA,CAAA;AAAA,UAC3C;AAAA,YACE,OAAA,EAAS,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO;AAAC;AAC3D,SACF,CAAE,IAAA;AAAA,UACA,OACE,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS;AAAA;AAGlC,OACD,CAAA;AAGD,MAAA,IAAI,cAAA,CAAe,eAAA,KAAoB,cAAA,CAAe,eAAA,EAAiB;AACrE,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,uBAAO,GAAA,CAAI;AAAA,YACT,GAAI,cAAA,CAAe,KAAA,IAAS,EAAC;AAAA,YAC7B,GAAI,cAAA,CAAe,KAAA,IAAS;AAAC,WAC9B;AAAA,UACD,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,iBAAiB,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACtC,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,KAAK,CAAA;AACzC,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,MAC3B;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAAH,kBAAA,CAAY,CAAC,CAAA;AAEb,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,wBAAA,EAA2B,iBAAiB,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA;AAAA,OAC5D;AACA,MAAA,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IAC3B,CAAA,SAAE;AAEA,MAAA,IAAII,yCAAA,CAAqB,MAAA,CAAO,QAAA,CAAS,GAAI,EAAE,cAAA,EAAe;AAAA,IAChE;AAAA,EACF;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs-backend",
3
- "version": "2.1.4-next.2",
3
+ "version": "2.1.5-next.0",
4
4
  "description": "The Backstage backend plugin that renders technical documentation for your components",
5
5
  "backstage": {
6
6
  "role": "backend-plugin",
@@ -72,15 +72,15 @@
72
72
  "test": "backstage-cli package test"
73
73
  },
74
74
  "dependencies": {
75
- "@backstage/backend-defaults": "0.15.0-next.2",
76
- "@backstage/backend-plugin-api": "1.6.0",
75
+ "@backstage/backend-defaults": "0.15.1-next.0",
76
+ "@backstage/backend-plugin-api": "1.7.0-next.0",
77
77
  "@backstage/catalog-client": "1.12.1",
78
78
  "@backstage/catalog-model": "1.7.6",
79
79
  "@backstage/config": "1.3.6",
80
80
  "@backstage/errors": "1.2.7",
81
- "@backstage/integration": "1.19.2-next.0",
82
- "@backstage/plugin-catalog-node": "1.20.1",
83
- "@backstage/plugin-techdocs-node": "1.13.11-next.0",
81
+ "@backstage/integration": "1.19.3-next.0",
82
+ "@backstage/plugin-catalog-node": "1.21.0-next.0",
83
+ "@backstage/plugin-techdocs-node": "1.14.1-next.0",
84
84
  "@backstage/types": "1.2.2",
85
85
  "express": "^4.22.0",
86
86
  "express-promise-router": "^4.1.0",
@@ -90,9 +90,9 @@
90
90
  "winston": "^3.2.1"
91
91
  },
92
92
  "devDependencies": {
93
- "@backstage/backend-defaults": "0.15.0-next.2",
94
- "@backstage/backend-test-utils": "1.10.3-next.1",
95
- "@backstage/cli": "0.35.2-next.1",
93
+ "@backstage/backend-defaults": "0.15.1-next.0",
94
+ "@backstage/backend-test-utils": "1.10.4-next.0",
95
+ "@backstage/cli": "0.35.3-next.0",
96
96
  "@types/express": "^4.17.6",
97
97
  "msw": "^2.0.0",
98
98
  "supertest": "^7.0.0"