@forinda/kickjs-view 0.0.0 → 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/format.ts"],"mappings":";;;;;;UAWiB;;EAEf;;wBAsNc,OACd,gBACA,cACA,OAAM;EACH;EAAiB,aAAa"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view v0.0.0
2
+ * @forinda/kickjs-view v0.1.0
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import{S as positionAt,_ as templateName,a as escapeHtml,c as safeStyleValue,d as parse,f as FORBIDDEN_NAMES,g as layoutResolver,h as componentTag,i as SafeHtml,l as sanitizeSrcset,m as check,n as BUILTIN_PIPES,o as escapeJsonForScript,p as parseExpression,r as builtinPipes,s as read,t as readPipeExports,u as sanitizeUrl,v as URL_ATTRS,w as AST_FORMAT_VERSION,y as isUrlAttr}from"./read-exports-D9hlBJY1.js";import{a as createViews,c as RenderError,d as safeHtml,f as withEnv,i as bundleLoader,l as render,n as KickView,o as useFileLoader,r as viewsMiddleware,s as MAX_DEPTH,t as assetTags,u as pipesFor}from"./exports-DM4MVXs6.js";useFileLoader(()=>import(`./file-loader.js`));export{AST_FORMAT_VERSION,BUILTIN_PIPES,FORBIDDEN_NAMES,KickView,MAX_DEPTH,RenderError,SafeHtml,URL_ATTRS,assetTags,builtinPipes,bundleLoader,check,componentTag,createViews,escapeHtml,escapeJsonForScript,isUrlAttr,layoutResolver,parse,parseExpression,pipesFor,positionAt,read,readPipeExports,render,safeHtml,safeStyleValue,sanitizeSrcset,sanitizeUrl,templateName,useFileLoader,viewsMiddleware,withEnv};
11
+ import{S as positionAt,_ as templateName,a as escapeHtml,c as safeStyleValue,d as parse,f as FORBIDDEN_NAMES,g as layoutResolver,h as componentTag,i as SafeHtml,l as sanitizeSrcset,m as check,n as BUILTIN_PIPES,o as escapeJsonForScript,p as parseExpression,r as builtinPipes,s as read,t as readPipeExports,u as sanitizeUrl,v as URL_ATTRS,w as AST_FORMAT_VERSION,y as isUrlAttr}from"./read-exports-CtiwXL4e.js";import{a as createViews,c as RenderError,d as safeHtml,f as withEnv,i as bundleLoader,l as render,n as KickView,o as useFileLoader,r as viewsMiddleware,s as MAX_DEPTH,t as assetTags,u as pipesFor}from"./exports-WibN1iWb.js";import{t as format}from"./format-BVAljUk8.js";useFileLoader(()=>import(`./file-loader.js`));export{AST_FORMAT_VERSION,BUILTIN_PIPES,FORBIDDEN_NAMES,KickView,MAX_DEPTH,RenderError,SafeHtml,URL_ATTRS,assetTags,builtinPipes,bundleLoader,check,componentTag,createViews,escapeHtml,escapeJsonForScript,format,isUrlAttr,layoutResolver,parse,parseExpression,pipesFor,positionAt,read,readPipeExports,render,safeHtml,safeStyleValue,sanitizeSrcset,sanitizeUrl,templateName,useFileLoader,viewsMiddleware,withEnv};
12
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * The Node entry (Node, Bun, Deno): everything, plus the file loader as the\n * default template source. Edge runtimes resolve `./edge` instead.\n */\nimport { useFileLoader } from './views'\n\nuseFileLoader(() => import('./loaders/file'))\n\nexport * from './exports'\n"],"mappings":";;;;;;;;;;0nBAMA,kBAAoB,OAAO,mBAAiB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * The Node entry (Node, Bun, Deno): everything, plus the file loader as the\n * default template source. Edge runtimes resolve `./edge` instead.\n */\nimport { useFileLoader } from './views'\n\nuseFileLoader(() => import('./loaders/file'))\n\nexport * from './exports'\nexport { format, type FormatOptions } from './format'\n"],"mappings":";;;;;;;;;;wqBAMA,kBAAoB,OAAO,mBAAiB"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view v0.0.0
2
+ * @forinda/kickjs-view v0.1.0
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -16,4 +16,4 @@ const AST_FORMAT_VERSION=1;function advance(base,text,upTo){let{line,column}=bas
16
16
  `&&b++,b}run(){try{for(;this.i<this.s.length;)this.top.type===`switch`?this.switchBody():this.step();this.flush();for(let f of this.frames)(f.type===`block`||f.type===`switch`)&&this.err(f.start,f.start+1,`@${f.type===`block`?f.keyword:`switch`} is never closed — expected }`)}catch(e){if(!(e instanceof Fatal))throw e}}step(){let s=this.s,i=this.i,c=s[i];if(c===`{`&&s.startsWith(`{{--`,i)){let end=s.indexOf(`--}}`,i+4);end<0&&this.fatal(i,i+4,`template comment is never closed — expected --}}`),this.i=end+4}else if(c===`{`&&s[i+1]===`{`)this.interp(i,`text`);else{if(c===`<`){if(s.startsWith(`<!--`,i))return this.htmlComment(i);if(s[i+1]===`/`&&/[A-Za-z]/.test(s[i+2]??``))return this.closeTag(i);if(/[A-Za-z]/.test(s[i+1]??``))return this.openTag(i);s[i+1]===`{`&&this.fatal(i,i+2,`tag names can't be interpolated`)}if(c===`@`){let m=KEYWORDS.exec(s.slice(i,i+12));if(m&&this.block(m[1],i))return}c===`}`&&this.frames.some(f=>f.type===`block`)?this.closeBlock(i):(this.addText(c,i),this.i++)}}interpSource(i){let at=i+2,j=at,quote=``;for(;j<this.s.length;){let ch=this.s[j];if(quote)ch===`\\`?j++:ch===quote&&(quote=``);else if(ch===`'`||ch===`"`)quote=ch;else if(ch===`}`&&this.s[j+1]===`}`)return{src:this.s.slice(at,j),at,end:j+2};j++}this.fatal(i,i+2,`interpolation is never closed — expected }}`)}interp(i,ctx){let{src,at,end}=this.interpSource(i),expr=this.expr(src,at);expr&&this.emit({k:`interp`,expr,ctx,span:this.span(i,end)}),this.i=end}textWithInterps(from,stop,ctx){let out=[],j=from,start=from;for(;j<stop;)if(this.s.startsWith(`{{--`,j)){j>start&&out.push({k:`text`,value:this.s.slice(start,j),span:this.span(start,j)});let end=this.s.indexOf(`--}}`,j+4);j=start=end<0||end>stop?stop:end+4}else if(this.s.startsWith(`{{`,j)){j>start&&out.push({k:`text`,value:this.s.slice(start,j),span:this.span(start,j)});let{src,at,end}=this.interpSource(j),expr=this.expr(src,at);expr&&out.push({k:`interp`,expr,ctx,span:this.span(j,end)}),j=start=end}else j++;return stop>start&&out.push({k:`text`,value:this.s.slice(start,stop),span:this.span(start,stop)}),out}htmlComment(i){let end=this.s.indexOf(`-->`,i+4);end<0&&this.fatal(i,i+4,`HTML comment is never closed — expected -->`),this.emit({k:`comment`,children:this.textWithInterps(i+4,end,`comment`),span:this.span(i,end+3)}),this.i=end+3}openTag(i){let s=this.s,m=/^<([A-Za-z][\w:.-]*)/.exec(s.slice(i,i+200)),tag=m[1],j=i+m[0].length,parent=this.frames.findLast(f=>f.type===`element`),lower=tag.toLowerCase(),foreign=!!parent?.el.foreign&&!INTEGRATION_POINTS.has(parent.el.tag.toLowerCase())||lower===`svg`||lower===`math`,attrs=[],selfClosing=!1;for(;;){for(;j<s.length&&/\s/.test(s[j]);)j++;if(j>=s.length&&this.fatal(i,i+m[0].length,`<${tag}> is never closed — expected >`),s[j]===`>`){j++;break}if(s[j]===`/`&&s[j+1]===`>`){selfClosing=!0,j+=2;break}j=this.attr(j,attrs)}this.i=j;let name=foreign?tag:lower,el={k:`element`,tag,attrs,children:[],foreign,void:!foreign&&VOID.has(lower),selfClosing,span:this.span(i,j)};if(!foreign&&lower===`slot`){let nameAttr=attrs.find(a=>a.name===`name`),slotName=nameAttr?.kind===`static`?String(nameAttr.parts?.[0]??``):void 0;nameAttr&&nameAttr.kind!==`static`&&this.err(nameAttr.span.start.offset,nameAttr.span.end.offset,`a slot name must be plain text`);let node={k:`slot-outlet`,name:slotName,fallback:[],span:el.span};this.emit(node),selfClosing||this.frames.push({type:`slot`,children:node.fallback})}else if(this.emit(el),!(el.void||selfClosing)){if(RAW_TEXT.has(lower)||!foreign&&RCDATA.has(lower)){let end=RegExp(`</${lower}(?=[\\t\\n\\f\\r />])`,`i`);end.lastIndex=0;let found=end.exec(s.slice(j)),close=found?j+found.index:-1,stop=close<0?s.length:close;if(RAW_TEXT.has(lower)){let content=s.slice(j,stop);foreign&&content.includes(`<`)?this.err(j,stop,`markup isn't allowed inside <${lower}> in SVG or MathML — move the code to a separate file`):(/<!\[CDATA\[/i.test(content)||lower===`script`&&/<!--/.test(content)&&/<script/i.test(content))&&this.err(j,stop,`this <${lower}> content (<!-- with <script, or CDATA) is read differently by browsers — move it to a separate file`)}if(el.children=this.textWithInterps(j,stop,RAW_TEXT.has(lower)?`raw-text`:`rcdata`),close<0){this.i=s.length;return}let gt=s.indexOf(`>`,close);this.i=gt<0?s.length:gt+1}else this.frames.push({type:`element`,el,children:el.children,name})}}attr(j,attrs){let s=this.s,start=j;for(s.startsWith(`{{`,j)&&this.fatal(j,j+2,`attribute names can't be interpolated`);j<s.length&&!/[\s"'>/=]/.test(s[j]);)s.startsWith(`{{`,j)&&this.fatal(j,j+2,`attribute names can't be interpolated`),j++;j===start&&this.fatal(j,j+1,`unexpected '${s[j]}' in a tag`);let raw=s.slice(start,j),k=j;for(;k<s.length&&/[ \t]/.test(s[k]);)k++;if(s[k]!==`=`)return attrs.push(this.classify(raw,void 0,start,j,!1)),j;for(k++;k<s.length&&/\s/.test(s[k]);)k++;let q=s[k];if(q===`"`||q===`'`){let close=s.indexOf(q,k+1);return close<0&&this.fatal(start,k+1,`the value of ${raw} is never closed — expected ${q}`),attrs.push(this.classify(raw,{from:k+1,to:close},start,close+1,!0)),close+1}let e=k;for(;e<s.length&&!/[\s>]/.test(s[e]);)e++;return s.slice(k,e).includes(`{{`)&&this.fatal(k,e,`quote the value of ${raw}: an interpolated attribute must be in quotes`),attrs.push(this.classify(raw,{from:k,to:e},start,e,!1)),e}classify(raw,value,start,end,quoted){let span=this.span(start,end),binding=/^\[(?:(class)\.([\w-]+)|(style)\.([\w-]+)(?:\.(\w+))?|([^\]]+))\]$/.exec(raw);if(binding){value||this.fatal(start,end,`${raw} needs a value: ${raw}="expression"`);let src=this.s.slice(value.from,value.to);src.includes(`{{`)&&this.fatal(value.from,value.to,`${raw} takes an expression, without {{ }}`);let expr=this.expr(src,value.from),[,cls,clsName,sty,styName,unit,bind]=binding;return cls?{name:clsName,kind:`class`,expr,quoted,span}:sty?{name:styName,kind:`style`,expr,unit,quoted,span}:{name:bind,kind:`bind`,expr,quoted,span}}if(!value)return{name:raw,kind:`bare`,quoted:!1,span};let parts=[];for(let n of this.textWithInterps(value.from,value.to,`text`))n.k===`text`?parts.push(n.value):n.k===`interp`&&parts.push(n.expr);return{name:raw,kind:parts.some(p=>typeof p!=`string`)?`interp`:`static`,parts:parts.length?parts:[``],quoted,span}}closeTag(i){let m=/^<\/([A-Za-z][\w:.-]*)\s*>/.exec(this.s.slice(i,i+200));m||this.fatal(i,i+2,`malformed closing tag`),this.i=i+m[0].length;let tag=m[1];for(let f=this.frames.length-1;f>0;f--){let frame=this.frames[f];if(frame.type===`block`||frame.type===`switch`||frame.type===`root`)break;if(frame.type===`slot`?tag.toLowerCase()===`slot`:frame.el.foreign?frame.name===tag:frame.name===tag.toLowerCase()){this.flush(),this.frames.length=f;return}}this.warn(i,this.i,`</${tag}> closes nothing`)}parens(j,what){this.s[j]!==`(`&&this.fatal(j,j+1,`expected ( after ${what}`);let depth=0,quote=``;for(let k=j;k<this.s.length;k++){let ch=this.s[k];if(quote)ch===`\\`?k++:ch===quote&&(quote=``);else if(ch===`'`||ch===`"`)quote=ch;else if(ch===`(`)depth++;else if(ch===`)`&&--depth===0)return{src:this.s.slice(j+1,k),at:j+1,end:k+1}}this.fatal(j,j+1,`${what} ( is never closed — expected )`)}skipWs(j){for(;j<this.s.length&&/\s/.test(this.s[j]);)j++;return j}openBrace(j,what){return j=this.skipWs(j),this.s[j]!==`{`&&this.fatal(j,j+1,`expected { after ${what}`),j+1}splitHeader(src,at){let out=[],quote=``,start=0;for(let k=0;k<src.length;k++){let ch=src[k];quote?ch===`\\`?k++:ch===quote&&(quote=``):ch===`'`||ch===`"`?quote=ch:ch===`;`&&(out.push({src:src.slice(start,k),at:at+start}),start=k+1)}return out.push({src:src.slice(start),at:at+start}),out}stringArg(src,at,what){let m=/^\s*(['"])([^'"]*)\1\s*$/.exec(src);return m||this.fatal(at,at+src.length,`${what} takes a quoted name`),m[2]}block(kw,i){let s=this.s,after=i+1+kw.length,next=this.skipWs(after),ch=s[next];switch(kw){case`if`:case`for`:case`switch`:case`slot`:case`layout`:case`assets`:if(ch!==`(`)return!1;break;case`verbatim`:if(ch!==`{`)return!1;break;case`let`:case`input`:if(!/[ \t]/.test(s[after]??``))return!1;break;case`else`:case`empty`:case`case`:case`default`:if(ch!==`{`&&ch!==`(`&&!(kw===`else`&&s.startsWith(`if`,next)))return!1;this.fatal(i,after,`@${kw} has no matching ${kw===`else`?`@if`:kw===`empty`?`@for`:`@switch`}`)}if(kw===`layout`)return this.layout(i,next);if(kw===`input`)return this.input(i,after);if(kw===`let`)return this.let(i,after);if(kw===`verbatim`)return this.verbatim(i,next);if(kw===`assets`){let p=this.parens(next,`@assets`),entry=this.stringArg(p.src,p.at,`@assets`);return this.i=this.standalone(i,p.end),this.emit({k:`assets`,entry,span:this.span(i,p.end)}),!0}let p=this.parens(next,`@${kw}`),brace=this.openBrace(p.end,`@${kw} (…)`),resume=this.standalone(i,brace);if(kw===`if`){let branch=this.ifBranch(p.src,p.at),node={k:`if`,branches:[branch],span:this.span(i,brace)};this.emit(node),this.frames.push({type:`block`,children:branch.body,next:`else`,node,keyword:`if`,start:i})}else if(kw===`for`){let node=this.forHeader(p.src,p.at,i,brace);this.emit(node),this.frames.push({type:`block`,children:node.body,next:`empty`,node,keyword:`for`,start:i})}else if(kw===`switch`){let node={k:`switch`,on:this.expr(p.src,p.at)??{kind:`literal`,value:null,span:this.span(p.at,p.at)},cases:[],span:this.span(i,brace)};this.emit(node),this.frames.push({type:`switch`,node,start:i})}else{let node={k:`slot-fill`,name:this.stringArg(p.src,p.at,`@slot`),body:[],span:this.span(i,brace)};this.emit(node),this.frames.push({type:`block`,children:node.body,node,keyword:`slot`,start:i})}return this.i=resume,!0}ifBranch(src,at){let parts=this.splitHeader(src,at),branch={cond:this.expr(parts[0].src,parts[0].at),body:[]};if(parts[1]){let m=/^\s*as\s+([A-Za-z_$][\w$]*)\s*$/.exec(parts[1].src);m?branch.alias=m[1]:this.err(parts[1].at,parts[1].at+parts[1].src.length,"expected `as name` after ;")}return parts.length>2&&this.err(parts[2].at,parts[2].at+1,`unexpected ; in @if`),branch}forHeader(src,at,start,end){let parts=this.splitHeader(src,at),head=parts[0],m=/^(\s*)(?:\[\s*([A-Za-z_$][\w$]*)\s*,\s*([A-Za-z_$][\w$]*)\s*\]|([A-Za-z_$][\w$]*))\s+of\s+/.exec(head.src);m||this.fatal(head.at,head.at+head.src.length,"@for needs `item of items`");let item=m[4]??[m[2],m[3]],ofSrc=head.src.slice(m[0].length),of=this.expr(ofSrc,head.at+m[0].length)??{kind:`literal`,value:null,span:this.span(at,at)},lets={};for(let part of parts.slice(1)){let t=part.src.trim();if(t.startsWith(`track`))this.expr(part.src.replace(/^\s*track\b/,w=>` `.repeat(w.length)),part.at);else if(t.startsWith(`let`)){let body=part.src.replace(/^\s*let\b/,``);for(let decl of body.split(`,`)){let d=/^\s*([A-Za-z_$][\w$]*)\s*=\s*(\$\w+)\s*$/.exec(decl);!d||!LOOP_VARS.has(d[2])?this.err(part.at,part.at+part.src.length,`unknown loop variable in \`${decl.trim()}\` — use ${[...LOOP_VARS].join(`, `)}`):lets[d[1]]=d[2]}}else this.err(part.at,part.at+part.src.length,`expected track or let in @for, found \`${t}\``)}return{k:`for`,item,of,lets,body:[],span:this.span(start,end)}}closeBlock(i){let f=this.frames.length-1;for(;this.frames[f].type!==`block`;)f--;let frame=this.frames[f],s=this.s,j=this.skipWs(i+1),branch,empty=!1,end=i+1;if(frame.next===`else`&&/^@else(?![\w$-])/.test(s.slice(j,j+6))){let k=this.skipWs(j+5);if(s.startsWith(`if`,k)&&/[\s(]/.test(s[k+2]??``)){let p=this.parens(this.skipWs(k+2),`@else if`);branch=this.ifBranch(p.src,p.at),k=p.end}else branch={body:[]};end=this.openBrace(k,`@else`)}else frame.next===`empty`&&/^@empty(?![\w$-])/.test(s.slice(j,j+7))&&(empty=!0,end=this.openBrace(j+6,`@empty`));let resume=this.standalone(i,end);if(this.flush(),this.frames.length=f,this.i=resume,branch){let node=frame.node;node.branches.push(branch),this.frames.push({type:`block`,children:branch.body,next:branch.cond?`else`:void 0,node,keyword:`else`,start:j})}else if(empty){let node=frame.node;node.empty=[],this.frames.push({type:`block`,children:node.empty,node,keyword:`empty`,start:j})}}switchBody(){let s=this.s,j=this.skipWs(this.i),frame=this.top;if(j>=s.length){this.i=j;return}if(s[j]===`}`){this.frames.pop(),this.i=this.standalone(j,j+1);return}let m=/^@(case|default)(?![\w$-])/.exec(s.slice(j,j+9));m||this.fatal(j,j+1,`only @case and @default go inside @switch`);let k=j+m[0].length,value;if(m[1]===`case`){let p=this.parens(this.skipWs(k),`@case`);value=this.expr(p.src,p.at),k=p.end}else frame.node.default&&this.err(j,k,`@switch has two @default blocks`);let brace=this.openBrace(k,`@${m[1]}`),body=[];m[1]===`case`?frame.node.cases.push({value:value??frame.node.on,body}):frame.node.default=body,this.i=this.standalone(j,brace),this.frames.push({type:`block`,children:body,node:frame.node,keyword:m[1],start:j})}verbatim(i,brace){let depth=0,quote=``;for(let k=brace;k<this.s.length;k++){let ch=this.s[k];if(quote)ch===`\\`?k++:ch===quote&&(quote=``);else if(ch===`'`||ch===`"`||ch==="`")quote=ch;else if(ch===`{`)depth++;else if(ch===`}`&&--depth===0){let resume=this.standalone(i,k+1);return this.emit({k:`verbatim`,text:this.s.slice(brace+1,k),span:this.span(i,k+1)}),this.i=resume,!0}}this.fatal(i,brace+1,`@verbatim is never closed — expected }`)}layout(i,at){let p=this.parens(at,`@layout`);return this.seenOutput||this.frames.length>1?this.err(i,p.end,`@layout must come before any output`):this.ast.layout===void 0?(this.ast.layout=/^\s*none\s*$/.test(p.src)?null:this.stringArg(p.src,p.at,`@layout`),this.ast.layoutSpan=this.span(i,p.end)):this.err(i,p.end,`a template has one @layout`),this.i=this.standalone(i,p.end),!0}input(i,after){let eol=this.s.indexOf(`
17
17
  `,after);eol<0&&(eol=this.s.length);let line=this.s.slice(after,eol).replace(/\r$/,``),m=/^\s*([A-Za-z_$][\w$]*)\s*(?:=\s*(.*?))?\s*$/.exec(line);m||this.fatal(i,eol,`@input needs a name: @input name or @input name = value`),this.frames.length>1&&this.err(i,eol,`@input goes at the top of a component, outside any block`);let decl={name:m[1],span:this.span(i,after+line.length)};if(m[2]!==void 0){let at=after+line.indexOf(m[2],m[0].indexOf(`=`)+1),e=this.expr(m[2],at),literal=e?.kind===`literal`?e.value:e?.kind===`unary`&&e.op===`-`&&e.arg.kind===`literal`&&typeof e.arg.value==`number`?-e.arg.value:void 0;e&&literal===void 0?this.err(at,at+m[2].length,`an @input default must be a literal: a string, number, true, false or null`):e&&(decl.default={value:literal,span:e.span})}return this.ast.inputs.some(d=>d.name===decl.name)&&this.err(i,eol,`@input ${decl.name} is declared twice`),this.ast.inputs.push(decl),this.i=this.standalone(i,after+line.length),!0}let(i,after){let quote=``;for(let k=after;k<this.s.length;k++){let ch=this.s[k];if(quote)ch===`\\`?k++:ch===quote&&(quote=``);else if(ch===`'`||ch===`"`)quote=ch;else if(ch===`;`){let src=this.s.slice(after,k),m=/^\s*([A-Za-z_$][\w$]*)\s*=/.exec(src);m||this.fatal(i,k,`@let needs a name: @let name = expression;`);let expr=this.expr(src.slice(m[0].length),after+m[0].length),resume=this.standalone(i,k+1);return expr&&this.emit({k:`let`,name:m[1],expr,span:this.span(i,k+1)}),this.i=resume,!0}}this.fatal(i,after,`@let is never ended — expected ;`)}};function parse(source,file){let p=new TemplateParser(source.charCodeAt(0)===65279?source.slice(1):source,file);return p.run(),{ast:p.ast,diagnostics:p.diagnostics}}var SafeHtml=class{html;constructor(html){this.html=html}toString(){return this.html}};function read(obj,key){if(obj==null)return;let k=typeof key==`number`||typeof key==`symbol`?key:String(key);if(typeof k==`string`&&FORBIDDEN_NAMES.has(k))return;let value=obj[k];return typeof value==`function`?void 0:value}const HTML_ESCAPES={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},escapeHtml=s=>s.replace(/[&<>"']/g,c=>HTML_ESCAPES[c]),SAFE_SCHEMES=/* @__PURE__ */ new Set([`http`,`https`,`mailto`,`tel`]);function sanitizeUrl(value){let normalised=value.replace(/[\u0000- \u007F]/g,``),m=/^([a-z][a-z0-9+.-]*):/i.exec(normalised);return m?SAFE_SCHEMES.has(m[1].toLowerCase())?value:`#`:value}function sanitizeSrcset(value){return value.split(`,`).map(candidate=>{let m=/^(\s*)(\S+)([\s\S]*)$/.exec(candidate);return m?`${m[1]}${sanitizeUrl(m[2])}${m[3]}`:candidate}).join(`,`)}const JSON_ESCAPES={"<":`\\u003c`,">":`\\u003e`,"&":`\\u0026`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},escapeJsonForScript=json=>json.replace(/[<>&\u2028\u2029]/g,c=>JSON_ESCAPES[c]);function safeStyleValue(v){return/[;{}\\"'<]|\/\*|url\s*\(|expression\s*\(/i.test(v)?void 0:v}const BUILTIN_PIPES=[`uppercase`,`lowercase`,`titlecase`,`json`,`slice`,`keys`,`entries`,`url`,`raw`,`date`,`number`,`currency`,`percent`],DATE_FORMATS={short:{dateStyle:`short`,timeStyle:`short`},medium:{dateStyle:`medium`,timeStyle:`medium`},long:{dateStyle:`long`,timeStyle:`long`},full:{dateStyle:`full`,timeStyle:`long`},shortDate:{dateStyle:`short`},mediumDate:{dateStyle:`medium`},longDate:{dateStyle:`long`},fullDate:{dateStyle:`full`},shortTime:{timeStyle:`short`},mediumTime:{timeStyle:`medium`}};function digits(info){if(info==null)return{};let m=/^(\d+)\.(\d+)-(\d+)$/.exec(String(info));if(!m)throw Error(`digits must look like '1.0-2', got '${String(info)}'`);return{minimumIntegerDigits:Number(m[1]),minimumFractionDigits:Number(m[2]),maximumFractionDigits:Number(m[3])}}const formatters=/* @__PURE__ */ new Map;function remember(key,f){return formatters.size>=256&&formatters.clear(),formatters.set(key,f),f}function cached(key,make){return formatters.get(key)??remember(key,make())}const toNumber=v=>{if(v==null||v===``)return;let n=Number(v);return Number.isNaN(n)?void 0:n},str=v=>v==null?``:String(v);function builtinPipes(env){return{uppercase:v=>str(v).toUpperCase(),lowercase:v=>str(v).toLowerCase(),titlecase:v=>str(v).replace(/\b\p{L}/gu,c=>c.toUpperCase()),json:v=>JSON.stringify(v,null,2),slice:(v,start,end)=>typeof v==`string`||Array.isArray(v)?v.slice(start,end):v,keys:v=>v instanceof Map?[...v.keys()]:v&&typeof v==`object`?Object.keys(v):[],entries:v=>v instanceof Map?[...v.entries()]:v&&typeof v==`object`?Object.entries(v):[],url:v=>encodeURIComponent(str(v)),raw:v=>v instanceof SafeHtml?v:new SafeHtml(str(v)),date:(v,format=`medium`,timeZone)=>{if(v==null||v===``)return``;let d=v instanceof Date?v:new Date(v);if(Number.isNaN(d.getTime()))return``;let preset=DATE_FORMATS[String(format)];if(!preset)throw Error(`unknown date format '${String(format)}'`);let tz=timeZone??env.timeZone;return cached(`d|${env.locale}|${String(format)}|${tz}`,()=>new Intl.DateTimeFormat(env.locale,{...preset,timeZone:tz})).format(d)},number:(v,info)=>{let n=toNumber(v);return n===void 0?``:cached(`n|${env.locale}|${String(info)}`,()=>new Intl.NumberFormat(env.locale,digits(info))).format(n)},currency:(v,code,info)=>{let n=toNumber(v);return n===void 0?``:cached(`c|${env.locale}|${String(code)}|${String(info)}`,()=>new Intl.NumberFormat(env.locale,{style:`currency`,currency:String(code??`USD`),...digits(info)})).format(n)},percent:(v,info)=>{let n=toNumber(v);return n===void 0?``:cached(`p|${env.locale}|${String(info)}`,()=>new Intl.NumberFormat(env.locale,{style:`percent`,...digits(info)})).format(n)}}}function topLevelTokens(src){let out=[],depth=0,i=0;for(;i<src.length;){let c=src[i];if(c===`/`&&src[i+1]===`/`){let nl=src.indexOf(`
18
18
  `,i);i=nl<0?src.length:nl}else if(c===`/`&&src[i+1]===`*`){let end=src.indexOf(`*/`,i+2);i=end<0?src.length:end+2}else if(c===`'`||c===`"`||c==="`"){for(i++;i<src.length&&src[i]!==c;)i+=src[i]===`\\`?2:1;i++}else if(c===`{`||c===`(`||c===`[`)depth===0&&out.push({v:c,start:i}),depth++,i++;else if(c===`}`||c===`)`||c===`]`)depth--,depth===0&&out.push({v:c,start:i}),i++;else if(depth===0&&/[A-Za-z_$*]/.test(c)){let m=/^[A-Za-z_$][\w$]*|^\*/.exec(src.slice(i));out.push({v:m[0],start:i}),i+=m[0].length}else depth===0&&(c===`,`||c===`;`||c===`=`)&&out.push({v:c,start:i}),i++}return out}function braceNames(src,open){let close=src.indexOf(`}`,open),body=src.slice(open+1,close<0?src.length:close),names=[],offset=open+1;for(let part of body.split(`,`)){let m=/^(\s*)([A-Za-z_$][\w$]*)(?:\s+as\s+([A-Za-z_$][\w$]*))?\s*$/.exec(part);m&&names.push({local:m[2],exported:m[3]??m[2],at:offset+m[1].length}),offset+=part.length+1}return{names,end:close<0?src.length:close+1}}function readPipeExports(source,file){let names=[],diagnostics=[],fail=(at,len,message)=>diagnostics.push(error(file,{start:positionAt(source,at),end:positionAt(source,at+len)},message)),add=(name,at)=>{BUILTIN_PIPES.includes(name)?fail(at,name.length,`'${name}' is a built-in pipe — choose another name`):names.push(name)},tokens=topLevelTokens(source);for(let t=0;t<tokens.length;t++){if(tokens[t].v!==`export`)continue;let at=tokens[t].start,next=tokens[t+1],after=tokens[t+2];switch(next?.v){case`const`:case`let`:case`var`:after&&/^[A-Za-z_$]/.test(after.v)?add(after.v,after.start):fail(at,6,`export one pipe per name: export const name = …`);break;case`function`:after&&/^[A-Za-z_$]/.test(after.v)&&add(after.v,after.start);break;case`async`:fail(at,6,`pipes must be synchronous — an async function returns a Promise`);break;case`{`:{let{names:list,end}=braceNames(source,next.start);if(tokens.find(x=>x.start>=end)?.v===`from`){fail(at,6,`re-exports aren't read — import the pipe and export it from this file`);break}for(let n of list)add(n.exported,n.at);break}case`type`:case`interface`:break;case`*`:fail(at,6,`export * isn't read — export each pipe by name`);break;case`default`:fail(at,6,`a default export is not a pipe — export each pipe by name`);break;default:fail(at,6,`export ${next?.v??``} is not a pipe — export const or function`)}}return{names,diagnostics}}export{warning as C,positionAt as S,templateName as _,escapeHtml as a,decodeEntities as b,safeStyleValue as c,parse as d,FORBIDDEN_NAMES as f,layoutResolver as g,componentTag as h,SafeHtml as i,sanitizeSrcset as l,check as m,BUILTIN_PIPES as n,escapeJsonForScript as o,parseExpression as p,builtinPipes as r,read as s,readPipeExports as t,sanitizeUrl as u,URL_ATTRS as v,AST_FORMAT_VERSION as w,error as x,isUrlAttr as y};
19
- //# sourceMappingURL=read-exports-D9hlBJY1.js.map
19
+ //# sourceMappingURL=read-exports-CtiwXL4e.js.map