@backstage/backend-defaults 0.15.1 → 0.15.2
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 +50 -6
- package/config.d.ts +26 -0
- package/dist/PackageDiscoveryService.cjs.js +1 -1
- package/dist/PackageDiscoveryService.cjs.js.map +1 -1
- package/dist/entrypoints/auth/helpers.cjs.js +2 -2
- package/dist/entrypoints/auth/helpers.cjs.js.map +1 -1
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js +2 -2
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js.map +1 -1
- package/dist/entrypoints/cache/CacheClient.cjs.js +2 -2
- package/dist/entrypoints/cache/CacheClient.cjs.js.map +1 -1
- package/dist/entrypoints/cache/providers/infinispan/InfinispanKeyvStore.cjs.js +2 -2
- package/dist/entrypoints/cache/providers/infinispan/InfinispanKeyvStore.cjs.js.map +1 -1
- package/dist/entrypoints/database/connectors/postgres.cjs.js +191 -157
- package/dist/entrypoints/database/connectors/postgres.cjs.js.map +1 -1
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js +1 -1
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js.map +1 -1
- package/dist/entrypoints/discovery/SrvResolvers.cjs.js +2 -2
- package/dist/entrypoints/discovery/SrvResolvers.cjs.js.map +1 -1
- package/dist/entrypoints/httpRouter/http/createRateLimitMiddleware.cjs.js.map +1 -1
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js +4 -4
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js +2 -2
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js.map +1 -1
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js +2 -2
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js.map +1 -1
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js +1 -1
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js +4 -4
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js +6 -6
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.cjs.js +3 -3
- package/dist/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js +1 -1
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js +2 -2
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js +2 -2
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js +2 -2
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js +2 -2
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js +1 -1
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js +3 -3
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js +2 -2
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js +25 -7
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js +30 -13
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js +3 -3
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/util.cjs.js +3 -3
- package/dist/entrypoints/urlReader/lib/util.cjs.js.map +1 -1
- package/dist/httpRouter.cjs.js +2 -0
- package/dist/httpRouter.cjs.js.map +1 -1
- package/dist/httpRouter.d.ts +10 -1
- package/dist/package.json.cjs.js +1 -1
- package/dist/rootHttpRouter.d.ts +2 -3
- package/dist/urlReader.d.ts +1 -1
- package/package.json +16 -15
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js +0 -12
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TarArchiveResponse.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/TarArchiveResponse.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 {\n isChildPath,\n UrlReaderServiceReadTreeResponse,\n UrlReaderServiceReadTreeResponseDirOptions,\n UrlReaderServiceReadTreeResponseFile,\n} from '@backstage/backend-plugin-api';\nimport concatStream from 'concat-stream';\nimport fs from 'fs-extra';\nimport platformPath from 'path';\nimport { pipeline as pipelineCb, Readable } from 'stream';\nimport tar, { FileStat, Parse, ParseStream, ReadEntry } from 'tar';\nimport { promisify } from 'util';\nimport { stripFirstDirectoryFromPath } from './util';\n\n// Tar types for `Parse` is not a proper constructor, but it should be\nconst TarParseStream = Parse as unknown as { new (): ParseStream };\n\nconst pipeline = promisify(pipelineCb);\n\n/**\n * Wraps a tar archive stream into a tree response reader.\n */\nexport class TarArchiveResponse implements UrlReaderServiceReadTreeResponse {\n private read = false;\n private readonly stream: Readable;\n private readonly subPath: string;\n private readonly workDir: string;\n public readonly etag: string;\n private readonly filter?: (path: string, info: { size: number }) => boolean;\n private readonly stripFirstDirectory: boolean;\n\n constructor(\n stream: Readable,\n subPath: string,\n workDir: string,\n etag: string,\n filter?: (path: string, info: { size: number }) => boolean,\n stripFirstDirectory: boolean = true,\n ) {\n this.stream = stream;\n this.subPath = subPath;\n this.workDir = workDir;\n this.etag = etag;\n this.filter = filter;\n this.stripFirstDirectory = stripFirstDirectory;\n if (subPath) {\n if (!subPath.endsWith('/')) {\n this.subPath += '/';\n }\n if (subPath.startsWith('/')) {\n throw new TypeError(\n `TarArchiveResponse subPath must not start with a /, got '${subPath}'`,\n );\n }\n }\n\n this.etag = etag;\n }\n\n // Make sure the input stream is only read once\n private onlyOnce() {\n if (this.read) {\n throw new Error('Response has already been read');\n }\n this.read = true;\n }\n\n async files(): Promise<UrlReaderServiceReadTreeResponseFile[]> {\n this.onlyOnce();\n\n const files = Array<UrlReaderServiceReadTreeResponseFile>();\n const parser = new TarParseStream();\n\n parser.on('entry', (entry: ReadEntry & Readable) => {\n if (entry.type === 'Directory') {\n entry.resume();\n return;\n }\n\n // File path relative to the root extracted directory. Will remove the\n // top level dir name from the path since its name is hard to predetermine.\n const relativePath = this.stripFirstDirectory\n ? stripFirstDirectoryFromPath(entry.path)\n : entry.path;\n\n if (this.subPath) {\n if (!relativePath.startsWith(this.subPath)) {\n entry.resume();\n return;\n }\n }\n\n const path = relativePath.slice(this.subPath.length);\n if (this.filter) {\n if (!this.filter(path, { size: entry.remain })) {\n entry.resume();\n return;\n }\n }\n\n const content = new Promise<Buffer>(async resolve => {\n await pipeline(entry, concatStream(resolve));\n });\n\n files.push({\n path,\n content: () => content,\n });\n\n entry.resume();\n });\n\n await pipeline(this.stream, parser);\n\n return files;\n }\n\n async archive(): Promise<Readable> {\n if (!this.subPath) {\n this.onlyOnce();\n\n return this.stream;\n }\n\n // TODO(Rugvip): method for repacking a tar with a subpath is to simply extract into a\n // tmp dir and recreate the archive. Would be nicer to stream things instead.\n const tmpDir = await this.dir();\n\n try {\n const data = await new Promise<Buffer>(async resolve => {\n await pipeline(\n tar.create({ cwd: tmpDir }, ['']),\n concatStream(resolve),\n );\n });\n return Readable.from(data);\n } finally {\n await fs.remove(tmpDir);\n }\n }\n\n async dir(\n options?: UrlReaderServiceReadTreeResponseDirOptions,\n ): Promise<string> {\n this.onlyOnce();\n\n const dir =\n options?.targetDir ??\n (await fs.mkdtemp(platformPath.join(this.workDir, 'backstage-')));\n\n // Equivalent of tar --strip-components=N\n // When no subPath is given, remove just 1 top level directory\n let strip = this.subPath ? this.subPath.split('/').length : 1;\n if (!this.stripFirstDirectory) {\n strip--;\n }\n\n let filterError: Error | undefined = undefined;\n await pipeline(\n this.stream,\n tar.extract({\n strip,\n cwd: dir,\n filter: (path, stat) => {\n // Filter errors will short-circuit the rest of the filtering and then throw\n if (filterError) {\n return false;\n }\n\n // Block symlinks/hardlinks that escape the extraction directory\n const entry = stat as FileStat & { type?: string; linkpath?: string };\n if (\n (entry.type === 'SymbolicLink' || entry.type === 'Link') &&\n entry.linkpath\n ) {\n const strippedPath = path.split('/').slice(strip).join('/');\n const linkDir = platformPath.dirname(\n platformPath.join(dir, strippedPath),\n );\n const targetPath = platformPath.resolve(linkDir, entry.linkpath);\n if (!isChildPath(dir, targetPath)) {\n return false;\n }\n }\n\n // File path relative to the root extracted directory. Will remove the\n // top level dir name from the path since its name is hard to predetermine.\n const relativePath = this.stripFirstDirectory\n ? stripFirstDirectoryFromPath(path)\n : path;\n if (this.subPath && !relativePath.startsWith(this.subPath)) {\n return false;\n }\n if (this.filter) {\n const innerPath = path.split('/').slice(strip).join('/');\n try {\n return this.filter(innerPath, { size: stat.size });\n } catch (error) {\n filterError = error;\n return false;\n }\n }\n return true;\n },\n }),\n );\n\n if (filterError) {\n // If the dir was provided we don't want to remove it, but if it wasn't it means\n // we created a temporary directory and we should remove it.\n if (!options?.targetDir) {\n await fs.remove(dir).catch(() => {});\n }\n throw filterError;\n }\n\n return dir;\n }\n}\n"],"names":["Parse","promisify","pipelineCb","stripFirstDirectoryFromPath","concatStream","tar","Readable","fs","platformPath","isChildPath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TarArchiveResponse.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/TarArchiveResponse.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 {\n isChildPath,\n UrlReaderServiceReadTreeResponse,\n UrlReaderServiceReadTreeResponseDirOptions,\n UrlReaderServiceReadTreeResponseFile,\n} from '@backstage/backend-plugin-api';\nimport concatStream from 'concat-stream';\nimport fs from 'fs-extra';\nimport platformPath from 'node:path';\nimport { pipeline as pipelineCb, Readable } from 'node:stream';\nimport * as tar from 'tar';\nimport type { ReadEntry } from 'tar';\nimport { promisify } from 'node:util';\nimport { stripFirstDirectoryFromPath } from './util';\n\nconst pipeline = promisify(pipelineCb);\n\n/**\n * Wraps a tar archive stream into a tree response reader.\n */\nexport class TarArchiveResponse implements UrlReaderServiceReadTreeResponse {\n private read = false;\n private readonly stream: Readable;\n private readonly subPath: string;\n private readonly workDir: string;\n public readonly etag: string;\n private readonly filter?: (path: string, info: { size: number }) => boolean;\n private readonly stripFirstDirectory: boolean;\n\n constructor(\n stream: Readable,\n subPath: string,\n workDir: string,\n etag: string,\n filter?: (path: string, info: { size: number }) => boolean,\n stripFirstDirectory: boolean = true,\n ) {\n this.stream = stream;\n this.subPath = subPath;\n this.workDir = workDir;\n this.etag = etag;\n this.filter = filter;\n this.stripFirstDirectory = stripFirstDirectory;\n if (subPath) {\n if (!subPath.endsWith('/')) {\n this.subPath += '/';\n }\n if (subPath.startsWith('/')) {\n throw new TypeError(\n `TarArchiveResponse subPath must not start with a /, got '${subPath}'`,\n );\n }\n }\n\n this.etag = etag;\n }\n\n // Make sure the input stream is only read once\n private onlyOnce() {\n if (this.read) {\n throw new Error('Response has already been read');\n }\n this.read = true;\n }\n\n async files(): Promise<UrlReaderServiceReadTreeResponseFile[]> {\n this.onlyOnce();\n\n const files = Array<UrlReaderServiceReadTreeResponseFile>();\n const parser = new tar.Parser();\n\n parser.on('entry', (entry: ReadEntry & Readable) => {\n if (entry.type === 'Directory') {\n entry.resume();\n return;\n }\n\n // File path relative to the root extracted directory. Will remove the\n // top level dir name from the path since its name is hard to predetermine.\n const relativePath = this.stripFirstDirectory\n ? stripFirstDirectoryFromPath(entry.path)\n : entry.path;\n\n if (this.subPath) {\n if (!relativePath.startsWith(this.subPath)) {\n entry.resume();\n return;\n }\n }\n\n const path = relativePath.slice(this.subPath.length);\n if (this.filter) {\n if (!this.filter(path, { size: entry.remain })) {\n entry.resume();\n return;\n }\n }\n\n const content = new Promise<Buffer>(async resolve => {\n await pipeline(entry, concatStream(resolve));\n });\n\n files.push({\n path,\n content: () => content,\n });\n\n entry.resume();\n });\n\n await pipeline(this.stream, parser);\n\n return files;\n }\n\n async archive(): Promise<Readable> {\n if (!this.subPath) {\n this.onlyOnce();\n\n return this.stream;\n }\n\n // TODO(Rugvip): method for repacking a tar with a subpath is to simply extract into a\n // tmp dir and recreate the archive. Would be nicer to stream things instead.\n const tmpDir = await this.dir();\n\n try {\n const data = await new Promise<Buffer>(async resolve => {\n await pipeline(\n tar.create({ cwd: tmpDir }, ['']),\n concatStream(resolve),\n );\n });\n return Readable.from(data);\n } finally {\n await fs.remove(tmpDir);\n }\n }\n\n async dir(\n options?: UrlReaderServiceReadTreeResponseDirOptions,\n ): Promise<string> {\n this.onlyOnce();\n\n const dir =\n options?.targetDir ??\n (await fs.mkdtemp(platformPath.join(this.workDir, 'backstage-')));\n\n // Equivalent of tar --strip-components=N\n // When no subPath is given, remove just 1 top level directory\n let strip = this.subPath ? this.subPath.split('/').length : 1;\n if (!this.stripFirstDirectory) {\n strip--;\n }\n\n let filterError: Error | undefined = undefined;\n await pipeline(\n this.stream,\n tar.extract({\n strip,\n cwd: dir,\n filter: (path, stat) => {\n // Filter errors will short-circuit the rest of the filtering and then throw\n if (filterError) {\n return false;\n }\n\n // Block symlinks/hardlinks that escape the extraction directory\n const entry = stat as ReadEntry;\n if (\n (entry.type === 'SymbolicLink' || entry.type === 'Link') &&\n entry.linkpath\n ) {\n const strippedPath = path.split('/').slice(strip).join('/');\n const linkDir = platformPath.dirname(\n platformPath.join(dir, strippedPath),\n );\n const targetPath = platformPath.resolve(linkDir, entry.linkpath);\n if (!isChildPath(dir, targetPath)) {\n return false;\n }\n }\n\n // File path relative to the root extracted directory. Will remove the\n // top level dir name from the path since its name is hard to predetermine.\n const relativePath = this.stripFirstDirectory\n ? stripFirstDirectoryFromPath(path)\n : path;\n if (this.subPath && !relativePath.startsWith(this.subPath)) {\n return false;\n }\n if (this.filter) {\n const innerPath = path.split('/').slice(strip).join('/');\n try {\n return this.filter(innerPath, { size: stat.size });\n } catch (error) {\n filterError = error;\n return false;\n }\n }\n return true;\n },\n }),\n );\n\n if (filterError) {\n // If the dir was provided we don't want to remove it, but if it wasn't it means\n // we created a temporary directory and we should remove it.\n if (!options?.targetDir) {\n await fs.remove(dir).catch(() => {});\n }\n throw filterError;\n }\n\n return dir;\n }\n}\n"],"names":["promisify","pipelineCb","tar","stripFirstDirectoryFromPath","concatStream","Readable","fs","platformPath","isChildPath"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var archiver = require('archiver');
|
|
4
4
|
var yauzl = require('yauzl');
|
|
5
5
|
var fs = require('fs-extra');
|
|
6
|
-
var platformPath = require('path');
|
|
6
|
+
var platformPath = require('node:path');
|
|
7
7
|
var util = require('./util.cjs.js');
|
|
8
8
|
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZipArchiveResponse.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.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 {\n UrlReaderServiceReadTreeResponse,\n UrlReaderServiceReadTreeResponseDirOptions,\n UrlReaderServiceReadTreeResponseFile,\n} from '@backstage/backend-plugin-api';\nimport archiver from 'archiver';\nimport yauzl, { Entry } from 'yauzl';\nimport fs from 'fs-extra';\nimport platformPath from 'path';\nimport { Readable } from 'stream';\nimport { streamToBuffer } from './util';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\n\n/**\n * Wraps a zip archive stream into a tree response reader.\n */\nexport class ZipArchiveResponse implements UrlReaderServiceReadTreeResponse {\n private read = false;\n private readonly stream: Readable;\n private readonly subPath: string;\n private readonly workDir: string;\n public readonly etag: string;\n private readonly filter?: (path: string, info: { size: number }) => boolean;\n\n constructor(\n stream: Readable,\n subPath: string,\n workDir: string,\n etag: string,\n filter?: (path: string, info: { size: number }) => boolean,\n ) {\n this.stream = stream;\n this.subPath = subPath;\n this.workDir = workDir;\n this.etag = etag;\n this.filter = filter;\n if (subPath) {\n if (!subPath.endsWith('/')) {\n this.subPath += '/';\n }\n if (subPath.startsWith('/')) {\n throw new TypeError(\n `ZipArchiveResponse subPath must not start with a /, got '${subPath}'`,\n );\n }\n }\n\n this.etag = etag;\n }\n\n // Make sure the input stream is only read once\n private onlyOnce() {\n if (this.read) {\n throw new Error('Response has already been read');\n }\n this.read = true;\n }\n\n // File path relative to the root extracted directory or a sub directory if subpath is set.\n private getInnerPath(path: string): string {\n return path.slice(this.subPath.length);\n }\n\n private shouldBeIncluded(entry: Entry): boolean {\n if (this.subPath) {\n if (!entry.fileName.startsWith(this.subPath)) {\n return false;\n }\n }\n if (this.filter) {\n return this.filter(this.getInnerPath(entry.fileName), {\n size: entry.uncompressedSize,\n });\n }\n return true;\n }\n\n private async streamToTemporaryFile(\n stream: Readable,\n ): Promise<{ fileName: string; cleanup: () => Promise<void> }> {\n const tmpDir = await fs.mkdtemp(\n platformPath.join(this.workDir, 'backstage-tmp'),\n );\n const tmpFile = platformPath.join(tmpDir, 'tmp.zip');\n\n const writeStream = fs.createWriteStream(tmpFile);\n\n return new Promise((resolve, reject) => {\n writeStream.on('error', reject);\n writeStream.on('finish', () => {\n writeStream.end();\n resolve({\n fileName: tmpFile,\n cleanup: () => fs.rm(tmpDir, { recursive: true }),\n });\n });\n stream.pipe(writeStream);\n });\n }\n\n private forEveryZipEntry(\n zip: string,\n callback: (entry: Entry, content: Readable) => Promise<void>,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(zip, { lazyEntries: true }, (err, zipfile) => {\n if (err || !zipfile) {\n reject(err || new Error(`Failed to open zip file ${zip}`));\n return;\n }\n\n zipfile.on('entry', async (entry: Entry) => {\n // Check that the file is not a directory, and that is matches the filter.\n if (!entry.fileName.endsWith('/') && this.shouldBeIncluded(entry)) {\n zipfile.openReadStream(entry, async (openErr, readStream) => {\n if (openErr || !readStream) {\n reject(\n openErr ||\n new Error(`Failed to open zip entry ${entry.fileName}`),\n );\n return;\n }\n\n await callback(entry, readStream);\n zipfile.readEntry();\n });\n } else {\n zipfile.readEntry();\n }\n });\n zipfile.once('end', () => resolve());\n zipfile.on('error', e => reject(e));\n zipfile.readEntry();\n });\n });\n }\n\n async files(): Promise<UrlReaderServiceReadTreeResponseFile[]> {\n this.onlyOnce();\n const files = Array<UrlReaderServiceReadTreeResponseFile>();\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n files.push({\n path: this.getInnerPath(entry.fileName),\n content: async () => await streamToBuffer(content),\n lastModifiedAt: entry.lastModFileTime\n ? new Date(entry.lastModFileTime)\n : undefined,\n });\n });\n\n await temporary.cleanup();\n\n return files;\n }\n\n async archive(): Promise<Readable> {\n this.onlyOnce();\n\n if (!this.subPath) {\n return this.stream;\n }\n\n const archive = archiver('zip');\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n archive.append(await streamToBuffer(content), {\n name: this.getInnerPath(entry.fileName),\n });\n });\n\n archive.finalize();\n\n await temporary.cleanup();\n\n return archive;\n }\n\n async dir(\n options?: UrlReaderServiceReadTreeResponseDirOptions,\n ): Promise<string> {\n this.onlyOnce();\n const dir =\n options?.targetDir ??\n (await fs.mkdtemp(platformPath.join(this.workDir, 'backstage-')));\n\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n const entryPath = this.getInnerPath(entry.fileName);\n const dirname = platformPath.dirname(entryPath);\n\n if (dirname) {\n await fs.mkdirp(resolveSafeChildPath(dir, dirname));\n }\n return new Promise(async (resolve, reject) => {\n const file = fs.createWriteStream(resolveSafeChildPath(dir, entryPath));\n file.on('finish', resolve);\n\n content.on('error', reject);\n content.pipe(file);\n });\n });\n\n await temporary.cleanup();\n\n return dir;\n }\n}\n"],"names":["fs","platformPath","yauzl","streamToBuffer","archiver","resolveSafeChildPath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ZipArchiveResponse.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.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 {\n UrlReaderServiceReadTreeResponse,\n UrlReaderServiceReadTreeResponseDirOptions,\n UrlReaderServiceReadTreeResponseFile,\n} from '@backstage/backend-plugin-api';\nimport archiver from 'archiver';\nimport yauzl, { Entry } from 'yauzl';\nimport fs from 'fs-extra';\nimport platformPath from 'node:path';\nimport { Readable } from 'node:stream';\nimport { streamToBuffer } from './util';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\n\n/**\n * Wraps a zip archive stream into a tree response reader.\n */\nexport class ZipArchiveResponse implements UrlReaderServiceReadTreeResponse {\n private read = false;\n private readonly stream: Readable;\n private readonly subPath: string;\n private readonly workDir: string;\n public readonly etag: string;\n private readonly filter?: (path: string, info: { size: number }) => boolean;\n\n constructor(\n stream: Readable,\n subPath: string,\n workDir: string,\n etag: string,\n filter?: (path: string, info: { size: number }) => boolean,\n ) {\n this.stream = stream;\n this.subPath = subPath;\n this.workDir = workDir;\n this.etag = etag;\n this.filter = filter;\n if (subPath) {\n if (!subPath.endsWith('/')) {\n this.subPath += '/';\n }\n if (subPath.startsWith('/')) {\n throw new TypeError(\n `ZipArchiveResponse subPath must not start with a /, got '${subPath}'`,\n );\n }\n }\n\n this.etag = etag;\n }\n\n // Make sure the input stream is only read once\n private onlyOnce() {\n if (this.read) {\n throw new Error('Response has already been read');\n }\n this.read = true;\n }\n\n // File path relative to the root extracted directory or a sub directory if subpath is set.\n private getInnerPath(path: string): string {\n return path.slice(this.subPath.length);\n }\n\n private shouldBeIncluded(entry: Entry): boolean {\n if (this.subPath) {\n if (!entry.fileName.startsWith(this.subPath)) {\n return false;\n }\n }\n if (this.filter) {\n return this.filter(this.getInnerPath(entry.fileName), {\n size: entry.uncompressedSize,\n });\n }\n return true;\n }\n\n private async streamToTemporaryFile(\n stream: Readable,\n ): Promise<{ fileName: string; cleanup: () => Promise<void> }> {\n const tmpDir = await fs.mkdtemp(\n platformPath.join(this.workDir, 'backstage-tmp'),\n );\n const tmpFile = platformPath.join(tmpDir, 'tmp.zip');\n\n const writeStream = fs.createWriteStream(tmpFile);\n\n return new Promise((resolve, reject) => {\n writeStream.on('error', reject);\n writeStream.on('finish', () => {\n writeStream.end();\n resolve({\n fileName: tmpFile,\n cleanup: () => fs.rm(tmpDir, { recursive: true }),\n });\n });\n stream.pipe(writeStream);\n });\n }\n\n private forEveryZipEntry(\n zip: string,\n callback: (entry: Entry, content: Readable) => Promise<void>,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(zip, { lazyEntries: true }, (err, zipfile) => {\n if (err || !zipfile) {\n reject(err || new Error(`Failed to open zip file ${zip}`));\n return;\n }\n\n zipfile.on('entry', async (entry: Entry) => {\n // Check that the file is not a directory, and that is matches the filter.\n if (!entry.fileName.endsWith('/') && this.shouldBeIncluded(entry)) {\n zipfile.openReadStream(entry, async (openErr, readStream) => {\n if (openErr || !readStream) {\n reject(\n openErr ||\n new Error(`Failed to open zip entry ${entry.fileName}`),\n );\n return;\n }\n\n await callback(entry, readStream);\n zipfile.readEntry();\n });\n } else {\n zipfile.readEntry();\n }\n });\n zipfile.once('end', () => resolve());\n zipfile.on('error', e => reject(e));\n zipfile.readEntry();\n });\n });\n }\n\n async files(): Promise<UrlReaderServiceReadTreeResponseFile[]> {\n this.onlyOnce();\n const files = Array<UrlReaderServiceReadTreeResponseFile>();\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n files.push({\n path: this.getInnerPath(entry.fileName),\n content: async () => await streamToBuffer(content),\n lastModifiedAt: entry.lastModFileTime\n ? new Date(entry.lastModFileTime)\n : undefined,\n });\n });\n\n await temporary.cleanup();\n\n return files;\n }\n\n async archive(): Promise<Readable> {\n this.onlyOnce();\n\n if (!this.subPath) {\n return this.stream;\n }\n\n const archive = archiver('zip');\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n archive.append(await streamToBuffer(content), {\n name: this.getInnerPath(entry.fileName),\n });\n });\n\n archive.finalize();\n\n await temporary.cleanup();\n\n return archive;\n }\n\n async dir(\n options?: UrlReaderServiceReadTreeResponseDirOptions,\n ): Promise<string> {\n this.onlyOnce();\n const dir =\n options?.targetDir ??\n (await fs.mkdtemp(platformPath.join(this.workDir, 'backstage-')));\n\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n const entryPath = this.getInnerPath(entry.fileName);\n const dirname = platformPath.dirname(entryPath);\n\n if (dirname) {\n await fs.mkdirp(resolveSafeChildPath(dir, dirname));\n }\n return new Promise(async (resolve, reject) => {\n const file = fs.createWriteStream(resolveSafeChildPath(dir, entryPath));\n file.on('finish', resolve);\n\n content.on('error', reject);\n content.pipe(file);\n });\n });\n\n await temporary.cleanup();\n\n return dir;\n }\n}\n"],"names":["fs","platformPath","yauzl","streamToBuffer","archiver","resolveSafeChildPath"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var node_stream = require('node:stream');
|
|
4
|
+
var node_util = require('node:util');
|
|
5
5
|
var concatStream = require('concat-stream');
|
|
6
6
|
|
|
7
7
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
8
|
|
|
9
9
|
var concatStream__default = /*#__PURE__*/_interopDefaultCompat(concatStream);
|
|
10
10
|
|
|
11
|
-
const pipeline =
|
|
11
|
+
const pipeline = node_util.promisify(node_stream.pipeline);
|
|
12
12
|
const directoryNameRegex = /^[^\/]+\//;
|
|
13
13
|
function stripFirstDirectoryFromPath(path) {
|
|
14
14
|
return path.replace(directoryNameRegex, "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/util.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 { Readable, pipeline as pipelineCb } from 'stream';\nimport { promisify } from 'util';\nimport concatStream from 'concat-stream';\n\nconst pipeline = promisify(pipelineCb);\n\n// Matches a directory name + one `/` at the start of any string,\n// containing any character except `/` one or more times, and ending with a `/`\n// e.g. Will match `dirA/` in `dirA/dirB/file.ext`\nconst directoryNameRegex = /^[^\\/]+\\//;\n// Removes the first segment of a forward-slash-separated path\nexport function stripFirstDirectoryFromPath(path: string): string {\n return path.replace(directoryNameRegex, '');\n}\n\n// Collect the stream into a buffer and return\nexport const streamToBuffer = (stream: Readable): Promise<Buffer> => {\n return new Promise(async (resolve, reject) => {\n try {\n await pipeline(stream, concatStream(resolve));\n } catch (ex) {\n reject(ex);\n }\n });\n};\n"],"names":["promisify","pipelineCb","concatStream"],"mappings":";;;;;;;;;;AAoBA,MAAM,QAAA,GAAWA,
|
|
1
|
+
{"version":3,"file":"util.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/util.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 { Readable, pipeline as pipelineCb } from 'node:stream';\nimport { promisify } from 'node:util';\nimport concatStream from 'concat-stream';\n\nconst pipeline = promisify(pipelineCb);\n\n// Matches a directory name + one `/` at the start of any string,\n// containing any character except `/` one or more times, and ending with a `/`\n// e.g. Will match `dirA/` in `dirA/dirB/file.ext`\nconst directoryNameRegex = /^[^\\/]+\\//;\n// Removes the first segment of a forward-slash-separated path\nexport function stripFirstDirectoryFromPath(path: string): string {\n return path.replace(directoryNameRegex, '');\n}\n\n// Collect the stream into a buffer and return\nexport const streamToBuffer = (stream: Readable): Promise<Buffer> => {\n return new Promise(async (resolve, reject) => {\n try {\n await pipeline(stream, concatStream(resolve));\n } catch (ex) {\n reject(ex);\n }\n });\n};\n"],"names":["promisify","pipelineCb","concatStream"],"mappings":";;;;;;;;;;AAoBA,MAAM,QAAA,GAAWA,oBAAUC,oBAAU,CAAA;AAKrC,MAAM,kBAAA,GAAqB,WAAA;AAEpB,SAAS,4BAA4B,IAAA,EAAsB;AAChE,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAC5C;AAGO,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAsC;AACnE,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS,MAAA,KAAW;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,MAAA,EAAQC,6BAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IAC9C,SAAS,EAAA,EAAI;AACX,MAAA,MAAA,CAAO,EAAE,CAAA;AAAA,IACX;AAAA,EACF,CAAC,CAAA;AACH;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var web = require('stream/web');
|
|
3
|
+
var node_stream = require('node:stream');
|
|
4
|
+
var web = require('node:stream/web');
|
|
5
5
|
|
|
6
6
|
function parseLastModified(value) {
|
|
7
7
|
if (!value) {
|
|
@@ -16,7 +16,7 @@ function parseLastModified(value) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
function responseToReadable(response) {
|
|
19
|
-
return response.body ?
|
|
19
|
+
return response.body ? node_stream.Readable.from(toWeb(response.body)) : new node_stream.PassThrough().end();
|
|
20
20
|
}
|
|
21
21
|
function toWeb(responseBody) {
|
|
22
22
|
const reader = responseBody.getReader();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.cjs.js","sources":["../../../../src/entrypoints/urlReader/lib/util.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { PassThrough, Readable } from 'stream';\nimport { ReadableStream as WebReadableStream } from 'stream/web';\n\nexport function parseLastModified(\n value: string | null | undefined,\n): Date | undefined {\n if (!value) {\n return undefined;\n }\n\n try {\n const result = new Date(value);\n result.toISOString(); // triggers exception if input was invalid\n return result;\n } catch {\n return undefined;\n }\n}\n\nexport function responseToReadable(response: Response): Readable {\n return response.body\n ? Readable.from(toWeb(response.body))\n : new PassThrough().end();\n}\n\n// The NodeJS ReadableStream is that fetch returns is super basic and not even\n// iterable. This function converts it to the smarter, iterable stream/web\n// variant instead.\nexport function toWeb(\n responseBody: ReadableStream<Uint8Array>,\n): WebReadableStream<Uint8Array> {\n const reader = responseBody.getReader();\n return new WebReadableStream({\n async pull(controller) {\n const { value, done } = await reader.read();\n if (value) {\n controller.enqueue(value);\n }\n if (done) {\n controller.close();\n }\n },\n });\n}\n"],"names":["Readable","PassThrough","WebReadableStream"],"mappings":";;;;;AAmBO,SAAS,kBACd,KAAA,EACkB;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAC7B,IAAA,MAAA,CAAO,WAAA,EAAY;AACnB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,QAAA,EAA8B;AAC/D,EAAA,OAAO,QAAA,CAAS,IAAA,GACZA,
|
|
1
|
+
{"version":3,"file":"util.cjs.js","sources":["../../../../src/entrypoints/urlReader/lib/util.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { PassThrough, Readable } from 'node:stream';\nimport { ReadableStream as WebReadableStream } from 'node:stream/web';\n\nexport function parseLastModified(\n value: string | null | undefined,\n): Date | undefined {\n if (!value) {\n return undefined;\n }\n\n try {\n const result = new Date(value);\n result.toISOString(); // triggers exception if input was invalid\n return result;\n } catch {\n return undefined;\n }\n}\n\nexport function responseToReadable(response: Response): Readable {\n return response.body\n ? Readable.from(toWeb(response.body))\n : new PassThrough().end();\n}\n\n// The NodeJS ReadableStream is that fetch returns is super basic and not even\n// iterable. This function converts it to the smarter, iterable stream/web\n// variant instead.\nexport function toWeb(\n responseBody: ReadableStream<Uint8Array>,\n): WebReadableStream<Uint8Array> {\n const reader = responseBody.getReader();\n return new WebReadableStream({\n async pull(controller) {\n const { value, done } = await reader.read();\n if (value) {\n controller.enqueue(value);\n }\n if (done) {\n controller.close();\n }\n },\n });\n}\n"],"names":["Readable","PassThrough","WebReadableStream"],"mappings":";;;;;AAmBO,SAAS,kBACd,KAAA,EACkB;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAC7B,IAAA,MAAA,CAAO,WAAA,EAAY;AACnB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,QAAA,EAA8B;AAC/D,EAAA,OAAO,QAAA,CAAS,IAAA,GACZA,oBAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA,GAClC,IAAIC,uBAAA,EAAY,CAAE,GAAA,EAAI;AAC5B;AAKO,SAAS,MACd,YAAA,EAC+B;AAC/B,EAAA,MAAM,MAAA,GAAS,aAAa,SAAA,EAAU;AACtC,EAAA,OAAO,IAAIC,kBAAA,CAAkB;AAAA,IAC3B,MAAM,KAAK,UAAA,EAAY;AACrB,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,MAC1B;AACA,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MACnB;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;;;;"}
|
package/dist/httpRouter.cjs.js
CHANGED
|
@@ -5,6 +5,7 @@ var createAuthIntegrationRouter = require('./entrypoints/httpRouter/http/createA
|
|
|
5
5
|
var createCredentialsBarrier = require('./entrypoints/httpRouter/http/createCredentialsBarrier.cjs.js');
|
|
6
6
|
var createLifecycleMiddleware = require('./entrypoints/httpRouter/http/createLifecycleMiddleware.cjs.js');
|
|
7
7
|
var createCookieAuthRefreshMiddleware = require('./entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.cjs.js');
|
|
8
|
+
var createRateLimitMiddleware = require('./entrypoints/httpRouter/http/createRateLimitMiddleware.cjs.js');
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
@@ -13,4 +14,5 @@ exports.createAuthIntegrationRouter = createAuthIntegrationRouter.createAuthInte
|
|
|
13
14
|
exports.createCredentialsBarrier = createCredentialsBarrier.createCredentialsBarrier;
|
|
14
15
|
exports.createLifecycleMiddleware = createLifecycleMiddleware.createLifecycleMiddleware;
|
|
15
16
|
exports.createCookieAuthRefreshMiddleware = createCookieAuthRefreshMiddleware.createCookieAuthRefreshMiddleware;
|
|
17
|
+
exports.createRateLimitMiddleware = createRateLimitMiddleware.createRateLimitMiddleware;
|
|
16
18
|
//# sourceMappingURL=httpRouter.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpRouter.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"httpRouter.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
package/dist/httpRouter.d.ts
CHANGED
|
@@ -65,5 +65,14 @@ declare function createCookieAuthRefreshMiddleware(options: {
|
|
|
65
65
|
httpAuth: HttpAuthService;
|
|
66
66
|
}): express.Router;
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* @public
|
|
70
|
+
* Creates a middleware that applies rate limiting to requests based on the provided configuration.
|
|
71
|
+
*/
|
|
72
|
+
declare const createRateLimitMiddleware: (options: {
|
|
73
|
+
pluginId: string;
|
|
74
|
+
config: RootConfigService;
|
|
75
|
+
}) => RequestHandler;
|
|
76
|
+
|
|
77
|
+
export { createAuthIntegrationRouter, createCookieAuthRefreshMiddleware, createCredentialsBarrier, createLifecycleMiddleware, createRateLimitMiddleware, httpRouterServiceFactory };
|
|
69
78
|
export type { LifecycleMiddlewareOptions };
|
package/dist/package.json.cjs.js
CHANGED
package/dist/rootHttpRouter.d.ts
CHANGED
|
@@ -3,11 +3,10 @@ import { RootHttpRouterService, RootHealthService, RootConfigService, LoggerServ
|
|
|
3
3
|
import * as express from 'express';
|
|
4
4
|
import { Handler, RequestHandler, ErrorRequestHandler, Express } from 'express';
|
|
5
5
|
import { Config } from '@backstage/config';
|
|
6
|
-
import * as http from 'http';
|
|
7
|
-
import { RequestListener } from 'http';
|
|
6
|
+
import * as http from 'node:http';
|
|
7
|
+
import { RequestListener, Server } from 'node:http';
|
|
8
8
|
import { CorsOptions } from 'cors';
|
|
9
9
|
import { HelmetOptions } from 'helmet';
|
|
10
|
-
import { Server } from 'node:http';
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* Options for the {@link DefaultRootHttpRouter} class.
|
package/dist/urlReader.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
2
2
|
import { RootConfigService, LoggerService, UrlReaderServiceReadTreeResponse, UrlReaderService, UrlReaderServiceReadUrlOptions, UrlReaderServiceReadUrlResponse, UrlReaderServiceReadTreeOptions, UrlReaderServiceSearchOptions, UrlReaderServiceSearchResponse } from '@backstage/backend-plugin-api';
|
|
3
3
|
import { AzureIntegration, AzureDevOpsCredentialsProvider, BitbucketCloudIntegration, BitbucketIntegration, BitbucketServerIntegration, GerritIntegration, GithubIntegration, GithubCredentialsProvider, GitLabIntegration, GiteaIntegration, HarnessIntegration, AwsS3Integration, AzureCredentialsManager, AzureBlobStorageIntergation } from '@backstage/integration';
|
|
4
|
-
import { Readable } from 'stream';
|
|
4
|
+
import { Readable } from 'node:stream';
|
|
5
5
|
import { AwsCredentialsManager } from '@backstage/integration-aws-node';
|
|
6
6
|
import { Config } from '@backstage/config';
|
|
7
7
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-defaults",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.2",
|
|
4
4
|
"description": "Backend defaults used by Backstage backend apps",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -215,19 +215,20 @@
|
|
|
215
215
|
"@aws-sdk/client-s3": "^3.350.0",
|
|
216
216
|
"@aws-sdk/credential-providers": "^3.350.0",
|
|
217
217
|
"@aws-sdk/types": "^3.347.0",
|
|
218
|
+
"@azure/identity": "^4.0.0",
|
|
218
219
|
"@azure/storage-blob": "^12.5.0",
|
|
219
|
-
"@backstage/backend-app-api": "^1.
|
|
220
|
-
"@backstage/backend-dev-utils": "^0.1.
|
|
221
|
-
"@backstage/backend-plugin-api": "^1.
|
|
222
|
-
"@backstage/cli-node": "^0.2.
|
|
220
|
+
"@backstage/backend-app-api": "^1.5.0",
|
|
221
|
+
"@backstage/backend-dev-utils": "^0.1.7",
|
|
222
|
+
"@backstage/backend-plugin-api": "^1.7.0",
|
|
223
|
+
"@backstage/cli-node": "^0.2.18",
|
|
223
224
|
"@backstage/config": "^1.3.6",
|
|
224
|
-
"@backstage/config-loader": "^1.10.
|
|
225
|
+
"@backstage/config-loader": "^1.10.8",
|
|
225
226
|
"@backstage/errors": "^1.2.7",
|
|
226
|
-
"@backstage/integration": "^1.
|
|
227
|
-
"@backstage/integration-aws-node": "^0.1.
|
|
228
|
-
"@backstage/plugin-auth-node": "^0.6.
|
|
229
|
-
"@backstage/plugin-events-node": "^0.4.
|
|
230
|
-
"@backstage/plugin-permission-node": "^0.10.
|
|
227
|
+
"@backstage/integration": "^1.20.0",
|
|
228
|
+
"@backstage/integration-aws-node": "^0.1.20",
|
|
229
|
+
"@backstage/plugin-auth-node": "^0.6.13",
|
|
230
|
+
"@backstage/plugin-events-node": "^0.4.19",
|
|
231
|
+
"@backstage/plugin-permission-node": "^0.10.10",
|
|
231
232
|
"@backstage/types": "^1.2.2",
|
|
232
233
|
"@google-cloud/storage": "^7.0.0",
|
|
233
234
|
"@keyv/memcache": "^2.0.1",
|
|
@@ -271,7 +272,7 @@
|
|
|
271
272
|
"rate-limit-redis": "^4.2.0",
|
|
272
273
|
"raw-body": "^2.4.1",
|
|
273
274
|
"selfsigned": "^2.0.0",
|
|
274
|
-
"tar": "^
|
|
275
|
+
"tar": "^7.5.6",
|
|
275
276
|
"triple-beam": "^1.4.1",
|
|
276
277
|
"uuid": "^11.0.0",
|
|
277
278
|
"winston": "^3.2.1",
|
|
@@ -283,9 +284,9 @@
|
|
|
283
284
|
},
|
|
284
285
|
"devDependencies": {
|
|
285
286
|
"@aws-sdk/util-stream-node": "^3.350.0",
|
|
286
|
-
"@backstage/backend-plugin-api": "^1.
|
|
287
|
-
"@backstage/backend-test-utils": "^1.
|
|
288
|
-
"@backstage/cli": "^0.35.
|
|
287
|
+
"@backstage/backend-plugin-api": "^1.7.0",
|
|
288
|
+
"@backstage/backend-test-utils": "^1.11.0",
|
|
289
|
+
"@backstage/cli": "^0.35.4",
|
|
289
290
|
"@google-cloud/cloud-sql-connector": "^1.4.0",
|
|
290
291
|
"@types/archiver": "^7.0.0",
|
|
291
292
|
"@types/base64-stream": "^1.0.2",
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
function defaultSchemaOverride(name) {
|
|
6
|
-
return {
|
|
7
|
-
searchPath: [name]
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
exports.default = defaultSchemaOverride;
|
|
12
|
-
//# sourceMappingURL=defaultSchemaOverride.cjs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaultSchemaOverride.cjs.js","sources":["../../../../src/entrypoints/database/connectors/defaultSchemaOverride.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 { Knex } from 'knex';\n\n/**\n * Provides a partial knex config with schema name override.\n *\n * @param name - schema name to get config override for\n */\nexport default function defaultSchemaOverride(\n name: string,\n): Partial<Knex.Config> {\n return {\n searchPath: [name],\n };\n}\n"],"names":[],"mappings":";;;;AAuBA,SAAwB,sBACtB,IAAA,EACsB;AACtB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,CAAC,IAAI;AAAA,GACnB;AACF;;;;"}
|