From 3e8148e39ce1a68dbd965584e8d1d32df2844144 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 14:49:40 +0200 Subject: [PATCH 1/6] feat: fix issue with redaction by implementing another way Signed-off-by: blam --- .../src/logging/WinstonLogger.test.ts | 2 +- .../src/logging/WinstonLogger.ts | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/backend-app-api/src/logging/WinstonLogger.test.ts b/packages/backend-app-api/src/logging/WinstonLogger.test.ts index 06f9cdd4c3..8f60e8dae2 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.test.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.test.ts @@ -80,7 +80,7 @@ describe('WinstonLogger', () => { nested: '[REDACTED] (world) from nested object', null: null, nullProto: { - foo: 'hello foo', // read only prop is not redacted + foo: '[REDACTED] foo', }, }, }), diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index 3fcb4142b6..cb9d81cdf1 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -86,19 +86,17 @@ export class WinstonLogger implements RootLoggerService { let redactionPattern: RegExp | undefined = undefined; const replace = (obj: TransformableInfo) => { - for (const key in obj) { - if (Object.hasOwn(obj, key)) { - if (typeof obj[key] === 'object') { - obj[key] = replace(obj[key] as TransformableInfo); - } else if (typeof obj[key] === 'string') { - try { - obj[key] = obj[key]?.replace(redactionPattern, '[REDACTED]'); - } catch { - /* ignore read only properties */ - } - } + const stringifiedFields = JSON.stringify(obj, null); + const redacted = JSON.parse( + stringifiedFields.replace(redactionPattern!, '[REDACTED]'), + ); + + for (const key in redacted) { + if (obj && Object.hasOwn(obj, key)) { + obj[key] = redacted[key]; } } + return obj; }; return { From 7d30d95dee0174a8345883ad59704b60fadb2cd8 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 15:03:13 +0200 Subject: [PATCH 2/6] chore: safer way to do redactions Signed-off-by: blam --- .changeset/nine-ties-type.md | 6 ++++++ packages/backend-app-api/package.json | 2 ++ .../src/logging/WinstonLogger.ts | 9 ++++++-- plugins/scaffolder-backend/package.json | 2 ++ .../src/scaffolder/tasks/logger.ts | 21 ++++++++++++------- yarn.lock | 11 ++++++++++ 6 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 .changeset/nine-ties-type.md diff --git a/.changeset/nine-ties-type.md b/.changeset/nine-ties-type.md new file mode 100644 index 0000000000..abb0661724 --- /dev/null +++ b/.changeset/nine-ties-type.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-app-api': patch +--- + +Fixing issue with log meta fields possibly being circular refs diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 0634c30de1..b5fe3a1271 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -72,6 +72,7 @@ "fs-extra": "^11.2.0", "helmet": "^6.0.0", "jose": "^5.0.0", + "json-stringify-safe": "^5.0.1", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", @@ -93,6 +94,7 @@ "@types/compression": "^1.7.0", "@types/fs-extra": "^11.0.0", "@types/http-errors": "^2.0.0", + "@types/json-stringify-safe": "^5.0.3", "@types/minimist": "^1.2.0", "@types/morgan": "^1.9.0", "@types/node-forge": "^1.3.0", diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index cb9d81cdf1..42c181573c 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -27,6 +27,7 @@ import { transports, transport as Transport, } from 'winston'; +import stringify from 'json-stringify-safe'; import { escapeRegExp } from '../lib/escapeRegExp'; /** @@ -86,9 +87,13 @@ export class WinstonLogger implements RootLoggerService { let redactionPattern: RegExp | undefined = undefined; const replace = (obj: TransformableInfo) => { - const stringifiedFields = JSON.stringify(obj, null); + if (!redactionPattern) { + return obj; + } + + const stringifiedFields = stringify(obj); const redacted = JSON.parse( - stringifiedFields.replace(redactionPattern!, '[REDACTED]'), + stringifiedFields.replace(redactionPattern, '[REDACTED]'), ); for (const key in redacted) { diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index f2f4da6a84..877163a151 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -85,6 +85,7 @@ "globby": "^11.0.0", "isbinaryfile": "^5.0.0", "isolated-vm": "^4.5.0", + "json-stringify-safe": "^5.0.1", "jsonschema": "^1.2.6", "knex": "^3.0.0", "lodash": "^4.17.21", @@ -107,6 +108,7 @@ "@backstage/cli": "workspace:^", "@backstage/plugin-scaffolder-node-test-utils": "workspace:^", "@types/fs-extra": "^11.0.0", + "@types/json-stringify-safe": "^5.0.3", "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", "@types/zen-observable": "^0.8.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts index 064eb69349..01f454a6ff 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts @@ -21,6 +21,7 @@ import { JsonObject } from '@backstage/types'; import { Format, TransformableInfo } from 'logform'; import Transport, { TransportStreamOptions } from 'winston-transport'; import { Logger, format, createLogger, transports } from 'winston'; +import stringify from 'json-stringify-safe'; /** * Escapes a given string to be used inside a RegExp. @@ -108,15 +109,21 @@ export class WinstonLogger implements RootLoggerService { let redactionPattern: RegExp | undefined = undefined; const replace = (obj: TransformableInfo) => { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - if (typeof obj[key] === 'object') { - obj[key] = replace(obj[key] as TransformableInfo); - } else if (typeof obj[key] === 'string') { - obj[key] = obj[key]?.replace(redactionPattern, '[REDACTED]'); - } + if (!redactionPattern) { + return obj; + } + + const stringifiedFields = stringify(obj); + const redacted = JSON.parse( + stringifiedFields.replace(redactionPattern, '[REDACTED]'), + ); + + for (const key in redacted) { + if (obj && Object.hasOwn(obj, key)) { + obj[key] = redacted[key]; } } + return obj; }; return { diff --git a/yarn.lock b/yarn.lock index f10de89d74..eccfdd3eb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3304,6 +3304,7 @@ __metadata: "@types/express": ^4.17.6 "@types/fs-extra": ^11.0.0 "@types/http-errors": ^2.0.0 + "@types/json-stringify-safe": ^5.0.3 "@types/minimist": ^1.2.0 "@types/morgan": ^1.9.0 "@types/node-forge": ^1.3.0 @@ -3317,6 +3318,7 @@ __metadata: helmet: ^6.0.0 http-errors: ^2.0.0 jose: ^5.0.0 + json-stringify-safe: ^5.0.1 knex: ^3.0.0 lodash: ^4.17.21 logform: ^2.3.2 @@ -6661,6 +6663,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": ^4.17.6 "@types/fs-extra": ^11.0.0 + "@types/json-stringify-safe": ^5.0.3 "@types/luxon": ^3.0.0 "@types/nunjucks": ^3.1.4 "@types/supertest": ^2.0.8 @@ -6673,6 +6676,7 @@ __metadata: globby: ^11.0.0 isbinaryfile: ^5.0.0 isolated-vm: ^4.5.0 + json-stringify-safe: ^5.0.1 jsonschema: ^1.2.6 knex: ^3.0.0 lodash: ^4.17.21 @@ -17312,6 +17316,13 @@ __metadata: languageName: node linkType: hard +"@types/json-stringify-safe@npm:^5.0.3": + version: 5.0.3 + resolution: "@types/json-stringify-safe@npm:5.0.3" + checksum: 66826a59b53ce5a5becc9c05cd0bdadb7e2032e02803a9dd13137de134a0882a6c67ae334371ccff07a20b1d2b2c23fa3a81b5e23f40b27cfcf553c7cce06e35 + languageName: node + linkType: hard + "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" From 0f68c5096db97136d8c8591f49440f7b2af2965b Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 16:24:23 +0200 Subject: [PATCH 3/6] chore: rework to use the message symbol instead Signed-off-by: blam --- packages/backend-app-api/package.json | 3 +- .../src/logging/WinstonLogger.test.ts | 97 ++++++++++--------- .../src/logging/WinstonLogger.ts | 33 +++---- 3 files changed, 65 insertions(+), 68 deletions(-) diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index b5fe3a1271..414a4333e7 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -72,7 +72,6 @@ "fs-extra": "^11.2.0", "helmet": "^6.0.0", "jose": "^5.0.0", - "json-stringify-safe": "^5.0.1", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", @@ -84,6 +83,7 @@ "path-to-regexp": "^6.2.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", + "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0" @@ -94,7 +94,6 @@ "@types/compression": "^1.7.0", "@types/fs-extra": "^11.0.0", "@types/http-errors": "^2.0.0", - "@types/json-stringify-safe": "^5.0.3", "@types/minimist": "^1.2.0", "@types/morgan": "^1.9.0", "@types/node-forge": "^1.3.0", diff --git a/packages/backend-app-api/src/logging/WinstonLogger.test.ts b/packages/backend-app-api/src/logging/WinstonLogger.test.ts index 8f60e8dae2..4b608f8e57 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.test.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.test.ts @@ -14,12 +14,10 @@ * limitations under the License. */ -import { TransformableInfo } from 'logform'; +import { format } from 'logform'; import { WinstonLogger } from './WinstonLogger'; - -function msg(info: TransformableInfo): TransformableInfo { - return { message: info.message, level: info.level, stack: info.stack }; -} +import Transport from 'winston-transport'; +import { MESSAGE } from 'triple-beam'; describe('WinstonLogger', () => { it('creates a winston logger instance with default options', () => { @@ -33,57 +31,66 @@ describe('WinstonLogger', () => { expect(childLogger).toBeInstanceOf(WinstonLogger); }); - it('redacter should redact and escape regex', () => { - const redacter = WinstonLogger.redacter(); - const log = { - level: 'error', - message: 'hello (world)', - stack: 'hello (world) from this file', - }; - expect(redacter.format.transform(msg(log))).toEqual(msg(log)); - redacter.add(['hello\n']); - expect(redacter.format.transform(msg(log))).toEqual( - msg({ - ...log, - message: '[REDACTED] (world)', - stack: '[REDACTED] (world) from this file', - }), - ); - redacter.add(['(world']); - expect(redacter.format.transform(msg(log))).toEqual( - msg({ - ...log, - message: '[REDACTED] [REDACTED])', - stack: '[REDACTED] [REDACTED]) from this file', + it('should redact and escape regex', () => { + const mockTransport = new Transport({ + log: jest.fn(), + logv: jest.fn(), + }); + + const logger = WinstonLogger.create({ + format: format.json(), + transports: [mockTransport], + }); + + logger.addRedactions(['hello (world']); + + logger.error('hello (world) from this file'); + + expect(mockTransport.log).toHaveBeenCalledWith( + expect.objectContaining({ + [MESSAGE]: JSON.stringify({ + level: 'error', + message: '[REDACTED]) from this file', + }), }), + expect.any(Function), ); }); - it('redacter should redact nested object', () => { - const redacter = WinstonLogger.redacter(); - const log = { - level: 'error', - message: { - nested: 'hello (world) from nested object', - null: null, - nullProto: Object.create(null, { - foo: { value: 'hello foo', enumerable: true }, - }), - }, - }; + it('should redact nested object', () => { + const mockTransport = new Transport({ + log: jest.fn(), + logv: jest.fn(), + }); - redacter.add(['hello']); - expect(redacter.format.transform(msg(log))).toEqual( - msg({ - ...log, - message: { + const logger = WinstonLogger.create({ + format: format.json(), + transports: [mockTransport], + }); + + logger.addRedactions(['hello']); + + logger.error('something went wrong', { + null: null, + nested: 'hello (world) from nested object', + nullProto: Object.create(null, { + foo: { value: 'hello foo', enumerable: true }, + }), + }); + + expect(mockTransport.log).toHaveBeenCalledWith( + expect.objectContaining({ + [MESSAGE]: JSON.stringify({ + level: 'error', + message: 'something went wrong', nested: '[REDACTED] (world) from nested object', null: null, nullProto: { foo: '[REDACTED] foo', }, - }, + }), }), + expect.any(Function), ); }); }); diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index 42c181573c..3133fde949 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -27,7 +27,7 @@ import { transports, transport as Transport, } from 'winston'; -import stringify from 'json-stringify-safe'; +import { MESSAGE } from 'triple-beam'; import { escapeRegExp } from '../lib/escapeRegExp'; /** @@ -62,8 +62,8 @@ export class WinstonLogger implements RootLoggerService { let logger = createLogger({ level: process.env.LOG_LEVEL || options.level || 'info', format: format.combine( - redacter.format, options.format ?? defaultFormatter, + redacter.format, ), transports: options.transports ?? new transports.Console(), }); @@ -86,26 +86,17 @@ export class WinstonLogger implements RootLoggerService { let redactionPattern: RegExp | undefined = undefined; - const replace = (obj: TransformableInfo) => { - if (!redactionPattern) { - return obj; - } - - const stringifiedFields = stringify(obj); - const redacted = JSON.parse( - stringifiedFields.replace(redactionPattern, '[REDACTED]'), - ); - - for (const key in redacted) { - if (obj && Object.hasOwn(obj, key)) { - obj[key] = redacted[key]; - } - } - - return obj; - }; return { - format: format(replace)(), + format: format((obj: TransformableInfo) => { + if (!redactionPattern || !obj) { + return obj; + } + + obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '[REDACTED]'); + obj.message = obj.message.replace?.(redactionPattern, '[REDACTED]'); + + return obj; + })(), add(newRedactions) { let added = 0; for (const redactionToTrim of newRedactions) { From d6c34ab98f8f219ef480435ffd23ecb22e4e4a7b Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 16:30:22 +0200 Subject: [PATCH 4/6] chore: update in the scaffolder instead Signed-off-by: blam --- plugins/scaffolder-backend/package.json | 2 +- .../src/scaffolder/tasks/logger.ts | 31 +++++++------------ yarn.lock | 20 ++++-------- 3 files changed, 18 insertions(+), 35 deletions(-) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 877163a151..59c9901eb8 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -96,6 +96,7 @@ "p-queue": "^6.6.2", "prom-client": "^15.0.0", "tar": "^6.1.12", + "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.7.0", @@ -108,7 +109,6 @@ "@backstage/cli": "workspace:^", "@backstage/plugin-scaffolder-node-test-utils": "workspace:^", "@types/fs-extra": "^11.0.0", - "@types/json-stringify-safe": "^5.0.3", "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", "@types/zen-observable": "^0.8.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts index 01f454a6ff..4314f39385 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts @@ -21,7 +21,7 @@ import { JsonObject } from '@backstage/types'; import { Format, TransformableInfo } from 'logform'; import Transport, { TransportStreamOptions } from 'winston-transport'; import { Logger, format, createLogger, transports } from 'winston'; -import stringify from 'json-stringify-safe'; +import { MESSAGE } from 'triple-beam'; /** * Escapes a given string to be used inside a RegExp. @@ -108,26 +108,17 @@ export class WinstonLogger implements RootLoggerService { let redactionPattern: RegExp | undefined = undefined; - const replace = (obj: TransformableInfo) => { - if (!redactionPattern) { - return obj; - } - - const stringifiedFields = stringify(obj); - const redacted = JSON.parse( - stringifiedFields.replace(redactionPattern, '[REDACTED]'), - ); - - for (const key in redacted) { - if (obj && Object.hasOwn(obj, key)) { - obj[key] = redacted[key]; - } - } - - return obj; - }; return { - format: format(replace)(), + format: format((obj: TransformableInfo) => { + if (!redactionPattern || !obj) { + return obj; + } + + obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '[REDACTED]'); + obj.message = obj.message?.replace?.(redactionPattern, '[REDACTED]'); + + return obj; + })(), add(newRedactions) { let added = 0; for (const redactionToTrim of newRedactions) { diff --git a/yarn.lock b/yarn.lock index eccfdd3eb5..d85a001f17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3304,7 +3304,6 @@ __metadata: "@types/express": ^4.17.6 "@types/fs-extra": ^11.0.0 "@types/http-errors": ^2.0.0 - "@types/json-stringify-safe": ^5.0.3 "@types/minimist": ^1.2.0 "@types/morgan": ^1.9.0 "@types/node-forge": ^1.3.0 @@ -3318,7 +3317,6 @@ __metadata: helmet: ^6.0.0 http-errors: ^2.0.0 jose: ^5.0.0 - json-stringify-safe: ^5.0.1 knex: ^3.0.0 lodash: ^4.17.21 logform: ^2.3.2 @@ -3332,6 +3330,7 @@ __metadata: selfsigned: ^2.0.0 stoppable: ^1.1.0 supertest: ^6.1.3 + triple-beam: ^1.4.1 uuid: ^9.0.0 winston: ^3.2.1 winston-transport: ^4.5.0 @@ -6663,7 +6662,6 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": ^4.17.6 "@types/fs-extra": ^11.0.0 - "@types/json-stringify-safe": ^5.0.3 "@types/luxon": ^3.0.0 "@types/nunjucks": ^3.1.4 "@types/supertest": ^2.0.8 @@ -6689,6 +6687,7 @@ __metadata: strip-ansi: ^7.1.0 supertest: ^6.1.3 tar: ^6.1.12 + triple-beam: ^1.4.1 uuid: ^9.0.0 wait-for-expect: ^3.0.2 winston: ^3.2.1 @@ -17316,13 +17315,6 @@ __metadata: languageName: node linkType: hard -"@types/json-stringify-safe@npm:^5.0.3": - version: 5.0.3 - resolution: "@types/json-stringify-safe@npm:5.0.3" - checksum: 66826a59b53ce5a5becc9c05cd0bdadb7e2032e02803a9dd13137de134a0882a6c67ae334371ccff07a20b1d2b2c23fa3a81b5e23f40b27cfcf553c7cce06e35 - languageName: node - linkType: hard - "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -41491,10 +41483,10 @@ __metadata: languageName: node linkType: hard -"triple-beam@npm:^1.3.0": - version: 1.3.0 - resolution: "triple-beam@npm:1.3.0" - checksum: 7d7b77d8625fb252c126c24984a68de462b538a8fcd1de2abd0a26421629cf3527d48e23b3c2264f08f4a6c3bc40a478a722176f4d7b6a1acc154cb70c359f2b +"triple-beam@npm:^1.3.0, triple-beam@npm:^1.4.1": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 languageName: node linkType: hard From 2bbc55f0a8a1938146fcd1a3466bacae4dbf7e95 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 16:53:18 +0200 Subject: [PATCH 5/6] chore: leave message clean Signed-off-by: blam --- packages/backend-app-api/src/logging/WinstonLogger.ts | 1 - plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index 3133fde949..8ee86d247f 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -93,7 +93,6 @@ export class WinstonLogger implements RootLoggerService { } obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '[REDACTED]'); - obj.message = obj.message.replace?.(redactionPattern, '[REDACTED]'); return obj; })(), diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts index 4314f39385..3824a32a6f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts @@ -115,7 +115,6 @@ export class WinstonLogger implements RootLoggerService { } obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '[REDACTED]'); - obj.message = obj.message?.replace?.(redactionPattern, '[REDACTED]'); return obj; })(), From 57a1d69e1df49953a9a47d46431409fa25d19c37 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 May 2024 17:23:05 +0200 Subject: [PATCH 6/6] chore: go away dependency Signed-off-by: blam --- plugins/scaffolder-backend/package.json | 1 - yarn.lock | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 59c9901eb8..f748ccb92d 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -85,7 +85,6 @@ "globby": "^11.0.0", "isbinaryfile": "^5.0.0", "isolated-vm": "^4.5.0", - "json-stringify-safe": "^5.0.1", "jsonschema": "^1.2.6", "knex": "^3.0.0", "lodash": "^4.17.21", diff --git a/yarn.lock b/yarn.lock index d85a001f17..728bac0c68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6674,7 +6674,6 @@ __metadata: globby: ^11.0.0 isbinaryfile: ^5.0.0 isolated-vm: ^4.5.0 - json-stringify-safe: ^5.0.1 jsonschema: ^1.2.6 knex: ^3.0.0 lodash: ^4.17.21