From 03ebad97d224c7a598a87bc897901be98dd7c8fb Mon Sep 17 00:00:00 2001 From: Tracey Date: Fri, 10 Mar 2023 17:36:40 -0800 Subject: [PATCH 01/22] adding new action confluence to markdown for GitHub repos onboarded onto techdocs Signed-off-by: Tracey --- .../.eslintrc.js | 1 + .../README.md | 126 +++++++ .../package.json | 49 +++ .../confluence/confluenceToMarkdown.test.ts | 316 ++++++++++++++++++ .../confluence/confluenceToMarkdown.ts | 187 +++++++++++ .../src/actions/confluence/helpers.ts | 142 ++++++++ .../src/actions/confluence/index.ts | 16 + .../src/actions/index.ts | 16 + .../src/index.ts | 23 ++ yarn.lock | 107 +++++- 10 files changed, 973 insertions(+), 10 deletions(-) create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js b/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md new file mode 100644 index 0000000000..61cc1efe13 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md @@ -0,0 +1,126 @@ +# @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn + +Welcome to the `transform:confluence-to-markdown` action for the `scaffolder-backend`. + +## Getting started + +You need to configure the action in your backend: + +## From your Backstage root directory + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn +``` + +Configure the action: +(you can check the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to see all options): + +```typescript +// packages/backend/src/plugins/scaffolder.ts + +import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend'; +import { ScmIntegrations } from '@backstage/integration'; +import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const catalogClient = new CatalogClient({ discoveryApi: env.discovery }); + const integrations = ScmIntegrations.fromConfig(env.config); + + const builtInActions = createBuiltinActions({ + integrations, + catalogClient, + config: env.config, + reader: env.reader, + }); + + const actions = [ + ...builtInActions, + createConfluenceToMarkdownAction({ + integrations, + config: env.config, + reader: env.reader, + }), + ]; + + return createRouter({ + actions, + catalogClient: catalogClient, + logger: env.logger, + config: env.config, + database: env.database, + reader: env.reader, + }); +} +``` + +You will also need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in confluence and add the PAT to your `app-config.yaml` + +``` +confluence: + baseUrl: ${CONFLUENCE_BASE_URL} + token: ${CONFLUENCE_TOKEN} + +``` + +After that you can use the action in your template: + +``` +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: confluence-to-markdown + title: Confluence to Markdown + description: This template converts a single confluence document to Markdown for Techdocs and adds it to a given GitHub repo. + tags: + - do-not-use + - poc +spec: + owner: + type: service + parameters: + - title: Confluence and Github Repo Information + properties: + confluenceUrls: + type: array + description: Urls for confluence doc to be converted to markdown. In format /display// or /pages/viewpage.action?spacekey=&title= + items: + type: string + default: confluence url + ui:options: + addable: true + minItems: 1 + maxItems: 5 + repoUrl: + type: string + title: GitHub url mkdocs.yaml link + description: The GitHub repo url to your mkdocs.yaml file. Example + steps: + - id: create-docs + name: Get markdown file created and update markdown.yaml file + action: transform:confluence-to-markdown + input: + confluenceUrls: ${{ parameters.confluenceUrls }} + repoUrl: ${{ parameters.repoUrl }} + - id: publish + name: Publish PR to GitHub + action: publish:github:pull-request + input: + repoUrl: ?repo=${{ steps['create-docs'].output.repo }}&owner=${{ steps['create-docs'].output.owner }} + branchName: confluence-to-markdown + title: Confluence to Markdown + description: PR for converting confluence page to mkdocs + - id: merge + name: Merge PR + action: publish:github:merge-pull-request + input: + prUrl: ${{ steps['publish'].output.remoteUrl }} + forceAdmin: true + +``` + +Replace `` with your GitHub url without `https://`. + +You can find a list of all registred actions including their parameters at the /create/actions route in your Backstage application. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json new file mode 100644 index 0000000000..cc445108c3 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json @@ -0,0 +1,49 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn", + "description": "The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "help": "backstage-cli help" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", + "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "@backstage/types": "workspace:^", + "fs": "^0.0.1-security", + "fs-extra": "^11.1.0", + "git-url-parse": "^13.1.0", + "node-fetch": "2.6.7", + "node-html-markdown": "^1.3.0", + "yaml": "^2.2.1" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "mock-fs": "^5.2.0", + "os": "^0.1.2" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts new file mode 100644 index 0000000000..6a3a497d99 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts @@ -0,0 +1,316 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { PassThrough } from 'stream'; +import { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; +import { getVoidLogger } from '@backstage/backend-common'; +import { UrlReader } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import mockFs from 'mock-fs'; +import os from 'os'; +import fetch from 'node-fetch'; +import type { ActionContext } from '@backstage/plugin-scaffolder-node'; +import { readFile, writeFile } from 'fs-extra'; +import { Readable } from 'stream'; + +jest.mock('node-fetch'); +jest.mock('fs-extra', () => ({ + mkdirSync: jest.fn(), + readFile: jest.fn().mockResolvedValue('File contents'), + writeFile: jest.fn().mockImplementation(() => { + return Promise.resolve(); + }), + outputFile: jest.fn(), + openSync: jest.fn(), + createWriteStream: jest.fn().mockReturnValue(new PassThrough()), + writeStream: jest.fn(), +})); +const { Response } = jest.requireActual('node-fetch'); + +describe('transform:confluence-to-markdown', () => { + const config = new ConfigReader({ + confluence: { + baseUrl: 'https://nodomain.confluence.com/', + token: 'fake_token', + }, + }); + + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + + let reader: UrlReader; + let mockContext: ActionContext<{ + confluenceUrls: string[]; + repoUrl: string; + }>; + + const logger = getVoidLogger(); + jest.spyOn(logger, 'info'); + + const mockTmpDir = os.tmpdir(); + + beforeEach(() => { + reader = { + readUrl: jest.fn(), + readTree: jest.fn().mockResolvedValue({ + dir: jest.fn(), + }), + search: jest.fn(), + }; + mockContext = { + input: { + confluenceUrls: [ + 'https://nodomain.confluence.com/display/testing/mkdocs', + ], + repoUrl: 'https://notreal.github.com/space/backstage/mkdocs.yml', + }, + workspacePath: '/tmp', + logger, + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + mockFs({ [`${mockTmpDir}/src/docs`]: {} }); + }); + afterEach(() => { + jest.clearAllMocks(); + mockFs.restore(); + }); + + it('should call confluence to markdown action successfully with results array', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = { + results: [ + { + id: '4444444', + type: 'attachment', + title: 'testing.pdf', + metadata: { + mediaType: 'application/pdf', + }, + _links: { + download: '/download/attachments/4444444/testing.pdf', + }, + }, + ], + }; + + (fetch as jest.MockedFunction) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBody), { + status: 200, + statusText: 'OK', + }), + ) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBodyTwo), { + status: 200, + statusText: 'OK', + }), + ) + .mockResolvedValueOnce( + new Response(Readable.from('Hello world'), { + status: 200, + statusText: 'OK', + }), + ); + + const mockCreateWriteStream = jest.fn().mockReturnValue({ + on: jest.fn(), + once: jest.fn((_event, callback) => { + callback(); + }), + }); + jest.mock('fs', () => ({ + openSync: jest.fn(), + createWriteStream: jest.fn().mockReturnValue(mockCreateWriteStream), + })); + const action = createConfluenceToMarkdownAction(options); + + await action.handler(mockContext); + + expect(logger.info).toHaveBeenCalledWith( + `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, + ); + expect(logger.info).toHaveBeenCalledTimes(5); + + expect(fetch).toHaveBeenCalledTimes(3); + expect(readFile).toHaveBeenCalledTimes(1); + expect(writeFile).toHaveBeenCalledTimes(1); + }); + + it('should call confluence to markdown action successfully with empty results array', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = { + results: [], + }; + + (fetch as jest.MockedFunction) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBody), { + status: 200, + statusText: 'OK', + }), + ) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBodyTwo), { + status: 200, + statusText: 'OK', + }), + ); + + jest.mock('fs-extra', () => ({ + readFile: jest.fn().mockResolvedValue('File contents'), + })); + const action = createConfluenceToMarkdownAction(options); + + await action.handler(mockContext); + + expect(logger.info).toHaveBeenCalledWith( + `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, + ); + expect(logger.info).toHaveBeenCalledTimes(5); + + expect(fetch).toHaveBeenCalledTimes(2); + expect(readFile).toHaveBeenCalledTimes(1); + expect(writeFile).toHaveBeenCalledTimes(1); + }); + + it('shoud fail on the first fetch call with response.ok set to false', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = {}; + (fetch as jest.MockedFunction).mockResolvedValueOnce( + new Response(JSON.stringify(responseBody), { + status: 401, + statusText: 'npot', + ok: false, + }), + ); + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow('Request failed with 401 Error'); + }); + + it('should return nothing in results from the first api call and fail', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [], + }; + (fetch as jest.MockedFunction).mockResolvedValueOnce( + new Response(JSON.stringify(responseBody), { + status: 200, + statusText: 'ok', + }), + ); + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow( + 'Could not find document https://nodomain.confluence.com/display/testing/mkdocs. Please check your input.', + ); + }); + + it('should fail on the second fetch call to confluence', async () => { + const options = { + reader, + integrations, + config, + }; + const responseBody = { + results: [ + { + id: '4444444', + type: 'page', + title: 'Testing', + body: { + export_view: { + value: '

hello world

', + }, + }, + }, + ], + }; + const responseBodyTwo = {}; + + (fetch as jest.MockedFunction) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBody), { + status: 200, + statusText: 'OK', + }), + ) + .mockResolvedValueOnce( + new Response(JSON.stringify(responseBodyTwo), { + status: 404, + statusText: 'notok', + }), + ); + const action = createConfluenceToMarkdownAction(options); + await expect(async () => { + await action.handler(mockContext); + }).rejects.toThrow('Request failed with 404 Error'); + }); +}); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts new file mode 100644 index 0000000000..792d1f088b --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts @@ -0,0 +1,187 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Config } from '@backstage/config'; +import { UrlReader } from '@backstage/backend-common'; +import { ScmIntegrations } from '@backstage/integration'; +import { createFetchPlainAction } from '@backstage/plugin-scaffolder-backend'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { InputError, ConflictError } from '@backstage/errors'; +import { NodeHtmlMarkdown } from 'node-html-markdown'; +import fs from 'fs-extra'; +import parseGitUrl from 'git-url-parse'; +import { + parseFromYaml, + readFileAsString, + transformToYaml, + updateFile, + fetchConfluence, + getAndWriteAttachments, + createConfluenceVariables, +} from './helpers'; + +export const createConfluenceToMarkdownAction = (options: { + reader: UrlReader; + integrations: ScmIntegrations; + config: Config; +}) => { + const { config, reader, integrations } = options; + const fetchPlainAction = createFetchPlainAction({ reader, integrations }); + type Obj = { + [key: string]: string; + }; + + return createTemplateAction<{ + confluenceUrls: string[]; + repoUrl: string; + }>({ + id: 'transform:confluence-to-markdown', + schema: { + input: { + properties: { + confluenceUrls: { + type: 'array', + title: 'Confluence URL', + description: + 'Paste your confluence url. Ensure it follows this format: https://{confluence+base+url}/display/{spacekey}/{page+title}', + items: { + type: 'string', + default: 'Confluence URL', + }, + }, + repoUrl: { + type: 'string', + title: 'GitHub Repo Url', + description: + 'mkdocs.yml file location inside the github repo you want to store the document', + }, + }, + }, + }, + async handler(ctx) { + const { confluenceUrls, repoUrl } = ctx.input; + const parsedRepoUrl = parseGitUrl(`${repoUrl}`); + const filePathToMkdocs = parsedRepoUrl.filepath.substring( + 0, + parsedRepoUrl.filepath.lastIndexOf('/') + 1, + ); + const dirPath = ctx.workspacePath; + let productArray: string[][] = []; + + ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`); + ctx.logger.info(confluenceUrls); + const params = new URL(confluenceUrls[0]); + ctx.logger.info(params.searchParams); + // This grabs the files from Github + const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`; + await fetchPlainAction.handler({ + ...ctx, + input: { + url: `https://${parsedRepoUrl.resource}/${parsedRepoUrl.owner}/${parsedRepoUrl.name}`, + targetPath: dirPath, + }, + }); + + for (let p = 0; p < confluenceUrls.length; p++) { + const confluenceUrl = confluenceUrls[p]; + + const { spacekey, title, titleWithSpaces } = + await createConfluenceVariables(confluenceUrl); + ctx.logger.info(spacekey); + ctx.logger.info(title); + ctx.logger.info(titleWithSpaces); + + // This calls confluence to get the page html and page id + const getConfluenceDoc = await fetchConfluence( + `/rest/api/content?title=${title}&spaceKey=${spacekey}&expand=body.export_view`, + config, + ); + if (getConfluenceDoc.results.length === 0) { + throw new InputError( + `Could not find document ${confluenceUrl}. Please check your input.`, + ); + } + // This gets attachements for the confluence page if they exist + const getDocAttachments = await fetchConfluence( + `/rest/api/content/${getConfluenceDoc.results[0].id}/child/attachment`, + config, + ); + + if (getDocAttachments.results.length) { + fs.mkdirSync(`${dirPath}/${filePathToMkdocs}docs/img`, { + recursive: true, + }); + productArray = await getAndWriteAttachments( + getDocAttachments, + dirPath, + config, + filePathToMkdocs, + ); + } + + ctx.logger.info( + `starting action for converting ${titleWithSpaces} from Confluence To Markdown`, + ); + + // This reads mkdocs.yml file + const mkdocsFileContent = await readFileAsString(repoFileDir); + const mkdocsFile = parseFromYaml(mkdocsFileContent); + ctx.logger.info( + `Adding new file - ${titleWithSpaces} to the current mkdocs.yml file`, + ); + + // This modifies the mkdocs.yml file + if (mkdocsFile !== undefined && mkdocsFile.hasOwnProperty('nav')) { + const { nav } = mkdocsFile; + if (!nav.some((i: Obj) => i.hasOwnProperty(titleWithSpaces))) { + nav.push({ + [titleWithSpaces]: `${titleWithSpaces.replace(/\s+/g, '-')}.md`, + }); + mkdocsFile.nav = nav; + } else { + throw new ConflictError( + 'This document looks to exist inside the GitHub repo. Will end the action.', + ); + } + } + const newTemplateFileContent = transformToYaml(mkdocsFile); + await updateFile(newTemplateFileContent, repoFileDir); + + // This grabs the confluence html and converts it to markdown and adds attachments + const html = getConfluenceDoc.results[0].body.export_view.value; + const markdownToPublish = NodeHtmlMarkdown.translate(html); + let newString: string = markdownToPublish; + productArray.map((product: string[]) => { + const regex = product[1].includes('pdf') + ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi') + : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi'); + newString = newString.replace(regex, `$1./img/${product[1]}$3`); + }); + + ctx.logger.info(`Adding new file to repo.`); + await fs.outputFile( + `${dirPath}/${filePathToMkdocs}docs/${titleWithSpaces.replace( + /\s+/g, + '-', + )}.md`, + newString, + ); + } + + ctx.output('repo', parsedRepoUrl.name); + ctx.output('owner', parsedRepoUrl.owner); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts new file mode 100644 index 0000000000..d0125b5a0d --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts @@ -0,0 +1,142 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Config } from '@backstage/config'; +import { ResponseError, ConflictError, InputError } from '@backstage/errors'; +import fs from 'fs-extra'; +import YAML from 'yaml'; +import fetch, { Response } from 'node-fetch'; + +interface Links { + webui: string; + download: string; + thumbnail: string; + self: string; +} + +interface Metadata { + mediaType: string; +} + +export interface Result { + id: string; + type: string; + status: string; + title: string; + metadata: Metadata; + _links: Links; +} + +export interface Results { + results: Result[]; +} + +export const readFileAsString = async (fileDir: string) => { + const content = await fs.readFile(fileDir, 'utf-8'); + return content.toString(); +}; + +export const parseFromYaml = (content: string) => { + return YAML.parse(content); +}; + +export const transformToYaml = (content: any) => { + return YAML.stringify(content); +}; + +export const updateFile = async (content: string, file: string) => { + await fs.writeFile(file, content); +}; + +export const fetchConfluence = async (relativeUrl: string, config: Config) => { + const baseUrl = config.getString('confluence.baseUrl'); + const token = config.getString('confluence.token'); + const response: Response = await fetch(`${baseUrl}${relativeUrl}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return response.json() as Promise; +}; + +export const getAndWriteAttachments = async ( + arr: Results, + workspace: string, + config: Config, + mkdocsDir: string, +) => { + const productArr: string[][] = []; + const baseUrl = config.getString('confluence.baseUrl'); + const token = config.getString('confluence.token'); + await Promise.all( + await arr.results.map(async (result: Result) => { + const downloadLink = result._links.download; + const downloadTitle = result.title.replace(/ /g, '-'); + if (result.metadata.mediaType !== 'application/gliffy+json') { + productArr.push([result.title.replace(/ /g, '%20'), downloadTitle]); + } + + const res = await fetch(`${baseUrl}${downloadLink}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + // console.log(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`) + if (!res.ok) { + throw ResponseError.fromResponse(res); + } else if (res.body !== null) { + fs.openSync(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`, 'w'); + const writeStream = fs.createWriteStream( + `${workspace}/${mkdocsDir}docs/img/${downloadTitle}`, + ); + res.body.pipe(writeStream); + await new Promise((resolve, reject) => { + writeStream.on('finish', () => { + resolve(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`); + }); + writeStream.on('error', reject); + }); + } else { + throw new ConflictError( + 'No Body on the response. Can not save images from Confluence Doc', + ); + } + }), + ); + return productArr; +}; + +export const createConfluenceVariables = async (url: string) => { + let spacekey: string | null = null; + let title: string | null = null; + let titleWithSpaces: string | null = ''; + const params = new URL(url); + if (url.includes('display')) { + spacekey = params.pathname.split('/')[2]; + title = params.pathname.split('/')[3]; + titleWithSpaces = title?.replace(/\+/g, ' '); + return { spacekey, title, titleWithSpaces }; + } + throw new InputError( + 'The Url format for Confluence is incorrect. Acceptable format is `/display//`', + ); +}; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts new file mode 100644 index 0000000000..00f00eabda --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts new file mode 100644 index 0000000000..3d3a6c73a0 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './confluence'; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts new file mode 100644 index 0000000000..e38cee3557 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend. + * + * @packageDocumentation + */ + +export * from './actions'; diff --git a/yarn.lock b/yarn.lock index b1b60ba15e..3585d449fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7651,6 +7651,29 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/integration": "workspace:^" + "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/types": "workspace:^" + fs: ^0.0.1-security + fs-extra: ^11.1.0 + git-url-parse: ^13.1.0 + mock-fs: ^5.2.0 + node-fetch: 2.6.7 + node-html-markdown: ^1.3.0 + os: ^0.1.2 + yaml: ^2.2.1 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter" @@ -20175,6 +20198,19 @@ __metadata: languageName: node linkType: hard +"css-select@npm:^5.1.0": + version: 5.1.0 + resolution: "css-select@npm:5.1.0" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.1.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + nth-check: ^2.0.1 + checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda + languageName: node + linkType: hard + "css-to-react-native@npm:^3.0.0": version: 3.0.0 resolution: "css-to-react-native@npm:3.0.0" @@ -20229,6 +20265,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe + languageName: node + linkType: hard + "css.escape@npm:1.5.1, css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -23898,6 +23941,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.0": + version: 11.1.0 + resolution: "fs-extra@npm:11.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f + languageName: node + linkType: hard + "fs-extra@npm:^7.0.1, fs-extra@npm:~7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -23955,6 +24009,13 @@ __metadata: languageName: node linkType: hard +"fs@npm:^0.0.1-security": + version: 0.0.1-security + resolution: "fs@npm:0.0.1-security" + checksum: 53c6230e1faae9fa32c1df82c16a84b51b1243d20f3da2b64bd110bb472b73b9185169b703e008356e3cdc92d155088b617d9d39a63b5227a30b3621baad7f5d + languageName: node + linkType: hard + "fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -24228,7 +24289,7 @@ __metadata: languageName: node linkType: hard -"git-url-parse@npm:^13.0.0": +"git-url-parse@npm:^13.0.0, git-url-parse@npm:^13.1.0": version: 13.1.0 resolution: "git-url-parse@npm:13.1.0" dependencies: @@ -24900,7 +24961,7 @@ __metadata: languageName: node linkType: hard -"he@npm:^1.2.0": +"he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -30598,6 +30659,25 @@ __metadata: languageName: node linkType: hard +"node-html-markdown@npm:^1.3.0": + version: 1.3.0 + resolution: "node-html-markdown@npm:1.3.0" + dependencies: + node-html-parser: ^6.1.1 + checksum: 303affd75bf11e92f004047e283aa05da5c8ae8696c1f28f811e9f61762c55b4480e0e5986a9a4b399791485b835380af8ab0554ebf867d6cf9be362abedcf5d + languageName: node + linkType: hard + +"node-html-parser@npm:^6.1.1": + version: 6.1.5 + resolution: "node-html-parser@npm:6.1.5" + dependencies: + css-select: ^5.1.0 + he: 1.2.0 + checksum: b54257b31954be17d473c86a2fede53d5e238708f3d88577c98881c28ab66013fd37044903f6f3cd662b56d882681fb511bca75a80a80b62f7111b32b39eebae + languageName: node + linkType: hard + "node-int64@npm:^0.4.0": version: 0.4.0 resolution: "node-int64@npm:0.4.0" @@ -30898,12 +30978,12 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^2.0.0": - version: 2.0.1 - resolution: "nth-check@npm:2.0.1" +"nth-check@npm:^2.0.0, nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" dependencies: boolbase: ^1.0.0 - checksum: 5386d035c48438ff304fe687704d93886397349d1bed136de97aeae464caba10e8ffac55a04b215b86b3bc8897f33e0a5aa1045a9d8b2f251ae61b2a3ad3e450 + checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 languageName: node linkType: hard @@ -31278,6 +31358,13 @@ __metadata: languageName: node linkType: hard +"os@npm:^0.1.2": + version: 0.1.2 + resolution: "os@npm:0.1.2" + checksum: dc2d99759eef13f5dc47ddb12c67b9760a7196fd83a35a7aec2d75b82f91163ca1d4e8872238f8c2a35f4cddd5adf5ce6638a234c0563c748d3cd1d69a9f7153 + languageName: node + linkType: hard + "ospath@npm:^1.2.2": version: 1.2.2 resolution: "ospath@npm:1.2.2" @@ -39460,10 +39547,10 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": - version: 2.1.3 - resolution: "yaml@npm:2.1.3" - checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 +"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3, yaml@npm:^2.2.1": + version: 2.2.1 + resolution: "yaml@npm:2.2.1" + checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 languageName: node linkType: hard From 1b49a18bf8de23e8b702a929935ec97d0f2c80b5 Mon Sep 17 00:00:00 2001 From: Tracey Date: Fri, 10 Mar 2023 17:41:49 -0800 Subject: [PATCH 02/22] adding changeset Signed-off-by: Tracey --- .changeset/new-pigs-jam.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/new-pigs-jam.md diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md new file mode 100644 index 0000000000..ed9c39297a --- /dev/null +++ b/.changeset/new-pigs-jam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn': patch +--- + +Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos onboarded onto Techdocs From a231e7e8fef6118723eb4239a963ea6714c00957 Mon Sep 17 00:00:00 2001 From: Tracey Date: Fri, 10 Mar 2023 18:02:51 -0800 Subject: [PATCH 03/22] removing logs that broke tests Signed-off-by: Tracey --- .../src/actions/confluence/confluenceToMarkdown.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts index 792d1f088b..1ded6e90f3 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts @@ -81,9 +81,7 @@ export const createConfluenceToMarkdownAction = (options: { let productArray: string[][] = []; ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`); - ctx.logger.info(confluenceUrls); - const params = new URL(confluenceUrls[0]); - ctx.logger.info(params.searchParams); + // This grabs the files from Github const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`; await fetchPlainAction.handler({ @@ -99,9 +97,6 @@ export const createConfluenceToMarkdownAction = (options: { const { spacekey, title, titleWithSpaces } = await createConfluenceVariables(confluenceUrl); - ctx.logger.info(spacekey); - ctx.logger.info(title); - ctx.logger.info(titleWithSpaces); // This calls confluence to get the page html and page id const getConfluenceDoc = await fetchConfluence( From b20e2e16fd9dae60d3cee94a80e31af0a4f2113e Mon Sep 17 00:00:00 2001 From: Tracey Radcliffe Date: Tue, 14 Mar 2023 10:25:28 -0700 Subject: [PATCH 04/22] Apply suggestions from code review Co-authored-by: Johan Haals Signed-off-by: Tracey Radcliffe --- .changeset/new-pigs-jam.md | 2 +- .../package.json | 2 +- .../src/actions/confluence/confluenceToMarkdown.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md index ed9c39297a..4c7f74d17f 100644 --- a/.changeset/new-pigs-jam.md +++ b/.changeset/new-pigs-jam.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn': patch +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn': minor --- Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos onboarded onto Techdocs diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json index cc445108c3..6ae6ea8688 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json @@ -1,5 +1,5 @@ { - "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn", + "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", "description": "The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend", "version": "0.0.0", "main": "src/index.ts", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts index 1ded6e90f3..62bebb752f 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts @@ -72,7 +72,7 @@ export const createConfluenceToMarkdownAction = (options: { }, async handler(ctx) { const { confluenceUrls, repoUrl } = ctx.input; - const parsedRepoUrl = parseGitUrl(`${repoUrl}`); + const parsedRepoUrl = parseGitUrl(repoUrl); const filePathToMkdocs = parsedRepoUrl.filepath.substring( 0, parsedRepoUrl.filepath.lastIndexOf('/') + 1, From 18e6ef9e8876d4b80ae21535cb7fc60d4de14ca6 Mon Sep 17 00:00:00 2001 From: Tracey Date: Thu, 16 Mar 2023 15:41:52 -0700 Subject: [PATCH 05/22] adjusting tests to use msw and other changes requested in pr Signed-off-by: Tracey --- .changeset/new-pigs-jam.md | 4 +- .../README.md | 20 +- .../package.json | 7 +- .../confluence/confluenceToMarkdown.test.ts | 121 ++- .../confluence/confluenceToMarkdown.ts | 21 +- .../src/actions/confluence/helpers.ts | 22 +- .../src/index.ts | 2 +- yarn.lock | 717 ++++++++++-------- 8 files changed, 466 insertions(+), 448 deletions(-) diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md index 4c7f74d17f..c56880e891 100644 --- a/.changeset/new-pigs-jam.md +++ b/.changeset/new-pigs-jam.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn': minor +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': minor --- -Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos onboarded onto Techdocs +Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos configured for Techdocs diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md index 61cc1efe13..56ca4afffc 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md @@ -1,4 +1,4 @@ -# @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn +# @backstage/plugin-scaffolder-backend-module-confluence-to-markdown Welcome to the `transform:confluence-to-markdown` action for the `scaffolder-backend`. @@ -10,7 +10,7 @@ You need to configure the action in your backend: ```bash # From your Backstage root directory -yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn +yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdown ``` Configure the action: @@ -21,7 +21,7 @@ Configure the action: import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend'; import { ScmIntegrations } from '@backstage/integration'; -import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn'; +import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdown'; export default async function createPlugin( env: PluginEnvironment, @@ -58,16 +58,15 @@ export default async function createPlugin( You will also need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in confluence and add the PAT to your `app-config.yaml` -``` +```yaml confluence: baseUrl: ${CONFLUENCE_BASE_URL} token: ${CONFLUENCE_TOKEN} - ``` After that you can use the action in your template: -``` +```yaml apiVersion: scaffolder.backstage.io/v1beta3 kind: Template metadata: @@ -85,7 +84,7 @@ spec: properties: confluenceUrls: type: array - description: Urls for confluence doc to be converted to markdown. In format /display// or /pages/viewpage.action?spacekey=&title= + description: Urls for confluence doc to be converted to markdown. In format /display// items: type: string default: confluence url @@ -95,8 +94,8 @@ spec: maxItems: 5 repoUrl: type: string - title: GitHub url mkdocs.yaml link - description: The GitHub repo url to your mkdocs.yaml file. Example + title: GitHub URL mkdocs.yaml link + description: The GitHub repo URL to your mkdocs.yaml file. Example steps: - id: create-docs name: Get markdown file created and update markdown.yaml file @@ -118,9 +117,8 @@ spec: input: prUrl: ${{ steps['publish'].output.remoteUrl }} forceAdmin: true - ``` Replace `` with your GitHub url without `https://`. -You can find a list of all registred actions including their parameters at the /create/actions route in your Backstage application. +You can find a list of all registered actions including their parameters at the /create/actions route in your Backstage application. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json index 6ae6ea8688..10aef2bca3 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "description": "The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend", + "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", @@ -31,16 +31,19 @@ "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", - "fs": "^0.0.1-security", "fs-extra": "^11.1.0", "git-url-parse": "^13.1.0", + "jest": "^29.5.0", "node-fetch": "2.6.7", "node-html-markdown": "^1.3.0", + "ts-jest": "^29.0.5", "yaml": "^2.2.1" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", "mock-fs": "^5.2.0", + "msw": "^1.1.0", "os": "^0.1.2" }, "files": [ diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts index 6a3a497d99..ae98c38c03 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts @@ -19,14 +19,14 @@ import { getVoidLogger } from '@backstage/backend-common'; import { UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; import mockFs from 'mock-fs'; import os from 'os'; -import fetch from 'node-fetch'; import type { ActionContext } from '@backstage/plugin-scaffolder-node'; -import { readFile, writeFile } from 'fs-extra'; -import { Readable } from 'stream'; +import { readFile, writeFile, createWriteStream } from 'fs-extra'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; -jest.mock('node-fetch'); jest.mock('fs-extra', () => ({ mkdirSync: jest.fn(), readFile: jest.fn().mockResolvedValue('File contents'), @@ -38,12 +38,15 @@ jest.mock('fs-extra', () => ({ createWriteStream: jest.fn().mockReturnValue(new PassThrough()), writeStream: jest.fn(), })); -const { Response } = jest.requireActual('node-fetch'); describe('transform:confluence-to-markdown', () => { + const baseUrl = `https://nodomain.confluence.com`; + const worker = setupServer(); + setupRequestMockHandlers(worker); + const config = new ConfigReader({ confluence: { - baseUrl: 'https://nodomain.confluence.com/', + baseUrl: baseUrl, token: 'fake_token', }, }); @@ -131,25 +134,19 @@ describe('transform:confluence-to-markdown', () => { ], }; - (fetch as jest.MockedFunction) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBody), { - status: 200, - statusText: 'OK', - }), - ) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBodyTwo), { - status: 200, - statusText: 'OK', - }), - ) - .mockResolvedValueOnce( - new Response(Readable.from('Hello world'), { - status: 200, - statusText: 'OK', - }), - ); + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.json(responseBodyTwo)), + ), + rest.get( + `${baseUrl}/download/attachments/4444444/testing.pdf`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.body('hello')), + ), + ); const mockCreateWriteStream = jest.fn().mockReturnValue({ on: jest.fn(), @@ -169,8 +166,7 @@ describe('transform:confluence-to-markdown', () => { `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, ); expect(logger.info).toHaveBeenCalledTimes(5); - - expect(fetch).toHaveBeenCalledTimes(3); + expect(createWriteStream).toHaveBeenCalledTimes(1); expect(readFile).toHaveBeenCalledTimes(1); expect(writeFile).toHaveBeenCalledTimes(1); }); @@ -199,19 +195,15 @@ describe('transform:confluence-to-markdown', () => { results: [], }; - (fetch as jest.MockedFunction) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBody), { - status: 200, - statusText: 'OK', - }), - ) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBodyTwo), { - status: 200, - statusText: 'OK', - }), - ); + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => res(ctx.status(200, 'OK'), ctx.json(responseBodyTwo)), + ), + ); jest.mock('fs-extra', () => ({ readFile: jest.fn().mockResolvedValue('File contents'), @@ -225,7 +217,7 @@ describe('transform:confluence-to-markdown', () => { ); expect(logger.info).toHaveBeenCalledTimes(5); - expect(fetch).toHaveBeenCalledTimes(2); + expect(createWriteStream).not.toHaveBeenCalled(); expect(readFile).toHaveBeenCalledTimes(1); expect(writeFile).toHaveBeenCalledTimes(1); }); @@ -237,13 +229,13 @@ describe('transform:confluence-to-markdown', () => { config, }; const responseBody = {}; - (fetch as jest.MockedFunction).mockResolvedValueOnce( - new Response(JSON.stringify(responseBody), { - status: 401, - statusText: 'npot', - ok: false, - }), + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(401, 'nope'), ctx.json(responseBody)), + ), ); + const action = createConfluenceToMarkdownAction(options); await expect(async () => { await action.handler(mockContext); @@ -259,12 +251,13 @@ describe('transform:confluence-to-markdown', () => { const responseBody = { results: [], }; - (fetch as jest.MockedFunction).mockResolvedValueOnce( - new Response(JSON.stringify(responseBody), { - status: 200, - statusText: 'ok', - }), + + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), ); + const action = createConfluenceToMarkdownAction(options); await expect(async () => { await action.handler(mockContext); @@ -295,19 +288,17 @@ describe('transform:confluence-to-markdown', () => { }; const responseBodyTwo = {}; - (fetch as jest.MockedFunction) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBody), { - status: 200, - statusText: 'OK', - }), - ) - .mockResolvedValueOnce( - new Response(JSON.stringify(responseBodyTwo), { - status: 404, - statusText: 'notok', - }), - ); + worker.use( + rest.get(`${baseUrl}/rest/api/content`, (_, res, ctx) => + res(ctx.status(200, 'OK'), ctx.json(responseBody)), + ), + rest.get( + `${baseUrl}/rest/api/content/4444444/child/attachment`, + (_, res, ctx) => + res(ctx.status(404, 'nope'), ctx.json(responseBodyTwo)), + ), + ); + const action = createConfluenceToMarkdownAction(options); await expect(async () => { await action.handler(mockContext); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts index 62bebb752f..2a7d28048a 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts @@ -22,11 +22,9 @@ import { InputError, ConflictError } from '@backstage/errors'; import { NodeHtmlMarkdown } from 'node-html-markdown'; import fs from 'fs-extra'; import parseGitUrl from 'git-url-parse'; +import YAML from 'yaml'; import { - parseFromYaml, readFileAsString, - transformToYaml, - updateFile, fetchConfluence, getAndWriteAttachments, createConfluenceVariables, @@ -92,12 +90,9 @@ export const createConfluenceToMarkdownAction = (options: { }, }); - for (let p = 0; p < confluenceUrls.length; p++) { - const confluenceUrl = confluenceUrls[p]; - + for (const url of confluenceUrls) { const { spacekey, title, titleWithSpaces } = - await createConfluenceVariables(confluenceUrl); - + await createConfluenceVariables(url); // This calls confluence to get the page html and page id const getConfluenceDoc = await fetchConfluence( `/rest/api/content?title=${title}&spaceKey=${spacekey}&expand=body.export_view`, @@ -105,7 +100,7 @@ export const createConfluenceToMarkdownAction = (options: { ); if (getConfluenceDoc.results.length === 0) { throw new InputError( - `Could not find document ${confluenceUrl}. Please check your input.`, + `Could not find document ${url}. Please check your input.`, ); } // This gets attachements for the confluence page if they exist @@ -132,7 +127,7 @@ export const createConfluenceToMarkdownAction = (options: { // This reads mkdocs.yml file const mkdocsFileContent = await readFileAsString(repoFileDir); - const mkdocsFile = parseFromYaml(mkdocsFileContent); + const mkdocsFile = await YAML.parse(mkdocsFileContent); ctx.logger.info( `Adding new file - ${titleWithSpaces} to the current mkdocs.yml file`, ); @@ -151,14 +146,14 @@ export const createConfluenceToMarkdownAction = (options: { ); } } - const newTemplateFileContent = transformToYaml(mkdocsFile); - await updateFile(newTemplateFileContent, repoFileDir); + + await fs.writeFile(repoFileDir, YAML.stringify(mkdocsFile)); // This grabs the confluence html and converts it to markdown and adds attachments const html = getConfluenceDoc.results[0].body.export_view.value; const markdownToPublish = NodeHtmlMarkdown.translate(html); let newString: string = markdownToPublish; - productArray.map((product: string[]) => { + productArray.forEach((product: string[]) => { const regex = product[1].includes('pdf') ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi') : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi'); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts index d0125b5a0d..d59a4cc3f5 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts @@ -17,7 +17,6 @@ import { Config } from '@backstage/config'; import { ResponseError, ConflictError, InputError } from '@backstage/errors'; import fs from 'fs-extra'; -import YAML from 'yaml'; import fetch, { Response } from 'node-fetch'; interface Links { @@ -49,18 +48,6 @@ export const readFileAsString = async (fileDir: string) => { return content.toString(); }; -export const parseFromYaml = (content: string) => { - return YAML.parse(content); -}; - -export const transformToYaml = (content: any) => { - return YAML.stringify(content); -}; - -export const updateFile = async (content: string, file: string) => { - await fs.writeFile(file, content); -}; - export const fetchConfluence = async (relativeUrl: string, config: Config) => { const baseUrl = config.getString('confluence.baseUrl'); const token = config.getString('confluence.token'); @@ -100,7 +87,6 @@ export const getAndWriteAttachments = async ( Authorization: `Bearer ${token}`, }, }); - // console.log(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`) if (!res.ok) { throw ResponseError.fromResponse(res); } else if (res.body !== null) { @@ -126,11 +112,11 @@ export const getAndWriteAttachments = async ( }; export const createConfluenceVariables = async (url: string) => { - let spacekey: string | null = null; - let title: string | null = null; - let titleWithSpaces: string | null = ''; + let spacekey: string | undefined = undefined; + let title: string | undefined = undefined; + let titleWithSpaces: string | undefined = ''; const params = new URL(url); - if (url.includes('display')) { + if (params.pathname.split('/')[1] === 'display') { spacekey = params.pathname.split('/')[2]; title = params.pathname.split('/')[3]; titleWithSpaces = title?.replace(/\+/g, ' '); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts index e38cee3557..bda2c7f9a1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts @@ -15,7 +15,7 @@ */ /** - * The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend. + * The confluence-to-markdown module for @backstage/plugin-scaffolder-backend. * * @packageDocumentation */ diff --git a/yarn.lock b/yarn.lock index 3585d449fc..4514e3757b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7651,9 +7651,9 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn": +"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn": version: 0.0.0-use.local - resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn" + resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn" dependencies: "@backstage/backend-common": "workspace:^" "@backstage/cli": "workspace:^" @@ -7662,14 +7662,17 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" - fs: ^0.0.1-security fs-extra: ^11.1.0 git-url-parse: ^13.1.0 + jest: ^29.5.0 mock-fs: ^5.2.0 + msw: ^1.1.0 node-fetch: 2.6.7 node-html-markdown: ^1.3.0 os: ^0.1.2 + ts-jest: ^29.0.5 yaml: ^2.2.1 languageName: unknown linkType: soft @@ -11173,50 +11176,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/console@npm:29.4.3" +"@jest/console@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/console@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.4.3 - jest-util: ^29.4.3 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 slash: ^3.0.0 - checksum: 8d9b163febe735153b523db527742309f4d598eda22f17f04e030060329bd3da4de7420fc1f7812f7a16f08273654a7de094c4b4e8b81a99dbfc17cfb1629008 + checksum: 9f4f4b8fabd1221361b7f2e92d4a90f5f8c2e2b29077249996ab3c8b7f765175ffee795368f8d6b5b2bb3adb32dc09319f7270c7c787b0d259e624e00e0f64a5 languageName: node linkType: hard -"@jest/core@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/core@npm:29.4.3" +"@jest/core@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/core@npm:29.5.0" dependencies: - "@jest/console": ^29.4.3 - "@jest/reporters": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/transform": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/console": ^29.5.0 + "@jest/reporters": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.4.3 - jest-config: ^29.4.3 - jest-haste-map: ^29.4.3 - jest-message-util: ^29.4.3 + jest-changed-files: ^29.5.0 + jest-config: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 jest-regex-util: ^29.4.3 - jest-resolve: ^29.4.3 - jest-resolve-dependencies: ^29.4.3 - jest-runner: ^29.4.3 - jest-runtime: ^29.4.3 - jest-snapshot: ^29.4.3 - jest-util: ^29.4.3 - jest-validate: ^29.4.3 - jest-watcher: ^29.4.3 + jest-resolve: ^29.5.0 + jest-resolve-dependencies: ^29.5.0 + jest-runner: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + jest-watcher: ^29.5.0 micromatch: ^4.0.4 - pretty-format: ^29.4.3 + pretty-format: ^29.5.0 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -11224,7 +11227,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 4aa10644d66f44f051d5dd9cdcedce27acc71216dbcc5e7adebdea458e27aefe27c78f457d7efd49f58b968c35f42de5a521590876e2013593e675120b9e6ab1 + checksum: 9e8f5243fe82d5a57f3971e1b96f320058df7c315328a3a827263f3b17f64be10c80f4a9c1b1773628b64d2de6d607c70b5b2d5bf13e7f5ad04223e9ef6aac06 languageName: node linkType: hard @@ -11237,15 +11240,15 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/environment@npm:29.4.3" +"@jest/environment@npm:^29.4.3, @jest/environment@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/environment@npm:29.5.0" dependencies: - "@jest/fake-timers": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" - jest-mock: ^29.4.3 - checksum: 7c1b0cc4e84b90f8a3bbeca9bbf088882c88aee70a81b3b8e24265dcb1cbc302cd1eee3319089cf65bfd39adbaea344903c712afea106cb8da6c86088d99c5fb + jest-mock: ^29.5.0 + checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a languageName: node linkType: hard @@ -11258,60 +11261,60 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/expect-utils@npm:29.4.3" +"@jest/expect-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect-utils@npm:29.5.0" dependencies: jest-get-type: ^29.4.3 - checksum: 2bbed39ff2fb59f5acac465a1ce7303e3b4b62b479e4f386261986c9827f7f799ea912761e22629c5daf10addf8513f16733c14a29c2647bb66d4ee625e9ff92 + checksum: c46fb677c88535cf83cf29f0a5b1f376c6a1109ddda266ad7da1a9cbc53cb441fa402dd61fc7b111ffc99603c11a9b3357ee41a1c0e035a58830bcb360871476 languageName: node linkType: hard -"@jest/expect@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/expect@npm:29.4.3" +"@jest/expect@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect@npm:29.5.0" dependencies: - expect: ^29.4.3 - jest-snapshot: ^29.4.3 - checksum: 08d0d40077ec99a7491fe59d05821dbd31126cfba70875855d8a063698b7126b5f6c309c50811caacc6ae2f727c6e44f51bdcf1d6c1ea832b4f020045ef22d45 + expect: ^29.5.0 + jest-snapshot: ^29.5.0 + checksum: bd10e295111547e6339137107d83986ab48d46561525393834d7d2d8b2ae9d5626653f3f5e48e5c3fa742ac982e97bdf1f541b53b9e1d117a247b08e938527f6 languageName: node linkType: hard -"@jest/fake-timers@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/fake-timers@npm:29.4.3" +"@jest/fake-timers@npm:^29.4.3, @jest/fake-timers@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/fake-timers@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.4.3 - jest-mock: ^29.4.3 - jest-util: ^29.4.3 - checksum: adaceb9143c395cccf3d7baa0e49b7042c3092a554e8283146df19926247e34c21b5bde5688bb90e9e87b4a02e4587926c5d858ee0a38d397a63175d0a127874 + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee languageName: node linkType: hard -"@jest/globals@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/globals@npm:29.4.3" +"@jest/globals@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/globals@npm:29.5.0" dependencies: - "@jest/environment": ^29.4.3 - "@jest/expect": ^29.4.3 - "@jest/types": ^29.4.3 - jest-mock: ^29.4.3 - checksum: ea76b546ceb4aa5ce2bb3726df12f989b23150b51c9f7664790caa81b943012a657cf3a8525498af1c3518cdb387f54b816cfba1b0ddd22c7b20f03b1d7290b4 + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/types": ^29.5.0 + jest-mock: ^29.5.0 + checksum: b309ab8f21b571a7c672608682e84bbdd3d2b554ddf81e4e32617fec0a69094a290ab42e3c8b2c66ba891882bfb1b8b2736720ea1285b3ad646d55c2abefedd9 languageName: node linkType: hard -"@jest/reporters@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/reporters@npm:29.4.3" +"@jest/reporters@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/reporters@npm:29.5.0" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/transform": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/console": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 "@jridgewell/trace-mapping": ^0.3.15 "@types/node": "*" chalk: ^4.0.0 @@ -11324,9 +11327,9 @@ __metadata: istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.4.3 - jest-util: ^29.4.3 - jest-worker: ^29.4.3 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -11336,7 +11339,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 7aa2e429c915bd96c3334962addd69d2bbf52065725757ddde26b293f8c4420a1e8c65363cc3e1e5ec89100a5273ccd3771bec58325a2cc0d97afdc81995073a + checksum: 481268aac9a4a75cc49c4df1273d6b111808dec815e9d009dad717c32383ebb0cebac76e820ad1ab44e207540e1c2fe1e640d44c4f262de92ab1933e057fdeeb languageName: node linkType: hard @@ -11369,50 +11372,50 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/test-result@npm:29.4.3" +"@jest/test-result@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-result@npm:29.5.0" dependencies: - "@jest/console": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/console": ^29.5.0 + "@jest/types": ^29.5.0 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 164f102b96619ec283c2c39e208b8048e4674f75bf3c3a4f2e95048ae0f9226105add684b25f10d286d91c221625f877e2c1cfc3da46c42d7e1804da239318cb + checksum: 2e8ff5242227ab960c520c3ea0f6544c595cc1c42fa3873c158e9f4f685f4ec9670ec08a4af94ae3885c0005a43550a9595191ffbc27a0965df27d9d98bbf901 languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/test-sequencer@npm:29.4.3" +"@jest/test-sequencer@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-sequencer@npm:29.5.0" dependencies: - "@jest/test-result": ^29.4.3 + "@jest/test-result": ^29.5.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.4.3 + jest-haste-map: ^29.5.0 slash: ^3.0.0 - checksum: 145e1fa9379e5be3587bde6d585b8aee5cf4442b06926928a87e9aec7de5be91b581711d627c6ca13144d244fe05e5d248c13b366b51bedc404f9dcfbfd79e9e + checksum: eca34b4aeb2fda6dfb7f9f4b064c858a7adf64ec5c6091b6f4ed9d3c19549177cbadcf1c615c4c182688fa1cf085c8c55c3ca6eea40719a34554b0bf071d842e languageName: node linkType: hard -"@jest/transform@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/transform@npm:29.4.3" +"@jest/transform@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/transform@npm:29.5.0" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@jridgewell/trace-mapping": ^0.3.15 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.4.3 + jest-haste-map: ^29.5.0 jest-regex-util: ^29.4.3 - jest-util: ^29.4.3 + jest-util: ^29.5.0 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: 082d74e04044213aa7baa8de29f8383e5010034f867969c8602a2447a4ef2f484cfaf2491eba3179ce42f369f7a0af419cbd087910f7e5caf7aa5d1fe03f2ff9 + checksum: d55d604085c157cf5112e165ff5ac1fa788873b3b31265fb4734ca59892ee24e44119964cc47eb6d178dd9512bbb6c576d1e20e51a201ff4e24d31e818a1c92d languageName: node linkType: hard @@ -11443,9 +11446,9 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/types@npm:29.4.3" +"@jest/types@npm:^29.4.3, @jest/types@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" dependencies: "@jest/schemas": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 @@ -11453,7 +11456,7 @@ __metadata: "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 1756f4149d360f98567f56f434144f7af23ed49a2c42889261a314df6b6654c2de70af618fb2ee0ee39cadaf10835b885845557184509503646c9cb9dcc02bac + checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 languageName: node linkType: hard @@ -17711,20 +17714,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.4.3": - version: 29.4.3 - resolution: "babel-jest@npm:29.4.3" +"babel-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-jest@npm:29.5.0" dependencies: - "@jest/transform": ^29.4.3 + "@jest/transform": ^29.5.0 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.4.3 + babel-preset-jest: ^29.5.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: a1a95937adb5e717dbffc2eb9e583fa6d26c7e5d5b07bb492a2d7f68631510a363e9ff097eafb642ad642dfac9dc2b13872b584f680e166a4f0922c98ea95853 + checksum: eafb6d37deb71f0c80bf3c80215aa46732153e5e8bcd73f6ff47d92e5c0c98c8f7f75995d0efec6289c371edad3693cd8fa2367b0661c4deb71a3a7117267ede languageName: node linkType: hard @@ -17750,15 +17753,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.4.3": - version: 29.4.3 - resolution: "babel-plugin-jest-hoist@npm:29.4.3" +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: c8702a6db6b30ec39dfb9f8e72b501c13895231ed80b15ed2648448f9f0c7b7cc4b1529beac31802ae655f63479a05110ca612815aa25fb1b0e6c874e1589137 + checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 languageName: node linkType: hard @@ -17897,15 +17900,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.4.3": - version: 29.4.3 - resolution: "babel-preset-jest@npm:29.4.3" +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" dependencies: - babel-plugin-jest-hoist: ^29.4.3 + babel-plugin-jest-hoist: ^29.5.0 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: a091721861ea2f8d969ace8fe06570cff8f2e847dbc6e4800abacbe63f72131abde615ce0a3b6648472c97e55a5be7f8bf7ae381e2b194ad2fa1737096febcf5 + checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad languageName: node linkType: hard @@ -18360,6 +18363,15 @@ __metadata: languageName: node linkType: hard +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -23081,16 +23093,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.4.3": - version: 29.4.3 - resolution: "expect@npm:29.4.3" +"expect@npm:^29.0.0, expect@npm:^29.5.0": + version: 29.5.0 + resolution: "expect@npm:29.5.0" dependencies: - "@jest/expect-utils": ^29.4.3 + "@jest/expect-utils": ^29.5.0 jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.4.3 - jest-message-util: ^29.4.3 - jest-util: ^29.4.3 - checksum: ff9dd8c50c0c6fd4b2b00f6dbd7ab0e2063fe1953be81a8c10ae1c005c7f5667ba452918e2efb055504b72b701a4f82575a081a0a7158efb16d87991b0366feb + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + checksum: 58f70b38693df6e5c6892db1bcd050f0e518d6f785175dc53917d4fa6a7359a048e5690e19ddcb96b65c4493881dd89a3dabdab1a84dfa55c10cdbdabf37b2d7 languageName: node linkType: hard @@ -23305,7 +23317,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb @@ -24009,13 +24021,6 @@ __metadata: languageName: node linkType: hard -"fs@npm:^0.0.1-security": - version: 0.0.1-security - resolution: "fs@npm:0.0.1-security" - checksum: 53c6230e1faae9fa32c1df82c16a84b51b1243d20f3da2b64bd110bb472b73b9185169b703e008356e3cdc92d155088b617d9d39a63b5227a30b3621baad7f5d - languageName: node - linkType: hard - "fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -26697,57 +26702,58 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-changed-files@npm:29.4.3" +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" dependencies: execa: ^5.0.0 p-limit: ^3.1.0 - checksum: 9a70bd8e92b37e18ad26d8bea97c516f41119fb7046b4255a13c76d557b0e54fa0629726de5a093fadfd6a0a08ce45da65a57086664d505b8db4b3133133e141 + checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 languageName: node linkType: hard -"jest-circus@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-circus@npm:29.4.3" +"jest-circus@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-circus@npm:29.5.0" dependencies: - "@jest/environment": ^29.4.3 - "@jest/expect": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 is-generator-fn: ^2.0.0 - jest-each: ^29.4.3 - jest-matcher-utils: ^29.4.3 - jest-message-util: ^29.4.3 - jest-runtime: ^29.4.3 - jest-snapshot: ^29.4.3 - jest-util: ^29.4.3 + jest-each: ^29.5.0 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 p-limit: ^3.1.0 - pretty-format: ^29.4.3 + pretty-format: ^29.5.0 + pure-rand: ^6.0.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 2739bef9c888743b49ff3fe303131381618e5d2f250f613a91240d9c86e19e6874fc904cbd8bcb02ec9ec59a84e5dae4ffec929f0c6171e87ddbc05508a137f4 + checksum: 44ff5d06acedae6de6c866e20e3b61f83e29ab94cf9f960826e7e667de49c12dd9ab9dffd7fa3b7d1f9688a8b5bfb1ebebadbea69d9ed0d3f66af4a0ff8c2b27 languageName: node linkType: hard -"jest-cli@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-cli@npm:29.4.3" +"jest-cli@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-cli@npm:29.5.0" dependencies: - "@jest/core": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/core": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.4.3 - jest-util: ^29.4.3 - jest-validate: ^29.4.3 + jest-config: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -26757,34 +26763,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: f4c9f6d76cde2c60a4169acbebb3f862728be03bcf3fe0077d2e55da7f9f3c3e9483cfa6e936832d35eabf96ee5ebf0300c4b0bd43cffff099801793466bfdd8 + checksum: 39897bbbc0f0d8a6b975ab12fd13887eaa28d92e3dee9e0173a5cb913ae8cc2ae46e090d38c6d723e84d9d6724429cd08685b4e505fa447d31ca615630c7dbba languageName: node linkType: hard -"jest-config@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-config@npm:29.4.3" +"jest-config@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-config@npm:29.5.0" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.4.3 - "@jest/types": ^29.4.3 - babel-jest: ^29.4.3 + "@jest/test-sequencer": ^29.5.0 + "@jest/types": ^29.5.0 + babel-jest: ^29.5.0 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.4.3 - jest-environment-node: ^29.4.3 + jest-circus: ^29.5.0 + jest-environment-node: ^29.5.0 jest-get-type: ^29.4.3 jest-regex-util: ^29.4.3 - jest-resolve: ^29.4.3 - jest-runner: ^29.4.3 - jest-util: ^29.4.3 - jest-validate: ^29.4.3 + jest-resolve: ^29.5.0 + jest-runner: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.4.3 + pretty-format: ^29.5.0 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -26795,7 +26801,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 92f9a9c6850b18682cb01892774a33967472af23a5844438d8c68077d5f2a29b15b665e4e4db7de3d74002a6dca158cd5b2cb9f5debfd2cce5e1aee6c74e3873 + checksum: c37c4dab964c54ab293d4e302d40b09687037ac9d00b88348ec42366970747feeaf265e12e3750cd3660b40c518d4031335eda11ac10b70b10e60797ebbd4b9c languageName: node linkType: hard @@ -26820,15 +26826,15 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-diff@npm:29.4.3" +"jest-diff@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-diff@npm:29.5.0" dependencies: chalk: ^4.0.0 diff-sequences: ^29.4.3 jest-get-type: ^29.4.3 - pretty-format: ^29.4.3 - checksum: 877fd1edffef6b319688c27b152e5b28e2bc4bcda5ce0ca90d7e137f9fafda4280bae25403d4c0bfd9806c2c0b15d966aa2dfaf5f9928ec8f1ccea7fa1d08ed6 + pretty-format: ^29.5.0 + checksum: dfd0f4a299b5d127779c76b40106c37854c89c3e0785098c717d52822d6620d227f6234c3a9291df204d619e799e3654159213bf93220f79c8e92a55475a3d39 languageName: node linkType: hard @@ -26841,16 +26847,16 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-each@npm:29.4.3" +"jest-each@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-each@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 chalk: ^4.0.0 jest-get-type: ^29.4.3 - jest-util: ^29.4.3 - pretty-format: ^29.4.3 - checksum: 1f72738338399efab0139eaea18bc198be0c6ed889770c8cbfa70bf9c724e8171fe1d3a29a94f9f39b8493ee6b2529bb350fb7c7c75e0d7eddfd28c253c79f9d + jest-util: ^29.5.0 + pretty-format: ^29.5.0 + checksum: b8b297534d25834c5d4e31e4c687359787b1e402519e42664eb704cc3a12a7a91a017565a75acb02e8cf9afd3f4eef3350bd785276bec0900184641b765ff7a5 languageName: node linkType: hard @@ -26875,17 +26881,17 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-environment-node@npm:29.4.3" +"jest-environment-node@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-environment-node@npm:29.5.0" dependencies: - "@jest/environment": ^29.4.3 - "@jest/fake-timers": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" - jest-mock: ^29.4.3 - jest-util: ^29.4.3 - checksum: 3c7362edfdbd516e83af7367c95dde35761a482b174de9735c07633405486ec73e19624e9bea4333fca33c24e8d65eaa1aa6594e0cb6bfeeeb564ccc431ee61d + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 57981911cc20a4219b0da9e22b2e3c9f31b505e43f78e61c899e3227ded455ce1a3a9483842c69cfa4532f02cfb536ae0995bf245f9211608edacfc1e478d411 languageName: node linkType: hard @@ -26903,11 +26909,11 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-haste-map@npm:29.4.3" +"jest-haste-map@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-haste-map@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 @@ -26915,24 +26921,24 @@ __metadata: fsevents: ^2.3.2 graceful-fs: ^4.2.9 jest-regex-util: ^29.4.3 - jest-util: ^29.4.3 - jest-worker: ^29.4.3 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: c7a83ebe6008b3fe96a96235e8153092e54b14df68e0f4205faedec57450df26b658578495a71c6d82494c01fbb44bca98c1506a6b2b9c920696dcc5d2e2bc59 + checksum: 3828ff7783f168e34be2c63887f82a01634261f605dcae062d83f979a61c37739e21b9607ecb962256aea3fbe5a530a1acee062d0026fcb47c607c12796cf3b7 languageName: node linkType: hard -"jest-leak-detector@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-leak-detector@npm:29.4.3" +"jest-leak-detector@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-leak-detector@npm:29.5.0" dependencies: jest-get-type: ^29.4.3 - pretty-format: ^29.4.3 - checksum: ec2b45e6f0abce81bd0dd0f6fd06b433c24d1ec865267af7640fae540ec868b93752598e407a9184d9c7419cbf32e8789007cc8c1be1a84f8f7321a0f8ad01f1 + pretty-format: ^29.5.0 + checksum: 0fb845da7ac9cdfc9b3b2e35f6f623a41c547d7dc0103ceb0349013459d00de5870b5689a625e7e37f9644934b40e8f1dcdd5422d14d57470600350364676313 languageName: node linkType: hard @@ -26948,15 +26954,15 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-matcher-utils@npm:29.4.3" +"jest-matcher-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-matcher-utils@npm:29.5.0" dependencies: chalk: ^4.0.0 - jest-diff: ^29.4.3 + jest-diff: ^29.5.0 jest-get-type: ^29.4.3 - pretty-format: ^29.4.3 - checksum: 9e13cbe42d2113bab2691110c7c3ba5cec3b94abad2727e1de90929d0f67da444e9b2066da3b476b5bf788df53a8ede0e0a950cfb06a04e4d6d566d115ee4f1d + pretty-format: ^29.5.0 + checksum: 1d3e8c746e484a58ce194e3aad152eff21fd0896e8b8bf3d4ab1a4e2cbfed95fb143646f4ad9fdf6e42212b9e8fc033268b58e011b044a9929df45485deb5ac9 languageName: node linkType: hard @@ -26977,31 +26983,31 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-message-util@npm:29.4.3" +"jest-message-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-message-util@npm:29.5.0" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.4.3 + pretty-format: ^29.5.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 64f06b9550021e68da0059020bea8691283cf818918810bb67192d7b7fb9b691c7eadf55c2ca3cd04df5394918f2327245077095cdc0d6b04be3532d2c7d0ced + checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf languageName: node linkType: hard -"jest-mock@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-mock@npm:29.4.3" +"jest-mock@npm:^29.4.3, jest-mock@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-mock@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@types/node": "*" - jest-util: ^29.4.3 - checksum: 8eb4a29b02d2cd03faac0290b6df6d23b4ffa43f72b21c7fff3c7dd04a2797355b1e85862b70b15341dd33ee3a693b17db5520a6f6e6b81ee75601987de6a1a2 + jest-util: ^29.5.0 + checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c languageName: node linkType: hard @@ -27024,95 +27030,95 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-resolve-dependencies@npm:29.4.3" +"jest-resolve-dependencies@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve-dependencies@npm:29.5.0" dependencies: jest-regex-util: ^29.4.3 - jest-snapshot: ^29.4.3 - checksum: 3ad934cd2170c9658d8800f84a975dafc866ec85b7ce391c640c09c3744ced337787620d8667dc8d1fa5e0b1493f973caa1a1bb980e4e6a50b46a1720baf0bd1 + jest-snapshot: ^29.5.0 + checksum: 479d2e5365d58fe23f2b87001e2e0adcbffe0147700e85abdec8f14b9703b0a55758c1929a9989e3f5d5e954fb88870ea4bfa04783523b664562fcf5f10b0edf languageName: node linkType: hard -"jest-resolve@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-resolve@npm:29.4.3" +"jest-resolve@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve@npm:29.5.0" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.4.3 + jest-haste-map: ^29.5.0 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.4.3 - jest-validate: ^29.4.3 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 056a66beccf833f3c7e5a8fc9bfec218886e87b0b103decdbdf11893669539df489d1490cd6d5f0eea35731e8be0d2e955a6710498f970d2eae734da4df029dc + checksum: 9a125f3cf323ceef512089339d35f3ee37f79fe16a831fb6a26773ea6a229b9e490d108fec7af334142e91845b5996de8e7cdd85a4d8d617078737d804e29c8f languageName: node linkType: hard -"jest-runner@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-runner@npm:29.4.3" +"jest-runner@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runner@npm:29.5.0" dependencies: - "@jest/console": ^29.4.3 - "@jest/environment": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/transform": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/console": ^29.5.0 + "@jest/environment": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 jest-docblock: ^29.4.3 - jest-environment-node: ^29.4.3 - jest-haste-map: ^29.4.3 - jest-leak-detector: ^29.4.3 - jest-message-util: ^29.4.3 - jest-resolve: ^29.4.3 - jest-runtime: ^29.4.3 - jest-util: ^29.4.3 - jest-watcher: ^29.4.3 - jest-worker: ^29.4.3 + jest-environment-node: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-leak-detector: ^29.5.0 + jest-message-util: ^29.5.0 + jest-resolve: ^29.5.0 + jest-runtime: ^29.5.0 + jest-util: ^29.5.0 + jest-watcher: ^29.5.0 + jest-worker: ^29.5.0 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: c41108e5da01e0b8fdc2a06c5042eb49bb1d8db0e0d4651769fd1b9fe84ab45188617c11a3a8e1c83748b29bfe57dd77001ec57e86e3e3c30f3534e0314f8882 + checksum: 437dea69c5dddca22032259787bac74790d5a171c9d804711415f31e5d1abfb64fa52f54a9015bb17a12b858fd0cf3f75ef6f3c9e94255a8596e179f707229c4 languageName: node linkType: hard -"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-runtime@npm:29.4.3" +"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runtime@npm:29.5.0" dependencies: - "@jest/environment": ^29.4.3 - "@jest/fake-timers": ^29.4.3 - "@jest/globals": ^29.4.3 + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/globals": ^29.5.0 "@jest/source-map": ^29.4.3 - "@jest/test-result": ^29.4.3 - "@jest/transform": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.4.3 - jest-message-util: ^29.4.3 - jest-mock: ^29.4.3 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 jest-regex-util: ^29.4.3 - jest-resolve: ^29.4.3 - jest-snapshot: ^29.4.3 - jest-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: b99f8a910d1a38e7476058ba04ad44dfd3d93e837bb7c301d691e646a1085412fde87f06fbe271c9145f0e72d89400bfa7f6994bc30d456c7742269f37d0f570 + checksum: 7af27bd9d54cf1c5735404cf8d76c6509d5610b1ec0106a21baa815c1aff15d774ce534ac2834bc440dccfe6348bae1885fd9a806f23a94ddafdc0f5bae4b09d languageName: node linkType: hard -"jest-snapshot@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-snapshot@npm:29.4.3" +"jest-snapshot@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-snapshot@npm:29.5.0" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 @@ -27120,25 +27126,24 @@ __metadata: "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.4.3 - "@jest/transform": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/expect-utils": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 "@types/babel__traverse": ^7.0.6 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.4.3 + expect: ^29.5.0 graceful-fs: ^4.2.9 - jest-diff: ^29.4.3 + jest-diff: ^29.5.0 jest-get-type: ^29.4.3 - jest-haste-map: ^29.4.3 - jest-matcher-utils: ^29.4.3 - jest-message-util: ^29.4.3 - jest-util: ^29.4.3 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 natural-compare: ^1.4.0 - pretty-format: ^29.4.3 + pretty-format: ^29.5.0 semver: ^7.3.5 - checksum: 79ba52f2435e23ce72b1309be4b17fdbcb299d1c2ce97ebb61df9a62711e9463035f63b4c849181b2fe5aa17b3e09d30ee4668cc25fb3c6f59511c010b4d9494 + checksum: fe5df54122ed10eed625de6416a45bc4958d5062b018f05b152bf9785ab7f355dcd55e40cf5da63895bf8278f8d7b2bb4059b2cfbfdee18f509d455d37d8aa2b languageName: node linkType: hard @@ -27156,47 +27161,47 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-util@npm:29.4.3" +"jest-util@npm:^29.0.0, jest-util@npm:^29.4.3, jest-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-util@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: 606b3e6077895baf8fb4ad4d08c134f37a6b81d5ba77ae654c942b1ae4b7294ab3b5a0eb93db34f129407b367970cf3b76bf5c80897b30f215f2bc8bf20a5f3f + checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 languageName: node linkType: hard -"jest-validate@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-validate@npm:29.4.3" +"jest-validate@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-validate@npm:29.5.0" dependencies: - "@jest/types": ^29.4.3 + "@jest/types": ^29.5.0 camelcase: ^6.2.0 chalk: ^4.0.0 jest-get-type: ^29.4.3 leven: ^3.1.0 - pretty-format: ^29.4.3 - checksum: 983e56430d86bed238448cae031535c1d908f760aa312cd4a4ec0e92f3bc1b6675415ddf57cdeceedb8ad9c698e5bcd10f0a856dfc93a8923bdecc7733f4ba80 + pretty-format: ^29.5.0 + checksum: 43ca5df7cb75572a254ac3e92fbbe7be6b6a1be898cc1e887a45d55ea003f7a112717d814a674d37f9f18f52d8de40873c8f084f17664ae562736c78dd44c6a1 languageName: node linkType: hard -"jest-watcher@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-watcher@npm:29.4.3" +"jest-watcher@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-watcher@npm:29.5.0" dependencies: - "@jest/test-result": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.4.3 + jest-util: ^29.5.0 string-length: ^4.0.1 - checksum: 44b64991b3414db853c3756f14690028f4edef7aebfb204a4291cc1901c2239fa27a8687c5c5abbecc74bf613e0bb9b1378bf766430c9febcc71e9c0cb5ad8fc + checksum: 62303ac7bdc7e61a8b4239a239d018f7527739da2b2be6a81a7be25b74ca769f1c43ee8558ce8e72bb857245c46d6e03af331227ffb00a57280abb2a928aa776 languageName: node linkType: hard @@ -27231,26 +27236,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-worker@npm:29.4.3" +"jest-worker@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-worker@npm:29.5.0" dependencies: "@types/node": "*" - jest-util: ^29.4.3 + jest-util: ^29.5.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: c99ae66f257564613e72c5797c3a68f21a22e1c1fb5f30d14695ff5b508a0d2405f22748f13a3df8d1015b5e16abb130170f81f047ff68f58b6b1d2ff6ebc51b + checksum: 1151a1ae3602b1ea7c42a8f1efe2b5a7bf927039deaa0827bf978880169899b705744e288f80a63603fb3fc2985e0071234986af7dc2c21c7a64333d8777c7c9 languageName: node linkType: hard -"jest@npm:^29.0.2": - version: 29.4.3 - resolution: "jest@npm:29.4.3" +"jest@npm:^29.0.2, jest@npm:^29.5.0": + version: 29.5.0 + resolution: "jest@npm:29.5.0" dependencies: - "@jest/core": ^29.4.3 - "@jest/types": ^29.4.3 + "@jest/core": ^29.5.0 + "@jest/types": ^29.5.0 import-local: ^3.0.2 - jest-cli: ^29.4.3 + jest-cli: ^29.5.0 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -27258,7 +27263,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 084d10d1ceaade3c40e6d3bbd71b9b71b8919ba6fbd6f1f6699bdc259a6ba2f7350c7ccbfa10c11f7e3e01662853650a6244210179542fe4ba87e77dc3f3109f + checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 languageName: node linkType: hard @@ -27756,7 +27761,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -28726,7 +28731,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:^4.1.2": +"lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 @@ -29010,7 +29015,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1": +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -30258,9 +30263,9 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.0.0, msw@npm:^1.0.1": - version: 1.0.1 - resolution: "msw@npm:1.0.1" +"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.1.0": + version: 1.1.0 + resolution: "msw@npm:1.1.0" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -30288,7 +30293,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: e5d6cbe67067ca46f42aaa33011f53a4e5a873abcf81c52a6996536b3c41a88f522821d3a4cf589658252581506afddb58fd8c3dfd79a5cbf06e26e14f9570b6 + checksum: e555547defbc3f07532bdadcbf9f4e3a32b92156d3869e85c9038ecaac220cfc93901727da097b7f9d3ecf9cbbc5a9178c0ecdd3999a9201db4c85c99b92c361 languageName: node linkType: hard @@ -32959,14 +32964,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.4.3": - version: 29.4.3 - resolution: "pretty-format@npm:29.4.3" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" dependencies: "@jest/schemas": ^29.4.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: 3258b9a010bd79b3cf73783ad1e4592b6326fc981b6e31b742f316f14e7fbac09b48a9dbf274d092d9bde404db9fe16f518370e121837dc078a597392e6e5cc5 + checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 languageName: node linkType: hard @@ -33326,6 +33331,13 @@ __metadata: languageName: node linkType: hard +"pure-rand@npm:^6.0.0": + version: 6.0.1 + resolution: "pure-rand@npm:6.0.1" + checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 + languageName: node + linkType: hard + "pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -35422,16 +35434,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": +"semver@npm:7.x, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -35442,6 +35445,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -37619,6 +37631,39 @@ __metadata: languageName: node linkType: hard +"ts-jest@npm:^29.0.5": + version: 29.0.5 + resolution: "ts-jest@npm:29.0.5" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 + languageName: node + linkType: hard + "ts-log@npm:^2.2.3": version: 2.2.3 resolution: "ts-log@npm:2.2.3" @@ -39571,7 +39616,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.0.0": +"yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.0.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c From fa70d69ec6fb38392bfc1693618e73cc747b63d6 Mon Sep 17 00:00:00 2001 From: Tracey Radcliffe Date: Fri, 17 Mar 2023 14:16:07 -0700 Subject: [PATCH 06/22] Apply suggestions from code review Co-authored-by: Johan Haals Signed-off-by: Tracey Radcliffe --- .../package.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json index 10aef2bca3..595b39ee83 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json @@ -31,20 +31,18 @@ "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", - "fs-extra": "^11.1.0", + "fs-extra": "10.1.0", "git-url-parse": "^13.1.0", "jest": "^29.5.0", - "node-fetch": "2.6.7", + "node-fetch": "^2.6.7", "node-html-markdown": "^1.3.0", - "ts-jest": "^29.0.5", - "yaml": "^2.2.1" + "yaml": "^2.0.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", "mock-fs": "^5.2.0", - "msw": "^1.1.0", - "os": "^0.1.2" + "msw": "^1.0.0", }, "files": [ "dist" From 98b21c24f2a1a3c35a662ff3a5ee7e15cf9cdffa Mon Sep 17 00:00:00 2001 From: Tracey Date: Fri, 17 Mar 2023 14:54:22 -0700 Subject: [PATCH 07/22] updated action id, added a comment and addressed other changes suggested during code reivew Signed-off-by: Tracey --- .../.eslintrc.js | 0 .../README.md | 4 +- .../package.json | 3 +- .../confluence/confluenceToMarkdown.test.ts | 2 +- .../confluence/confluenceToMarkdown.ts | 5 +- .../src/actions/confluence/helpers.ts | 0 .../src/actions/confluence/index.ts | 0 .../src/actions/index.ts | 0 .../src/index.ts | 0 yarn.lock | 113 ++++-------------- 10 files changed, 32 insertions(+), 95 deletions(-) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/.eslintrc.js (100%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/README.md (96%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/package.json (97%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/actions/confluence/confluenceToMarkdown.test.ts (99%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/actions/confluence/confluenceToMarkdown.ts (94%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/actions/confluence/helpers.ts (100%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/actions/confluence/index.ts (100%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/actions/index.ts (100%) rename plugins/{scaffolder-backend-module-confluence-to-markdowwn => scaffolder-backend-module-confluence-to-markdown}/src/index.ts (100%) diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js b/plugins/scaffolder-backend-module-confluence-to-markdown/.eslintrc.js similarity index 100% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js rename to plugins/scaffolder-backend-module-confluence-to-markdown/.eslintrc.js diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md similarity index 96% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md rename to plugins/scaffolder-backend-module-confluence-to-markdown/README.md index 56ca4afffc..7f526db553 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md @@ -1,6 +1,6 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown -Welcome to the `transform:confluence-to-markdown` action for the `scaffolder-backend`. +Welcome to the `confluence:transform:markdown` action for the `scaffolder-backend`. ## Getting started @@ -99,7 +99,7 @@ spec: steps: - id: create-docs name: Get markdown file created and update markdown.yaml file - action: transform:confluence-to-markdown + action: confluence:transform:markdown input: confluenceUrls: ${{ parameters.confluenceUrls }} repoUrl: ${{ parameters.repoUrl }} diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json similarity index 97% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json rename to plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 595b39ee83..7ad5f127f6 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -33,7 +33,6 @@ "@backstage/types": "workspace:^", "fs-extra": "10.1.0", "git-url-parse": "^13.1.0", - "jest": "^29.5.0", "node-fetch": "^2.6.7", "node-html-markdown": "^1.3.0", "yaml": "^2.0.0" @@ -42,7 +41,7 @@ "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", "mock-fs": "^5.2.0", - "msw": "^1.0.0", + "msw": "^1.0.0" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts similarity index 99% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts index ae98c38c03..a7d0ea7b25 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -39,7 +39,7 @@ jest.mock('fs-extra', () => ({ writeStream: jest.fn(), })); -describe('transform:confluence-to-markdown', () => { +describe('confluence:transform:markdown', () => { const baseUrl = `https://nodomain.confluence.com`; const worker = setupServer(); setupRequestMockHandlers(worker); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts similarity index 94% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index 2a7d28048a..6cbf4da53a 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -45,7 +45,7 @@ export const createConfluenceToMarkdownAction = (options: { confluenceUrls: string[]; repoUrl: string; }>({ - id: 'transform:confluence-to-markdown', + id: 'confluence:transform:markdown', schema: { input: { properties: { @@ -154,7 +154,8 @@ export const createConfluenceToMarkdownAction = (options: { const markdownToPublish = NodeHtmlMarkdown.translate(html); let newString: string = markdownToPublish; productArray.forEach((product: string[]) => { - const regex = product[1].includes('pdf') + // This regex is looking for either [](link to confluence) or ![](link to confluence) in the newly created markdown doc and updating it to point to the versions saved(in ./docs/img) in the local version of GitHub Repo during getAndWriteAttachments + const regex = product[0].includes('pdf') ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi') : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi'); newString = newString.replace(regex, `$1./img/${product[1]}$3`); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts similarity index 100% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/index.ts similarity index 100% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/index.ts diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/index.ts similarity index 100% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/index.ts diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts similarity index 100% rename from plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts rename to plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts diff --git a/yarn.lock b/yarn.lock index 4514e3757b..e4434d5168 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7651,9 +7651,9 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn": +"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown": version: 0.0.0-use.local - resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn" + resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown" dependencies: "@backstage/backend-common": "workspace:^" "@backstage/cli": "workspace:^" @@ -7664,16 +7664,13 @@ __metadata: "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" - fs-extra: ^11.1.0 + fs-extra: 10.1.0 git-url-parse: ^13.1.0 - jest: ^29.5.0 mock-fs: ^5.2.0 - msw: ^1.1.0 - node-fetch: 2.6.7 + msw: ^1.0.0 + node-fetch: ^2.6.7 node-html-markdown: ^1.3.0 - os: ^0.1.2 - ts-jest: ^29.0.5 - yaml: ^2.2.1 + yaml: ^2.0.0 languageName: unknown linkType: soft @@ -18363,15 +18360,6 @@ __metadata: languageName: node linkType: hard -"bs-logger@npm:0.x": - version: 0.2.6 - resolution: "bs-logger@npm:0.2.6" - dependencies: - fast-json-stable-stringify: 2.x - checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 - languageName: node - linkType: hard - "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -23317,7 +23305,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb @@ -23953,17 +23941,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f - languageName: node - linkType: hard - "fs-extra@npm:^7.0.1, fs-extra@npm:~7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -27161,7 +27138,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.4.3, jest-util@npm:^29.5.0": +"jest-util@npm:^29.4.3, jest-util@npm:^29.5.0": version: 29.5.0 resolution: "jest-util@npm:29.5.0" dependencies: @@ -27248,7 +27225,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.0.2, jest@npm:^29.5.0": +"jest@npm:^29.0.2": version: 29.5.0 resolution: "jest@npm:29.5.0" dependencies: @@ -27761,7 +27738,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -28731,7 +28708,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": +"lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 @@ -29015,7 +28992,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -30263,7 +30240,7 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.1.0": +"msw@npm:^1.0.0, msw@npm:^1.0.1": version: 1.1.0 resolution: "msw@npm:1.1.0" dependencies: @@ -31363,13 +31340,6 @@ __metadata: languageName: node linkType: hard -"os@npm:^0.1.2": - version: 0.1.2 - resolution: "os@npm:0.1.2" - checksum: dc2d99759eef13f5dc47ddb12c67b9760a7196fd83a35a7aec2d75b82f91163ca1d4e8872238f8c2a35f4cddd5adf5ce6638a234c0563c748d3cd1d69a9f7153 - languageName: node - linkType: hard - "ospath@npm:^1.2.2": version: 1.2.2 resolution: "ospath@npm:1.2.2" @@ -35434,7 +35404,16 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.x, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": +"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -35445,15 +35424,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -37631,39 +37601,6 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.0.5": - version: 29.0.5 - resolution: "ts-jest@npm:29.0.5" - dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^29.0.0 - json5: ^2.2.3 - lodash.memoize: 4.x - make-error: 1.x - semver: 7.x - yargs-parser: ^21.0.1 - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 - typescript: ">=4.3" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 - languageName: node - linkType: hard - "ts-log@npm:^2.2.3": version: 2.2.3 resolution: "ts-log@npm:2.2.3" @@ -39592,7 +39529,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3, yaml@npm:^2.2.1": +"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": version: 2.2.1 resolution: "yaml@npm:2.2.1" checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 @@ -39616,7 +39553,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.0.1": +"yargs-parser@npm:^21.0.0": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c From 605b43ad762c7459be9cb3b848936f048d9fb979 Mon Sep 17 00:00:00 2001 From: Tracey Date: Mon, 20 Mar 2023 16:13:08 -0700 Subject: [PATCH 08/22] cleaned up tests, fixed yarn.lock, and updated to .pdf Signed-off-by: Tracey --- .../README.md | 2 +- .../confluence/confluenceToMarkdown.test.ts | 15 +- .../confluence/confluenceToMarkdown.ts | 2 +- yarn.lock | 631 +++++++++--------- 4 files changed, 315 insertions(+), 335 deletions(-) diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md index 7f526db553..740706b556 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md @@ -119,6 +119,6 @@ spec: forceAdmin: true ``` -Replace `` with your GitHub url without `https://`. +Replace `` with your GitHub URL without `https://`. You can find a list of all registered actions including their parameters at the /create/actions route in your Backstage application. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts index a7d0ea7b25..b95d8ae520 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -36,7 +36,7 @@ jest.mock('fs-extra', () => ({ outputFile: jest.fn(), openSync: jest.fn(), createWriteStream: jest.fn().mockReturnValue(new PassThrough()), - writeStream: jest.fn(), + ensureDir: jest.fn(), })); describe('confluence:transform:markdown', () => { @@ -148,16 +148,6 @@ describe('confluence:transform:markdown', () => { ), ); - const mockCreateWriteStream = jest.fn().mockReturnValue({ - on: jest.fn(), - once: jest.fn((_event, callback) => { - callback(); - }), - }); - jest.mock('fs', () => ({ - openSync: jest.fn(), - createWriteStream: jest.fn().mockReturnValue(mockCreateWriteStream), - })); const action = createConfluenceToMarkdownAction(options); await action.handler(mockContext); @@ -205,9 +195,6 @@ describe('confluence:transform:markdown', () => { ), ); - jest.mock('fs-extra', () => ({ - readFile: jest.fn().mockResolvedValue('File contents'), - })); const action = createConfluenceToMarkdownAction(options); await action.handler(mockContext); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index 6cbf4da53a..ad58ed11c5 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -155,7 +155,7 @@ export const createConfluenceToMarkdownAction = (options: { let newString: string = markdownToPublish; productArray.forEach((product: string[]) => { // This regex is looking for either [](link to confluence) or ![](link to confluence) in the newly created markdown doc and updating it to point to the versions saved(in ./docs/img) in the local version of GitHub Repo during getAndWriteAttachments - const regex = product[0].includes('pdf') + const regex = product[0].includes('.pdf') ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi') : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi'); newString = newString.replace(regex, `$1./img/${product[1]}$3`); diff --git a/yarn.lock b/yarn.lock index e4434d5168..60b3adf461 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11173,50 +11173,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/console@npm:29.5.0" +"@jest/console@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/console@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 slash: ^3.0.0 - checksum: 9f4f4b8fabd1221361b7f2e92d4a90f5f8c2e2b29077249996ab3c8b7f765175ffee795368f8d6b5b2bb3adb32dc09319f7270c7c787b0d259e624e00e0f64a5 + checksum: 8d9b163febe735153b523db527742309f4d598eda22f17f04e030060329bd3da4de7420fc1f7812f7a16f08273654a7de094c4b4e8b81a99dbfc17cfb1629008 languageName: node linkType: hard -"@jest/core@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/core@npm:29.5.0" +"@jest/core@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/core@npm:29.4.3" dependencies: - "@jest/console": ^29.5.0 - "@jest/reporters": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.4.3 + "@jest/reporters": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.5.0 - jest-config: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 + jest-changed-files: ^29.4.3 + jest-config: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-message-util: ^29.4.3 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-resolve-dependencies: ^29.5.0 - jest-runner: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - jest-watcher: ^29.5.0 + jest-resolve: ^29.4.3 + jest-resolve-dependencies: ^29.4.3 + jest-runner: ^29.4.3 + jest-runtime: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 + jest-watcher: ^29.4.3 micromatch: ^4.0.4 - pretty-format: ^29.5.0 + pretty-format: ^29.4.3 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -11224,7 +11224,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 9e8f5243fe82d5a57f3971e1b96f320058df7c315328a3a827263f3b17f64be10c80f4a9c1b1773628b64d2de6d607c70b5b2d5bf13e7f5ad04223e9ef6aac06 + checksum: 4aa10644d66f44f051d5dd9cdcedce27acc71216dbcc5e7adebdea458e27aefe27c78f457d7efd49f58b968c35f42de5a521590876e2013593e675120b9e6ab1 languageName: node linkType: hard @@ -11237,15 +11237,15 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^29.4.3, @jest/environment@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/environment@npm:29.5.0" +"@jest/environment@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/environment@npm:29.4.3" dependencies: - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/fake-timers": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-mock: ^29.5.0 - checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a + jest-mock: ^29.4.3 + checksum: 7c1b0cc4e84b90f8a3bbeca9bbf088882c88aee70a81b3b8e24265dcb1cbc302cd1eee3319089cf65bfd39adbaea344903c712afea106cb8da6c86088d99c5fb languageName: node linkType: hard @@ -11258,60 +11258,60 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect-utils@npm:29.5.0" +"@jest/expect-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/expect-utils@npm:29.4.3" dependencies: jest-get-type: ^29.4.3 - checksum: c46fb677c88535cf83cf29f0a5b1f376c6a1109ddda266ad7da1a9cbc53cb441fa402dd61fc7b111ffc99603c11a9b3357ee41a1c0e035a58830bcb360871476 + checksum: 2bbed39ff2fb59f5acac465a1ce7303e3b4b62b479e4f386261986c9827f7f799ea912761e22629c5daf10addf8513f16733c14a29c2647bb66d4ee625e9ff92 languageName: node linkType: hard -"@jest/expect@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect@npm:29.5.0" +"@jest/expect@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/expect@npm:29.4.3" dependencies: - expect: ^29.5.0 - jest-snapshot: ^29.5.0 - checksum: bd10e295111547e6339137107d83986ab48d46561525393834d7d2d8b2ae9d5626653f3f5e48e5c3fa742ac982e97bdf1f541b53b9e1d117a247b08e938527f6 + expect: ^29.4.3 + jest-snapshot: ^29.4.3 + checksum: 08d0d40077ec99a7491fe59d05821dbd31126cfba70875855d8a063698b7126b5f6c309c50811caacc6ae2f727c6e44f51bdcf1d6c1ea832b4f020045ef22d45 languageName: node linkType: hard -"@jest/fake-timers@npm:^29.4.3, @jest/fake-timers@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/fake-timers@npm:29.5.0" +"@jest/fake-timers@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/fake-timers@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee + jest-message-util: ^29.4.3 + jest-mock: ^29.4.3 + jest-util: ^29.4.3 + checksum: adaceb9143c395cccf3d7baa0e49b7042c3092a554e8283146df19926247e34c21b5bde5688bb90e9e87b4a02e4587926c5d858ee0a38d397a63175d0a127874 languageName: node linkType: hard -"@jest/globals@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/globals@npm:29.5.0" +"@jest/globals@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/globals@npm:29.4.3" dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/types": ^29.5.0 - jest-mock: ^29.5.0 - checksum: b309ab8f21b571a7c672608682e84bbdd3d2b554ddf81e4e32617fec0a69094a290ab42e3c8b2c66ba891882bfb1b8b2736720ea1285b3ad646d55c2abefedd9 + "@jest/environment": ^29.4.3 + "@jest/expect": ^29.4.3 + "@jest/types": ^29.4.3 + jest-mock: ^29.4.3 + checksum: ea76b546ceb4aa5ce2bb3726df12f989b23150b51c9f7664790caa81b943012a657cf3a8525498af1c3518cdb387f54b816cfba1b0ddd22c7b20f03b1d7290b4 languageName: node linkType: hard -"@jest/reporters@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/reporters@npm:29.5.0" +"@jest/reporters@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/reporters@npm:29.4.3" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@jridgewell/trace-mapping": ^0.3.15 "@types/node": "*" chalk: ^4.0.0 @@ -11324,9 +11324,9 @@ __metadata: istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -11336,7 +11336,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 481268aac9a4a75cc49c4df1273d6b111808dec815e9d009dad717c32383ebb0cebac76e820ad1ab44e207540e1c2fe1e640d44c4f262de92ab1933e057fdeeb + checksum: 7aa2e429c915bd96c3334962addd69d2bbf52065725757ddde26b293f8c4420a1e8c65363cc3e1e5ec89100a5273ccd3771bec58325a2cc0d97afdc81995073a languageName: node linkType: hard @@ -11369,50 +11369,50 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-result@npm:29.5.0" +"@jest/test-result@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/test-result@npm:29.4.3" dependencies: - "@jest/console": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.4.3 + "@jest/types": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 2e8ff5242227ab960c520c3ea0f6544c595cc1c42fa3873c158e9f4f685f4ec9670ec08a4af94ae3885c0005a43550a9595191ffbc27a0965df27d9d98bbf901 + checksum: 164f102b96619ec283c2c39e208b8048e4674f75bf3c3a4f2e95048ae0f9226105add684b25f10d286d91c221625f877e2c1cfc3da46c42d7e1804da239318cb languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-sequencer@npm:29.5.0" +"@jest/test-sequencer@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/test-sequencer@npm:29.4.3" dependencies: - "@jest/test-result": ^29.5.0 + "@jest/test-result": ^29.4.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.4.3 slash: ^3.0.0 - checksum: eca34b4aeb2fda6dfb7f9f4b064c858a7adf64ec5c6091b6f4ed9d3c19549177cbadcf1c615c4c182688fa1cf085c8c55c3ca6eea40719a34554b0bf071d842e + checksum: 145e1fa9379e5be3587bde6d585b8aee5cf4442b06926928a87e9aec7de5be91b581711d627c6ca13144d244fe05e5d248c13b366b51bedc404f9dcfbfd79e9e languageName: node linkType: hard -"@jest/transform@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/transform@npm:29.5.0" +"@jest/transform@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/transform@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@jridgewell/trace-mapping": ^0.3.15 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.4.3 jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 + jest-util: ^29.4.3 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: d55d604085c157cf5112e165ff5ac1fa788873b3b31265fb4734ca59892ee24e44119964cc47eb6d178dd9512bbb6c576d1e20e51a201ff4e24d31e818a1c92d + checksum: 082d74e04044213aa7baa8de29f8383e5010034f867969c8602a2447a4ef2f484cfaf2491eba3179ce42f369f7a0af419cbd087910f7e5caf7aa5d1fe03f2ff9 languageName: node linkType: hard @@ -11443,9 +11443,9 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.4.3, @jest/types@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/types@npm:29.5.0" +"@jest/types@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/types@npm:29.4.3" dependencies: "@jest/schemas": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 @@ -11453,7 +11453,7 @@ __metadata: "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 + checksum: 1756f4149d360f98567f56f434144f7af23ed49a2c42889261a314df6b6654c2de70af618fb2ee0ee39cadaf10835b885845557184509503646c9cb9dcc02bac languageName: node linkType: hard @@ -17711,20 +17711,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-jest@npm:29.5.0" +"babel-jest@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-jest@npm:29.4.3" dependencies: - "@jest/transform": ^29.5.0 + "@jest/transform": ^29.4.3 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.5.0 + babel-preset-jest: ^29.4.3 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: eafb6d37deb71f0c80bf3c80215aa46732153e5e8bcd73f6ff47d92e5c0c98c8f7f75995d0efec6289c371edad3693cd8fa2367b0661c4deb71a3a7117267ede + checksum: a1a95937adb5e717dbffc2eb9e583fa6d26c7e5d5b07bb492a2d7f68631510a363e9ff097eafb642ad642dfac9dc2b13872b584f680e166a4f0922c98ea95853 languageName: node linkType: hard @@ -17750,15 +17750,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-plugin-jest-hoist@npm:29.5.0" +"babel-plugin-jest-hoist@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-plugin-jest-hoist@npm:29.4.3" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + checksum: c8702a6db6b30ec39dfb9f8e72b501c13895231ed80b15ed2648448f9f0c7b7cc4b1529beac31802ae655f63479a05110ca612815aa25fb1b0e6c874e1589137 languageName: node linkType: hard @@ -17897,15 +17897,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-preset-jest@npm:29.5.0" +"babel-preset-jest@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-preset-jest@npm:29.4.3" dependencies: - babel-plugin-jest-hoist: ^29.5.0 + babel-plugin-jest-hoist: ^29.4.3 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + checksum: a091721861ea2f8d969ace8fe06570cff8f2e847dbc6e4800abacbe63f72131abde615ce0a3b6648472c97e55a5be7f8bf7ae381e2b194ad2fa1737096febcf5 languageName: node linkType: hard @@ -23081,16 +23081,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.5.0": - version: 29.5.0 - resolution: "expect@npm:29.5.0" +"expect@npm:^29.0.0, expect@npm:^29.4.3": + version: 29.4.3 + resolution: "expect@npm:29.4.3" dependencies: - "@jest/expect-utils": ^29.5.0 + "@jest/expect-utils": ^29.4.3 jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - checksum: 58f70b38693df6e5c6892db1bcd050f0e518d6f785175dc53917d4fa6a7359a048e5690e19ddcb96b65c4493881dd89a3dabdab1a84dfa55c10cdbdabf37b2d7 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + checksum: ff9dd8c50c0c6fd4b2b00f6dbd7ab0e2063fe1953be81a8c10ae1c005c7f5667ba452918e2efb055504b72b701a4f82575a081a0a7158efb16d87991b0366feb languageName: node linkType: hard @@ -26679,58 +26679,57 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-changed-files@npm:29.5.0" +"jest-changed-files@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-changed-files@npm:29.4.3" dependencies: execa: ^5.0.0 p-limit: ^3.1.0 - checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + checksum: 9a70bd8e92b37e18ad26d8bea97c516f41119fb7046b4255a13c76d557b0e54fa0629726de5a093fadfd6a0a08ce45da65a57086664d505b8db4b3133133e141 languageName: node linkType: hard -"jest-circus@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-circus@npm:29.5.0" +"jest-circus@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-circus@npm:29.4.3" dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/environment": ^29.4.3 + "@jest/expect": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 is-generator-fn: ^2.0.0 - jest-each: ^29.5.0 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 + jest-each: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-runtime: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 p-limit: ^3.1.0 - pretty-format: ^29.5.0 - pure-rand: ^6.0.0 + pretty-format: ^29.4.3 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 44ff5d06acedae6de6c866e20e3b61f83e29ab94cf9f960826e7e667de49c12dd9ab9dffd7fa3b7d1f9688a8b5bfb1ebebadbea69d9ed0d3f66af4a0ff8c2b27 + checksum: 2739bef9c888743b49ff3fe303131381618e5d2f250f613a91240d9c86e19e6874fc904cbd8bcb02ec9ec59a84e5dae4ffec929f0c6171e87ddbc05508a137f4 languageName: node linkType: hard -"jest-cli@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-cli@npm:29.5.0" +"jest-cli@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-cli@npm:29.4.3" dependencies: - "@jest/core": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/core": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-config: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -26740,34 +26739,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 39897bbbc0f0d8a6b975ab12fd13887eaa28d92e3dee9e0173a5cb913ae8cc2ae46e090d38c6d723e84d9d6724429cd08685b4e505fa447d31ca615630c7dbba + checksum: f4c9f6d76cde2c60a4169acbebb3f862728be03bcf3fe0077d2e55da7f9f3c3e9483cfa6e936832d35eabf96ee5ebf0300c4b0bd43cffff099801793466bfdd8 languageName: node linkType: hard -"jest-config@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-config@npm:29.5.0" +"jest-config@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-config@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.5.0 - "@jest/types": ^29.5.0 - babel-jest: ^29.5.0 + "@jest/test-sequencer": ^29.4.3 + "@jest/types": ^29.4.3 + babel-jest: ^29.4.3 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.5.0 - jest-environment-node: ^29.5.0 + jest-circus: ^29.4.3 + jest-environment-node: ^29.4.3 jest-get-type: ^29.4.3 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-runner: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-resolve: ^29.4.3 + jest-runner: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.5.0 + pretty-format: ^29.4.3 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -26778,7 +26777,7 @@ __metadata: optional: true ts-node: optional: true - checksum: c37c4dab964c54ab293d4e302d40b09687037ac9d00b88348ec42366970747feeaf265e12e3750cd3660b40c518d4031335eda11ac10b70b10e60797ebbd4b9c + checksum: 92f9a9c6850b18682cb01892774a33967472af23a5844438d8c68077d5f2a29b15b665e4e4db7de3d74002a6dca158cd5b2cb9f5debfd2cce5e1aee6c74e3873 languageName: node linkType: hard @@ -26803,15 +26802,15 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-diff@npm:29.5.0" +"jest-diff@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-diff@npm:29.4.3" dependencies: chalk: ^4.0.0 diff-sequences: ^29.4.3 jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: dfd0f4a299b5d127779c76b40106c37854c89c3e0785098c717d52822d6620d227f6234c3a9291df204d619e799e3654159213bf93220f79c8e92a55475a3d39 + pretty-format: ^29.4.3 + checksum: 877fd1edffef6b319688c27b152e5b28e2bc4bcda5ce0ca90d7e137f9fafda4280bae25403d4c0bfd9806c2c0b15d966aa2dfaf5f9928ec8f1ccea7fa1d08ed6 languageName: node linkType: hard @@ -26824,16 +26823,16 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-each@npm:29.5.0" +"jest-each@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-each@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 chalk: ^4.0.0 jest-get-type: ^29.4.3 - jest-util: ^29.5.0 - pretty-format: ^29.5.0 - checksum: b8b297534d25834c5d4e31e4c687359787b1e402519e42664eb704cc3a12a7a91a017565a75acb02e8cf9afd3f4eef3350bd785276bec0900184641b765ff7a5 + jest-util: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 1f72738338399efab0139eaea18bc198be0c6ed889770c8cbfa70bf9c724e8171fe1d3a29a94f9f39b8493ee6b2529bb350fb7c7c75e0d7eddfd28c253c79f9d languageName: node linkType: hard @@ -26858,17 +26857,17 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-environment-node@npm:29.5.0" +"jest-environment-node@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-environment-node@npm:29.4.3" dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/environment": ^29.4.3 + "@jest/fake-timers": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: 57981911cc20a4219b0da9e22b2e3c9f31b505e43f78e61c899e3227ded455ce1a3a9483842c69cfa4532f02cfb536ae0995bf245f9211608edacfc1e478d411 + jest-mock: ^29.4.3 + jest-util: ^29.4.3 + checksum: 3c7362edfdbd516e83af7367c95dde35761a482b174de9735c07633405486ec73e19624e9bea4333fca33c24e8d65eaa1aa6594e0cb6bfeeeb564ccc431ee61d languageName: node linkType: hard @@ -26886,11 +26885,11 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-haste-map@npm:29.5.0" +"jest-haste-map@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-haste-map@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 @@ -26898,24 +26897,24 @@ __metadata: fsevents: ^2.3.2 graceful-fs: ^4.2.9 jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 3828ff7783f168e34be2c63887f82a01634261f605dcae062d83f979a61c37739e21b9607ecb962256aea3fbe5a530a1acee062d0026fcb47c607c12796cf3b7 + checksum: c7a83ebe6008b3fe96a96235e8153092e54b14df68e0f4205faedec57450df26b658578495a71c6d82494c01fbb44bca98c1506a6b2b9c920696dcc5d2e2bc59 languageName: node linkType: hard -"jest-leak-detector@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-leak-detector@npm:29.5.0" +"jest-leak-detector@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-leak-detector@npm:29.4.3" dependencies: jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 0fb845da7ac9cdfc9b3b2e35f6f623a41c547d7dc0103ceb0349013459d00de5870b5689a625e7e37f9644934b40e8f1dcdd5422d14d57470600350364676313 + pretty-format: ^29.4.3 + checksum: ec2b45e6f0abce81bd0dd0f6fd06b433c24d1ec865267af7640fae540ec868b93752598e407a9184d9c7419cbf32e8789007cc8c1be1a84f8f7321a0f8ad01f1 languageName: node linkType: hard @@ -26931,15 +26930,15 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-matcher-utils@npm:29.5.0" +"jest-matcher-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-matcher-utils@npm:29.4.3" dependencies: chalk: ^4.0.0 - jest-diff: ^29.5.0 + jest-diff: ^29.4.3 jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 1d3e8c746e484a58ce194e3aad152eff21fd0896e8b8bf3d4ab1a4e2cbfed95fb143646f4ad9fdf6e42212b9e8fc033268b58e011b044a9929df45485deb5ac9 + pretty-format: ^29.4.3 + checksum: 9e13cbe42d2113bab2691110c7c3ba5cec3b94abad2727e1de90929d0f67da444e9b2066da3b476b5bf788df53a8ede0e0a950cfb06a04e4d6d566d115ee4f1d languageName: node linkType: hard @@ -26960,31 +26959,31 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-message-util@npm:29.5.0" +"jest-message-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-message-util@npm:29.4.3" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.5.0 + pretty-format: ^29.4.3 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf + checksum: 64f06b9550021e68da0059020bea8691283cf818918810bb67192d7b7fb9b691c7eadf55c2ca3cd04df5394918f2327245077095cdc0d6b04be3532d2c7d0ced languageName: node linkType: hard -"jest-mock@npm:^29.4.3, jest-mock@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-mock@npm:29.5.0" +"jest-mock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-mock@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-util: ^29.5.0 - checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c + jest-util: ^29.4.3 + checksum: 8eb4a29b02d2cd03faac0290b6df6d23b4ffa43f72b21c7fff3c7dd04a2797355b1e85862b70b15341dd33ee3a693b17db5520a6f6e6b81ee75601987de6a1a2 languageName: node linkType: hard @@ -27007,95 +27006,95 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve-dependencies@npm:29.5.0" +"jest-resolve-dependencies@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-resolve-dependencies@npm:29.4.3" dependencies: jest-regex-util: ^29.4.3 - jest-snapshot: ^29.5.0 - checksum: 479d2e5365d58fe23f2b87001e2e0adcbffe0147700e85abdec8f14b9703b0a55758c1929a9989e3f5d5e954fb88870ea4bfa04783523b664562fcf5f10b0edf + jest-snapshot: ^29.4.3 + checksum: 3ad934cd2170c9658d8800f84a975dafc866ec85b7ce391c640c09c3744ced337787620d8667dc8d1fa5e0b1493f973caa1a1bb980e4e6a50b46a1720baf0bd1 languageName: node linkType: hard -"jest-resolve@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve@npm:29.5.0" +"jest-resolve@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-resolve@npm:29.4.3" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.4.3 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 9a125f3cf323ceef512089339d35f3ee37f79fe16a831fb6a26773ea6a229b9e490d108fec7af334142e91845b5996de8e7cdd85a4d8d617078737d804e29c8f + checksum: 056a66beccf833f3c7e5a8fc9bfec218886e87b0b103decdbdf11893669539df489d1490cd6d5f0eea35731e8be0d2e955a6710498f970d2eae734da4df029dc languageName: node linkType: hard -"jest-runner@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runner@npm:29.5.0" +"jest-runner@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-runner@npm:29.4.3" dependencies: - "@jest/console": ^29.5.0 - "@jest/environment": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.4.3 + "@jest/environment": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 jest-docblock: ^29.4.3 - jest-environment-node: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-leak-detector: ^29.5.0 - jest-message-util: ^29.5.0 - jest-resolve: ^29.5.0 - jest-runtime: ^29.5.0 - jest-util: ^29.5.0 - jest-watcher: ^29.5.0 - jest-worker: ^29.5.0 + jest-environment-node: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-leak-detector: ^29.4.3 + jest-message-util: ^29.4.3 + jest-resolve: ^29.4.3 + jest-runtime: ^29.4.3 + jest-util: ^29.4.3 + jest-watcher: ^29.4.3 + jest-worker: ^29.4.3 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 437dea69c5dddca22032259787bac74790d5a171c9d804711415f31e5d1abfb64fa52f54a9015bb17a12b858fd0cf3f75ef6f3c9e94255a8596e179f707229c4 + checksum: c41108e5da01e0b8fdc2a06c5042eb49bb1d8db0e0d4651769fd1b9fe84ab45188617c11a3a8e1c83748b29bfe57dd77001ec57e86e3e3c30f3534e0314f8882 languageName: node linkType: hard -"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runtime@npm:29.5.0" +"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-runtime@npm:29.4.3" dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/globals": ^29.5.0 + "@jest/environment": ^29.4.3 + "@jest/fake-timers": ^29.4.3 + "@jest/globals": ^29.4.3 "@jest/source-map": ^29.4.3 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 + jest-haste-map: ^29.4.3 + jest-message-util: ^29.4.3 + jest-mock: ^29.4.3 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 + jest-resolve: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 7af27bd9d54cf1c5735404cf8d76c6509d5610b1ec0106a21baa815c1aff15d774ce534ac2834bc440dccfe6348bae1885fd9a806f23a94ddafdc0f5bae4b09d + checksum: b99f8a910d1a38e7476058ba04ad44dfd3d93e837bb7c301d691e646a1085412fde87f06fbe271c9145f0e72d89400bfa7f6994bc30d456c7742269f37d0f570 languageName: node linkType: hard -"jest-snapshot@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-snapshot@npm:29.5.0" +"jest-snapshot@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-snapshot@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 @@ -27103,24 +27102,25 @@ __metadata: "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/expect-utils": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/babel__traverse": ^7.0.6 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.5.0 + expect: ^29.4.3 graceful-fs: ^4.2.9 - jest-diff: ^29.5.0 + jest-diff: ^29.4.3 jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 + jest-haste-map: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 natural-compare: ^1.4.0 - pretty-format: ^29.5.0 + pretty-format: ^29.4.3 semver: ^7.3.5 - checksum: fe5df54122ed10eed625de6416a45bc4958d5062b018f05b152bf9785ab7f355dcd55e40cf5da63895bf8278f8d7b2bb4059b2cfbfdee18f509d455d37d8aa2b + checksum: 79ba52f2435e23ce72b1309be4b17fdbcb299d1c2ce97ebb61df9a62711e9463035f63b4c849181b2fe5aa17b3e09d30ee4668cc25fb3c6f59511c010b4d9494 languageName: node linkType: hard @@ -27138,47 +27138,47 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.4.3, jest-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-util@npm:29.5.0" +"jest-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-util@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 + checksum: 606b3e6077895baf8fb4ad4d08c134f37a6b81d5ba77ae654c942b1ae4b7294ab3b5a0eb93db34f129407b367970cf3b76bf5c80897b30f215f2bc8bf20a5f3f languageName: node linkType: hard -"jest-validate@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-validate@npm:29.5.0" +"jest-validate@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-validate@npm:29.4.3" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.4.3 camelcase: ^6.2.0 chalk: ^4.0.0 jest-get-type: ^29.4.3 leven: ^3.1.0 - pretty-format: ^29.5.0 - checksum: 43ca5df7cb75572a254ac3e92fbbe7be6b6a1be898cc1e887a45d55ea003f7a112717d814a674d37f9f18f52d8de40873c8f084f17664ae562736c78dd44c6a1 + pretty-format: ^29.4.3 + checksum: 983e56430d86bed238448cae031535c1d908f760aa312cd4a4ec0e92f3bc1b6675415ddf57cdeceedb8ad9c698e5bcd10f0a856dfc93a8923bdecc7733f4ba80 languageName: node linkType: hard -"jest-watcher@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-watcher@npm:29.5.0" +"jest-watcher@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-watcher@npm:29.4.3" dependencies: - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.5.0 + jest-util: ^29.4.3 string-length: ^4.0.1 - checksum: 62303ac7bdc7e61a8b4239a239d018f7527739da2b2be6a81a7be25b74ca769f1c43ee8558ce8e72bb857245c46d6e03af331227ffb00a57280abb2a928aa776 + checksum: 44b64991b3414db853c3756f14690028f4edef7aebfb204a4291cc1901c2239fa27a8687c5c5abbecc74bf613e0bb9b1378bf766430c9febcc71e9c0cb5ad8fc languageName: node linkType: hard @@ -27213,26 +27213,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-worker@npm:29.5.0" +"jest-worker@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-worker@npm:29.4.3" dependencies: "@types/node": "*" - jest-util: ^29.5.0 + jest-util: ^29.4.3 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 1151a1ae3602b1ea7c42a8f1efe2b5a7bf927039deaa0827bf978880169899b705744e288f80a63603fb3fc2985e0071234986af7dc2c21c7a64333d8777c7c9 + checksum: c99ae66f257564613e72c5797c3a68f21a22e1c1fb5f30d14695ff5b508a0d2405f22748f13a3df8d1015b5e16abb130170f81f047ff68f58b6b1d2ff6ebc51b languageName: node linkType: hard "jest@npm:^29.0.2": - version: 29.5.0 - resolution: "jest@npm:29.5.0" + version: 29.4.3 + resolution: "jest@npm:29.4.3" dependencies: - "@jest/core": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/core": ^29.4.3 + "@jest/types": ^29.4.3 import-local: ^3.0.2 - jest-cli: ^29.5.0 + jest-cli: ^29.4.3 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -27240,7 +27240,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 + checksum: 084d10d1ceaade3c40e6d3bbd71b9b71b8919ba6fbd6f1f6699bdc259a6ba2f7350c7ccbfa10c11f7e3e01662853650a6244210179542fe4ba87e77dc3f3109f languageName: node linkType: hard @@ -30241,8 +30241,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1": - version: 1.1.0 - resolution: "msw@npm:1.1.0" + version: 1.0.1 + resolution: "msw@npm:1.0.1" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -30270,7 +30270,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: e555547defbc3f07532bdadcbf9f4e3a32b92156d3869e85c9038ecaac220cfc93901727da097b7f9d3ecf9cbbc5a9178c0ecdd3999a9201db4c85c99b92c361 + checksum: e5d6cbe67067ca46f42aaa33011f53a4e5a873abcf81c52a6996536b3c41a88f522821d3a4cf589658252581506afddb58fd8c3dfd79a5cbf06e26e14f9570b6 languageName: node linkType: hard @@ -32934,14 +32934,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": - version: 29.5.0 - resolution: "pretty-format@npm:29.5.0" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.4.3": + version: 29.4.3 + resolution: "pretty-format@npm:29.4.3" dependencies: "@jest/schemas": ^29.4.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 + checksum: 3258b9a010bd79b3cf73783ad1e4592b6326fc981b6e31b742f316f14e7fbac09b48a9dbf274d092d9bde404db9fe16f518370e121837dc078a597392e6e5cc5 languageName: node linkType: hard @@ -33301,13 +33301,6 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.0.1 - resolution: "pure-rand@npm:6.0.1" - checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 - languageName: node - linkType: hard - "pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -39530,9 +39523,9 @@ __metadata: linkType: hard "yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": - version: 2.2.1 - resolution: "yaml@npm:2.2.1" - checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 + version: 2.1.3 + resolution: "yaml@npm:2.1.3" + checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 languageName: node linkType: hard From 9dd9cf7769a1ebd5acc185169c08fa172f651061 Mon Sep 17 00:00:00 2001 From: Tracey Date: Tue, 21 Mar 2023 10:38:30 -0700 Subject: [PATCH 09/22] adding api reporrt Signed-off-by: Tracey --- .../api-report.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md new file mode 100644 index 0000000000..30235c2112 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md @@ -0,0 +1,26 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { UrlReader } from '@backstage/backend-common'; + +// Warning: (ae-missing-release-tag) "createConfluenceToMarkdownAction" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const createConfluenceToMarkdownAction: (options: { + reader: UrlReader; + integrations: ScmIntegrations; + config: Config; +}) => TemplateAction<{ + confluenceUrls: string[]; + repoUrl: string; +}>; + +// Warnings were encountered during analysis: +// +// src/index.d.ts:2:42 - (tsdoc-characters-after-block-tag) The token "@backstage" looks like a TSDoc tag but contains an invalid character "/"; if it is not a tag, use a backslash to escape the "@" +``` From 38e0eeb41a335709d3d998493b12972406d5c50c Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Wed, 22 Mar 2023 18:34:20 +0100 Subject: [PATCH 10/22] color tweaks to handle changes in mkdocs-material v9 Signed-off-by: Morgan Bentell --- .changeset/hungry-pianos-unite.md | 5 +++++ plugins/techdocs-node/src/stages/generate/techdocs.ts | 2 +- .../src/reader/transformers/copyToClipboard.tsx | 10 +++++++--- .../src/reader/transformers/styles/rules/layout.ts | 5 +++++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 .changeset/hungry-pianos-unite.md diff --git a/.changeset/hungry-pianos-unite.md b/.changeset/hungry-pianos-unite.md new file mode 100644 index 0000000000..c762b9c2a3 --- /dev/null +++ b/.changeset/hungry-pianos-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Minor visual tweaks in response to changes in mkdocs-material v9 diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 2f88e1a8ad..d2ad0021be 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -53,7 +53,7 @@ export class TechdocsGenerator implements GeneratorBase { * The default docker image (and version) used to generate content. Public * and static so that techdocs-node consumers can use the same version. */ - public static readonly defaultDockerImage = 'spotify/techdocs:v1.1.0'; + public static readonly defaultDockerImage = 'spotify/techdocs:v1.2.0'; private readonly logger: Logger; private readonly containerRunner?: ContainerRunner; private readonly options: GeneratorConfig; diff --git a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx index 422bbb10ce..28a6c789b6 100644 --- a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx +++ b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx @@ -23,7 +23,7 @@ import { SvgIcon, Tooltip, } from '@material-ui/core'; -import Button from '@material-ui/core/Button'; +import IconButton from '@material-ui/core/IconButton'; import type { Transformer } from './transformer'; import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; @@ -69,9 +69,13 @@ const CopyToClipboardButton = ({ text }: CopyToClipboardButtonProps) => { onClose={handleClose} leaveDelay={1000} > - + ); }; diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index 979a616f01..c5e69e6084 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -21,6 +21,11 @@ const SIDEBAR_WIDTH = '224px'; export default ({ theme, sidebar }: RuleOptions) => ` /*================== Layout ==================*/ +/* mkdocs material v9 compat */ +.md-nav__title { + color: var(--md-default-fg-color); +} + .md-grid { max-width: 100%; margin: 0; From 6c809d1a41c63632258132ac8ad9d1bb5d44d897 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Wed, 22 Mar 2023 18:43:12 +0100 Subject: [PATCH 11/22] update changeset Signed-off-by: Morgan Bentell --- .changeset/forty-gorillas-help.md | 6 ++++++ .changeset/hungry-pianos-unite.md | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 .changeset/forty-gorillas-help.md delete mode 100644 .changeset/hungry-pianos-unite.md diff --git a/.changeset/forty-gorillas-help.md b/.changeset/forty-gorillas-help.md new file mode 100644 index 0000000000..ecad212aee --- /dev/null +++ b/.changeset/forty-gorillas-help.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-techdocs': patch +--- + +Minor visual tweaks to adapt to changes in mkdocs-material v9 diff --git a/.changeset/hungry-pianos-unite.md b/.changeset/hungry-pianos-unite.md deleted file mode 100644 index c762b9c2a3..0000000000 --- a/.changeset/hungry-pianos-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Minor visual tweaks in response to changes in mkdocs-material v9 From 7ebbf7378546d7044759092490104c993fe5397e Mon Sep 17 00:00:00 2001 From: Tracey Date: Wed, 22 Mar 2023 11:24:11 -0700 Subject: [PATCH 12/22] fixed errors from api-report file Signed-off-by: Tracey --- .../api-report.md | 6 ------ .../src/actions/confluence/confluenceToMarkdown.ts | 4 ++++ .../src/index.ts | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md index 30235c2112..398beb5059 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md @@ -8,8 +8,6 @@ import { ScmIntegrations } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UrlReader } from '@backstage/backend-common'; -// Warning: (ae-missing-release-tag) "createConfluenceToMarkdownAction" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export const createConfluenceToMarkdownAction: (options: { reader: UrlReader; @@ -19,8 +17,4 @@ export const createConfluenceToMarkdownAction: (options: { confluenceUrls: string[]; repoUrl: string; }>; - -// Warnings were encountered during analysis: -// -// src/index.d.ts:2:42 - (tsdoc-characters-after-block-tag) The token "@backstage" looks like a TSDoc tag but contains an invalid character "/"; if it is not a tag, use a backslash to escape the "@" ``` diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index ad58ed11c5..655b1bbdb7 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -30,6 +30,10 @@ import { createConfluenceVariables, } from './helpers'; +/** + * @public + */ + export const createConfluenceToMarkdownAction = (options: { reader: UrlReader; integrations: ScmIntegrations; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts index bda2c7f9a1..80d2e35cb3 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/index.ts @@ -15,7 +15,7 @@ */ /** - * The confluence-to-markdown module for @backstage/plugin-scaffolder-backend. + * The confluence-to-markdown module for \@backstage/plugin-scaffolder-backend. * * @packageDocumentation */ From eef59fe416b5c0aaa3d73fc9b5d3bfe14299de54 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Thu, 23 Mar 2023 10:49:45 +0100 Subject: [PATCH 13/22] do default techdocs docker image version in a separate PR Signed-off-by: Morgan Bentell --- .changeset/forty-gorillas-help.md | 1 - plugins/techdocs-node/src/stages/generate/techdocs.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.changeset/forty-gorillas-help.md b/.changeset/forty-gorillas-help.md index ecad212aee..3f185525a2 100644 --- a/.changeset/forty-gorillas-help.md +++ b/.changeset/forty-gorillas-help.md @@ -1,5 +1,4 @@ --- -'@backstage/plugin-techdocs-node': patch '@backstage/plugin-techdocs': patch --- diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index d2ad0021be..2f88e1a8ad 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -53,7 +53,7 @@ export class TechdocsGenerator implements GeneratorBase { * The default docker image (and version) used to generate content. Public * and static so that techdocs-node consumers can use the same version. */ - public static readonly defaultDockerImage = 'spotify/techdocs:v1.2.0'; + public static readonly defaultDockerImage = 'spotify/techdocs:v1.1.0'; private readonly logger: Logger; private readonly containerRunner?: ContainerRunner; private readonly options: GeneratorConfig; From 9c00d8b963411a761b76cbea6388afe4d50ac375 Mon Sep 17 00:00:00 2001 From: Tracey Radcliffe Date: Thu, 23 Mar 2023 12:47:37 -0700 Subject: [PATCH 14/22] Apply suggestions from code review Co-authored-by: Johan Haals Signed-off-by: Tracey Radcliffe --- .changeset/new-pigs-jam.md | 2 +- .../README.md | 6 ------ .../src/actions/confluence/helpers.ts | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md index c56880e891..efea0076d2 100644 --- a/.changeset/new-pigs-jam.md +++ b/.changeset/new-pigs-jam.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': minor --- -Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos configured for Techdocs +Created `confluence:transform:markdown` action for converting confluence docs to Markdown. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md index 740706b556..d9b235d6c1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md @@ -111,12 +111,6 @@ spec: branchName: confluence-to-markdown title: Confluence to Markdown description: PR for converting confluence page to mkdocs - - id: merge - name: Merge PR - action: publish:github:merge-pull-request - input: - prUrl: ${{ steps['publish'].output.remoteUrl }} - forceAdmin: true ``` Replace `` with your GitHub URL without `https://`. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts index d59a4cc3f5..58f84a8747 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts @@ -61,7 +61,7 @@ export const fetchConfluence = async (relativeUrl: string, config: Config) => { throw await ResponseError.fromResponse(response); } - return response.json() as Promise; + return response.json(); }; export const getAndWriteAttachments = async ( From 82edae411f751e7cd6822923c4d1befe1bfc75fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 23:39:53 +0000 Subject: [PATCH 15/22] fix(deps): update dependency immer to v9.0.21 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88026d2897..001c850bf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25666,9 +25666,9 @@ __metadata: linkType: hard "immer@npm:^9.0.1, immer@npm:^9.0.7": - version: 9.0.19 - resolution: "immer@npm:9.0.19" - checksum: f02ee53989989c287cd548a3d817fccf0bfe56db919755ee94a72ea3ae78a00363fba93ee6c010fe54a664380c29c53d44ed4091c6a86cae60957ad2cfabc010 + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432 languageName: node linkType: hard From e2a152af87ea54d4680e0047b266f6d68886270b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 23:40:38 +0000 Subject: [PATCH 16/22] fix(deps): update aws-sdk-js-v3 monorepo to v3.298.0 Signed-off-by: Renovate Bot --- yarn.lock | 138 +++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88026d2897..28f21a1cfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -518,15 +518,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.296.0" +"@aws-sdk/client-cognito-identity@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.298.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.296.0 + "@aws-sdk/client-sts": 3.298.0 "@aws-sdk/config-resolver": 3.296.0 - "@aws-sdk/credential-provider-node": 3.296.0 + "@aws-sdk/credential-provider-node": 3.298.0 "@aws-sdk/fetch-http-handler": 3.296.0 "@aws-sdk/hash-node": 3.296.0 "@aws-sdk/invalid-dependency": 3.296.0 @@ -557,20 +557,20 @@ __metadata: "@aws-sdk/util-user-agent-node": 3.296.0 "@aws-sdk/util-utf8": 3.295.0 tslib: ^2.5.0 - checksum: 72c8aac879cc31f156178ecef5895b1c5c802fe1433a3ba0c0010364259815b7e96f7ca7872781e0a512f15ecacb82f62d67902d15f3960a4c0ebf20a1dfd3bd + checksum: 92ec17e7bfa2f71e06a916311ae624e3973b67d0ab1bd0ba7f27481df5cf34f0ee48d26b34bb0c328c7cc0adfd75e4822da0d186fd95cc99a7ac50b165751721 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/client-s3@npm:3.296.0" + version: 3.298.0 + resolution: "@aws-sdk/client-s3@npm:3.298.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.296.0 + "@aws-sdk/client-sts": 3.298.0 "@aws-sdk/config-resolver": 3.296.0 - "@aws-sdk/credential-provider-node": 3.296.0 + "@aws-sdk/credential-provider-node": 3.298.0 "@aws-sdk/eventstream-serde-browser": 3.296.0 "@aws-sdk/eventstream-serde-config-resolver": 3.296.0 "@aws-sdk/eventstream-serde-node": 3.296.0 @@ -619,19 +619,19 @@ __metadata: "@aws-sdk/xml-builder": 3.295.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: e7c73260ec654780be882eddad68f39873010a436477c1536ae04abc249ba08280f240a8dea51db0e222fd623db12a5e555514b2dde9f042299643c483b446cd + checksum: 83d5876eb92493f64fc64dc49229b33f44f7f8def6fa9b32f42e341d0cbe50a340daaa9cbf4e7132e8271fd2f0c07a0a9a790249da3b34e54856d5003d3134bb languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/client-sqs@npm:3.296.0" + version: 3.298.0 + resolution: "@aws-sdk/client-sqs@npm:3.298.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.296.0 + "@aws-sdk/client-sts": 3.298.0 "@aws-sdk/config-resolver": 3.296.0 - "@aws-sdk/credential-provider-node": 3.296.0 + "@aws-sdk/credential-provider-node": 3.298.0 "@aws-sdk/fetch-http-handler": 3.296.0 "@aws-sdk/hash-node": 3.296.0 "@aws-sdk/invalid-dependency": 3.296.0 @@ -665,13 +665,13 @@ __metadata: "@aws-sdk/util-utf8": 3.295.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: ec3c7844ef114e8784efad036f0442bbc1a17bec5878fc22a4641bde3847a57c16e8d5ec92917df9f8a3601b63277852788b16727e9039d389cb8fcf06131e25 + checksum: 262b174e0c7df07dcc3eaf2741596caa7b2f9e964421e6e16102b55d11292c8c626061bf6e39175b80b19083f0e593302e7bb5328dbff80ea92b3aa50cb619c8 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.296.0" +"@aws-sdk/client-sso-oidc@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.298.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 @@ -705,13 +705,13 @@ __metadata: "@aws-sdk/util-user-agent-node": 3.296.0 "@aws-sdk/util-utf8": 3.295.0 tslib: ^2.5.0 - checksum: e2cae6747b8300a143e67354913964e2aa7d96fcb7d68e1020cbb40e2e9079a3aea10f427a3cddd98cf8e8463b189d1a15639d713e92d3dff2f8aada7527db9d + checksum: 48786eb7287a7430bd0460d6faf76903aa8979248d626da53727a20b2e4499d5b01e9ebc0206a7f4061673796c07d597d3fc52bd157d765483a59a5e7a484292 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/client-sso@npm:3.296.0" +"@aws-sdk/client-sso@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/client-sso@npm:3.298.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 @@ -745,18 +745,18 @@ __metadata: "@aws-sdk/util-user-agent-node": 3.296.0 "@aws-sdk/util-utf8": 3.295.0 tslib: ^2.5.0 - checksum: def371cedc2add3127d648c24ea1356517cba510f06679134add036f22c9d139205071fc30e0c753081507881068987efcef2a3a61ca283c4696614236febc08 + checksum: 226b8c211e78a384db7106c6c5ed4d8ae7cfb672ed31c595c6f8531d17b5704315b06cba07aabbc35d8dbccc3fe0ed4f1c290e33d9e599e2f75af9d51afdb1fe languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.296.0, @aws-sdk/client-sts@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/client-sts@npm:3.296.0" +"@aws-sdk/client-sts@npm:3.298.0, @aws-sdk/client-sts@npm:^3.208.0": + version: 3.298.0 + resolution: "@aws-sdk/client-sts@npm:3.298.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 "@aws-sdk/config-resolver": 3.296.0 - "@aws-sdk/credential-provider-node": 3.296.0 + "@aws-sdk/credential-provider-node": 3.298.0 "@aws-sdk/fetch-http-handler": 3.296.0 "@aws-sdk/hash-node": 3.296.0 "@aws-sdk/invalid-dependency": 3.296.0 @@ -789,7 +789,7 @@ __metadata: "@aws-sdk/util-utf8": 3.295.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: c7a7837601d3bf2cf80e00a498e4f3412d88cccb605a251e65b949e8495874cb7738f0979dc51857f7606e76a568c9c15ecc77800191f54fef181c5cb2bca97b + checksum: a46024185263e548101746cc6c1841d904b02a5bc44e580384bd616ab5325ecb2d27bd0231bce7fab9796e10ce60387c98853e5915b4718f9b2715482c5eca46 languageName: node linkType: hard @@ -806,15 +806,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.296.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.298.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.296.0 + "@aws-sdk/client-cognito-identity": 3.298.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: ef2046e91aa3235e894ac762da7a4d6146fb383f094e504e6a0c6a6950f827c3c81e6826dd622483db5b13df234aa8e73cc4bad089753ef9ac3a1ffb390f75fa + checksum: d6bf9bf5c3d5ef916b931a4a69ae3e54cd90ff86da508a22e24b1b401f771461be73ccacf3aaed844b27019355f3c0c2a64af5815140fdcd7438c7190dc7a207 languageName: node linkType: hard @@ -842,38 +842,38 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.296.0" +"@aws-sdk/credential-provider-ini@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.298.0" dependencies: "@aws-sdk/credential-provider-env": 3.296.0 "@aws-sdk/credential-provider-imds": 3.296.0 "@aws-sdk/credential-provider-process": 3.296.0 - "@aws-sdk/credential-provider-sso": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.298.0 "@aws-sdk/credential-provider-web-identity": 3.296.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/shared-ini-file-loader": 3.296.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: 8c3a518ab5eb1b2153f722548e50c11af1cc2d8d2b3eafe5ddb1022bb677eb6fb6cc41bd60a508d45c322c6a653511d9445ca335ea103890f7b534ed0fdfab78 + checksum: b729aa62ea23377185c031d5738f4d97e263b2e24eae8643a12ce493ba63729a19c4590f861ead268c6264f5b1bb06dd4cff8e52b4cc0b906c3dae254ab1d11c languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.296.0, @aws-sdk/credential-provider-node@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.296.0" +"@aws-sdk/credential-provider-node@npm:3.298.0, @aws-sdk/credential-provider-node@npm:^3.208.0": + version: 3.298.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.298.0" dependencies: "@aws-sdk/credential-provider-env": 3.296.0 "@aws-sdk/credential-provider-imds": 3.296.0 - "@aws-sdk/credential-provider-ini": 3.296.0 + "@aws-sdk/credential-provider-ini": 3.298.0 "@aws-sdk/credential-provider-process": 3.296.0 - "@aws-sdk/credential-provider-sso": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.298.0 "@aws-sdk/credential-provider-web-identity": 3.296.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/shared-ini-file-loader": 3.296.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: ccc0616dc331764a7378bad898982c2dfb56c8c2d52d4eed003a5265105dfab2598bf40761ef231df28bf9bce17671e86af88415784ae779979ab9c55d75aeb8 + checksum: 7ac85fff40f4c266f5890ae02998f166c10cda43c6ce50b59c475e776be3356cadca8bf00f0f687c62a38ce6030597e850f98068c862a1103fee62198c206f3a languageName: node linkType: hard @@ -889,17 +889,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.296.0" +"@aws-sdk/credential-provider-sso@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.298.0" dependencies: - "@aws-sdk/client-sso": 3.296.0 + "@aws-sdk/client-sso": 3.298.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/shared-ini-file-loader": 3.296.0 - "@aws-sdk/token-providers": 3.296.0 + "@aws-sdk/token-providers": 3.298.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: c4916c1d923831240b65bd51c1db3e0f80ce65f2caedf5e45c4799cf0db71ef79b27cd0394a1bd2c94a90bd65ae08b6cbc36416f3c91f7e6c41339c5ef00f919 + checksum: cabb308ec19016f7ab416e2f77b9ec4293c1b8a7e129c60133f19532cd9fedb2dbef6471e48119b8e084539cd095b08ad810680d82d2059288ac43d69cea2163 languageName: node linkType: hard @@ -915,25 +915,25 @@ __metadata: linkType: hard "@aws-sdk/credential-providers@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/credential-providers@npm:3.296.0" + version: 3.298.0 + resolution: "@aws-sdk/credential-providers@npm:3.298.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.296.0 - "@aws-sdk/client-sso": 3.296.0 - "@aws-sdk/client-sts": 3.296.0 - "@aws-sdk/credential-provider-cognito-identity": 3.296.0 + "@aws-sdk/client-cognito-identity": 3.298.0 + "@aws-sdk/client-sso": 3.298.0 + "@aws-sdk/client-sts": 3.298.0 + "@aws-sdk/credential-provider-cognito-identity": 3.298.0 "@aws-sdk/credential-provider-env": 3.296.0 "@aws-sdk/credential-provider-imds": 3.296.0 - "@aws-sdk/credential-provider-ini": 3.296.0 - "@aws-sdk/credential-provider-node": 3.296.0 + "@aws-sdk/credential-provider-ini": 3.298.0 + "@aws-sdk/credential-provider-node": 3.298.0 "@aws-sdk/credential-provider-process": 3.296.0 - "@aws-sdk/credential-provider-sso": 3.296.0 + "@aws-sdk/credential-provider-sso": 3.298.0 "@aws-sdk/credential-provider-web-identity": 3.296.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/shared-ini-file-loader": 3.296.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: 5daa3d2e69c346f37f9c752c8e25953678d2571c911bb3da4d6b71b7f2ab5af3066890b3116b176a5d1aa9d7163e80c32db70d61bcd901dc0091711fa313a763 + checksum: 133c41843a4d5913ab7ec8a833a7868cb243ed56a574e3ab8f557bcc0366933ce09f06d48e17e461eeaf0eb7f86991e527f76b9b22fbb082d5c9af804fe4fc5d languageName: node linkType: hard @@ -1060,8 +1060,8 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.296.0 - resolution: "@aws-sdk/lib-storage@npm:3.296.0" + version: 3.298.0 + resolution: "@aws-sdk/lib-storage@npm:3.298.0" dependencies: "@aws-sdk/middleware-endpoint": 3.296.0 "@aws-sdk/smithy-client": 3.296.0 @@ -1072,7 +1072,7 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 2d609ea842dbef07ed6b4ed5d5593d562332dd81141398e9e41e2f8282e37e8293021fa416c28d3c2430b5ffc16e301d09073fd2d20e85983f2ec2352b19eba2 + checksum: 5148a92123a4bbf596ead6901cdbfb4985cc59a50437593dfc483ddf29c66a9d9fbf3040b4b6675a2b92517a01bb9fbf0cffc31c3391ad212787cc77d5867d51 languageName: node linkType: hard @@ -1430,16 +1430,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.296.0": - version: 3.296.0 - resolution: "@aws-sdk/token-providers@npm:3.296.0" +"@aws-sdk/token-providers@npm:3.298.0": + version: 3.298.0 + resolution: "@aws-sdk/token-providers@npm:3.298.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.296.0 + "@aws-sdk/client-sso-oidc": 3.298.0 "@aws-sdk/property-provider": 3.296.0 "@aws-sdk/shared-ini-file-loader": 3.296.0 "@aws-sdk/types": 3.296.0 tslib: ^2.5.0 - checksum: 02d5294fcec153977a7edff3b1843a9c935b11b59adbde26dc84cc5e793d2850b9d4736b29425f384a5c01ca0d747f5b3686d42e1370dae8ed9bc298eda1d888 + checksum: aed172e630a4d5de12f77564782486989cf12fe90b837bf0b82347cf1ed6c73c086aacad284d753a9e47676d4bdf251232b845d57f2f9943e5c815bb9321b465 languageName: node linkType: hard From 99ba4319cbf937449e5a78f13b5f5d7a10f5cc45 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 00:31:46 +0000 Subject: [PATCH 17/22] fix(deps): update dependency cronstrue to v2.24.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 001c850bf8..9f0ae85278 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20245,11 +20245,11 @@ __metadata: linkType: hard "cronstrue@npm:^2.2.0": - version: 2.23.0 - resolution: "cronstrue@npm:2.23.0" + version: 2.24.0 + resolution: "cronstrue@npm:2.24.0" bin: cronstrue: bin/cli.js - checksum: 050140ac6452468d6f9032f18038f41b16968502d411a996efd5d42243cfd882271ff20ed4a3cdb25c45bf8f88beeb0579e45e974a11987401e9d383af2641a8 + checksum: 2c7d4cfe43bec7b57b1824772641271bb5f5ed0209336ea53796f97b17966dd95cf15ae890f7c2494f639ba489d225bfb882950cda0ec7e5453fa7bf236842dd languageName: node linkType: hard From b794ee577d4b5ef6f2ff3515a4cbbf8da6860686 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 01:23:36 +0000 Subject: [PATCH 18/22] fix(deps): update dependency marked to v4.3.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4d2b33b122..93a6661725 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29354,11 +29354,11 @@ __metadata: linkType: hard "marked@npm:^4.0.10, marked@npm:^4.0.14": - version: 4.2.12 - resolution: "marked@npm:4.2.12" + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 languageName: node linkType: hard From a6ac09eb32de6098d93601bed1b4ba9bb1edd8ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 02:20:35 +0000 Subject: [PATCH 19/22] fix(deps): update dependency sass to v1.60.0 Signed-off-by: Renovate Bot --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 38067f5214..689171ffa9 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -9438,15 +9438,15 @@ __metadata: linkType: hard "sass@npm:^1.57.1": - version: 1.59.3 - resolution: "sass@npm:1.59.3" + version: 1.60.0 + resolution: "sass@npm:1.60.0" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 839b5282cdf7d0ba3fdbfb605277dd584a8c40fa3e3e58ad905d64cd812acfb82ff0a4072d4981673db884ee61505472ff07c5c5a8a497f16ba013b183ba6473 + checksum: 06e163c37af466ec194cf2ed8dab616372afeb19322d356947d48ea664fc38398ae77c4d91bea9cb0ace954ce289d5518d0f8555ecc49f6bf2539a8ef52fc580 languageName: node linkType: hard From a2fcd70aa6d36e88c060cf2a6e3f70dfc5ba9831 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 22 Mar 2023 16:37:19 +0100 Subject: [PATCH 20/22] OWNERS: update to reflect pulp + bux Signed-off-by: Patrik Oldsberg --- OWNERS.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/OWNERS.md b/OWNERS.md index 1834abe227..368620cf42 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -24,6 +24,20 @@ Team: @backstage/catalog-maintainers | ---- | ------------ | --------- | ---------------------------- | ------- | | TBD | Spotify | Chipmunks | [TBD](http://github.com/TBD) | - | +### Discoverability + +Team: @backstage/discoverability-maintainers + +Scope: Discoverability within Backstage, including the home page, information architecture, and search + +| Name | Organization | Team | GitHub | Discord | +| ------------------------ | ------------ | ---- | ---------------------------------------- | ------------------ | +| Avantika Iyer | Spotify | BUX | [tikabom](http://github.com/tikabom) | - | +| Camila Belo | Spotify | BUX | [camilaibs](http://github.com/camilaibs) | Camila Loiola#0226 | +| Emma Indal | Spotify | BUX | [emmaindal](http://github.com/emmaindal) | emmaindal#7503 | +| Raghunandan Balachandran | Spotify | BUX | [soapraj](http://github.com/soapraj) | raghunandanb#1114 | +| Renan Mendes Carvalho | Spotify | BUX | [aitherios](http://github.com/aitherios) | aitherios#0593 | + ### Kubernetes Team: @backstage/kubernetes-maintainers @@ -38,17 +52,12 @@ Scope: The Kubernetes plugin and the base it provides for other plugins to build Team: @backstage/techdocs-maintainers -| Name | Organization | Team | GitHub | Discord | -| ---- | ------------ | ------------ | ---------------------------- | ------- | -| TBD | Spotify | Pulp Fiction | [TBD](http://github.com/TBD) | - | +Scope: The TechDocs plugin and related tooling -### Search - -Team: @backstage/search-maintainers - -| Name | Organization | Team | GitHub | Discord | -| ---- | ------------ | ---- | ---------------------------- | ------- | -| TBD | Spotify | BUX | [TBD](http://github.com/TBD) | - | +| Name | Organization | Team | GitHub | Discord | +| ------------------------ | ------------ | ------------ | ------------------------------------------------ | ------------------ | +| Morgan Bentell | Spotify | Pulp Fiction | [agentbellnorm](http://github.com/agentbellnorm) | morganbentell#9030 | +| Raghunandan Balachandran | Spotify | Pulp Fiction | [soapraj](http://github.com/soapraj) | raghunandanb#1114 | ## Sponsors From c8b464c97e5732eb6387fcd76621f39bf7fdd3f1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 23 Mar 2023 09:57:03 +0100 Subject: [PATCH 21/22] CODEOWNERS: update to reflect techdocs-core change Signed-off-by: Patrik Oldsberg --- .github/CODEOWNERS | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a38d085dc9..b4be92e4ec 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,14 +8,14 @@ yarn.lock @backstage/maintainers @backstage-service */yarn.lock @backstage/maintainers @backstage-service /.changeset/*.md -/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-core -/docs/assets/search @backstage/techdocs-core -/docs/features/search @backstage/techdocs-core -/docs/features/techdocs @backstage/techdocs-core -/docs/plugins/integrating-search-into-plugins.md @backstage/techdocs-core +/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-maintainers +/docs/assets/search @backstage/discoverability-maintainers +/docs/features/search @backstage/discoverability-maintainers +/docs/features/techdocs @backstage/techdocs-maintainers +/docs/plugins/integrating-search-into-plugins.md @backstage/discoverability-maintainers /packages/cli/src/commands/onboard @backstage/sharks -/packages/techdocs-cli @backstage/techdocs-core -/packages/techdocs-cli-embedded-app @backstage/techdocs-core +/packages/techdocs-cli @backstage/techdocs-maintainers +/packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers /plugins/adr @backstage/maintainers @kuangp /plugins/adr-* @backstage/maintainers @kuangp /plugins/allure @backstage/maintainers @deepak-bhardwaj-ps @@ -55,7 +55,7 @@ yarn.lock @backstage/maintainers @back /plugins/fossa @backstage/maintainers @backstage/sda-se-reviewers /plugins/gcalendar @backstage/maintainers @szubster @ptychu @kielosz @alexrybch /plugins/git-release-manager @backstage/maintainers @erikengervall -/plugins/home @backstage/techdocs-core +/plugins/home @backstage/discoverability-maintainers /plugins/ilert @backstage/maintainers @yacut /plugins/jenkins @backstage/maintainers @timja /plugins/jenkins-backend @backstage/maintainers @timja @@ -71,13 +71,13 @@ yarn.lock @backstage/maintainers @back /plugins/rollbar-backend @backstage/maintainers @andrewthauer /plugins/scaffolder-backend-module-rails @backstage/maintainers @angeliski /plugins/scaffolder-backend-module-yeoman @backstage/maintainers @pawelmitka -/plugins/search @backstage/techdocs-core -/plugins/search-* @backstage/techdocs-core +/plugins/search @backstage/discoverability-maintainers +/plugins/search-* @backstage/discoverability-maintainers /plugins/sonarqube @backstage/maintainers @backstage/sda-se-reviewers -/plugins/stack-overflow @backstage/techdocs-core -/plugins/stack-overflow-backend @backstage/techdocs-core -/plugins/techdocs @backstage/techdocs-core -/plugins/techdocs-* @backstage/techdocs-core +/plugins/stack-overflow @backstage/discoverability-maintainers +/plugins/stack-overflow-backend @backstage/discoverability-maintainers +/plugins/techdocs @backstage/techdocs-maintainers +/plugins/techdocs-* @backstage/techdocs-maintainers /plugins/user-settings-backend @backstage/maintainers @backstage/sda-se-reviewers /tech-insights-backend @backstage/maintainers @xantier @iain-b /tech-insights-backend-module-jsonfc @backstage/maintainers @xantier @iain-b From 5c392e50b11d4dd0536780ca6f8cac6d3f65ff90 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 24 Mar 2023 11:30:38 +0100 Subject: [PATCH 22/22] OWNERS: add org members pjungermann, jamieklassen, OrkoHunter Signed-off-by: Patrik Oldsberg --- OWNERS.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/OWNERS.md b/OWNERS.md index 368620cf42..08736d5723 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -69,17 +69,20 @@ Scope: The TechDocs plugin and related tooling ## Organization Members -| Name | Organization | GitHub | Discord | -| --------------- | ------------------------ | ----------------------------------------------- | ------------------------------ | -| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` | -| Andre Wanlin | Keyloop | [awanlin](https://github.com/awanlin) | `Ahhhndre#3095` | -| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | -| Brian Fletcher | RoadieHQ | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | -| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | -| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` | -| Mark Avery | Cvent | [webark](https://github.com/webark) | `webark#8471` | -| Phil Kuang | FactSet Research Systems | [kuangp](https://github.com/kuangp) | `pkuang#3202` | -| Taras Mankovski | Frontside | [taras](https://github.com/taras) | `tarasm#1256` | +| Name | Organization | GitHub | Discord | +| ------------------ | ------------------------- | ----------------------------------------------- | ------------------------------ | +| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` | +| Andre Wanlin | Keyloop | [awanlin](https://github.com/awanlin) | `Ahhhndre#3095` | +| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | +| Brian Fletcher | RoadieHQ | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | +| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | +| Himanshu Mishra | Harness.io | [OrkoHunter](https://github.com/OrkoHunter) | `OrkoHunter#1520` | +| Jamie Klassen | VMware | [jamieklassen](https://github.com/jamieklassen) | `jamieklassen#3047` | +| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` | +| Mark Avery | Cvent | [webark](https://github.com/webark) | `webark#8471` | +| Patrick Jungermann | Bonial International GmbH | [pjungermann](https://github.com/pjungermann) | `pjungermann#6933` | +| Phil Kuang | FactSet Research Systems | [kuangp](https://github.com/kuangp) | `pkuang#3202` | +| Taras Mankovski | Frontside | [taras](https://github.com/taras) | `tarasm#1256` | ## Emeritus Core Maintainers