You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					192 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					192 lines
				
				4.4 KiB
			| 
											3 years ago
										 | 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 | ||
|  |   } | ||
|  | } |