| | import { Tokenizer, TokenKind } from 'liquidjs' |
| | import type { TopLevelToken, TagToken } from 'liquidjs' |
| |
|
| | import { deprecated } from '@/versions/lib/enterprise-server-releases' |
| |
|
| | |
| | const liquidTokenCache = new Map<string, TopLevelToken[]>() |
| |
|
| | |
| | export function getLiquidTokens( |
| | content: string, |
| | { noCache = false }: { noCache?: boolean } = {}, |
| | ): TopLevelToken[] { |
| | if (!content) return [] |
| |
|
| | if (noCache) { |
| | const tokenizer = new Tokenizer(content) |
| | return tokenizer.readTopLevelTokens() |
| | } |
| |
|
| | if (liquidTokenCache.has(content)) { |
| | return liquidTokenCache.get(content)! |
| | } |
| |
|
| | const tokenizer = new Tokenizer(content) |
| | const tokens = tokenizer.readTopLevelTokens() |
| | liquidTokenCache.set(content, tokens) |
| | return liquidTokenCache.get(content)! |
| | } |
| |
|
| | export const OUTPUT_OPEN = '{%' |
| | export const OUTPUT_CLOSE = '%}' |
| | export const TAG_OPEN = '{{' |
| | export const TAG_CLOSE = '}}' |
| |
|
| | export const conditionalTags = ['if', 'elseif', 'unless', 'case', 'ifversion'] |
| | const CONDITIONAL_TAG_NAMES = ['if', 'ifversion', 'elsif', 'else', 'endif'] |
| |
|
| | |
| | export function getPositionData( |
| | token: TopLevelToken, |
| | lines: string[], |
| | ): { lineNumber: number; column: number; length: number } { |
| | |
| | |
| | const begin = token.begin + 1 |
| | const end = token.end + 1 |
| | |
| | |
| | |
| | const lineLengths = lines.map((line) => line.length + 1) |
| |
|
| | let count = begin |
| | let lineNumber = 1 |
| | for (const lineLength of lineLengths) { |
| | if (count - lineLength <= 0) break |
| | count = count - lineLength |
| | lineNumber++ |
| | } |
| | return { lineNumber, column: count, length: end - begin } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function getContentDeleteData( |
| | token: TopLevelToken, |
| | tokenEnd: number, |
| | lines: string[], |
| | ): Array<{ lineNumber: number; column: number; deleteCount: number }> { |
| | const { lineNumber, column } = getPositionData(token, lines) |
| | const errorInfo: Array<{ lineNumber: number; column: number; deleteCount: number }> = [] |
| | let begin = column - 1 |
| | |
| | |
| | const length = tokenEnd - token.begin |
| |
|
| | if (lines[lineNumber - 1].slice(begin).length >= length) { |
| | return [{ lineNumber, column, deleteCount: length }] |
| | } |
| |
|
| | let remainingLength = length |
| | let incLineNumber = 0 |
| | while (remainingLength > 0) { |
| | const zeroBasedLineNumber = lineNumber - 1 + incLineNumber |
| | const line = lines[zeroBasedLineNumber] |
| | const lineLength = line.length |
| | let deleteCount |
| | if (begin !== 0) { |
| | deleteCount = line.slice(begin).length |
| | remainingLength -= deleteCount + 1 |
| | } else if (remainingLength >= lineLength) { |
| | deleteCount = -1 |
| | remainingLength -= lineLength + 1 |
| | } else { |
| | deleteCount = remainingLength |
| | remainingLength -= deleteCount |
| | } |
| | errorInfo.push({ lineNumber: zeroBasedLineNumber + 1, column: begin + 1, deleteCount }) |
| | begin = 0 |
| | incLineNumber++ |
| | } |
| | return errorInfo |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | export function getLiquidIfVersionTokens(content: string): TagToken[] { |
| | const tokens = getLiquidTokens(content) |
| | .filter((token): token is TagToken => token.kind === TokenKind.Tag) |
| | .filter((token) => CONDITIONAL_TAG_NAMES.includes(token.name)) |
| |
|
| | let inIfStatement = false |
| | const ifVersionTokens: TagToken[] = [] |
| | for (const token of tokens) { |
| | if (token.name === 'if') { |
| | inIfStatement = true |
| | continue |
| | } |
| | if (inIfStatement && token.name !== 'endif') continue |
| | if (inIfStatement && token.name === 'endif') { |
| | inIfStatement = false |
| | continue |
| | } |
| | ifVersionTokens.push(token) |
| | } |
| | return ifVersionTokens |
| | } |
| |
|
| | export function getSimplifiedSemverRange(release: string): string { |
| | |
| | |
| | |
| | |
| | |
| | const releaseStrings = release.split(' ') |
| | const releaseToCheckIndex = releaseStrings.indexOf('>') + 1 |
| | const releaseToCheck = releaseStrings[releaseToCheckIndex] |
| |
|
| | |
| | |
| | if (deprecated.includes(releaseToCheck) && releaseStrings.length === 2) { |
| | return '*' |
| | } |
| |
|
| | |
| | |
| | |
| | const newRelease = deprecated.includes(releaseToCheck) |
| | ? release.replace(`> ${releaseToCheck}`, '') |
| | : release |
| |
|
| | return newRelease |
| | } |
| |
|