192 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Type, YAMLSyntaxError } from './util'
 | |
| 
 | |
| export default function parseCST(str: string): ParsedCST
 | |
| 
 | |
| export interface ParsedCST extends Array<CST.Document> {
 | |
|   setOrigRanges(): boolean
 | |
| }
 | |
| 
 | |
| export namespace CST {
 | |
|   interface Range {
 | |
|     start: number
 | |
|     end: number
 | |
|     origStart?: number
 | |
|     origEnd?: number
 | |
|     isEmpty(): boolean
 | |
|   }
 | |
| 
 | |
|   interface ParseContext {
 | |
|     /** Node starts at beginning of line */
 | |
|     atLineStart: boolean
 | |
|     /** true if currently in a collection context */
 | |
|     inCollection: boolean
 | |
|     /** true if currently in a flow context */
 | |
|     inFlow: boolean
 | |
|     /** Current level of indentation */
 | |
|     indent: number
 | |
|     /** Start of the current line */
 | |
|     lineStart: number
 | |
|     /** The parent of the node */
 | |
|     parent: Node
 | |
|     /** Source of the YAML document */
 | |
|     src: string
 | |
|   }
 | |
| 
 | |
|   interface Node {
 | |
|     context: ParseContext | null
 | |
|     /** if not null, indicates a parser failure */
 | |
|     error: YAMLSyntaxError | null
 | |
|     /** span of context.src parsed into this node */
 | |
|     range: Range | null
 | |
|     valueRange: Range | null
 | |
|     /** anchors, tags and comments */
 | |
|     props: Range[]
 | |
|     /** specific node type */
 | |
|     type: Type
 | |
|     /** if non-null, overrides source value */
 | |
|     value: string | null
 | |
| 
 | |
|     readonly anchor: string | null
 | |
|     readonly comment: string | null
 | |
|     readonly hasComment: boolean
 | |
|     readonly hasProps: boolean
 | |
|     readonly jsonLike: boolean
 | |
|     readonly rangeAsLinePos: null | {
 | |
|       start: { line: number; col: number }
 | |
|       end?: { line: number; col: number }
 | |
|     }
 | |
|     readonly rawValue: string | null
 | |
|     readonly tag:
 | |
|       | null
 | |
|       | { verbatim: string }
 | |
|       | { handle: string; suffix: string }
 | |
|     readonly valueRangeContainsNewline: boolean
 | |
|   }
 | |
| 
 | |
|   interface Alias extends Node {
 | |
|     type: Type.ALIAS
 | |
|     /** contain the anchor without the * prefix */
 | |
|     readonly rawValue: string
 | |
|   }
 | |
| 
 | |
|   type Scalar = BlockValue | PlainValue | QuoteValue
 | |
| 
 | |
|   interface BlockValue extends Node {
 | |
|     type: Type.BLOCK_FOLDED | Type.BLOCK_LITERAL
 | |
|     chomping: 'CLIP' | 'KEEP' | 'STRIP'
 | |
|     blockIndent: number | null
 | |
|     header: Range
 | |
|     readonly strValue: string | null
 | |
|   }
 | |
| 
 | |
|   interface BlockFolded extends BlockValue {
 | |
|     type: Type.BLOCK_FOLDED
 | |
|   }
 | |
| 
 | |
|   interface BlockLiteral extends BlockValue {
 | |
|     type: Type.BLOCK_LITERAL
 | |
|   }
 | |
| 
 | |
|   interface PlainValue extends Node {
 | |
|     type: Type.PLAIN
 | |
|     readonly strValue: string | null
 | |
|   }
 | |
| 
 | |
|   interface QuoteValue extends Node {
 | |
|     type: Type.QUOTE_DOUBLE | Type.QUOTE_SINGLE
 | |
|     readonly strValue:
 | |
|       | null
 | |
|       | string
 | |
|       | { str: string; errors: YAMLSyntaxError[] }
 | |
|   }
 | |
| 
 | |
|   interface QuoteDouble extends QuoteValue {
 | |
|     type: Type.QUOTE_DOUBLE
 | |
|   }
 | |
| 
 | |
|   interface QuoteSingle extends QuoteValue {
 | |
|     type: Type.QUOTE_SINGLE
 | |
|   }
 | |
| 
 | |
|   interface Comment extends Node {
 | |
|     type: Type.COMMENT
 | |
|     readonly anchor: null
 | |
|     readonly comment: string
 | |
|     readonly rawValue: null
 | |
|     readonly tag: null
 | |
|   }
 | |
| 
 | |
|   interface BlankLine extends Node {
 | |
|     type: Type.BLANK_LINE
 | |
|   }
 | |
| 
 | |
|   interface MapItem extends Node {
 | |
|     type: Type.MAP_KEY | Type.MAP_VALUE
 | |
|     node: ContentNode | null
 | |
|   }
 | |
| 
 | |
|   interface MapKey extends MapItem {
 | |
|     type: Type.MAP_KEY
 | |
|   }
 | |
| 
 | |
|   interface MapValue extends MapItem {
 | |
|     type: Type.MAP_VALUE
 | |
|   }
 | |
| 
 | |
|   interface Map extends Node {
 | |
|     type: Type.MAP
 | |
|     /** implicit keys are not wrapped */
 | |
|     items: Array<BlankLine | Comment | Alias | Scalar | MapItem>
 | |
|   }
 | |
| 
 | |
|   interface SeqItem extends Node {
 | |
|     type: Type.SEQ_ITEM
 | |
|     node: ContentNode | null
 | |
|   }
 | |
| 
 | |
|   interface Seq extends Node {
 | |
|     type: Type.SEQ
 | |
|     items: Array<BlankLine | Comment | SeqItem>
 | |
|   }
 | |
| 
 | |
|   interface FlowChar {
 | |
|     char: '{' | '}' | '[' | ']' | ',' | '?' | ':'
 | |
|     offset: number
 | |
|     origOffset?: number
 | |
|   }
 | |
| 
 | |
|   interface FlowCollection extends Node {
 | |
|     type: Type.FLOW_MAP | Type.FLOW_SEQ
 | |
|     items: Array<
 | |
|       FlowChar | BlankLine | Comment | Alias | Scalar | FlowCollection
 | |
|     >
 | |
|   }
 | |
| 
 | |
|   interface FlowMap extends FlowCollection {
 | |
|     type: Type.FLOW_MAP
 | |
|   }
 | |
| 
 | |
|   interface FlowSeq extends FlowCollection {
 | |
|     type: Type.FLOW_SEQ
 | |
|   }
 | |
| 
 | |
|   type ContentNode = Alias | Scalar | Map | Seq | FlowCollection
 | |
| 
 | |
|   interface Directive extends Node {
 | |
|     type: Type.DIRECTIVE
 | |
|     name: string
 | |
|     readonly anchor: null
 | |
|     readonly parameters: string[]
 | |
|     readonly tag: null
 | |
|   }
 | |
| 
 | |
|   interface Document extends Node {
 | |
|     type: Type.DOCUMENT
 | |
|     directives: Array<BlankLine | Comment | Directive>
 | |
|     contents: Array<BlankLine | Comment | ContentNode>
 | |
|     readonly anchor: null
 | |
|     readonly comment: null
 | |
|     readonly tag: null
 | |
|   }
 | |
| }
 |