All files / app/codeCharta/model/files files.helper.ts

97.77% Statements 44/45
100% Branches 8/8
95.45% Functions 21/22
97.22% Lines 35/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76  115x   115x 115x 115x 115x   115x 23x     115x 22x     115x 4x 3x     115x       115x 7x     115x 104x     115x 87x     115x 21x     115x 25x     115x 6x 6x 11x 6x 6x 6x       11x       6x           12x   6x   6x            
import { CCFile } from "../../codeCharta.model"
import { FileSelectionState, FileState } from "./files"
 
const FILE_EXTENSION_PNG = ".png"
const SCREENSHOT_FILE_NAME_LENGTH_LIMIT = 255
const SCREENSHOT_FILE_NAME_SHORTENER = "~"
const SCREENSHOT_FILE_NAME_LINK = "_"
 
export function getCCFiles(fileStates: FileState[]) {
    return fileStates.map(x => x.file)
}
 
export function fileStatesAvailable(fileStates: FileState[]) {
    return fileStates.some(x => x.selectedAs !== FileSelectionState.None)
}
 
export function getFileByFileName(fileStates: FileState[], fileName: string) {
    const matchingFileState = fileStates.find(x => x.file.fileMeta.fileName === fileName)
    return matchingFileState ? matchingFileState.file : undefined
}
 
export function getFileNameOf(fileState: FileState) {
    return fileState.file.fileMeta.fileName
}
 
export function getVisibleFiles(fileStates: FileState[]) {
    return getVisibleFileStates(fileStates).map(x => x.file)
}
 
export function getVisibleFileStates(fileStates: FileState[]) {
    return fileStates.filter(x => x.selectedAs !== FileSelectionState.None)
}
 
export function isDeltaState(fileStates: FileState[]) {
    return fileStates.some(x => x.selectedAs === FileSelectionState.Reference)
}
 
export function isPartialState(fileStates: FileState[]) {
    return fileStates.some(x => x.selectedAs === FileSelectionState.Partial)
}
 
export function isEqual(file1: CCFile, file2: CCFile) {
    return file1.fileMeta.fileChecksum === file2.fileMeta.fileChecksum
}
 
export function createPNGFileName(files: FileState[], screenshotFileNameSuffix: FileNameSuffixScreenshot) {
    const state = isDeltaState(files) ? "delta" : ""
    const fileNames = getVisibleFileStates(files)
    const fileNamesStripped = fileNames.map(fileStates => createStrippedFileName(fileStates))
    const fileNameCombined = createCombinedFileName(fileNamesStripped)
    const fileNameCapped = createCappedFileName(fileNameCombined, state, screenshotFileNameSuffix)
    return fileNameCapped
}
 
function createStrippedFileName(fileState: FileState) {
    return fileState.file.fileMeta.fileName.replace(/(.cc)?.json$/, "")
}
 
function createCombinedFileName(fileNamesStripped: string[]) {
    return fileNamesStripped.length <= 3
        ? fileNamesStripped.join(SCREENSHOT_FILE_NAME_LINK)
        : [fileNamesStripped.at(0), SCREENSHOT_FILE_NAME_SHORTENER, fileNamesStripped.at(-1)].join(SCREENSHOT_FILE_NAME_LINK)
}
 
function createCappedFileName(fileNameCombined: string, state: string, screenshotFileNameSuffix: string) {
    const fileName = [state, fileNameCombined].filter(fileNameElement => fileNameElement.length > 0).join(SCREENSHOT_FILE_NAME_LINK)
 
    const maxLength = SCREENSHOT_FILE_NAME_LENGTH_LIMIT - screenshotFileNameSuffix.length - FILE_EXTENSION_PNG.length
 
    return fileName.length <= maxLength
        ? [fileName, SCREENSHOT_FILE_NAME_LINK, screenshotFileNameSuffix, FILE_EXTENSION_PNG].join("")
        : [fileName.slice(0, maxLength - 1), SCREENSHOT_FILE_NAME_SHORTENER, screenshotFileNameSuffix, FILE_EXTENSION_PNG].join("")
}
 
type FileNameSuffixScreenshot = "legend" | "map"