@purestack/ts-format 0.0.0-stage → 1.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +44 -2
- package/dist/files.d.mts +39 -0
- package/dist/files.d.mts.map +1 -0
- package/dist/files.mjs +1076 -0
- package/dist/files.mjs.map +1 -0
- package/dist/ts-format.d.mts +178 -0
- package/dist/ts-format.d.mts.map +1 -0
- package/dist/ts-format.mjs +987 -0
- package/dist/ts-format.mjs.map +1 -0
- package/package.json +46 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-format.mjs","names":["escapeRegExp"],"sources":["../src/markup.ts","../src/expressions.ts","../src/source.ts","../src/fences.ts","../src/html.ts","../src/mdx.ts","../src/templates.ts","../src/index.ts"],"sourcesContent":["export const VOID_HTML_TAG_NAMES = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\nexport interface TagToken {\n end: number\n kind: 'closing' | 'opening'\n name: string\n nameEnd: number\n nameStart: number\n selfClosing: boolean\n start: number\n}\n\nexport function scanTagTokens(markup: string) {\n const tokens: TagToken[] = []\n\n for (let index = 0; index < markup.length; index++) {\n if (markup[index] !== '<') continue\n\n if (markup.startsWith('<!--', index)) {\n const commentEnd = markup.indexOf('-->', index + 4)\n if (commentEnd === -1) break\n index = commentEnd + 2\n continue\n }\n\n const isClosing = markup[index + 1] === '/'\n const nameStart = skipWhitespace(markup, index + (isClosing ? 2 : 1))\n const nameEnd = readTagNameEnd(markup, nameStart)\n if (nameEnd === nameStart) continue\n\n const tagEnd = findTagEnd(markup, nameEnd)\n if (tagEnd === -1) break\n\n const name = markup.slice(nameStart, nameEnd)\n const trailing = markup.slice(nameEnd, tagEnd)\n tokens.push({\n start: index,\n end: tagEnd + 1,\n kind: isClosing ? 'closing' : 'opening',\n name,\n nameStart,\n nameEnd,\n selfClosing: !isClosing && /\\/\\s*$/.test(trailing),\n })\n index = tagEnd\n }\n\n return tokens\n}\n\nexport function isMdxExpressionStart(source: string, index: number) {\n return (\n source[index] === '{' &&\n source[index - 1] !== '{' &&\n source[index + 1] !== '{'\n )\n}\n\nexport function findMdxExpressionEnd(source: string, startIndex: number) {\n let braceDepth = 0\n let quote: '\"' | \"'\" | '`' | undefined\n\n for (let index = startIndex; index < source.length; index++) {\n const current = source[index]\n const previous = source[index - 1]\n\n if (quote) {\n if (current === quote && previous !== '\\\\') {\n quote = undefined\n } else if (\n quote === '`' &&\n current === '$' &&\n source[index + 1] === '{'\n ) {\n const templateExpressionEnd = findMdxExpressionEnd(source, index + 1)\n if (templateExpressionEnd === -1) return -1\n index = templateExpressionEnd - 1\n }\n continue\n }\n\n if (current === '\"' || current === \"'\" || current === '`') {\n quote = current\n continue\n }\n\n if (current === '{') {\n braceDepth++\n continue\n }\n\n if (current !== '}') continue\n\n braceDepth--\n if (braceDepth === 0) return index + 1\n if (braceDepth < 0) return -1\n }\n\n return -1\n}\n\nexport function findTagEnd(markup: string, startIndex: number) {\n let quote: '\"' | \"'\" | undefined\n\n for (let index = startIndex; index < markup.length; index++) {\n const current = markup[index]\n if (quote) {\n if (current === quote && markup[index - 1] !== '\\\\') quote = undefined\n continue\n }\n\n if (current === '\"' || current === \"'\") {\n quote = current\n continue\n }\n\n if (current === '>') return index\n }\n\n return -1\n}\n\nfunction skipWhitespace(markup: string, startIndex: number) {\n let index = startIndex\n while (index < markup.length && /\\s/.test(markup[index])) index++\n return index\n}\n\nfunction readTagNameEnd(markup: string, startIndex: number) {\n let index = startIndex\n while (index < markup.length && /[A-Za-z0-9._:$-]/.test(markup[index])) {\n index++\n }\n return index\n}\n","import { findMdxExpressionEnd } from './markup'\n\nexport interface RegorExpressionPlaceholder {\n placeholder: string\n source: string\n}\n\n/**\n * Protects Regor {{ ... }} expressions while the surrounding markup is\n * formatted as HTML. The expression source is restored byte-for-byte.\n */\nexport function maskRegorExpressions(source: string) {\n const expressions: RegorExpressionPlaceholder[] = []\n let placeholderContent = ''\n let cursor = 0\n\n while (cursor < source.length) {\n const start = source.indexOf('{{', cursor)\n if (start === -1) {\n placeholderContent += source.slice(cursor)\n break\n }\n\n placeholderContent += source.slice(cursor, start)\n\n const end = findRegorExpressionEnd(source, start)\n if (end === -1) {\n // Keep incomplete input untouched rather than guessing its boundary.\n placeholderContent += source.slice(start)\n break\n }\n\n const placeholder = createPlaceholder(source, expressions.length)\n expressions.push({ placeholder, source: source.slice(start, end) })\n placeholderContent += placeholder\n cursor = end\n }\n\n return { expressions, placeholderContent }\n}\n\nexport function restoreRegorExpressions(\n formatted: string,\n expressions: RegorExpressionPlaceholder[],\n) {\n let restored = formatted\n\n for (const expression of expressions) {\n restored = restored.split(expression.placeholder).join(expression.source)\n }\n\n return restored\n}\n\nfunction findRegorExpressionEnd(source: string, start: number) {\n // Reuse the expression scanner already used by MDX. Starting at the first\n // brace makes {{ ... }} two outer brace levels, so nested object literals,\n // quoted braces and template-literal expressions remain balanced correctly.\n const end = findMdxExpressionEnd(source, start)\n if (end === -1) return -1\n\n return source.slice(end - 2, end) === '}}' ? end : -1\n}\n\nfunction createPlaceholder(source: string, index: number) {\n let placeholder = `__PURESTACK_REGOR_EXPR_${index}__`\n\n while (source.includes(placeholder)) {\n placeholder = `_${placeholder}_`\n }\n\n return placeholder\n}\n","import type { HtmlFormattingOptions } from './html'\n\nexport interface SourceRange {\n start: number\n end: number\n}\n\nexport interface SourceEdit extends SourceRange {\n newText: string\n}\n\nexport interface FormatDiagnostic extends SourceRange {\n message: string\n}\n\nexport interface FormatOptions extends Partial<HtmlFormattingOptions> {\n filePath?: string\n language?: 'mdx' | 'typescript'\n onlyWithinRange?: SourceRange\n}\n\nexport function intersects(left: SourceRange, right: SourceRange) {\n return left.start <= right.end && right.start <= left.end\n}\n\n/** Immutable source snapshot. All edit offsets refer to this text. */\nexport class SourceText {\n readonly filePath: string\n readonly options: HtmlFormattingOptions\n readonly diagnostics: FormatDiagnostic[] = []\n private readonly lines: Array<{ text: string; range: SourceRange }> = []\n private readonly eol: '\\n' | '\\r\\n'\n\n constructor(\n readonly text: string,\n options: FormatOptions = {},\n ) {\n this.filePath = options.filePath ?? 'source.mdx'\n this.options = {\n printWidth: options.printWidth ?? 80,\n tabSize: options.tabSize ?? 2,\n useTabs: options.useTabs ?? false,\n }\n for (const value of [this.options.printWidth, this.options.tabSize]) {\n if (!Number.isInteger(value) || value < 1)\n throw new Error('Print width and tab size must be positive integers.')\n }\n this.eol = /\\r\\n/.test(text) ? '\\r\\n' : '\\n'\n let start = 0\n for (const line of text.split('\\n')) {\n const content = line.endsWith('\\r') ? line.slice(0, -1) : line\n this.lines.push({\n text: content,\n range: { start, end: start + content.length },\n })\n start += line.length + 1\n }\n }\n\n get lineCount() {\n return this.lines.length\n }\n\n lineAt(line: number) {\n return this.lines[line]\n }\n\n positionAt(offset: number) {\n const bounded = Math.max(0, Math.min(offset, this.text.length))\n let low = 0\n let high = this.lines.length - 1\n while (low < high) {\n const middle = Math.ceil((low + high) / 2)\n if (this.lines[middle].range.start > bounded) high = middle - 1\n else low = middle\n }\n const line = this.lines[low]\n return {\n line: low,\n character: Math.min(bounded, line.range.end) - line.range.start,\n }\n }\n\n offsetAt(position: { line: number; character: number }) {\n const line =\n this.lines[Math.max(0, Math.min(position.line, this.lines.length - 1))]\n return Math.min(\n line.range.end,\n line.range.start + Math.max(0, position.character),\n )\n }\n\n preserveEol(text: string) {\n return text.replace(/\\r?\\n/g, this.eol)\n }\n\n report(range: SourceRange, error: unknown) {\n this.diagnostics.push({\n ...range,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n}\n\n/** Apply non-overlapping edits against their original snapshot. */\nexport function applySourceEdits(source: string, edits: readonly SourceEdit[]) {\n const ordered = [...edits].sort((a, b) => a.start - b.start || a.end - b.end)\n let cursor = 0\n const parts: string[] = []\n for (const edit of ordered) {\n if (\n edit.start < cursor ||\n edit.end < edit.start ||\n edit.end > source.length\n )\n throw new Error('Formatter returned overlapping or invalid source edits.')\n parts.push(source.slice(cursor, edit.start), edit.newText)\n cursor = edit.end\n }\n parts.push(source.slice(cursor))\n return parts.join('')\n}\n","import { scanTagTokens } from './markup'\nimport {\n intersects,\n type SourceEdit,\n type SourceRange,\n type SourceText,\n} from './source'\n\nexport interface MdxFencePlaceholder {\n placeholder: string\n source: string\n}\n\nexport interface MdxFence {\n length: number\n marker: '`' | '~'\n}\n\nexport interface MdxFenceDelimiter extends MdxFence {\n suffix: string\n}\n\nexport interface MdxFenceDelimiterEditOptions {\n onlyWithinRange?: SourceRange\n}\n\nexport function buildMdxFenceDelimiterEdits(\n document: SourceText,\n excludedRanges: SourceRange[],\n options: MdxFenceDelimiterEditOptions = {},\n) {\n const edits: SourceEdit[] = []\n let activeFence: MdxFence | undefined\n let frontmatterHandled = false\n let inFrontmatter = false\n\n for (let lineIndex = 0; lineIndex < document.lineCount; lineIndex++) {\n const line = document.lineAt(lineIndex)\n const lineText = line.text\n const trimmed = lineText.trim()\n\n if (!frontmatterHandled && lineIndex === 0 && trimmed === '---') {\n frontmatterHandled = true\n inFrontmatter = true\n continue\n }\n\n if (inFrontmatter) {\n if (trimmed === '---') inFrontmatter = false\n continue\n }\n\n if (isLineInsideAnyRange(line.range, excludedRanges)) {\n continue\n }\n\n if (\n options.onlyWithinRange &&\n !intersects(line.range, options.onlyWithinRange)\n ) {\n continue\n }\n\n if (!activeFence) {\n const splitLine = splitLineBeforeInlineMdxFenceOpener(lineText)\n if (splitLine) {\n const replacement = [\n ...splitAdjacentMarkupTags(splitLine.before),\n splitLine.fenceLine,\n ].join('\\n')\n pushLineReplacement(edits, line.range, lineText, replacement)\n\n const delimiter = parseMdxFenceDelimiter(splitLine.fenceLine.trim())\n activeFence = delimiter\n ? { length: delimiter.length, marker: delimiter.marker }\n : undefined\n continue\n }\n\n const delimiter = parseMdxFenceDelimiter(trimmed)\n if (!delimiter) continue\n\n pushLineReplacement(\n edits,\n line.range,\n lineText,\n trimLineStartIndent(lineText),\n )\n activeFence = { length: delimiter.length, marker: delimiter.marker }\n continue\n }\n\n const splitClosingPrefix = splitLineAfterInlineMdxFenceCloser(\n lineText,\n activeFence,\n )\n if (splitClosingPrefix) {\n const replacement = [\n trimLineStartIndent(splitClosingPrefix.fenceLine),\n splitClosingPrefix.after,\n ].join('\\n')\n pushLineReplacement(edits, line.range, lineText, replacement)\n activeFence = undefined\n continue\n }\n\n const splitClosingSuffix = splitLineBeforeInlineMdxFenceCloser(\n lineText,\n activeFence,\n )\n if (splitClosingSuffix) {\n const replacement = [\n splitClosingSuffix.before,\n trimLineStartIndent(splitClosingSuffix.fenceLine),\n ].join('\\n')\n pushLineReplacement(edits, line.range, lineText, replacement)\n activeFence = undefined\n continue\n }\n\n const delimiter = parseMdxFenceDelimiter(trimmed)\n if (!delimiter || !isMdxFenceClosingDelimiter(delimiter, activeFence)) {\n continue\n }\n\n pushLineReplacement(\n edits,\n line.range,\n lineText,\n trimLineStartIndent(lineText),\n )\n activeFence = undefined\n }\n\n return edits.map((edit) => ({\n ...edit,\n newText: document.preserveEol(edit.newText),\n }))\n}\n\nexport function maskMdxFencedRegions(source: string) {\n const fences: MdxFencePlaceholder[] = []\n const lines = splitInlineMdxFenceDelimiters(source).split('\\n')\n const placeholderLines: string[] = []\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const openingDelimiter = parseMdxFenceDelimiter(lines[lineIndex].trim())\n if (!openingDelimiter) {\n placeholderLines.push(lines[lineIndex])\n continue\n }\n\n let closingLineIndex = -1\n for (\n let candidateLineIndex = lineIndex + 1;\n candidateLineIndex < lines.length;\n candidateLineIndex++\n ) {\n const closingDelimiter = parseMdxFenceDelimiter(\n lines[candidateLineIndex].trim(),\n )\n if (\n closingDelimiter &&\n isMdxFenceClosingDelimiter(closingDelimiter, openingDelimiter)\n ) {\n closingLineIndex = candidateLineIndex\n break\n }\n }\n\n if (closingLineIndex === -1) {\n placeholderLines.push(lines[lineIndex])\n continue\n }\n\n const placeholder = `<!--PURESTACK_MDX_FENCE_${fences.length}-->`\n fences.push({\n placeholder,\n source: normalizeMdxFenceDelimiterIndent(\n lines.slice(lineIndex, closingLineIndex + 1),\n ),\n })\n placeholderLines.push(placeholder)\n lineIndex = closingLineIndex\n }\n\n return { fences, placeholderContent: placeholderLines.join('\\n') }\n}\n\nexport function restoreMdxFencedRegions(\n formatted: string,\n fences: MdxFencePlaceholder[],\n) {\n let restored = formatted\n\n for (const fence of fences) {\n const standalonePlaceholderPattern = new RegExp(\n `^[\\\\t ]*${escapeRegExp(fence.placeholder)}$`,\n 'gm',\n )\n if (standalonePlaceholderPattern.test(restored)) {\n restored = restored.replace(standalonePlaceholderPattern, fence.source)\n continue\n }\n\n restored = restored.split(fence.placeholder).join(fence.source)\n }\n\n return restored\n}\n\nexport function parseMdxFenceDelimiter(\n trimmed: string,\n): MdxFenceDelimiter | undefined {\n const match = /^(`{3,}|~{3,})(.*)$/.exec(trimmed)\n if (!match) return undefined\n\n return {\n length: match[1].length,\n marker: match[1].startsWith('`') ? '`' : '~',\n suffix: match[2],\n }\n}\n\nexport function parseInlineMdxFenceOpener(trimmed: string) {\n const splitLine = splitLineBeforeInlineMdxFenceOpener(trimmed)\n if (!splitLine) return undefined\n\n return parseMdxFenceDelimiter(splitLine.fenceLine.trim())\n}\n\nexport function parseInlineMdxFenceCloser(\n trimmed: string,\n activeFence: MdxFence,\n) {\n const splitLine = splitLineAfterInlineMdxFenceCloser(trimmed, activeFence)\n if (splitLine) return parseMdxFenceDelimiter(splitLine.fenceLine.trim())\n\n const trailingSplitLine = splitLineBeforeInlineMdxFenceCloser(\n trimmed,\n activeFence,\n )\n if (!trailingSplitLine) return undefined\n\n return parseMdxFenceDelimiter(trailingSplitLine.fenceLine.trim())\n}\n\nexport function isMdxFenceClosingDelimiter(\n delimiter: MdxFenceDelimiter,\n activeFence: MdxFence,\n) {\n return (\n delimiter.marker === activeFence.marker &&\n delimiter.length >= activeFence.length &&\n delimiter.suffix.trim().length === 0\n )\n}\n\nfunction splitInlineMdxFenceDelimiters(source: string) {\n const lines = source.split('\\n')\n const splitLines: string[] = []\n let activeFence: MdxFence | undefined\n\n for (const line of lines) {\n if (!activeFence) {\n const splitLine = splitLineBeforeInlineMdxFenceOpener(line)\n if (splitLine) {\n splitLines.push(\n ...splitAdjacentMarkupTags(splitLine.before),\n splitLine.fenceLine,\n )\n\n const delimiter = parseMdxFenceDelimiter(splitLine.fenceLine.trim())\n activeFence = delimiter\n ? { length: delimiter.length, marker: delimiter.marker }\n : undefined\n continue\n }\n\n splitLines.push(line)\n\n const delimiter = parseMdxFenceDelimiter(line.trim())\n if (!delimiter) continue\n activeFence = { length: delimiter.length, marker: delimiter.marker }\n continue\n }\n\n const splitClosingLine = splitLineAfterInlineMdxFenceCloser(\n line,\n activeFence,\n )\n if (splitClosingLine) {\n splitLines.push(splitClosingLine.fenceLine, splitClosingLine.after)\n activeFence = undefined\n continue\n }\n\n const splitTrailingClosingLine = splitLineBeforeInlineMdxFenceCloser(\n line,\n activeFence,\n )\n if (splitTrailingClosingLine) {\n splitLines.push(\n splitTrailingClosingLine.before,\n splitTrailingClosingLine.fenceLine,\n )\n activeFence = undefined\n continue\n }\n\n splitLines.push(line)\n\n const delimiter = parseMdxFenceDelimiter(line.trim())\n if (!delimiter) continue\n\n if (isMdxFenceClosingDelimiter(delimiter, activeFence)) {\n activeFence = undefined\n }\n }\n\n return splitLines.join('\\n')\n}\n\nfunction splitLineBeforeInlineMdxFenceOpener(line: string) {\n if (parseMdxFenceDelimiter(line.trim())) return undefined\n\n const match = /`{3}|~{3}/.exec(line)\n if (!match) return undefined\n\n const before = line.slice(0, match.index).trimEnd()\n if (before.trim().length === 0) return undefined\n\n return {\n before,\n fenceLine: line.slice(match.index),\n }\n}\n\nfunction splitAdjacentMarkupTags(line: string) {\n const tokens = scanTagTokens(line)\n if (tokens.length < 2) return [line]\n\n let cursor = 0\n const lines: string[] = []\n const indent = /^\\s*/.exec(line)?.[0] ?? ''\n\n for (const token of tokens) {\n if (line.slice(cursor, token.start).trim().length > 0) return [line]\n\n const tag = line.slice(token.start, token.end)\n lines.push(lines.length === 0 ? `${indent}${tag}` : tag)\n cursor = token.end\n }\n\n if (line.slice(cursor).trim().length > 0) return [line]\n\n return lines\n}\n\nfunction splitLineBeforeInlineMdxFenceCloser(\n line: string,\n activeFence: MdxFence,\n) {\n let end = line.length\n while (end > 0 && (line[end - 1] === '\\t' || line[end - 1] === ' ')) end--\n let start = end\n while (start > 0 && line[start - 1] === activeFence.marker) start--\n if (end - start < activeFence.length) return undefined\n\n const before = line.slice(0, start).trimEnd()\n if (before.trim().length === 0) return undefined\n\n return {\n before,\n fenceLine: line.slice(start, end),\n }\n}\n\nfunction splitLineAfterInlineMdxFenceCloser(\n line: string,\n activeFence: MdxFence,\n) {\n const pattern = new RegExp(\n `^([\\\\t ]*${escapeRegExp(activeFence.marker.repeat(activeFence.length))}${escapeRegExp(activeFence.marker)}*)(.*)$`,\n )\n const match = pattern.exec(line)\n if (!match || match[2].trim().length === 0) return undefined\n\n const closingDelimiter = parseMdxFenceDelimiter(match[1].trim())\n if (!closingDelimiter) return undefined\n if (!isMdxFenceClosingDelimiter(closingDelimiter, activeFence)) {\n return undefined\n }\n\n return {\n fenceLine: match[1],\n after: match[2],\n }\n}\n\nfunction normalizeMdxFenceDelimiterIndent(lines: string[]) {\n if (lines.length < 2) return lines.join('\\n')\n\n const normalizedLines = [...lines]\n normalizedLines[0] = trimLineStartIndent(normalizedLines[0])\n normalizedLines[normalizedLines.length - 1] = trimLineStartIndent(\n normalizedLines[normalizedLines.length - 1],\n )\n return normalizedLines.join('\\n')\n}\n\nfunction trimLineStartIndent(line: string) {\n return line.replace(/^[\\t ]+/, '')\n}\n\nfunction pushLineReplacement(\n edits: SourceEdit[],\n range: SourceRange,\n oldText: string,\n newText: string,\n) {\n if (newText === oldText) return\n\n edits.push({ ...range, newText })\n}\n\nfunction isLineInsideAnyRange(line: SourceRange, ranges: SourceRange[]) {\n return ranges.some(\n (range) => line.start >= range.start && line.end <= range.end,\n )\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","import htmlPlugin from 'prettier/plugins/html'\nimport postcssPlugin from 'prettier/plugins/postcss'\nimport prettier from 'prettier/standalone'\n\nconst RAW_TEXT_TAG =\n 'script|style|textarea|title|xmp|iframe|noembed|noframes|plaintext'\nconst TAG_BODY = `(?:\"[^\"]*\"|'[^']*'|[^\"'>])*>`\n\n/**\n * Skips comments, raw text and opening tags; captures closing tags broken before `>`.\n * Case-sensitive so PascalCase components such as `<Title>` are not raw text.\n */\nconst BROKEN_CLOSING_TAG = new RegExp(\n [\n String.raw`<!--[\\s\\S]*?-->`,\n String.raw`<(${RAW_TEXT_TAG})\\b${TAG_BODY}[\\s\\S]*?</\\1\\s*>`,\n `<[A-Za-z]${TAG_BODY}`,\n String.raw`(</[^\\s>]+)\\s*\\n\\s*>`,\n ].join('|'),\n 'g',\n)\n\nexport interface HtmlFormattingOptions {\n printWidth: number\n tabSize: number\n useTabs: boolean\n}\n\nexport async function formatHtmlFragment(\n source: string,\n options: HtmlFormattingOptions,\n) {\n const formatted = await prettier.format(source, {\n htmlWhitespaceSensitivity: 'css',\n parser: 'html',\n plugins: [htmlPlugin, postcssPlugin],\n printWidth: options.printWidth,\n tabWidth: options.tabSize,\n useTabs: options.useTabs,\n })\n return normalizeClosingTagSpacing(formatted)\n}\n\n/** Keep closing tags readable without inserting whitespace into inline content. */\nexport function normalizeClosingTagSpacing(source: string) {\n return source.replace(\n BROKEN_CLOSING_TAG,\n (match, _rawTextTag: string, closingTag?: string) =>\n closingTag ? `${closingTag}>` : match,\n )\n}\n\nexport function getLineIndent(line: string) {\n const match = /^\\s*/.exec(line)\n return match?.[0] ?? ''\n}\n\nexport function normalizeSelfClosingTagSpacing(formatted: string) {\n // Match each whitespace run once, even when no /> follows it.\n return formatted.replace(/\\s+/g, (whitespace, offset: number) =>\n formatted.startsWith('/>', offset + whitespace.length) ? '' : whitespace,\n )\n}\n","import { maskRegorExpressions, restoreRegorExpressions } from './expressions'\nimport {\n buildMdxFenceDelimiterEdits,\n isMdxFenceClosingDelimiter,\n maskMdxFencedRegions,\n parseInlineMdxFenceCloser,\n parseInlineMdxFenceOpener,\n parseMdxFenceDelimiter,\n restoreMdxFencedRegions,\n} from './fences'\nimport { formatHtmlFragment, normalizeSelfClosingTagSpacing } from './html'\nimport {\n findMdxExpressionEnd,\n findTagEnd,\n isMdxExpressionStart,\n scanTagTokens,\n VOID_HTML_TAG_NAMES,\n} from './markup'\nimport {\n intersects,\n type SourceEdit,\n type SourceRange,\n type SourceText,\n} from './source'\n\nexport interface MdxMarkupBlock {\n content: string\n range: SourceRange\n}\n\ninterface MdxExpressionPlaceholder {\n placeholder: string\n source: string\n}\n\ninterface MdxInlineCodePlaceholder {\n placeholder: string\n source: string\n}\n\ninterface MdxFormattingRequest {\n onlyWithinRange?: SourceRange\n}\n\ninterface MdxMarkupBlockOptions {\n includeIncomplete?: boolean\n}\n\ninterface MdxBlockScanState {\n activeEndLine?: number\n activeLines: string[]\n activeStartLine?: number\n fenceLength?: number\n fenceMarker?: '`' | '~'\n frontmatterHandled: boolean\n inFence: boolean\n inFrontmatter: boolean\n}\n\nexport async function buildMdxFormattingEdits(\n document: SourceText,\n request: MdxFormattingRequest = {},\n) {\n const blocks = getMdxMarkupBlocks(document, {\n includeIncomplete: true,\n }).filter((block) =>\n request.onlyWithinRange\n ? intersects(block.range, request.onlyWithinRange)\n : true,\n )\n\n const edits: SourceEdit[] = []\n const blockRanges = blocks.map((block) => block.range)\n\n for (const block of blocks) {\n const formatted = await formatMdxMarkupBlock(document, block)\n if (!formatted || formatted === block.content) continue\n\n edits.push({ ...block.range, newText: document.preserveEol(formatted) })\n }\n\n edits.push(\n ...buildMdxFenceDelimiterEdits(document, blockRanges, {\n onlyWithinRange: request.onlyWithinRange,\n }),\n )\n\n return edits\n}\n\nexport function getMdxMarkupBlocks(\n document: SourceText,\n options: MdxMarkupBlockOptions = {},\n) {\n const blocks: MdxMarkupBlock[] = []\n const state: MdxBlockScanState = {\n activeEndLine: undefined,\n activeLines: [],\n frontmatterHandled: false,\n inFence: false,\n inFrontmatter: false,\n }\n\n for (let lineIndex = 0; lineIndex < document.lineCount; lineIndex++) {\n const lineText = document.lineAt(lineIndex).text\n const trimmed = lineText.trim()\n\n if (startMdxFrontmatter(lineIndex, trimmed, state)) {\n continue\n }\n\n if (closeMdxFrontmatter(trimmed, state)) {\n continue\n }\n\n collectActiveMarkupBlock(\n blocks,\n document,\n lineIndex,\n lineText,\n trimmed,\n state,\n )\n }\n\n if (\n options.includeIncomplete &&\n state.activeStartLine !== undefined &&\n state.activeEndLine !== undefined\n ) {\n pushActiveBlock(\n blocks,\n document,\n state.activeStartLine,\n state.activeEndLine,\n state.activeLines,\n )\n }\n\n return blocks\n}\n\nfunction pushActiveBlock(\n blocks: MdxMarkupBlock[],\n document: SourceText,\n startLine: number,\n endLine: number,\n lines: string[],\n) {\n const start = document.lineAt(startLine).range.start\n const end = document.lineAt(endLine).range.end\n blocks.push({\n content: lines.join('\\n'),\n range: { start, end },\n })\n}\n\nfunction looksLikeMarkupBlockStart(trimmedLine: string) {\n return /^<[A-Za-z][A-Za-z0-9._:$-]*/.test(trimmedLine)\n}\n\nfunction isCompleteMarkupBlock(markup: string) {\n const { placeholderContent } = maskMdxFencedRegions(markup)\n if (!placeholderContent.includes('<')) return false\n if (hasUnterminatedTag(placeholderContent)) return false\n\n return getUnclosedTagNames(placeholderContent).length === 0\n}\n\nasync function formatMdxMarkupBlock(\n document: SourceText,\n block: MdxMarkupBlock,\n) {\n const formattingOptions = document.options\n const { fences, placeholderContent: fencePlaceholderContent } =\n maskMdxFencedRegions(block.content.trim())\n const { inlineCodeSpans, placeholderContent: inlineCodePlaceholderContent } =\n maskMdxInlineCodeSpans(fencePlaceholderContent)\n const {\n expressions: regorExpressions,\n placeholderContent: regorPlaceholderContent,\n } = maskRegorExpressions(inlineCodePlaceholderContent)\n const { expressions, placeholderContent } = maskMdxExpressions(\n regorPlaceholderContent,\n )\n if (!placeholderContent.includes('<')) return undefined\n\n let formatted: string\n try {\n formatted = await formatHtmlFragment(placeholderContent, formattingOptions)\n } catch (error) {\n document.report(block.range, error)\n return undefined\n }\n\n const restoredExpressions = restoreMdxExpressions(\n normalizeSelfClosingTagSpacing(formatted.trim()),\n expressions,\n )\n const restoredRegorExpressions = restoreRegorExpressions(\n restoredExpressions,\n regorExpressions,\n )\n const restoredInlineCode = restoreMdxInlineCodeSpans(\n restoredRegorExpressions,\n inlineCodeSpans,\n )\n\n return restoreMdxFencedRegions(restoredInlineCode, fences)\n}\n\nfunction maskMdxInlineCodeSpans(source: string) {\n const inlineCodeSpans: MdxInlineCodePlaceholder[] = []\n const lines = source.split('\\n')\n const placeholderLines = lines.map((line) =>\n maskMdxInlineCodeSpansInLine(line, inlineCodeSpans),\n )\n\n return {\n inlineCodeSpans,\n placeholderContent: placeholderLines.join('\\n'),\n }\n}\n\nfunction maskMdxInlineCodeSpansInLine(\n line: string,\n inlineCodeSpans: MdxInlineCodePlaceholder[],\n) {\n let placeholderLine = ''\n\n for (let index = 0; index < line.length; ) {\n const start = line.indexOf('`', index)\n if (start === -1) {\n placeholderLine += line.slice(index)\n break\n }\n\n const tickCount = countRepeatedChar(line, start, '`')\n if (tickCount !== 1) {\n placeholderLine += line.slice(index, start + tickCount)\n index = start + tickCount\n continue\n }\n\n const end = findMdxInlineCodeEnd(line, start + 1)\n if (end === -1) {\n placeholderLine += line.slice(index)\n break\n }\n\n const source = line.slice(start, end + 1)\n const placeholder = createMdxInlineCodePlaceholder(\n inlineCodeSpans.length,\n line,\n start,\n end + 1,\n )\n inlineCodeSpans.push({ placeholder, source })\n placeholderLine += line.slice(index, start)\n placeholderLine += placeholder\n index = end + 1\n }\n\n return placeholderLine\n}\n\nfunction createMdxInlineCodePlaceholder(\n index: number,\n line: string,\n start: number,\n end: number,\n) {\n const lineBefore = line.slice(0, start)\n const lineAfter = line.slice(end)\n if (lineBefore.trim().length === 0 && lineAfter.trim().length === 0) {\n return `<!--PURESTACK_MDX_INLINE_CODE_${index}-->`\n }\n\n return `PURESTACK_MDX_INLINE_CODE_${index}`\n}\n\nfunction restoreMdxInlineCodeSpans(\n formatted: string,\n inlineCodeSpans: MdxInlineCodePlaceholder[],\n) {\n let restored = formatted\n\n for (const inlineCodeSpan of sortLongestPlaceholderFirst(inlineCodeSpans)) {\n restored = restored\n .split(inlineCodeSpan.placeholder)\n .join(inlineCodeSpan.source)\n }\n\n return restored\n}\n\nexport function maskMdxExpressions(source: string) {\n const expressions: MdxExpressionPlaceholder[] = []\n let placeholderContent = ''\n\n for (let index = 0; index < source.length; ) {\n const rawTextEnd = findRawTextElementEnd(source, index)\n if (rawTextEnd !== undefined) {\n placeholderContent += source.slice(index, rawTextEnd)\n index = rawTextEnd\n continue\n }\n\n if (!isMdxExpressionStart(source, index)) {\n placeholderContent += source[index]\n index++\n continue\n }\n\n const expressionEnd = findMdxExpressionEnd(source, index)\n if (expressionEnd === -1) {\n placeholderContent += source[index]\n index++\n continue\n }\n\n const placeholder = `PURESTACK_MDX_EXPR_${expressions.length}`\n expressions.push({\n placeholder,\n source: source.slice(index, expressionEnd),\n })\n placeholderContent += placeholder\n index = expressionEnd\n }\n\n return { expressions, placeholderContent }\n}\n\nfunction restoreMdxExpressions(\n formatted: string,\n expressions: MdxExpressionPlaceholder[],\n) {\n let restored = formatted\n\n for (const expression of sortLongestPlaceholderFirst(expressions)) {\n restored = restored.split(expression.placeholder).join(expression.source)\n }\n\n return restored\n}\n\nfunction hasUnterminatedTag(markup: string) {\n for (let index = 0; index < markup.length; index++) {\n if (markup[index] !== '<') continue\n\n if (markup.startsWith('<!--', index)) {\n const commentEnd = markup.indexOf('-->', index + 4)\n if (commentEnd === -1) return true\n index = commentEnd + 2\n continue\n }\n\n const nextTagEnd = findTagEnd(markup, index + 1)\n if (nextTagEnd === -1) return true\n index = nextTagEnd\n }\n\n return false\n}\n\nfunction startMdxFrontmatter(\n lineIndex: number,\n trimmed: string,\n state: MdxBlockScanState,\n) {\n if (state.frontmatterHandled || lineIndex !== 0 || trimmed !== '---') {\n return false\n }\n\n state.inFrontmatter = true\n state.frontmatterHandled = true\n return true\n}\n\nfunction closeMdxFrontmatter(trimmed: string, state: MdxBlockScanState) {\n if (!state.inFrontmatter) return false\n\n if (trimmed === '---') {\n state.inFrontmatter = false\n }\n\n return true\n}\n\nfunction updateMdxFenceState(trimmed: string, state: MdxBlockScanState) {\n const activeFence =\n state.fenceMarker && state.fenceLength\n ? { length: state.fenceLength, marker: state.fenceMarker }\n : undefined\n const delimiter =\n state.inFence && activeFence\n ? (parseInlineMdxFenceCloser(trimmed, activeFence) ??\n parseMdxFenceDelimiter(trimmed))\n : (parseMdxFenceDelimiter(trimmed) ?? parseInlineMdxFenceOpener(trimmed))\n if (!delimiter) return state.inFence\n\n if (!state.inFence) {\n state.inFence = true\n state.fenceLength = delimiter.length\n state.fenceMarker = delimiter.marker\n return true\n }\n\n if (\n state.fenceMarker &&\n state.fenceLength &&\n isMdxFenceClosingDelimiter(delimiter, {\n length: state.fenceLength,\n marker: state.fenceMarker,\n })\n ) {\n state.inFence = false\n state.fenceLength = undefined\n state.fenceMarker = undefined\n }\n\n return true\n}\n\nfunction collectActiveMarkupBlock(\n blocks: MdxMarkupBlock[],\n document: SourceText,\n lineIndex: number,\n lineText: string,\n trimmed: string,\n state: MdxBlockScanState,\n) {\n if (state.activeStartLine === undefined) {\n if (state.inFence) {\n updateMdxFenceState(trimmed, state)\n return\n }\n\n if (!looksLikeMarkupBlockStart(trimmed)) {\n if (updateMdxFenceState(trimmed, state)) return\n return\n }\n\n state.activeStartLine = lineIndex\n state.activeEndLine = lineIndex\n state.activeLines = [lineText]\n } else {\n state.activeEndLine = lineIndex\n state.activeLines.push(lineText)\n }\n\n updateMdxFenceState(trimmed, state)\n if (state.inFence) return\n if (!isCompleteMarkupBlock(state.activeLines.join('\\n'))) return\n\n pushActiveBlock(\n blocks,\n document,\n state.activeStartLine,\n state.activeEndLine ?? lineIndex,\n state.activeLines,\n )\n state.activeEndLine = undefined\n state.activeStartLine = undefined\n state.activeLines = []\n}\n\nfunction getUnclosedTagNames(markup: string) {\n const stack: string[] = []\n\n for (const token of scanTagTokens(markup)) {\n if (token.kind === 'opening') {\n if (isSelfContainedTag(token.name, token.selfClosing)) continue\n\n stack.push(token.name)\n continue\n }\n\n closeMatchingTag(stack, token.name)\n }\n\n return stack\n}\n\nfunction isSelfContainedTag(tagName: string, selfClosing: boolean) {\n return selfClosing || VOID_HTML_TAG_NAMES.has(tagName.toLowerCase())\n}\n\nfunction closeMatchingTag(stack: string[], tagName: string) {\n for (let index = stack.length - 1; index >= 0; index--) {\n if (stack[index] !== tagName) continue\n stack.splice(index)\n return\n }\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction sortLongestPlaceholderFirst<T extends { placeholder: string }>(\n placeholders: T[],\n) {\n return [...placeholders].sort(\n (left, right) => right.placeholder.length - left.placeholder.length,\n )\n}\n\nfunction findMdxInlineCodeEnd(line: string, startIndex: number) {\n for (let index = startIndex; index < line.length; index++) {\n if (line[index] === '`') return index\n }\n\n return -1\n}\n\nfunction countRepeatedChar(line: string, startIndex: number, char: string) {\n let count = 0\n\n while (line[startIndex + count] === char) {\n count++\n }\n\n return count\n}\n\nfunction findRawTextElementEnd(source: string, startIndex: number) {\n if (source[startIndex] !== '<' || source[startIndex + 1] === '/') {\n return undefined\n }\n\n const tagEnd = findTagEnd(source, startIndex + 1)\n if (tagEnd === -1) return undefined\n\n const openingTag = source.slice(startIndex, tagEnd + 1)\n const tagName = /^<\\s*(script|style)\\b/i.exec(openingTag)?.[1]\n if (!tagName) return undefined\n\n const closingTagPattern = new RegExp(\n `<\\\\/\\\\s*${escapeRegExp(tagName)}\\\\s*>`,\n 'i',\n )\n const closingTagMatch = closingTagPattern.exec(source.slice(tagEnd + 1))\n if (!closingTagMatch) return undefined\n\n return tagEnd + 1 + closingTagMatch.index + closingTagMatch[0].length\n}\n","import type * as TypeScript from 'typescript-parser'\nimport ts from 'typescript-parser'\nimport { maskRegorExpressions, restoreRegorExpressions } from './expressions'\n\nimport { formatHtmlFragment, normalizeSelfClosingTagSpacing } from './html'\nimport {\n intersects,\n type SourceEdit,\n type SourceRange,\n type SourceText,\n} from './source'\n\nexport type SupportedTemplateTagName = 'html' | 'svg'\n\nexport interface SupportedTaggedTemplate {\n content: string\n contentRange: SourceRange\n expressions: TemplateExpressionPlaceholder[]\n interpolationRanges: Array<{ start: number; end: number }>\n placeholderContent: string\n tagName: SupportedTemplateTagName\n}\n\ninterface TemplateExpressionPlaceholder {\n placeholder: string\n source: string\n}\n\nconst SUPPORTED_TEMPLATE_TAG_NAMES: SupportedTemplateTagName[] = ['html', 'svg']\n\ninterface TemplateFormattingRequest {\n onlyWithinRange?: SourceRange\n}\n\nexport async function buildTemplateFormattingEdits(\n document: SourceText,\n request: TemplateFormattingRequest = {},\n) {\n const templates = getSupportedTaggedTemplates(document).filter((template) =>\n request.onlyWithinRange\n ? intersects(template.contentRange, request.onlyWithinRange)\n : true,\n )\n if (templates.length === 0) return []\n\n const edits: SourceEdit[] = []\n\n for (const template of templates) {\n const formatted = await formatTaggedTemplate(document, template)\n if (!formatted || formatted === template.content) continue\n\n edits.push({\n ...template.contentRange,\n newText: document.preserveEol(formatted),\n })\n }\n\n return edits\n}\n\nexport function getSupportedTaggedTemplates(\n document: SourceText,\n): SupportedTaggedTemplate[] {\n const sourceText = document.text\n const sourceFile = ts.createSourceFile(\n document.filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n false,\n ts.ScriptKind.TS,\n )\n const templates: SupportedTaggedTemplate[] = []\n\n visitNode(sourceFile)\n return templates\n\n function visitNode(node: TypeScript.Node) {\n if (ts.isTaggedTemplateExpression(node)) {\n const template = createSupportedTaggedTemplate(node, sourceFile)\n if (template) {\n templates.push(template)\n // The outer template owns its interpolations; never emit overlapping edits.\n return\n }\n }\n\n ts.forEachChild(node, visitNode)\n }\n}\n\nexport function isOffsetInsideSupportedTaggedTemplate(\n sourceFile: TypeScript.SourceFile,\n offset: number,\n) {\n let isInsideTemplate = false\n\n visitNode(sourceFile)\n return isInsideTemplate\n\n function visitNode(node: TypeScript.Node) {\n if (isInsideTemplate) return\n if (offset < node.getStart(sourceFile) || offset >= node.getEnd()) return\n\n if (ts.isTaggedTemplateExpression(node)) {\n const templateTagName = getSupportedTemplateTagName(\n node.tag.getText(sourceFile),\n )\n if (!templateTagName) {\n ts.forEachChild(node, visitNode)\n return\n }\n\n const template = node.template\n if (\n offset >= template.getStart(sourceFile) &&\n offset < template.getEnd()\n ) {\n isInsideTemplate = true\n return\n }\n }\n\n ts.forEachChild(node, visitNode)\n }\n}\n\nfunction createSupportedTaggedTemplate(\n node: TypeScript.TaggedTemplateExpression,\n sourceFile: TypeScript.SourceFile,\n) {\n const tagName = getSupportedTemplateTagName(node.tag.getText(sourceFile))\n if (!tagName) return undefined\n\n const template = node.template\n if (isLikelyPrematureRawBacktickClose(sourceFile.text, template)) {\n return undefined\n }\n\n const innerStart = template.getStart(sourceFile) + 1\n const innerEnd = template.getEnd() - 1\n if (innerEnd < innerStart) return undefined\n\n const contentRange = { start: innerStart, end: innerEnd }\n\n if (ts.isNoSubstitutionTemplateLiteral(template)) {\n const content = sourceFile.text.slice(innerStart, innerEnd)\n return {\n content,\n contentRange,\n expressions: [],\n interpolationRanges: [],\n placeholderContent: content,\n tagName,\n }\n }\n\n const expressions: TemplateExpressionPlaceholder[] = []\n const interpolationRanges: Array<{ start: number; end: number }> = []\n let placeholderContent = sliceTemplateHeadContent(template.head, sourceFile)\n let currentContentOffset = placeholderContent.length\n\n template.templateSpans.forEach((span, index) => {\n const placeholder = `PURESTACK_EXPR_${index}_${tagName.toUpperCase()}`\n const interpolationEnd = span.literal.getStart(sourceFile) - innerStart + 1\n expressions.push({\n placeholder,\n source: sourceFile.text.slice(\n span.expression.getStart(sourceFile),\n span.expression.getEnd(),\n ),\n })\n interpolationRanges.push({\n start: currentContentOffset,\n end: interpolationEnd,\n })\n placeholderContent += placeholder\n const literalContent = sliceTemplateSpanLiteralContent(\n span.literal,\n sourceFile,\n )\n placeholderContent += literalContent\n currentContentOffset = interpolationEnd + literalContent.length\n })\n\n return {\n content: sourceFile.text.slice(innerStart, innerEnd),\n contentRange,\n expressions,\n interpolationRanges,\n placeholderContent,\n tagName,\n }\n}\n\nfunction getSupportedTemplateTagName(tagText: string) {\n const normalizedTag = tagText.trim()\n\n for (const tagName of SUPPORTED_TEMPLATE_TAG_NAMES) {\n if (normalizedTag === tagName || normalizedTag.endsWith(`.${tagName}`)) {\n return tagName\n }\n }\n\n return undefined\n}\n\nfunction isLikelyPrematureRawBacktickClose(\n sourceText: string,\n template: TypeScript.TemplateLiteral,\n) {\n return sourceText.startsWith('``', template.getEnd())\n}\n\nfunction sliceTemplateHeadContent(\n head: TypeScript.TemplateHead,\n sourceFile: TypeScript.SourceFile,\n) {\n return sourceFile.text.slice(head.getStart(sourceFile) + 1, head.getEnd() - 2)\n}\n\nfunction sliceTemplateSpanLiteralContent(\n literal: TypeScript.TemplateMiddle | TypeScript.TemplateTail,\n sourceFile: TypeScript.SourceFile,\n) {\n const endOffset = ts.isTemplateTail(literal) ? 1 : 2\n return sourceFile.text.slice(\n literal.getStart(sourceFile) + 1,\n literal.getEnd() - endOffset,\n )\n}\n\nasync function formatTaggedTemplate(\n document: SourceText,\n template: SupportedTaggedTemplate,\n) {\n const formattingOptions = document.options\n const source = template.placeholderContent.trim()\n const { expressions: regorExpressions, placeholderContent } =\n maskRegorExpressions(source)\n\n if (!placeholderContent.includes('<')) return undefined\n\n let formatted: string\n try {\n formatted = await formatHtmlFragment(placeholderContent, formattingOptions)\n } catch (error) {\n document.report(template.contentRange, error)\n return undefined\n }\n\n const restoredTemplateExpressions = restoreTemplateExpressions(\n normalizeSelfClosingTagSpacing(formatted.trim()),\n template.expressions,\n )\n\n return restoreRegorExpressions(restoredTemplateExpressions, regorExpressions)\n}\n\nfunction restoreTemplateExpressions(\n formatted: string,\n expressions: TemplateExpressionPlaceholder[],\n) {\n let restored = formatted\n\n for (const expression of expressions) {\n restored = restored\n .split(expression.placeholder)\n .join(`\\${${expression.source}}`)\n }\n\n return restored\n}\n","import { buildMdxFormattingEdits } from './mdx'\nimport { applySourceEdits, type FormatOptions, SourceText } from './source'\nimport { buildTemplateFormattingEdits } from './templates'\n\nexport {\n maskRegorExpressions,\n type RegorExpressionPlaceholder,\n restoreRegorExpressions,\n} from './expressions'\nexport * from './fences'\nexport * from './html'\nexport * from './markup'\nexport * from './mdx'\nexport * from './source'\nexport * from './templates'\n\n/** Formats only component markup and html/svg tagged template contents. */\nexport async function formatSource(text: string, options: FormatOptions = {}) {\n const source = new SourceText(text, options)\n const language =\n options.language ??\n (/\\.[cm]?tsx?$/i.test(source.filePath) ? 'typescript' : 'mdx')\n const edits = await (language === 'typescript'\n ? buildTemplateFormattingEdits(source, options)\n : buildMdxFormattingEdits(source, options))\n const code = applySourceEdits(text, edits)\n return {\n code,\n edits,\n diagnostics: source.diagnostics,\n changed: code !== text,\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@purestack/ts-format",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.1.25",
|
|
4
|
+
"packageManager": "yarn@4.18.1",
|
|
5
|
+
"module": "./dist/ts-format.mjs",
|
|
6
|
+
"types": "./dist/ts-format.d.mts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/PureStackStudio/PureStack.git",
|
|
12
|
+
"directory": "packages/ts-format"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://purestack.studio",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/PureStackStudio/PureStack/issues"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/ts-format.d.mts",
|
|
24
|
+
"import": "./dist/ts-format.mjs"
|
|
25
|
+
},
|
|
26
|
+
"./files": {
|
|
27
|
+
"types": "./dist/files.d.mts",
|
|
28
|
+
"import": "./dist/files.mjs"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist/*.mjs",
|
|
34
|
+
"dist/*.mjs.map",
|
|
35
|
+
"dist/*.d.mts",
|
|
36
|
+
"dist/*.d.mts.map",
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE"
|
|
39
|
+
],
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"prettier": "^3.9.10",
|
|
42
|
+
"typescript-parser": "npm:typescript@6.0.3"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc",
|
|
46
|
+
"lint": "biome check ./src --formatter-enabled=false --write",
|
|
47
|
+
"test": "vitest"
|
|
48
|
+
}
|
|
6
49
|
}
|