1- import { getBuffer , parse , type Range } from '../utils/content-tag.js' ;
1+ import {
2+ getBuffer ,
3+ parse ,
4+ type Range ,
5+ sliceByteRange ,
6+ } from '../utils/content-tag.js' ;
27
38export interface Template {
49 contents : string ;
@@ -12,18 +17,6 @@ export interface Template {
1217
1318const PLACEHOLDER = '~' ;
1419
15- /** Slice string using byte range */
16- function sliceByteRange ( s : string , a : number , b ?: number ) : string {
17- const buf = getBuffer ( s ) ;
18- return buf . subarray ( a , b ) . toString ( ) ;
19- }
20-
21- /** Converts byte index to js char index (utf16) */
22- function byteToCharIndex ( s : string , byteOffset : number ) : number {
23- const buf = getBuffer ( s ) ;
24- return buf . subarray ( 0 , byteOffset ) . toString ( ) . length ;
25- }
26-
2720function replaceRange (
2821 s : string ,
2922 start : number ,
@@ -53,7 +46,7 @@ export function preprocessTemplateRange(
5346 prefix = '{/*' ;
5447 suffix = '*/}' ;
5548
56- const nextToken = code . slice ( template . range . end ) . toString ( ) . match ( / \S + / ) ;
49+ const nextToken = sliceByteRange ( code , template . range . end ) . match ( / \S + / ) ;
5750
5851 if ( nextToken && ( nextToken [ 0 ] === 'as' || nextToken [ 0 ] === 'satisfies' ) ) {
5952 // Replace with parenthesized ObjectExpression
@@ -84,8 +77,8 @@ export function codeToGlimmerAst(code: string, filename: string): Template[] {
8477 contentRange : r . contentRange ,
8578 contents : r . contents ,
8679 utf16Range : {
87- start : byteToCharIndex ( code , r . range . start ) ,
88- end : byteToCharIndex ( code , r . range . end ) ,
80+ start : sliceByteRange ( code , 0 , r . range . start ) . length ,
81+ end : sliceByteRange ( code , 0 , r . range . end ) . length ,
8982 } ,
9083 } ) ) ;
9184
0 commit comments