11import sax from "sax" ;
22import parseMustaches from "./stache.js" ;
33import { isHole } from "./hole.js" ;
4- import { create as createNode , Node , Attrs } from "./node.js" ;
4+ import { create as createNode , freezeNode , Node , Attrs } from "./node.js" ;
55
6- /** Parse a template into a simple object representation */
7- export const parse = ( xml : string ) : Node => {
6+ /** Parse a template into a simple JSON markup representation */
7+ export const parse = ( markup : string ) : Node => {
88 const strict = false ;
99 const parser = sax . parser ( strict , {
1010 trim : true ,
@@ -32,8 +32,12 @@ export const parse = (xml: string): Node => {
3232 stack . push ( next ) ;
3333 } ;
3434
35- parser . onclosetag = ( _tagName ) => {
36- stack . pop ( ) ;
35+ parser . onclosetag = ( tagName ) => {
36+ const node = stack . pop ( ) ;
37+ if ( ! node ) {
38+ throw new ParseError ( `Unexpected closing tag ${ tagName } ` ) ;
39+ }
40+ freezeNode ( node ) ;
3741 } ;
3842
3943 parser . ontext = ( text ) => {
@@ -42,13 +46,13 @@ export const parse = (xml: string): Node => {
4246 top . children . push ( ...parsed ) ;
4347 } ;
4448
45- parser . write ( xml ) . close ( ) ;
49+ parser . write ( markup ) . close ( ) ;
4650
4751 if ( getTop ( stack ) !== root ) {
4852 throw new ParseError ( `Unexpected root node ${ root . tag } ` ) ;
4953 }
5054
51- return root ;
55+ return freezeNode ( root ) ;
5256} ;
5357
5458export default parse ;
0 commit comments