@backstage/plugin-techdocs-node 1.12.12-next.1 → 1.12.12

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/extensions.cjs.js +22 -0
  3. package/dist/extensions.cjs.js.map +1 -0
  4. package/dist/helpers.cjs.js +80 -0
  5. package/dist/helpers.cjs.js.map +1 -0
  6. package/dist/index.cjs.js +29 -2602
  7. package/dist/index.cjs.js.map +1 -1
  8. package/dist/index.d.ts +11 -1
  9. package/dist/stages/generate/DockerContainerRunner.cjs.js +99 -0
  10. package/dist/stages/generate/DockerContainerRunner.cjs.js.map +1 -0
  11. package/dist/stages/generate/generators.cjs.js +42 -0
  12. package/dist/stages/generate/generators.cjs.js.map +1 -0
  13. package/dist/stages/generate/helpers.cjs.js +265 -0
  14. package/dist/stages/generate/helpers.cjs.js.map +1 -0
  15. package/dist/stages/generate/index.cjs.js +15 -0
  16. package/dist/stages/generate/index.cjs.js.map +1 -0
  17. package/dist/stages/generate/mkdocsPatchers.cjs.js +96 -0
  18. package/dist/stages/generate/mkdocsPatchers.cjs.js.map +1 -0
  19. package/dist/stages/generate/techdocs.cjs.js +169 -0
  20. package/dist/stages/generate/techdocs.cjs.js.map +1 -0
  21. package/dist/stages/prepare/dir.cjs.js +63 -0
  22. package/dist/stages/prepare/dir.cjs.js.map +1 -0
  23. package/dist/stages/prepare/preparers.cjs.js +54 -0
  24. package/dist/stages/prepare/preparers.cjs.js.map +1 -0
  25. package/dist/stages/prepare/url.cjs.js +46 -0
  26. package/dist/stages/prepare/url.cjs.js.map +1 -0
  27. package/dist/stages/publish/awsS3.cjs.js +436 -0
  28. package/dist/stages/publish/awsS3.cjs.js.map +1 -0
  29. package/dist/stages/publish/azureBlobStorage.cjs.js +337 -0
  30. package/dist/stages/publish/azureBlobStorage.cjs.js.map +1 -0
  31. package/dist/stages/publish/googleStorage.cjs.js +288 -0
  32. package/dist/stages/publish/googleStorage.cjs.js.map +1 -0
  33. package/dist/stages/publish/helpers.cjs.js +138 -0
  34. package/dist/stages/publish/helpers.cjs.js.map +1 -0
  35. package/dist/stages/publish/local.cjs.js +248 -0
  36. package/dist/stages/publish/local.cjs.js.map +1 -0
  37. package/dist/stages/publish/migrations/GoogleMigration.cjs.js +52 -0
  38. package/dist/stages/publish/migrations/GoogleMigration.cjs.js.map +1 -0
  39. package/dist/stages/publish/openStackSwift.cjs.js +286 -0
  40. package/dist/stages/publish/openStackSwift.cjs.js.map +1 -0
  41. package/dist/stages/publish/publish.cjs.js +100 -0
  42. package/dist/stages/publish/publish.cjs.js.map +1 -0
  43. package/package.json +13 -13
@@ -0,0 +1,169 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var integration = require('@backstage/integration');
5
+ var helpers = require('./helpers.cjs.js');
6
+ var mkdocsPatchers = require('./mkdocsPatchers.cjs.js');
7
+ var errors = require('@backstage/errors');
8
+ var DockerContainerRunner = require('./DockerContainerRunner.cjs.js');
9
+
10
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
11
+
12
+ var path__default = /*#__PURE__*/_interopDefaultCompat(path);
13
+
14
+ class TechdocsGenerator {
15
+ /**
16
+ * The default docker image (and version) used to generate content. Public
17
+ * and static so that techdocs-node consumers can use the same version.
18
+ */
19
+ static defaultDockerImage = "spotify/techdocs:v1.2.4";
20
+ logger;
21
+ containerRunner;
22
+ options;
23
+ scmIntegrations;
24
+ /**
25
+ * Returns a instance of TechDocs generator
26
+ * @param config - A Backstage configuration
27
+ * @param options - Options to configure the generator
28
+ */
29
+ static fromConfig(config, options) {
30
+ const { containerRunner, logger } = options;
31
+ const scmIntegrations = integration.ScmIntegrations.fromConfig(config);
32
+ return new TechdocsGenerator({
33
+ logger,
34
+ containerRunner,
35
+ config,
36
+ scmIntegrations
37
+ });
38
+ }
39
+ constructor(options) {
40
+ this.logger = options.logger;
41
+ this.options = readGeneratorConfig(options.config, options.logger);
42
+ this.containerRunner = options.containerRunner;
43
+ this.scmIntegrations = options.scmIntegrations;
44
+ }
45
+ /** {@inheritDoc GeneratorBase.run} */
46
+ async run(options) {
47
+ const {
48
+ inputDir,
49
+ outputDir,
50
+ parsedLocationAnnotation,
51
+ etag,
52
+ logger: childLogger,
53
+ logStream,
54
+ siteOptions,
55
+ runAsDefaultUser
56
+ } = options;
57
+ const { path: mkdocsYmlPath, content } = await helpers.getMkdocsYml(
58
+ inputDir,
59
+ siteOptions
60
+ );
61
+ const docsDir = await helpers.validateMkdocsYaml(inputDir, content);
62
+ if (parsedLocationAnnotation) {
63
+ await mkdocsPatchers.patchMkdocsYmlPreBuild(
64
+ mkdocsYmlPath,
65
+ childLogger,
66
+ parsedLocationAnnotation,
67
+ this.scmIntegrations
68
+ );
69
+ }
70
+ if (this.options.legacyCopyReadmeMdToIndexMd) {
71
+ await helpers.patchIndexPreBuild({ inputDir, logger: childLogger, docsDir });
72
+ }
73
+ const defaultPlugins = this.options.defaultPlugins ?? [];
74
+ if (!this.options.omitTechdocsCoreMkdocsPlugin && !defaultPlugins.includes("techdocs-core")) {
75
+ defaultPlugins.push("techdocs-core");
76
+ }
77
+ await mkdocsPatchers.patchMkdocsYmlWithPlugins(mkdocsYmlPath, childLogger, defaultPlugins);
78
+ const mountDirs = {
79
+ [inputDir]: "/input",
80
+ [outputDir]: "/output"
81
+ };
82
+ try {
83
+ switch (this.options.runIn) {
84
+ case "local":
85
+ await helpers.runCommand({
86
+ command: "mkdocs",
87
+ args: ["build", "-d", outputDir, "-v"],
88
+ options: {
89
+ cwd: inputDir
90
+ },
91
+ logStream
92
+ });
93
+ childLogger.info(
94
+ `Successfully generated docs from ${inputDir} into ${outputDir} using local mkdocs`
95
+ );
96
+ break;
97
+ case "docker": {
98
+ const containerRunner = this.containerRunner || new DockerContainerRunner.DockerContainerRunner();
99
+ await containerRunner.runContainer({
100
+ imageName: this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage,
101
+ args: ["build", "-d", "/output"],
102
+ logStream,
103
+ mountDirs,
104
+ workingDir: "/input",
105
+ // Set the home directory inside the container as something that applications can
106
+ // write to, otherwise they will just fail trying to write to /
107
+ envVars: { HOME: "/tmp" },
108
+ pullImage: this.options.pullImage,
109
+ defaultUser: runAsDefaultUser
110
+ });
111
+ childLogger.info(
112
+ `Successfully generated docs from ${inputDir} into ${outputDir} using techdocs-container`
113
+ );
114
+ break;
115
+ }
116
+ default:
117
+ throw new Error(
118
+ `Invalid config value "${this.options.runIn}" provided in 'techdocs.generators.techdocs'.`
119
+ );
120
+ }
121
+ } catch (error) {
122
+ this.logger.debug(
123
+ `Failed to generate docs from ${inputDir} into ${outputDir}`
124
+ );
125
+ throw new errors.ForwardedError(
126
+ `Failed to generate docs from ${inputDir} into ${outputDir}`,
127
+ error
128
+ );
129
+ }
130
+ await helpers.createOrUpdateMetadata(
131
+ path__default.default.join(outputDir, "techdocs_metadata.json"),
132
+ childLogger
133
+ );
134
+ if (etag) {
135
+ await helpers.storeEtagMetadata(
136
+ path__default.default.join(outputDir, "techdocs_metadata.json"),
137
+ etag
138
+ );
139
+ }
140
+ }
141
+ }
142
+ function readGeneratorConfig(config, logger) {
143
+ const legacyGeneratorType = config.getOptionalString(
144
+ "techdocs.generators.techdocs"
145
+ );
146
+ if (legacyGeneratorType) {
147
+ logger.warn(
148
+ `The 'techdocs.generators.techdocs' configuration key is deprecated and will be removed in the future. Please use 'techdocs.generator' instead. See here https://backstage.io/docs/features/techdocs/configuration`
149
+ );
150
+ }
151
+ return {
152
+ runIn: legacyGeneratorType ?? config.getOptionalString("techdocs.generator.runIn") ?? "docker",
153
+ dockerImage: config.getOptionalString("techdocs.generator.dockerImage"),
154
+ pullImage: config.getOptionalBoolean("techdocs.generator.pullImage"),
155
+ omitTechdocsCoreMkdocsPlugin: config.getOptionalBoolean(
156
+ "techdocs.generator.mkdocs.omitTechdocsCorePlugin"
157
+ ),
158
+ legacyCopyReadmeMdToIndexMd: config.getOptionalBoolean(
159
+ "techdocs.generator.mkdocs.legacyCopyReadmeMdToIndexMd"
160
+ ),
161
+ defaultPlugins: config.getOptionalStringArray(
162
+ "techdocs.generator.mkdocs.defaultPlugins"
163
+ )
164
+ };
165
+ }
166
+
167
+ exports.TechdocsGenerator = TechdocsGenerator;
168
+ exports.readGeneratorConfig = readGeneratorConfig;
169
+ //# sourceMappingURL=techdocs.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"techdocs.cjs.js","sources":["../../../src/stages/generate/techdocs.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 */\n\nimport { Config } from '@backstage/config';\nimport path from 'path';\nimport {\n ScmIntegrationRegistry,\n ScmIntegrations,\n} from '@backstage/integration';\nimport {\n createOrUpdateMetadata,\n getMkdocsYml,\n patchIndexPreBuild,\n runCommand,\n storeEtagMetadata,\n validateMkdocsYaml,\n} from './helpers';\n\nimport {\n patchMkdocsYmlPreBuild,\n patchMkdocsYmlWithPlugins,\n} from './mkdocsPatchers';\nimport {\n GeneratorBase,\n GeneratorConfig,\n GeneratorOptions,\n GeneratorRunInType,\n GeneratorRunOptions,\n} from './types';\nimport { ForwardedError } from '@backstage/errors';\nimport { DockerContainerRunner } from './DockerContainerRunner';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { TechDocsContainerRunner } from './types';\n\n/**\n * Generates documentation files\n * @public\n */\nexport class TechdocsGenerator implements GeneratorBase {\n /**\n * The default docker image (and version) used to generate content. Public\n * and static so that techdocs-node consumers can use the same version.\n */\n public static readonly defaultDockerImage = 'spotify/techdocs:v1.2.4';\n private readonly logger: LoggerService;\n private readonly containerRunner?: TechDocsContainerRunner;\n private readonly options: GeneratorConfig;\n private readonly scmIntegrations: ScmIntegrationRegistry;\n\n /**\n * Returns a instance of TechDocs generator\n * @param config - A Backstage configuration\n * @param options - Options to configure the generator\n */\n static fromConfig(config: Config, options: GeneratorOptions) {\n const { containerRunner, logger } = options;\n const scmIntegrations = ScmIntegrations.fromConfig(config);\n return new TechdocsGenerator({\n logger,\n containerRunner,\n config,\n scmIntegrations,\n });\n }\n\n constructor(options: {\n logger: LoggerService;\n containerRunner?: TechDocsContainerRunner;\n config: Config;\n scmIntegrations: ScmIntegrationRegistry;\n }) {\n this.logger = options.logger;\n this.options = readGeneratorConfig(options.config, options.logger);\n this.containerRunner = options.containerRunner;\n this.scmIntegrations = options.scmIntegrations;\n }\n\n /** {@inheritDoc GeneratorBase.run} */\n public async run(options: GeneratorRunOptions): Promise<void> {\n const {\n inputDir,\n outputDir,\n parsedLocationAnnotation,\n etag,\n logger: childLogger,\n logStream,\n siteOptions,\n runAsDefaultUser,\n } = options;\n\n // Do some updates to mkdocs.yml before generating docs e.g. adding repo_url\n const { path: mkdocsYmlPath, content } = await getMkdocsYml(\n inputDir,\n siteOptions,\n );\n\n // validate the docs_dir first\n const docsDir = await validateMkdocsYaml(inputDir, content);\n\n if (parsedLocationAnnotation) {\n await patchMkdocsYmlPreBuild(\n mkdocsYmlPath,\n childLogger,\n parsedLocationAnnotation,\n this.scmIntegrations,\n );\n }\n\n if (this.options.legacyCopyReadmeMdToIndexMd) {\n await patchIndexPreBuild({ inputDir, logger: childLogger, docsDir });\n }\n\n // patch the list of mkdocs plugins\n const defaultPlugins = this.options.defaultPlugins ?? [];\n\n if (\n !this.options.omitTechdocsCoreMkdocsPlugin &&\n !defaultPlugins.includes('techdocs-core')\n ) {\n defaultPlugins.push('techdocs-core');\n }\n\n await patchMkdocsYmlWithPlugins(mkdocsYmlPath, childLogger, defaultPlugins);\n\n // Directories to bind on container\n const mountDirs = {\n [inputDir]: '/input',\n [outputDir]: '/output',\n };\n\n try {\n switch (this.options.runIn) {\n case 'local':\n await runCommand({\n command: 'mkdocs',\n args: ['build', '-d', outputDir, '-v'],\n options: {\n cwd: inputDir,\n },\n logStream,\n });\n childLogger.info(\n `Successfully generated docs from ${inputDir} into ${outputDir} using local mkdocs`,\n );\n break;\n case 'docker': {\n const containerRunner =\n this.containerRunner || new DockerContainerRunner();\n await containerRunner.runContainer({\n imageName:\n this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage,\n args: ['build', '-d', '/output'],\n logStream,\n mountDirs,\n workingDir: '/input',\n // Set the home directory inside the container as something that applications can\n // write to, otherwise they will just fail trying to write to /\n envVars: { HOME: '/tmp' },\n pullImage: this.options.pullImage,\n defaultUser: runAsDefaultUser,\n });\n childLogger.info(\n `Successfully generated docs from ${inputDir} into ${outputDir} using techdocs-container`,\n );\n break;\n }\n default:\n throw new Error(\n `Invalid config value \"${this.options.runIn}\" provided in 'techdocs.generators.techdocs'.`,\n );\n }\n } catch (error) {\n this.logger.debug(\n `Failed to generate docs from ${inputDir} into ${outputDir}`,\n );\n throw new ForwardedError(\n `Failed to generate docs from ${inputDir} into ${outputDir}`,\n error,\n );\n }\n\n /**\n * Post Generate steps\n */\n\n // Add build timestamp and files to techdocs_metadata.json\n // Creates techdocs_metadata.json if file does not exist.\n await createOrUpdateMetadata(\n path.join(outputDir, 'techdocs_metadata.json'),\n childLogger,\n );\n\n // Add etag of the prepared tree to techdocs_metadata.json\n // Assumes that the file already exists.\n if (etag) {\n await storeEtagMetadata(\n path.join(outputDir, 'techdocs_metadata.json'),\n etag,\n );\n }\n }\n}\n\nexport function readGeneratorConfig(\n config: Config,\n logger: LoggerService,\n): GeneratorConfig {\n const legacyGeneratorType = config.getOptionalString(\n 'techdocs.generators.techdocs',\n ) as GeneratorRunInType;\n\n if (legacyGeneratorType) {\n logger.warn(\n `The 'techdocs.generators.techdocs' configuration key is deprecated and will be removed in the future. Please use 'techdocs.generator' instead. ` +\n `See here https://backstage.io/docs/features/techdocs/configuration`,\n );\n }\n\n return {\n runIn:\n legacyGeneratorType ??\n config.getOptionalString('techdocs.generator.runIn') ??\n 'docker',\n dockerImage: config.getOptionalString('techdocs.generator.dockerImage'),\n pullImage: config.getOptionalBoolean('techdocs.generator.pullImage'),\n omitTechdocsCoreMkdocsPlugin: config.getOptionalBoolean(\n 'techdocs.generator.mkdocs.omitTechdocsCorePlugin',\n ),\n legacyCopyReadmeMdToIndexMd: config.getOptionalBoolean(\n 'techdocs.generator.mkdocs.legacyCopyReadmeMdToIndexMd',\n ),\n defaultPlugins: config.getOptionalStringArray(\n 'techdocs.generator.mkdocs.defaultPlugins',\n ),\n };\n}\n"],"names":["ScmIntegrations","getMkdocsYml","validateMkdocsYaml","patchMkdocsYmlPreBuild","patchIndexPreBuild","patchMkdocsYmlWithPlugins","runCommand","DockerContainerRunner","ForwardedError","createOrUpdateMetadata","path","storeEtagMetadata"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var errors = require('@backstage/errors');
4
+ var integration = require('@backstage/integration');
5
+ var pluginTechdocsCommon = require('@backstage/plugin-techdocs-common');
6
+ var helpers = require('../../helpers.cjs.js');
7
+
8
+ class DirectoryPreparer {
9
+ scmIntegrations;
10
+ reader;
11
+ /**
12
+ * Returns a directory preparer instance
13
+ * @param config - A backstage config
14
+ * @param options - A directory preparer options containing a logger and reader
15
+ */
16
+ static fromConfig(config, options) {
17
+ return new DirectoryPreparer(config, options.logger, options.reader);
18
+ }
19
+ constructor(config, _logger, reader) {
20
+ this.reader = reader;
21
+ this.scmIntegrations = integration.ScmIntegrations.fromConfig(config);
22
+ }
23
+ /** {@inheritDoc PreparerBase.shouldCleanPreparedDirectory} */
24
+ shouldCleanPreparedDirectory() {
25
+ return false;
26
+ }
27
+ /** {@inheritDoc PreparerBase.prepare} */
28
+ async prepare(entity, options) {
29
+ const annotation = helpers.parseReferenceAnnotation(pluginTechdocsCommon.TECHDOCS_ANNOTATION, entity);
30
+ const { type, target } = helpers.transformDirLocation(
31
+ entity,
32
+ annotation,
33
+ this.scmIntegrations
34
+ );
35
+ switch (type) {
36
+ case "url": {
37
+ options?.logger?.debug(`Reading files from ${target}`);
38
+ const response = await this.reader.readTree(target, {
39
+ etag: options?.etag
40
+ });
41
+ const preparedDir = await response.dir();
42
+ options?.logger?.debug(`Tree downloaded and stored at ${preparedDir}`);
43
+ return {
44
+ preparedDir,
45
+ etag: response.etag
46
+ };
47
+ }
48
+ case "dir": {
49
+ return {
50
+ // the transformation already validated that the target is in a safe location
51
+ preparedDir: target,
52
+ // Instead of supporting caching on local sources, use techdocs-cli for local development and debugging.
53
+ etag: ""
54
+ };
55
+ }
56
+ default:
57
+ throw new errors.InputError(`Unable to resolve location type ${type}`);
58
+ }
59
+ }
60
+ }
61
+
62
+ exports.DirectoryPreparer = DirectoryPreparer;
63
+ //# sourceMappingURL=dir.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir.cjs.js","sources":["../../../src/stages/prepare/dir.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 */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport {\n ScmIntegrationRegistry,\n ScmIntegrations,\n} from '@backstage/integration';\nimport { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common';\nimport { parseReferenceAnnotation, transformDirLocation } from '../../helpers';\nimport {\n PreparerBase,\n PreparerConfig,\n PreparerOptions,\n PreparerResponse,\n} from './types';\nimport { LoggerService, UrlReaderService } from '@backstage/backend-plugin-api';\n\n/**\n * Preparer used to retrieve documentation files from a local directory\n * @public\n */\nexport class DirectoryPreparer implements PreparerBase {\n private readonly scmIntegrations: ScmIntegrationRegistry;\n private readonly reader: UrlReaderService;\n\n /**\n * Returns a directory preparer instance\n * @param config - A backstage config\n * @param options - A directory preparer options containing a logger and reader\n */\n static fromConfig(\n config: Config,\n options: PreparerConfig,\n ): DirectoryPreparer {\n return new DirectoryPreparer(config, options.logger, options.reader);\n }\n\n private constructor(\n config: Config,\n _logger: LoggerService | null,\n reader: UrlReaderService,\n ) {\n this.reader = reader;\n this.scmIntegrations = ScmIntegrations.fromConfig(config);\n }\n\n /** {@inheritDoc PreparerBase.shouldCleanPreparedDirectory} */\n shouldCleanPreparedDirectory() {\n return false;\n }\n\n /** {@inheritDoc PreparerBase.prepare} */\n async prepare(\n entity: Entity,\n options?: PreparerOptions,\n ): Promise<PreparerResponse> {\n const annotation = parseReferenceAnnotation(TECHDOCS_ANNOTATION, entity);\n const { type, target } = transformDirLocation(\n entity,\n annotation,\n this.scmIntegrations,\n );\n\n switch (type) {\n case 'url': {\n options?.logger?.debug(`Reading files from ${target}`);\n // the target is an absolute url since it has already been transformed\n const response = await this.reader.readTree(target, {\n etag: options?.etag,\n });\n const preparedDir = await response.dir();\n\n options?.logger?.debug(`Tree downloaded and stored at ${preparedDir}`);\n\n return {\n preparedDir,\n etag: response.etag,\n };\n }\n\n case 'dir': {\n return {\n // the transformation already validated that the target is in a safe location\n preparedDir: target,\n // Instead of supporting caching on local sources, use techdocs-cli for local development and debugging.\n etag: '',\n };\n }\n\n default:\n throw new InputError(`Unable to resolve location type ${type}`);\n }\n }\n}\n"],"names":["ScmIntegrations","parseReferenceAnnotation","TECHDOCS_ANNOTATION","transformDirLocation","InputError"],"mappings":";;;;;;;AAqCO,MAAM,iBAA0C,CAAA;AAAA,EACpC,eAAA,CAAA;AAAA,EACA,MAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,OAAO,UACL,CAAA,MAAA,EACA,OACmB,EAAA;AACnB,IAAA,OAAO,IAAI,iBAAkB,CAAA,MAAA,EAAQ,OAAQ,CAAA,MAAA,EAAQ,QAAQ,MAAM,CAAA,CAAA;AAAA,GACrE;AAAA,EAEQ,WAAA,CACN,MACA,EAAA,OAAA,EACA,MACA,EAAA;AACA,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAK,IAAA,CAAA,eAAA,GAAkBA,2BAAgB,CAAA,UAAA,CAAW,MAAM,CAAA,CAAA;AAAA,GAC1D;AAAA;AAAA,EAGA,4BAA+B,GAAA;AAC7B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA;AAAA,EAGA,MAAM,OACJ,CAAA,MAAA,EACA,OAC2B,EAAA;AAC3B,IAAM,MAAA,UAAA,GAAaC,gCAAyB,CAAAC,wCAAA,EAAqB,MAAM,CAAA,CAAA;AACvE,IAAM,MAAA,EAAE,IAAM,EAAA,MAAA,EAAW,GAAAC,4BAAA;AAAA,MACvB,MAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAK,CAAA,eAAA;AAAA,KACP,CAAA;AAEA,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,KAAO,EAAA;AACV,QAAA,OAAA,EAAS,MAAQ,EAAA,KAAA,CAAM,CAAsB,mBAAA,EAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAErD,QAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAS,MAAQ,EAAA;AAAA,UAClD,MAAM,OAAS,EAAA,IAAA;AAAA,SAChB,CAAA,CAAA;AACD,QAAM,MAAA,WAAA,GAAc,MAAM,QAAA,CAAS,GAAI,EAAA,CAAA;AAEvC,QAAA,OAAA,EAAS,MAAQ,EAAA,KAAA,CAAM,CAAiC,8BAAA,EAAA,WAAW,CAAE,CAAA,CAAA,CAAA;AAErE,QAAO,OAAA;AAAA,UACL,WAAA;AAAA,UACA,MAAM,QAAS,CAAA,IAAA;AAAA,SACjB,CAAA;AAAA,OACF;AAAA,MAEA,KAAK,KAAO,EAAA;AACV,QAAO,OAAA;AAAA;AAAA,UAEL,WAAa,EAAA,MAAA;AAAA;AAAA,UAEb,IAAM,EAAA,EAAA;AAAA,SACR,CAAA;AAAA,OACF;AAAA,MAEA;AACE,QAAA,MAAM,IAAIC,iBAAA,CAAW,CAAmC,gCAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var pluginTechdocsCommon = require('@backstage/plugin-techdocs-common');
4
+ var helpers = require('../../helpers.cjs.js');
5
+ var dir = require('./dir.cjs.js');
6
+ var url = require('./url.cjs.js');
7
+
8
+ class Preparers {
9
+ preparerMap = /* @__PURE__ */ new Map();
10
+ /**
11
+ * Returns a generators instance containing a generator for TechDocs
12
+ * @public
13
+ * @param backstageConfig - A Backstage configuration
14
+ * @param preparerConfig - Options to configure preparers
15
+ */
16
+ static async fromConfig(backstageConfig, options) {
17
+ const preparers = new Preparers();
18
+ const urlPreparer = url.UrlPreparer.fromConfig({
19
+ reader: options.reader,
20
+ logger: options.logger
21
+ });
22
+ preparers.register("url", urlPreparer);
23
+ const directoryPreparer = dir.DirectoryPreparer.fromConfig(backstageConfig, {
24
+ reader: options.reader,
25
+ logger: options.logger
26
+ });
27
+ preparers.register("dir", directoryPreparer);
28
+ return preparers;
29
+ }
30
+ /**
31
+ * Register a preparer in the preparers collection
32
+ * @param protocol - url or dir to associate with preparer
33
+ * @param preparer - The preparer instance to set
34
+ */
35
+ register(protocol, preparer) {
36
+ this.preparerMap.set(protocol, preparer);
37
+ }
38
+ /**
39
+ * Returns the preparer for a given TechDocs entity
40
+ * @param entity - A TechDocs entity instance
41
+ * @returns
42
+ */
43
+ get(entity) {
44
+ const { type } = helpers.parseReferenceAnnotation(pluginTechdocsCommon.TECHDOCS_ANNOTATION, entity);
45
+ const preparer = this.preparerMap.get(type);
46
+ if (!preparer) {
47
+ throw new Error(`No preparer registered for type: "${type}"`);
48
+ }
49
+ return preparer;
50
+ }
51
+ }
52
+
53
+ exports.Preparers = Preparers;
54
+ //# sourceMappingURL=preparers.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparers.cjs.js","sources":["../../../src/stages/prepare/preparers.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 { Entity } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { TECHDOCS_ANNOTATION } from '@backstage/plugin-techdocs-common';\nimport { parseReferenceAnnotation } from '../../helpers';\nimport { DirectoryPreparer } from './dir';\nimport { UrlPreparer } from './url';\nimport {\n PreparerBase,\n PreparerBuilder,\n PreparerConfig,\n RemoteProtocol,\n} from './types';\n\n/**\n * Collection of docs preparers (dir and url)\n * @public\n */\nexport class Preparers implements PreparerBuilder {\n private preparerMap = new Map<RemoteProtocol, PreparerBase>();\n\n /**\n * Returns a generators instance containing a generator for TechDocs\n * @public\n * @param backstageConfig - A Backstage configuration\n * @param preparerConfig - Options to configure preparers\n */\n static async fromConfig(\n backstageConfig: Config,\n options: PreparerConfig,\n ): Promise<PreparerBuilder> {\n const preparers = new Preparers();\n\n const urlPreparer = UrlPreparer.fromConfig({\n reader: options.reader,\n logger: options.logger,\n });\n preparers.register('url', urlPreparer);\n\n /**\n * Dir preparer is a syntactic sugar for users to define techdocs-ref annotation.\n * When using dir preparer, the docs will be fetched using URL Reader.\n */\n const directoryPreparer = DirectoryPreparer.fromConfig(backstageConfig, {\n reader: options.reader,\n logger: options.logger,\n });\n preparers.register('dir', directoryPreparer);\n\n return preparers;\n }\n\n /**\n * Register a preparer in the preparers collection\n * @param protocol - url or dir to associate with preparer\n * @param preparer - The preparer instance to set\n */\n register(protocol: RemoteProtocol, preparer: PreparerBase) {\n this.preparerMap.set(protocol, preparer);\n }\n\n /**\n * Returns the preparer for a given TechDocs entity\n * @param entity - A TechDocs entity instance\n * @returns\n */\n get(entity: Entity): PreparerBase {\n const { type } = parseReferenceAnnotation(TECHDOCS_ANNOTATION, entity);\n const preparer = this.preparerMap.get(type);\n\n if (!preparer) {\n throw new Error(`No preparer registered for type: \"${type}\"`);\n }\n\n return preparer;\n }\n}\n"],"names":["UrlPreparer","DirectoryPreparer","parseReferenceAnnotation","TECHDOCS_ANNOTATION"],"mappings":";;;;;;;AAgCO,MAAM,SAAqC,CAAA;AAAA,EACxC,WAAA,uBAAkB,GAAkC,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5D,aAAa,UACX,CAAA,eAAA,EACA,OAC0B,EAAA;AAC1B,IAAM,MAAA,SAAA,GAAY,IAAI,SAAU,EAAA,CAAA;AAEhC,IAAM,MAAA,WAAA,GAAcA,gBAAY,UAAW,CAAA;AAAA,MACzC,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KACjB,CAAA,CAAA;AACD,IAAU,SAAA,CAAA,QAAA,CAAS,OAAO,WAAW,CAAA,CAAA;AAMrC,IAAM,MAAA,iBAAA,GAAoBC,qBAAkB,CAAA,UAAA,CAAW,eAAiB,EAAA;AAAA,MACtE,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KACjB,CAAA,CAAA;AACD,IAAU,SAAA,CAAA,QAAA,CAAS,OAAO,iBAAiB,CAAA,CAAA;AAE3C,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CAAS,UAA0B,QAAwB,EAAA;AACzD,IAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AAAA,GACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAA8B,EAAA;AAChC,IAAA,MAAM,EAAE,IAAA,EAAS,GAAAC,gCAAA,CAAyBC,0CAAqB,MAAM,CAAA,CAAA;AACrE,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAE1C,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAqC,kCAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KAC9D;AAEA,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AACF;;;;"}
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var errors = require('@backstage/errors');
4
+ var helpers = require('../../helpers.cjs.js');
5
+
6
+ class UrlPreparer {
7
+ logger;
8
+ reader;
9
+ /**
10
+ * Returns a directory preparer instance
11
+ * @param config - A URL preparer config containing the a logger and reader
12
+ */
13
+ static fromConfig(options) {
14
+ return new UrlPreparer(options.reader, options.logger);
15
+ }
16
+ constructor(reader, logger) {
17
+ this.logger = logger;
18
+ this.reader = reader;
19
+ }
20
+ /** {@inheritDoc PreparerBase.shouldCleanPreparedDirectory} */
21
+ shouldCleanPreparedDirectory() {
22
+ return true;
23
+ }
24
+ /** {@inheritDoc PreparerBase.prepare} */
25
+ async prepare(entity, options) {
26
+ try {
27
+ return await helpers.getDocFilesFromRepository(this.reader, entity, {
28
+ etag: options?.etag,
29
+ logger: this.logger
30
+ });
31
+ } catch (error) {
32
+ errors.assertError(error);
33
+ if (error.name === "NotModifiedError") {
34
+ this.logger.debug(`Cache is valid for etag ${options?.etag}`);
35
+ } else {
36
+ this.logger.debug(
37
+ `Unable to fetch files for building docs ${error.message}`
38
+ );
39
+ }
40
+ throw error;
41
+ }
42
+ }
43
+ }
44
+
45
+ exports.UrlPreparer = UrlPreparer;
46
+ //# sourceMappingURL=url.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.cjs.js","sources":["../../../src/stages/prepare/url.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 */\n\nimport { assertError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { getDocFilesFromRepository } from '../../helpers';\nimport {\n PreparerBase,\n PreparerConfig,\n PreparerOptions,\n PreparerResponse,\n} from './types';\nimport { LoggerService, UrlReaderService } from '@backstage/backend-plugin-api';\n\n/**\n * Preparer used to retrieve documentation files from a remote repository\n * @public\n */\nexport class UrlPreparer implements PreparerBase {\n private readonly logger: LoggerService;\n private readonly reader: UrlReaderService;\n\n /**\n * Returns a directory preparer instance\n * @param config - A URL preparer config containing the a logger and reader\n */\n static fromConfig(options: PreparerConfig): UrlPreparer {\n return new UrlPreparer(options.reader, options.logger);\n }\n\n private constructor(reader: UrlReaderService, logger: LoggerService) {\n this.logger = logger;\n this.reader = reader;\n }\n\n /** {@inheritDoc PreparerBase.shouldCleanPreparedDirectory} */\n shouldCleanPreparedDirectory() {\n return true;\n }\n\n /** {@inheritDoc PreparerBase.prepare} */\n async prepare(\n entity: Entity,\n options?: PreparerOptions,\n ): Promise<PreparerResponse> {\n try {\n return await getDocFilesFromRepository(this.reader, entity, {\n etag: options?.etag,\n logger: this.logger,\n });\n } catch (error) {\n assertError(error);\n // NotModifiedError means that etag based cache is still valid.\n if (error.name === 'NotModifiedError') {\n this.logger.debug(`Cache is valid for etag ${options?.etag}`);\n } else {\n this.logger.debug(\n `Unable to fetch files for building docs ${error.message}`,\n );\n }\n\n throw error;\n }\n }\n}\n"],"names":["getDocFilesFromRepository","assertError"],"mappings":";;;;;AA+BO,MAAM,WAAoC,CAAA;AAAA,EAC9B,MAAA,CAAA;AAAA,EACA,MAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,OAAO,WAAW,OAAsC,EAAA;AACtD,IAAA,OAAO,IAAI,WAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,QAAQ,MAAM,CAAA,CAAA;AAAA,GACvD;AAAA,EAEQ,WAAA,CAAY,QAA0B,MAAuB,EAAA;AACnE,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAAA,GAChB;AAAA;AAAA,EAGA,4BAA+B,GAAA;AAC7B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA;AAAA,EAGA,MAAM,OACJ,CAAA,MAAA,EACA,OAC2B,EAAA;AAC3B,IAAI,IAAA;AACF,MAAA,OAAO,MAAMA,iCAAA,CAA0B,IAAK,CAAA,MAAA,EAAQ,MAAQ,EAAA;AAAA,QAC1D,MAAM,OAAS,EAAA,IAAA;AAAA,QACf,QAAQ,IAAK,CAAA,MAAA;AAAA,OACd,CAAA,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAAC,kBAAA,CAAY,KAAK,CAAA,CAAA;AAEjB,MAAI,IAAA,KAAA,CAAM,SAAS,kBAAoB,EAAA;AACrC,QAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAA2B,wBAAA,EAAA,OAAA,EAAS,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,OACvD,MAAA;AACL,QAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,UACV,CAAA,wCAAA,EAA2C,MAAM,OAAO,CAAA,CAAA;AAAA,SAC1D,CAAA;AAAA,OACF;AAEA,MAAM,MAAA,KAAA,CAAA;AAAA,KACR;AAAA,GACF;AACF;;;;"}