mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
fix: Syntax highlighting with long lines and untar content with emojis (#5098)
This commit is contained in:
2
site/js-untar.d.ts
vendored
2
site/js-untar.d.ts
vendored
@ -1,7 +1,7 @@
|
|||||||
declare module "js-untar" {
|
declare module "js-untar" {
|
||||||
interface File {
|
interface File {
|
||||||
name: string
|
name: string
|
||||||
readAsString: () => string
|
blob: Blob
|
||||||
}
|
}
|
||||||
|
|
||||||
const Untar: (buffer: ArrayBuffer) => {
|
const Untar: (buffer: ArrayBuffer) => {
|
||||||
|
@ -30,6 +30,9 @@ const useStyles = makeStyles((theme) => ({
|
|||||||
background: theme.palette.background.paperLight,
|
background: theme.palette.background.paperLight,
|
||||||
borderRadius: theme.shape.borderRadius,
|
borderRadius: theme.shape.borderRadius,
|
||||||
padding: theme.spacing(2, 3),
|
padding: theme.spacing(2, 3),
|
||||||
|
// Line breaks are broken when used with line numbers on react-syntax-highlighter
|
||||||
|
// https://github.com/react-syntax-highlighter/react-syntax-highlighter/pull/483
|
||||||
|
overflowX: "auto",
|
||||||
|
|
||||||
"& code": {
|
"& code": {
|
||||||
color: theme.palette.text.secondary,
|
color: theme.palette.text.secondary,
|
||||||
|
@ -12,11 +12,9 @@ const TEMPLATE_NAME = "coder-ts"
|
|||||||
const VERSION_NAME = "12345"
|
const VERSION_NAME = "12345"
|
||||||
const TERRAFORM_FILENAME = "main.tf"
|
const TERRAFORM_FILENAME = "main.tf"
|
||||||
const README_FILENAME = "readme.md"
|
const README_FILENAME = "readme.md"
|
||||||
const GPG_FILENAME = "key.gpg"
|
|
||||||
const TEMPLATE_VERSION_FILES = {
|
const TEMPLATE_VERSION_FILES = {
|
||||||
[TERRAFORM_FILENAME]: "{}",
|
[TERRAFORM_FILENAME]: "{}",
|
||||||
[README_FILENAME]: "Readme",
|
[README_FILENAME]: "Readme",
|
||||||
[GPG_FILENAME]: "Some sensitive info",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const setup = async () => {
|
const setup = async () => {
|
||||||
@ -38,10 +36,9 @@ const setup = async () => {
|
|||||||
describe("TemplateVersionPage", () => {
|
describe("TemplateVersionPage", () => {
|
||||||
beforeEach(setup)
|
beforeEach(setup)
|
||||||
|
|
||||||
it("shows the tf and md files only", () => {
|
it("shows files", () => {
|
||||||
expect(screen.queryByText(TERRAFORM_FILENAME)).toBeInTheDocument()
|
expect(screen.queryByText(TERRAFORM_FILENAME)).toBeInTheDocument()
|
||||||
expect(screen.queryByText(README_FILENAME)).toBeInTheDocument()
|
expect(screen.queryByText(README_FILENAME)).toBeInTheDocument()
|
||||||
expect(screen.queryByText(GPG_FILENAME)).not.toBeInTheDocument()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it("shows the right content when click on the file name", async () => {
|
it("shows the right content when click on the file name", async () => {
|
||||||
|
@ -9,26 +9,27 @@ export type TemplateVersionFiles = Record<string, string>
|
|||||||
|
|
||||||
export const getTemplateVersionFiles = async (
|
export const getTemplateVersionFiles = async (
|
||||||
version: TemplateVersion,
|
version: TemplateVersion,
|
||||||
|
allowedExtensions: string[],
|
||||||
): Promise<TemplateVersionFiles> => {
|
): Promise<TemplateVersionFiles> => {
|
||||||
const files: TemplateVersionFiles = {}
|
const files: TemplateVersionFiles = {}
|
||||||
const tarFile = await getFile(version.job.file_id)
|
const tarFile = await getFile(version.job.file_id)
|
||||||
|
const blobs: Record<string, Blob> = {}
|
||||||
|
|
||||||
await untar(tarFile).then(undefined, undefined, async (file) => {
|
await untar(tarFile).then(undefined, undefined, async (file) => {
|
||||||
const paths = file.name.split("/")
|
const paths = file.name.split("/")
|
||||||
const filename = paths[paths.length - 1]
|
const filename = paths[paths.length - 1]
|
||||||
files[filename] = file.readAsString()
|
|
||||||
})
|
|
||||||
return files
|
|
||||||
}
|
|
||||||
|
|
||||||
export const filterTemplateFilesByExtension = (
|
|
||||||
files: TemplateVersionFiles,
|
|
||||||
extensions: string[],
|
|
||||||
): TemplateVersionFiles => {
|
|
||||||
return Object.keys(files).reduce((filteredFiles, filename) => {
|
|
||||||
const [_, extension] = filename.split(".")
|
const [_, extension] = filename.split(".")
|
||||||
|
|
||||||
return extensions.includes(extension)
|
if (allowedExtensions.includes(extension)) {
|
||||||
? { ...filteredFiles, [filename]: files[filename] }
|
blobs[filename] = file.blob
|
||||||
: filteredFiles
|
}
|
||||||
}, {} as TemplateVersionFiles)
|
})
|
||||||
|
|
||||||
|
await Promise.all(
|
||||||
|
Object.entries(blobs).map(async ([filename, blob]) => {
|
||||||
|
files[filename] = await blob.text()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
return files
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { getTemplateVersionByName } from "api/api"
|
import { getTemplateVersionByName } from "api/api"
|
||||||
import { TemplateVersion } from "api/typesGenerated"
|
import { TemplateVersion } from "api/typesGenerated"
|
||||||
import {
|
import {
|
||||||
filterTemplateFilesByExtension,
|
|
||||||
getTemplateVersionFiles,
|
getTemplateVersionFiles,
|
||||||
TemplateVersionFiles,
|
TemplateVersionFiles,
|
||||||
} from "util/templateVersion"
|
} from "util/templateVersion"
|
||||||
@ -86,10 +85,7 @@ export const templateVersionMachine = createMachine(
|
|||||||
if (!version) {
|
if (!version) {
|
||||||
throw new Error("Version is not defined")
|
throw new Error("Version is not defined")
|
||||||
}
|
}
|
||||||
return filterTemplateFilesByExtension(
|
return getTemplateVersionFiles(version, ["tf", "md"])
|
||||||
await getTemplateVersionFiles(version),
|
|
||||||
["tf", "md"],
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user