diff --git a/packages/apps-engine/deno-runtime/deno.lock b/packages/apps-engine/deno-runtime/deno.lock index 476e9a59227ea..bc87cb5e87d84 100644 --- a/packages/apps-engine/deno-runtime/deno.lock +++ b/packages/apps-engine/deno-runtime/deno.lock @@ -1,73 +1,73 @@ { - "version": "3", - "packages": { - "specifiers": { - "jsr:@std/bytes@^1.0.6": "jsr:@std/bytes@1.0.6", - "jsr:@std/cli@^1.0.9": "jsr:@std/cli@1.0.13", - "jsr:@std/streams@^1.0.16": "jsr:@std/streams@1.0.16", - "npm:@msgpack/msgpack@3.0.0-beta2": "npm:@msgpack/msgpack@3.0.0-beta2", - "npm:@rocket.chat/ui-kit@^0.31.22": "npm:@rocket.chat/ui-kit@0.31.25_@rocket.chat+icons@0.32.0", - "npm:acorn-walk@8.2.0": "npm:acorn-walk@8.2.0", - "npm:acorn@8.10.0": "npm:acorn@8.10.0", - "npm:astring@1.8.6": "npm:astring@1.8.6", - "npm:jsonrpc-lite@2.2.0": "npm:jsonrpc-lite@2.2.0", - "npm:stack-trace": "npm:stack-trace@0.0.10", - "npm:stack-trace@0.0.10": "npm:stack-trace@0.0.10", - "npm:uuid@8.3.2": "npm:uuid@8.3.2" + "version": "5", + "specifiers": { + "jsr:@std/bytes@^1.0.6": "1.0.6", + "jsr:@std/cli@^1.0.9": "1.0.13", + "jsr:@std/io@~0.225.3": "0.225.3", + "jsr:@std/streams@^1.0.16": "1.0.16", + "npm:@msgpack/msgpack@3.0.0-beta2": "3.0.0-beta2", + "npm:@rocket.chat/ui-kit@~0.31.22": "0.31.25_@rocket.chat+icons@0.32.0", + "npm:acorn-walk@8.2.0": "8.2.0", + "npm:acorn@8.10.0": "8.10.0", + "npm:astring@1.8.6": "1.8.6", + "npm:jsonrpc-lite@2.2.0": "2.2.0", + "npm:stack-trace@*": "0.0.10", + "npm:stack-trace@0.0.10": "0.0.10", + "npm:uuid@8.3.2": "8.3.2" + }, + "jsr": { + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" + }, + "@std/cli@1.0.13": { + "integrity": "5db2d95ab2dca3bca9fb6ad3c19908c314e93d6391c8b026725e4892d4615a69" + }, + "@std/io@0.225.3": { + "integrity": "27b07b591384d12d7b568f39e61dff966b8230559122df1e9fd11cc068f7ddd1", + "dependencies": [ + "jsr:@std/bytes" + ] + }, + "@std/streams@1.0.16": { + "integrity": "85030627befb1767c60d4f65cb30fa2f94af1d6ee6e5b2515b76157a542e89c4", + "dependencies": [ + "jsr:@std/bytes" + ] + } + }, + "npm": { + "@msgpack/msgpack@3.0.0-beta2": { + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==" + }, + "@rocket.chat/icons@0.32.0": { + "integrity": "sha512-7yhhELKNLb9kUtXCvau0V+iMXraV2bOsxcPjc/ZtLR5VeeIDTeaflqRWGtLroX6f3bE+J1n5qB5zi8A4YXuH2g==" + }, + "@rocket.chat/ui-kit@0.31.25_@rocket.chat+icons@0.32.0": { + "integrity": "sha512-yTgTKDw9SMlJ6p8n0PDO6zSvox/nHYUrwCIvILQeAK6PvTrgSe/u9CvU7ATTYjnQiQ603yEGR6dxjF4euCGdNA==", + "dependencies": [ + "@rocket.chat/icons" + ] + }, + "acorn-walk@8.2.0": { + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "acorn@8.10.0": { + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": true + }, + "astring@1.8.6": { + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": true + }, + "jsonrpc-lite@2.2.0": { + "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==" }, - "jsr": { - "@std/bytes@1.0.6": { - "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" - }, - "@std/cli@1.0.13": { - "integrity": "5db2d95ab2dca3bca9fb6ad3c19908c314e93d6391c8b026725e4892d4615a69" - }, - "@std/streams@1.0.16": { - "integrity": "85030627befb1767c60d4f65cb30fa2f94af1d6ee6e5b2515b76157a542e89c4", - "dependencies": [ - "jsr:@std/bytes@^1.0.6" - ] - } + "stack-trace@0.0.10": { + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, - "npm": { - "@msgpack/msgpack@3.0.0-beta2": { - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", - "dependencies": {} - }, - "@rocket.chat/icons@0.32.0": { - "integrity": "sha512-7yhhELKNLb9kUtXCvau0V+iMXraV2bOsxcPjc/ZtLR5VeeIDTeaflqRWGtLroX6f3bE+J1n5qB5zi8A4YXuH2g==", - "dependencies": {} - }, - "@rocket.chat/ui-kit@0.31.25_@rocket.chat+icons@0.32.0": { - "integrity": "sha512-yTgTKDw9SMlJ6p8n0PDO6zSvox/nHYUrwCIvILQeAK6PvTrgSe/u9CvU7ATTYjnQiQ603yEGR6dxjF4euCGdNA==", - "dependencies": { - "@rocket.chat/icons": "@rocket.chat/icons@0.32.0" - } - }, - "acorn-walk@8.2.0": { - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dependencies": {} - }, - "acorn@8.10.0": { - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dependencies": {} - }, - "astring@1.8.6": { - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "dependencies": {} - }, - "jsonrpc-lite@2.2.0": { - "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==", - "dependencies": {} - }, - "stack-trace@0.0.10": { - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dependencies": {} - }, - "uuid@8.3.2": { - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dependencies": {} - } + "uuid@8.3.2": { + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": true } }, "remote": { @@ -113,10 +113,10 @@ "workspace": { "dependencies": [ "jsr:@std/cli@^1.0.9", - "jsr:@std/io@^0.225.3", + "jsr:@std/io@~0.225.3", "jsr:@std/streams@^1.0.16", "npm:@msgpack/msgpack@3.0.0-beta2", - "npm:@rocket.chat/ui-kit@^0.31.22", + "npm:@rocket.chat/ui-kit@~0.31.22", "npm:acorn-walk@8.2.0", "npm:acorn@8.10.0", "npm:astring@1.8.6", diff --git a/packages/apps-engine/scripts/deno-cache.js b/packages/apps-engine/scripts/deno-cache.js index acb286711a9ed..c1626e32ff0d2 100644 --- a/packages/apps-engine/scripts/deno-cache.js +++ b/packages/apps-engine/scripts/deno-cache.js @@ -1,13 +1,74 @@ const childProcess = require('child_process'); +const fs = require('fs'); const path = require('path'); +const SHELL_ERR_CMD_NOT_FOUND = 127; +const { CI } = process.env; + +/** + * Matches 'deno 2.3.1' or 'Deno 2.7.11-alpha3.24' or even 'some deno and-anything in between 1.43.5' (as long as everything is in the same line) + * and extracts the correct version string from those ('2.3.1', '2.7.11' and '1.43.5' respectively). + * + * Doesn't match 'denoing 2.3.1' or 'deno2.3.1' or 'mydeno 2.7.11alpha3.24' or 'deno\n1.43.5' + * + * The expression gets a bit complicated because the word boundary assertion (\b) identifies the dash (-) as a valid word boundary, + * but that is not the case for use, as we don't want to match "make-deno" for instance. So, for correctness, we use a negative lookbehind + * assertion ("(? /(?\d+\.\d+\.\d+)\b/.exec(input)?.groups?.version; + try { - childProcess.execSync('deno info'); + const toolVersionsPath = path.resolve(__dirname, '..', '..', '..', '.tool-versions'); + const denoToolVersion = extractDenoVersion(fs.readFileSync(toolVersionsPath).toString()); + + if (!denoToolVersion) { + throw new Error(`Invalid Deno version in ${toolVersionsPath}, aborting...`); + } + + const installedVersion = extractDenoVersion(childProcess.execSync('deno --version').toString()); + + if (!installedVersion) { + throw new Error( + `Couldn't determine version of installed Deno. Try validating the version with 'deno --version' and make sure it is a valid Deno installation`, + ); + } + + if (installedVersion !== denoToolVersion) { + const message = `Incorrect Deno version. Required '${denoToolVersion}', found '${installedVersion}'.${CI ? '' : " The server will likely work, but it may cause your deno.lock to change - do not commit it. Make sure your Deno version matches the required one so you don't see this message again."}`; + + if (CI) { + throw new Error(message); + } + + // We don't need to fail if a dev environment doesn't have a matching Deno version, just the warning is enough + console.warn(message); + } } catch (e) { - console.error( - 'Could not execute "deno" in the system. It is now a requirement for the Apps-Engine framework, and Rocket.Chat apps will not work without it.\n', - 'Make sure to install Deno and run the installation process for the Apps-Engine again. More info on https://docs.deno.com/runtime/manual/getting_started/installation', - ); + if (e.status === SHELL_ERR_CMD_NOT_FOUND) { + console.error( + new Error( + [ + 'Could not execute "deno" in the system. It is now a requirement for the Apps-Engine framework, and Rocket.Chat apps will not work without it.', + 'Make sure to install Deno and run the installation process for the Apps-Engine again. More info on https://docs.deno.com/runtime/manual/getting_started/installation', + ].join('\n'), + { cause: e }, + ), + ); + } else { + console.error(e); + } + process.exit(1); } @@ -15,7 +76,10 @@ const rootPath = path.join(__dirname, '..'); const denoRuntimePath = path.join(rootPath, 'deno-runtime'); const DENO_DIR = process.env.DENO_DIR ?? path.join(rootPath, '.deno-cache'); -childProcess.execSync('deno cache main.ts', { +// In CI envs, break if lockfile changes; in dev envs, it's alright +const commandLine = CI ? 'deno install --frozen --entrypoint main.ts' : 'deno install --entrypoint main.ts'; + +childProcess.execSync(commandLine, { cwd: denoRuntimePath, env: { ...process.env,