@prostojs/rewrite 0.0.3 → 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.
- package/dist/index.cjs +3994 -0
- package/dist/{rewrite.d.ts → index.d.ts} +125 -147
- package/dist/index.mjs +3987 -0
- package/package.json +40 -43
- package/dist/rewrite.cjs.prod.js +0 -847
- package/dist/rewrite.esm-browser.prod.js +0 -1
- package/dist/rewrite.esm-bundler.js +0 -728
- package/dist/rewrite.global.prod.js +0 -1
- package/dist/src/__test__/html-parser.spec.d.ts +0 -2
- package/dist/src/__test__/html-parser.spec.d.ts.map +0 -1
- package/dist/src/__test__/mixed-parser.spec.d.ts +0 -2
- package/dist/src/__test__/mixed-parser.spec.d.ts.map +0 -1
- package/dist/src/__test__/rewriter.spec.d.ts +0 -2
- package/dist/src/__test__/rewriter.spec.d.ts.map +0 -1
- package/dist/src/__test__/strings.spec.d.ts +0 -2
- package/dist/src/__test__/strings.spec.d.ts.map +0 -1
- package/dist/src/__test__/text-parser.spec.d.ts +0 -2
- package/dist/src/__test__/text-parser.spec.d.ts.map +0 -1
- package/dist/src/constants.d.ts +0 -3
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/files.d.ts +0 -8
- package/dist/src/files.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -18
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/rw-common.d.ts +0 -13
- package/dist/src/rw-common.d.ts.map +0 -1
- package/dist/src/rw-html-parser.d.ts +0 -17
- package/dist/src/rw-html-parser.d.ts.map +0 -1
- package/dist/src/rw-text-parser.d.ts +0 -31
- package/dist/src/rw-text-parser.d.ts.map +0 -1
- package/dist/src/string-expression.d.ts +0 -4
- package/dist/src/string-expression.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -96
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/utils.d.ts +0 -3
- package/dist/src/utils.d.ts.map +0 -1
- package/index.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{BasicNode as e,renderCodeFragment as t}from"@prostojs/parser";const o=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],n=["script","style"],r="Work with files supported only in NodeJS environment.";const i=new e({label:"",icon:'"',tokens:[/(?<quote>["'`])/,({customData:e})=>e.quote||""],backSlash:"-ignore"});function s(t){return new e({label:"string",icon:"≈",tokens:[t[0],t[1]],tokenOE:"omit-omit"}).addAbsorbs(i,"join").mapContent("expression","join-clear").onPop((({parserContext:e,customData:{expression:o}})=>{try{new Function(o)}catch(n){e.panic("Invalid expression: "+n.message,o.length+t[0].length+t[1].length)}})).initCustomData((()=>({expression:"",code:({customData:e},t=0)=>" ".repeat(2*t)+`__ += ${e.expression.trim()}\n`})))}function c(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function a(e){console.log("[33m[1m[2m[rewrite] DEBUG: "+e+"[0m")}function l(e){try{return new Function("__ctx__","process","window","global","require",e)}catch(t){throw console.error(t.message),console.error(t.stack),t}}function p(e){return`__ += \`${e.replace(/`/g,"\\`").replace(/\n/g,"\\n").replace(/\$/g,"\\$")}\`\n`}function d(e,t=1){let o="",n="";function r(){o&&(n+=i+p(o),o="")}const i=" ".repeat(2*t);return e.content.forEach((e=>{if("string"==typeof e)o+=e;else{r();const o=e.getCustomData();o.openCode&&(n+=i+o.openCode),o.code&&(n+=o.code(e,t)),n+=d(e,t+(o.openCode?1:0)),o.closeCode&&(n+=i+o.closeCode)}})),r(),n}function u(e,t=!1){function o(o){const n=e.parse(o);return t&&a("Parsed tree view:\n"+n.toTree()),"let __ = ''\nlet __v = ''\nwith (__ctx__) {\n"+d(n)+"}\nreturn __"}function n(e){const t=o(e),n=l(t);return e=>{try{return n(e)}catch(o){g(o,t)}}}return{genRewriteCode:o,genRewriteFunction:n,printAsTree:function(t){return console.log(e.parse(t).toTree())},rewrite:(e,t)=>n(e)(t||{})}}function g(e,o){var n;const r=(null===(n=e.stack)||void 0===n?void 0:n.split("\n")[1])||"",i=/<anonymous>:(\d+):(\d+)\)/g.exec(r);if(i){const n=parseInt(i[1],10)-2,r=parseInt(i[2],10)-1,s=t(o.split("\n"),{row:n,error:r});console.error("[91m"+e.message+"[39m"),console.error(s)}throw e}function m(t=["{{","}}"]){const o=s(t),n=new e({}).addRecognizes(o);function r(e){return"let __ = []\nwith (__ctx__) {\n"+n.parse(e).content.map((e=>`__.push(${"string"==typeof e?`'${e.replace(/\n/g,"\\n").replace(/'/g,"\\'").replace(/\$/g,"\\$")}'`:`${e.getCustomData().expression}`})`)).join("\n ")+"}\nreturn __.length === 1 ? __[0] : __.join('')"}function i(e){const t=r(e),o=l(t);return e=>{try{return o(e)}catch(n){g(n,t)}}}return{genRewriteCode:r,genRewriteFunction:i,printAsTree:function(e){return console.log(n.parse(e).toTree())},rewrite:(e,t)=>i(e)(t||{})}}const x={label:"Document Type",tokens:["<!DOCTYPE ",">"]},k={icon:"<![CDATA[",tokens:["<![CDATA[","]]>"]},h={label:"comment",icon:"“",tokens:["\x3c!--","--\x3e"]},f=new e({label:"value",icon:"=",tokens:[/=(?<quote>["'`])/,({customData:e})=>e.quote||""],backSlash:"-ignore",tokenOE:"omit-omit"}),w=new e({label:"value",icon:"=",tokens:[/=(?<content>\w+)/,/[\s\/\>]/],tokenOE:"omit-eject"}),v={label:"inner",tokens:[">","</"],tokenOE:"-eject"},b={};[{key:"for",exprRequired:!0,compatible:["if"],opening:!0,renderOpen:e=>`for (${e||""}) {\n`},{key:"if",exprRequired:!0,compatible:["for"],opening:!0,renderOpen:e=>`if (${e||""}) {\n`},{key:"else-if",closingKey:"IF",exprRequired:!0,opening:!1,overtakes:["if","else-if"],renderOpen:e=>`} else if (${e||""}) {\n`},{key:"else",closingKey:"IF",exprRequired:!1,opening:!1,overtakes:["if","else-if"],renderOpen:()=>"} else {\n"}].forEach((e=>b[e.key]=e));const $=(t,o=!1)=>{const n=new e({icon:"Html Mode"}),r=new e(x),i=new e(k),a=new e(h),l=new e(v),p=s(t.exprDelimeters),d=y(),u=y("↳",t.blockOperation,"block"),g=y("≈",t.attrExpression,"expr"),m=[u,g,d],f=new e({icon:"T",tokens:[new RegExp(`^\\s*(?:\x3c!--)${c(t.directive)}\\s*text-mode-on\\s*--\x3e\\s*$`,"m"),new RegExp(`^\\s*(?:\x3c!--)${c(t.directive)}\\s*text-mode-off\\s*--\x3e\\s*$`,"m")],tokenOE:"omit-omit"}).onMatch((({parserContext:e})=>e.jump())).onPop((({parserContext:e})=>e.jump())),w=new e({tokens:[/<(?<tag>[\w:\-\.]+)/,({customData:e})=>e.isVoid?/\/?>\s*/:e.isText?new RegExp(`\\s*<\\/(?<endTag>${c(e.tag)})\\s*>\\s*`):/(?:\/\>|\<\/(?<endTag>[\w:\-\.]+)\s*\>\s*)/]}).onMatch((({context:e,customData:n})=>{e.icon=n.tag,n.isVoid=t.voidTags.includes(n.tag),n.isText=t.textTags.includes(n.tag),n.isVoid&&e.clearRecognizes(l),n.isText&&!o&&e.addAbsorbs(l,"join")})).onBeforeChildParse(((e,{customData:t})=>{t.isText&&e.node===l&&(e.clearRecognizes(),o&&e.addRecognizes(f),e.removeOnAppendContent(),e.endsWith={token:new RegExp(`<\\/(?<endTag>${c(t.tag)})\\s*>`),eject:!0})})).onAfterChildParse(((e,{context:t})=>{e.node===l&&t.clearRecognizes()})).onPop((({customData:{isVoid:e,tag:t,endTag:o,operations:n},parserContext:r,customData:i,context:s})=>{var c,a;if(n&&n.length){n=n.sort((e=>"for"===e.key?-1:1)),i.operation=n[0].key;for(let e=0;e<n.length;e++){const{key:o,value:i}=n[e],c=b[o];if(c||r.panicBlock(`Unknown block operation "${o}".`,t.length,t.length+1),c.exprRequired&&!i&&r.panicBlock(`Expression required for "${o}" operation.`,t.length,t.length+1),!c.exprRequired&&i&&r.panicBlock(`Unexpected expression for "${o}" operation.`,t.length,t.length+1),c.overtakes){const e=s.getPrevNode(),o=s.getPrevContext();"string"==typeof e&&e.replace(/[\s\n\r]/g,"")&&r.panicBlock(`Unexpected block operation "${c.key}".`,t.length,t.length+1),o&&c.overtakes.includes(o.getCustomData().operation)||r.panicBlock(`Unexpected block operation "${c.key}".`,t.length,t.length+1);o.getCustomData().closeCode=""}}if(1===n.length){i.openCode=b[n[0].key].renderOpen(n[0].value),i.closeCode="}\n"}else if(2===n.length){const e=b[n[0].key],o=b[n[1].key];(null===(c=e.compatible)||void 0===c?void 0:c.includes(o.key))&&(null===(a=o.compatible)||void 0===a?void 0:a.includes(e.key))||r.panicBlock(`Block operation "${e.key}" is not compatible with "${o.key}".`,t.length,t.length+1),i.openCode=e.renderOpen(n[0].value)+o.renderOpen(n[1].value),i.closeCode="}\n}\n"}else r.panicBlock(`Too many block operations "${n.map((e=>e.key)).join(", ")}".`,t.length,t.length+1)}e||"string"!=typeof o||t===o||r.panicBlock(`Open tag <${t}> and closing tag </${o}> must be equal.`,t.length||0,o.length+1)})).addRecognizes(l,...m).addHoistChildren({node:u,as:"operations",asArray:!0,deep:1,mapRule:"customData"});return o&&(n.addRecognizes(f),l.addRecognizes(f),i.addRecognizes(f)),n.addRecognizes(r,a,w,p),l.addRecognizes(a,i,w,p),a.addRecognizes(p),i.addRecognizes(p),{rootNode:n,innerNode:l,commentNode:a,cDataNode:i,docTypeNode:r,stringExpressionNode:p,attrNode:d,attrBlockOperationNode:u,attrExprNode:g,tagNode:w,textDirectiveNode:f}};function y(t="=",o,n="plain"){const r={label:"",icon:t,tokens:[o?new RegExp(`${c(o)}(?<key>[\\w:\\-\\.]+)`):/(?<key>[\w:\-\.]+)/,/[\s\n\/>]/],tokenOE:"omit-eject"},i={'"':""","'":"'"};const s=[w,f],a={plain:({customData:{key:e,value:t,quote:o}},n=0)=>" ".repeat(2*n)+p(e+function(e,t){let o="";return e&&(o+="=",o+=t?t+e.replace(new RegExp(t,"g"),i[t])+t:e),o}(t,o)),block:()=>"",expr:({customData:{key:e,value:t,quote:o}},n=0)=>{const r=o||"",s=" ".repeat(2*n);let c=s+"__v = "+(t||"''")+"\n";return c+=s+"if (typeof __v === 'boolean') {\n",c+=s+` if (__v) __ += \`${e}\`\n`,c+=s+"} else {\n",c+=s+` __ += \`${e}=${r}\${`+` (__v || '').replace(/${r}/g, '${i[r]}') }${r}\`\n`,c+=s+"}\n",c}};return new e(r).addPopsAfterNode(...s).addHoistChildren({node:f,as:"quote",deep:1,mapRule:"customData.quote"}).onPop((({parserContext:e,customData:{value:t,quote:o}})=>{if("expr"===n&&t)try{new Function(t)}catch(r){e.panic("Invalid expression: "+r.message,t.length+1)}"expr"!==n||o||e.panic("Expression must be quoted.",(null==t?void 0:t.length)||1)})).addAbsorbs(s,"join->value").initCustomData((()=>({key:"",code:a[n]})))}const R={};[{key:"FOR",exprRequired:!0,opening:!0,code:({customData:e})=>`for ${e.expression} {\n`},{key:"IF",exprRequired:!0,opening:!0,code:({customData:e})=>`if ${e.expression} {\n`},{key:"ELSEIF",closingKey:"IF",exprRequired:!0,opening:!1,overtakes:["IF","ELSEIF"],code:({customData:e})=>`} else if ${e.expression} {\n`},{key:"ELSE",closingKey:"IF",exprRequired:!1,opening:!1,overtakes:["IF","ELSEIF"],code:()=>"} else {\n"}].forEach((e=>R[e.key]=e));const E=(t,o=!1)=>{const n=new e({icon:"Text Mode"}),r=s(t.exprDelimeters),i=new e({label:"",icon:"↳",tokens:[new RegExp(`^\\s*(?:\\/\\/|#)${c(t.blockOperation)}\\s*(?<block>\\w+[^\\S\\r\\n]*\\w*)[^\\S\\r\\n]*(?<expression>\\(.*\\))?(?<rest>[^\\n]*)?$`,"m"),new RegExp(`^\\s*(?:\\/\\/|#)${c(t.blockOperation)}\\s*(?<endBlock>END[^\\S\\r\\n]*\\w*)[^\\S\\r\\n]*(?<endExpression>\\(.*\\))?(?<endRest>[^\\n]*)?$`,"m")],tokenOE:"omit-omit"}).onMatchStartToken((({customData:e,parserContext:t,matched:o})=>{const{block:n,expression:r,rest:i}=o.groups,s=R[n.replace(/[\s\n]/g,"")];return s||t.panic(`Unknown block operation "${n.trim()}".`,-o[0].indexOf(n)),s.exprRequired&&!r&&t.panic(`Expression required for "${n.trim()}" operation.`,-o[0].length),!s.exprRequired&&r&&t.panic(`Unexpected expression for "${n.trim()}" operation.`,-o[0].indexOf(r)),i&&t.panic(`Unexpected text "${i}" in "${n.trim()}" operation.`,-o[0].length+i.length),!!s.opening||(s.overtakes&&s.overtakes.includes(e.block)?(t.pop(),!0):void t.panic(e.block?`Unexpected block operation "${n.trim()}" after "${e.block}" block.`:`Unexpected block operation "${n.trim()}".`))})).onMatch((({customData:e,context:t,parserContext:o})=>{e.block=e.block.replace(/[\s\n]/g,""),e.descr=R[e.block],e.openCode=e.descr.code(t),o.jump()})).onPop((({parserContext:e})=>e.jump())).onMatchEndToken((({customData:e,matched:t,parserContext:o})=>{const{endBlock:n}=t.groups;return"END"+(e.descr.closingKey||e.descr.key)!==n.replace(/[\s\n]/g,"")&&o.panic("Wrong closing block instruction "+n,t[0].length),e.closeCode="}\n",!0})).popsAtEOFSource(!0),a=new e({icon:":",tokens:[new RegExp(`^\\s*(?:\\/\\/|#)${c(t.revealLine)}[^\\S\\r\\n]*`,"m"),/$/m],tokenOE:"omit-"}).addRecognizes(r).popsAtEOFSource(!0),l=new e({icon:":",tokens:[new RegExp(`^\\s*(?:\\/\\/|#)${c(t.directive)}\\s*ignore-next-line\\s*$`,"m"),/^[^\n]*$/m],tokenOE:"omit-"}).popsAtEOFSource(!0),p=new e({icon:"H",tokens:[new RegExp(`^\\s*(?:\\/\\/|#)${c(t.directive)}\\s*html-mode-on\\s*$`,"m"),new RegExp(`^\\s*(?:\\/\\/|#)${c(t.directive)}\\s*html-mode-off\\s*$`,"m")],tokenOE:"omit-omit"}).onMatch((({parserContext:e})=>e.jump())).onPop((({parserContext:e})=>e.jump()));return i.addRecognizes(l,i,a,r),n.addRecognizes(l,i,a,r),o&&(n.addRecognizes(p),i.addRecognizes(p)),{stringExpressionNode:r,revealNode:a,ignoreDirectiveNode:l,blockOperationNode:i,rootNode:n,htmlDirectiveNode:p}},D=["{{","}}"];class _{constructor(e){var t,r;this.options={defaultMode:(null==e?void 0:e.defaultMode)||"auto",debug:(null==e?void 0:e.debug)||!1,htmlPattern:[],textPattern:[],html:{exprDelimeters:D,attrExpression:":",blockOperation:"v-",directive:"!@",voidTags:(null===(t=null==e?void 0:e.html)||void 0===t?void 0:t.voidTags)||o,textTags:(null===(r=null==e?void 0:e.html)||void 0===r?void 0:r.textTags)||n,...null==e?void 0:e.html},text:{exprDelimeters:D,blockOperation:"=",revealLine:":",directive:"!@",...null==e?void 0:e.text}}}get mixedRewriter(){const e=E(this.options.text,!0),t=$(this.options.html,!0);return e.htmlDirectiveNode.addRecognizes(...t.rootNode.recognizes),t.textDirectiveNode.addRecognizes(...e.rootNode.recognizes),{text:u(e.rootNode,this.options.debug),html:u(t.rootNode,this.options.debug)}}get textRewriter(){return((e,t=!1)=>u(E(e).rootNode,t))(this.options.text,this.options.debug)}get htmlRewriter(){return((e,t=!1)=>u($(e).rootNode,t))(this.options.html,this.options.debug)}async rewriteFile(e,t){const o=await async function(e){throw new Error(r)}(),n=this.determineMode(e.mode||this.options.defaultMode,e.input,o);let i=o;const s=this.mixedRewriter;return n?(this.debug("Parsing file in "+n+" mode. [4m[22m"+e.input),i=s[n].rewrite(o,t)):this.debug("File isn't recognized as text nor as html. [4m[22m"+e.input),e.output&&(n?(await async function(e,t){throw new Error(r)}(),this.debug("File has been rewritten in "+n+" mode. [4m[22m"+e.output)):(await async function(e,t){throw new Error(r)}(),this.debug("File rewriting was skipped. File copied. [4m[22m"+e.output))),i}async rewriteDir(e,t){}determineMode(e,t,o){if("text"===e)return"text";if("html"===e)return"html";if("auto"===e){const e=!!this.options.textPattern.find((e=>e.match(t))),n=!!this.options.htmlPattern.find((e=>e.match(t)));if(e&&n)return/^<!DOCTYPE\s/.test(o)||/^<\?xml\s/.test(o)?"html":"text";if(e)return"text";if(n)return"html"}}debug(e){this.options.debug&&a(e)}}export{_ as ProstoRewrite,l as genSafeFunc,u as getRewriter,m as getStringExpressionRewriter,p as pushString,d as renderCode};
|