From 37c2880996be297e61bef5f5e28119d217ce8cfd Mon Sep 17 00:00:00 2001 From: Paulo Castro Date: Sat, 20 Mar 2021 22:10:18 +0000 Subject: [PATCH] push: Fix docker-compose.dev.yml serialization ("should be object,null" error) Change-type: patch --- automation/update-module.ts | 2 +- lib/utils/compose.js | 2 +- lib/utils/compose_ts.ts | 17 +++--- npm-shrinkwrap.json | 101 +++++++++++++++++++++++++++++++++--- package.json | 4 +- 5 files changed, 108 insertions(+), 18 deletions(-) diff --git a/automation/update-module.ts b/automation/update-module.ts index 7e2b271c..72c8ccb4 100644 --- a/automation/update-module.ts +++ b/automation/update-module.ts @@ -58,7 +58,7 @@ const getUpstreams = async () => { const repoYaml = fs.readFileSync(__dirname + '/../repo.yml', 'utf8'); const yaml = await import('js-yaml'); - const { upstream } = yaml.safeLoad(repoYaml) as { + const { upstream } = yaml.load(repoYaml) as { upstream: Upstream[]; }; diff --git a/lib/utils/compose.js b/lib/utils/compose.js index 039b2241..a7a5eafa 100644 --- a/lib/utils/compose.js +++ b/lib/utils/compose.js @@ -56,7 +56,7 @@ export function createProject(composePath, composeStr, projectName = null) { const compose = require('resin-compose-parse'); // both methods below may throw. - const rawComposition = yml.safeLoad(composeStr, { + const rawComposition = yml.load(composeStr, { schema: yml.FAILSAFE_SCHEMA, }); const composition = compose.normalize(rawComposition); diff --git a/lib/utils/compose_ts.ts b/lib/utils/compose_ts.ts index b94ace66..7af13422 100644 --- a/lib/utils/compose_ts.ts +++ b/lib/utils/compose_ts.ts @@ -179,13 +179,18 @@ async function mergeDevComposeOverlay( logger.logInfo( `Docker compose dev overlay detected (${devOverlayFilename}) - merging.`, ); + interface ComposeObj { + services?: object; + } + const yaml = await import('js-yaml'); + const loadObj = (inputStr: string): ComposeObj => + (yaml.load(inputStr) || {}) as ComposeObj; try { - const yaml = await import('js-yaml'); - const compose = yaml.load(composeStr); - const devOverlay = yaml.load(await fs.readFile(devOverlayPath, 'utf8')); + const compose = loadObj(composeStr); + const devOverlay = loadObj(await fs.readFile(devOverlayPath, 'utf8')); // We only want to merge the services section compose.services = { ...compose.services, ...devOverlay.services }; - composeStr = yaml.dump(compose); + composeStr = yaml.dump(compose, { styles: { '!!null': 'empty' } }); } catch (err) { err.message = `Error merging docker compose dev overlay file "${devOverlayPath}":\n${err.message}`; throw err; @@ -629,7 +634,7 @@ async function loadBuildMetatada( if (metadataPath.endsWith('json')) { buildMetadata = JSON.parse(rawString); } else { - buildMetadata = require('js-yaml').safeLoad(rawString); + buildMetadata = require('js-yaml').load(rawString); } } catch (err) { throw new ExpectedError( @@ -972,7 +977,7 @@ async function parseRegistrySecrets( const raw = (await fs.readFile(secretsFilename)).toString(); const multiBuild = await import('resin-multibuild'); const registrySecrets = new multiBuild.RegistrySecretValidator().validateRegistrySecrets( - isYaml ? require('js-yaml').safeLoad(raw) : JSON.parse(raw), + isYaml ? require('js-yaml').load(raw) : JSON.parse(raw), ); multiBuild.addCanonicalDockerHubEntry(registrySecrets); return registrySecrets; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8fea05f7..160b2b40 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -536,6 +536,16 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -1621,9 +1631,9 @@ } }, "@types/js-yaml": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", - "integrity": "sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-4vlpCM5KPCL5CfGmTbpjwVKbISRYhduEJvvUWsH5EB7QInhEj94XPZ3ts/9FPiLZFqYO0xoW4ZL8z2AabTGgJA==", "dev": true }, "@types/jsesc": { @@ -2778,6 +2788,15 @@ "version": "3.11.1", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.11.1.tgz", "integrity": "sha512-M5qhhfuTt4fwHGqqANNQilp3Htb5cHwBxlMHDUw/TYRVkEp3s3IIFSH3Fe9HIAeEtnO4p3SSowLmCVavdRYfpw==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, @@ -2831,6 +2850,15 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -4623,6 +4651,16 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, @@ -5533,6 +5571,16 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -8945,12 +8993,18 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } } }, "jsbn": { @@ -10404,6 +10458,16 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -13636,6 +13700,17 @@ "tar-stream": "^2.1.3", "tar-utils": "^2.1.0", "typed-error": "^3.2.1" + }, + "dependencies": { + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } } }, "resin-stream-logger": { @@ -15390,6 +15465,16 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", diff --git a/package.json b/package.json index 000d281c..b2071a93 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "@types/http-proxy": "^1.17.4", "@types/intercept-stdout": "^0.1.0", "@types/is-root": "^2.1.2", - "@types/js-yaml": "^3.12.5", + "@types/js-yaml": "^4.0.0", "@types/jsonwebtoken": "^8.5.0", "@types/klaw": "^3.0.1", "@types/lodash": "^4.14.159", @@ -235,7 +235,7 @@ "inquirer": "^7.3.3", "is-elevated": "^3.0.0", "is-root": "^2.1.0", - "js-yaml": "^3.14.0", + "js-yaml": "^4.0.0", "klaw": "^3.0.0", "livepush": "^3.5.0", "lodash": "^4.17.20",