diff --git a/apps/site/components/Downloads/Release/ReleaseCodeBox.tsx b/apps/site/components/Downloads/Release/ReleaseCodeBox.tsx index 71cbbe7b53bc6..e6b0984dd8718 100644 --- a/apps/site/components/Downloads/Release/ReleaseCodeBox.tsx +++ b/apps/site/components/Downloads/Release/ReleaseCodeBox.tsx @@ -17,6 +17,10 @@ import { INSTALLATION_METHODS } from '@/util/downloadUtils'; import LinkWithArrow from './LinkWithArrow'; // Creates a minimal JavaScript interpreter for parsing the JavaScript code from the snippets +// Note: that the code runs inside a sandboxed environment and cannot interact with any code outside of the sandbox +// It also does not have access to any Global or Window objects, nor it can execute code on the end-user's browser +// It also only allows a return statement for a string and it forces the return value to also be a string and only be used +// by Shiki to render the highlighted syntax. Hence XSS attacks or JavaScript injections are not possible. const interpreter = createSval({}, 'script'); const parseSnippet = (s: string, releaseContext: ReleaseContextType) => { @@ -27,7 +31,7 @@ const parseSnippet = (s: string, releaseContext: ReleaseContextType) => { interpreter.run(`exports.content = \`${s}\``); // Sets the parsed raw string to be used by the JSX CodeBox - return interpreter.exports.content; + return String(interpreter.exports.content); }; const ReleaseCodeBox: FC = () => { @@ -54,7 +58,7 @@ const ReleaseCodeBox: FC = () => { return parseSnippet( // Bundles the Platform and Package Manager snippets - `${platformSnippet?.content ?? ''}${packageManagerSnippet?.content ?? ''}`, + `${platformSnippet?.content ?? ''}\n${packageManagerSnippet?.content ?? ''}`, // Passes a partial state of only the things we need to the parser { release, platform, os } as ReleaseContextType ); diff --git a/apps/site/snippets/en/download/docker.bash b/apps/site/snippets/en/download/docker.bash index 976c5af6ca8df..6614ba8212351 100644 --- a/apps/site/snippets/en/download/docker.bash +++ b/apps/site/snippets/en/download/docker.bash @@ -5,5 +5,8 @@ # Pull the Node.js Docker image: docker pull node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} +# Create a Node.js container and start a Shell session: +docker run -it --rm --entrypoint sh node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} + # Verify the Node.js version: -docker run node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} node -v # Should print "${props.release.versionWithPrefix}". +node -v # Should print "${props.release.versionWithPrefix}". diff --git a/apps/site/snippets/en/download/npm.bash b/apps/site/snippets/en/download/npm.bash index e93ccca8094fa..8e53d103a9155 100644 --- a/apps/site/snippets/en/download/npm.bash +++ b/apps/site/snippets/en/download/npm.bash @@ -1,6 +1,2 @@ - # Verify the Node.js version: -${props.platform === 'DOCKER' ? - `docker run node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} npm -v # Should print "${props.release.npm}".` : - `npm -v # Should print "${props.release.npm}".` -} +npm -v # Should print "${props.release.npm}". diff --git a/apps/site/snippets/en/download/pnpm.bash b/apps/site/snippets/en/download/pnpm.bash index 4fec51bea18c8..f6a7ec541bdae 100644 --- a/apps/site/snippets/en/download/pnpm.bash +++ b/apps/site/snippets/en/download/pnpm.bash @@ -1,4 +1,3 @@ - # Download and install "pnpm": ${props.os === 'WIN' ? 'corepack enable pnpm' : @@ -6,7 +5,4 @@ ${props.os === 'WIN' ? } # Verify "pnpm" version: -${props.platform === 'DOCKER' ? - `docker run node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} pnpm -v` : - 'pnpm -v' -} +pnpm -v diff --git a/apps/site/snippets/en/download/yarn.bash b/apps/site/snippets/en/download/yarn.bash index 54879118102ca..d7d85bed01b36 100644 --- a/apps/site/snippets/en/download/yarn.bash +++ b/apps/site/snippets/en/download/yarn.bash @@ -1,9 +1,5 @@ - # Download and install "Yarn": corepack enable yarn # Verify "Yarn" version: -${props.platform === 'DOCKER' ? - `docker run node:${props.release.major}-${props.release.major >= 4 ? 'alpine' : 'slim'} yarn -v` : - 'yarn -v' -} +yarn -v