difit 3.1.8 → 3.1.10
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/README.ja.md +31 -14
- package/README.ko.md +31 -14
- package/README.md +31 -14
- package/README.zh.md +31 -14
- package/dist/cli/index.js +55 -40
- package/dist/cli/index.test.js +114 -56
- package/dist/cli/utils.d.ts +14 -4
- package/dist/cli/utils.js +40 -98
- package/dist/cli/utils.test.js +99 -1
- package/dist/client/assets/{index-C3dUtNTw.js → index-CH5h4Jfu.js} +40 -40
- package/dist/client/assets/{prism-csharp-CBHytnk2.js → prism-csharp-omuTcU4j.js} +1 -1
- package/dist/client/assets/{prism-hcl-Dg0qCBz9.js → prism-hcl-BVGrHlPv.js} +1 -1
- package/dist/client/assets/{prism-java-qbAyqoLL.js → prism-java-BjHLe7qM.js} +1 -1
- package/dist/client/assets/{prism-perl-C5wGhuJd.js → prism-perl-Cl4F-f2r.js} +1 -1
- package/dist/client/assets/{prism-php-BAMztFi0.js → prism-php-BbsdsICU.js} +1 -1
- package/dist/client/assets/{prism-ruby-BVXH3cUk.js → prism-ruby-CSLiFfIy.js} +1 -1
- package/dist/client/assets/{prism-solidity-DLMGfXyj.js → prism-solidity-C3yStBME.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/git-diff.js +38 -22
- package/dist/server/server.d.ts +1 -0
- package/dist/server/server.js +16 -10
- package/dist/server/server.test.js +76 -0
- package/dist/tui/App.js +7 -10
- package/dist/tui/components/SideBySideDiffViewer.js +8 -8
- package/dist/tui/components/StatusBar.js +1 -5
- package/dist/utils/commentFormatting.js +1 -3
- package/package.json +9 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as U}from"./index-
|
|
1
|
+
import{g as U}from"./index-CH5h4Jfu.js";function W(r,t){for(var e=0;e<t.length;e++){const a=t[e];if(typeof a!="string"&&!Array.isArray(a)){for(const s in a)if(s!=="default"&&!(s in r)){const u=Object.getOwnPropertyDescriptor(a,s);u&&Object.defineProperty(r,s,u.get?u:{enumerable:!0,get:()=>a[s]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var I={},O;function Z(){return O||(O=1,(function(r){function t(n,l){return n.replace(/<<(\d+)>>/g,function(f,M){return"(?:"+l[+M]+")"})}function e(n,l,f){return RegExp(t(n,l),"")}function a(n,l){for(var f=0;f<l;f++)n=n.replace(/<<self>>/g,function(){return"(?:"+n+")"});return n.replace(/<<self>>/g,"[^\\s\\S]")}var s={type:"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",typeDeclaration:"class enum interface record struct",contextual:"add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",other:"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"};function u(n){return"\\b(?:"+n.trim().replace(/ /g,"|")+")\\b"}var v=u(s.typeDeclaration),d=RegExp(u(s.type+" "+s.typeDeclaration+" "+s.contextual+" "+s.other)),T=u(s.typeDeclaration+" "+s.contextual+" "+s.other),z=u(s.type+" "+s.typeDeclaration+" "+s.other),g=a(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source,2),h=a(/\((?:[^()]|<<self>>)*\)/.source,2),i=/@?\b[A-Za-z_]\w*\b/.source,b=t(/<<0>>(?:\s*<<1>>)?/.source,[i,g]),c=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[T,b]),y=/\[\s*(?:,\s*)*\]/.source,A=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[c,y]),K=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,h,y]),q=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[K]),p=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[q,c,y]),o={keyword:d,punctuation:/[<>()?,.:[\]]/},k=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,w=/"(?:\\.|[^\\"\r\n])*"/.source,F=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;r.languages.csharp=r.languages.extend("clike",{string:[{pattern:e(/(^|[^$\\])<<0>>/.source,[F]),lookbehind:!0,greedy:!0},{pattern:e(/(^|[^@$\\])<<0>>/.source,[w]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:e(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[c]),lookbehind:!0,inside:o},{pattern:e(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[i,p]),lookbehind:!0,inside:o},{pattern:e(/(\busing\s+)<<0>>(?=\s*=)/.source,[i]),lookbehind:!0},{pattern:e(/(\b<<0>>\s+)<<1>>/.source,[v,b]),lookbehind:!0,inside:o},{pattern:e(/(\bcatch\s*\(\s*)<<0>>/.source,[c]),lookbehind:!0,inside:o},{pattern:e(/(\bwhere\s+)<<0>>/.source,[i]),lookbehind:!0},{pattern:e(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[A]),lookbehind:!0,inside:o},{pattern:e(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[p,z,i]),inside:o}],keyword:d,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),r.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),r.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:e(/([(,]\s*)<<0>>(?=\s*:)/.source,[i]),lookbehind:!0,alias:"punctuation"}}),r.languages.insertBefore("csharp","class-name",{namespace:{pattern:e(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[i]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:e(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[h]),lookbehind:!0,alias:"class-name",inside:o},"return-type":{pattern:e(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[p,c]),inside:o,alias:"class-name"},"constructor-invocation":{pattern:e(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[p]),lookbehind:!0,inside:o,alias:"class-name"},"generic-method":{pattern:e(/<<0>>\s*<<1>>(?=\s*\()/.source,[i,g]),inside:{function:e(/^<<0>>/.source,[i]),generic:{pattern:RegExp(g),alias:"class-name",inside:o}}},"type-list":{pattern:e(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[v,b,i,p,d.source,h,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:e(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[b,h]),lookbehind:!0,greedy:!0,inside:r.languages.csharp},keyword:d,"class-name":{pattern:RegExp(p),greedy:!0,inside:o},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var x=w+"|"+k,E=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[x]),S=a(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[E]),2),_=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,N=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[c,S]);r.languages.insertBefore("csharp","class-name",{attribute:{pattern:e(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[_,N]),lookbehind:!0,greedy:!0,inside:{target:{pattern:e(/^<<0>>(?=\s*:)/.source,[_]),alias:"keyword"},"attribute-arguments":{pattern:e(/\(<<0>>*\)/.source,[S]),inside:r.languages.csharp},"class-name":{pattern:RegExp(c),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var m=/:[^}\r\n]+/.source,C=a(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[E]),2),$=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[C,m]),R=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source,[x]),2),D=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[R,m]);function j(n,l){return{interpolation:{pattern:e(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[n]),lookbehind:!0,inside:{"format-string":{pattern:e(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[l,m]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:r.languages.csharp}}},string:/[\s\S]+/}}r.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:e(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[$]),lookbehind:!0,greedy:!0,inside:j($,C)},{pattern:e(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[D]),lookbehind:!0,greedy:!0,inside:j(D,R)}],char:{pattern:RegExp(k),greedy:!0}}),r.languages.dotnet=r.languages.cs=r.languages.csharp})(Prism)),I}var B=Z();const G=U(B),J=W({__proto__:null,default:G},[B]);export{J as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as u}from"./index-
|
|
1
|
+
import{g as u}from"./index-CH5h4Jfu.js";function d(t,o){for(var a=0;a<o.length;a++){const e=o[a];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const i=Object.getOwnPropertyDescriptor(e,r);i&&Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var s={},n;function p(){return n||(n=1,Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}),s}var l=p();const b=u(l),f=d({__proto__:null,default:b},[l]);export{f as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as u}from"./index-
|
|
1
|
+
import{g as u}from"./index-CH5h4Jfu.js";function p(t,a){for(var r=0;r<a.length;r++){const e=a[r];if(typeof e!="string"&&!Array.isArray(e)){for(const s in e)if(s!=="default"&&!(s in t)){const n=Object.getOwnPropertyDescriptor(e,s);n&&Object.defineProperty(t,s,n.get?n:{enumerable:!0,get:()=>e[s]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var o={},i;function d(){return i||(i=1,(function(t){var a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,r=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,e={pattern:RegExp(/(^|[^\w.])/.source+r+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};t.languages.java=t.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[e,{pattern:RegExp(/(^|[^\w.])/.source+r+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:e.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+r+/[A-Z]\w*\b/.source),lookbehind:!0,inside:e.inside}],keyword:a,function:[t.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),t.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),t.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":e,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+r+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:e.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+r+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:e.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,function(){return a.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(Prism)),o}var c=d();const l=u(c),w=p({__proto__:null,default:l},[c]);export{w as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as l}from"./index-
|
|
1
|
+
import{g as l}from"./index-CH5h4Jfu.js";function d(r,e){for(var o=0;o<e.length;o++){const t=e[o];if(typeof t!="string"&&!Array.isArray(t)){for(const s in t)if(s!=="default"&&!(s in r)){const n=Object.getOwnPropertyDescriptor(t,s);n&&Object.defineProperty(r,s,n.get?n:{enumerable:!0,get:()=>t[s]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var a={},u;function c(){return u||(u=1,(function(r){var e=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;r.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,e].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,e].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,e+/\s*/.source+e].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}})(Prism)),a}var i=c();const p=l(i),b=d({__proto__:null,default:p},[i]);export{b as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as c}from"./index-
|
|
1
|
+
import{g as c}from"./index-CH5h4Jfu.js";function f(e,r){for(var n=0;n<r.length;n++){const t=r[n];if(typeof t!="string"&&!Array.isArray(t)){for(const a in t)if(a!=="default"&&!(a in e)){const i=Object.getOwnPropertyDescriptor(t,a);i&&Object.defineProperty(e,a,i.get?i:{enumerable:!0,get:()=>t[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var u={},d;function g(){return d||(d=1,(function(e){var r=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],t=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,a=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:r,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:t,operator:a,punctuation:i};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:r,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:t,operator:a,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(s){if(/<\?/.test(s.code)){var p=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;e.languages["markup-templating"].buildPlaceholders(s,"php",p)}}),e.hooks.add("after-tokenize",function(s){e.languages["markup-templating"].tokenizePlaceholders(s,"php")})})(Prism)),u}var b=g();const y=c(b),m=f({__proto__:null,default:y},[b]);export{m as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as l}from"./index-
|
|
1
|
+
import{g as l}from"./index-CH5h4Jfu.js";function d(e,r){for(var n=0;n<r.length;n++){const t=r[n];if(typeof t!="string"&&!Array.isArray(t)){for(const i in t)if(i!=="default"&&!(i in e)){const s=Object.getOwnPropertyDescriptor(t,i);s&&Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var a={},o;function g(){return o||(o=1,(function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var r={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",t=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:r,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+t),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+t+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:r,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:r,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby})(Prism)),a}var u=g();const p=l(u),b=d({__proto__:null,default:p},[u]);export{b as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as u}from"./index-
|
|
1
|
+
import{g as u}from"./index-CH5h4Jfu.js";function d(t,n){for(var i=0;i<n.length;i++){const e=n[i];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const s=Object.getOwnPropertyDescriptor(e,r);s&&Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var o={},a;function c(){return a||(a=1,Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity),o}var l=c();const m=u(l),y=d({__proto__:null,default:m},[l]);export{y as p};
|
package/dist/client/index.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<link rel="icon" href="/favicon-white.svg" media="(prefers-color-scheme: dark)" />
|
|
8
8
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
9
9
|
<title>difit - Git Diff Viewer</title>
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-CH5h4Jfu.js"></script>
|
|
11
11
|
<link rel="stylesheet" crossorigin href="/assets/index-D4vctQX_.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
package/dist/server/git-diff.js
CHANGED
|
@@ -125,18 +125,6 @@ export class GitDiffParser {
|
|
|
125
125
|
return undefined;
|
|
126
126
|
}
|
|
127
127
|
const bytes = [];
|
|
128
|
-
const escapeMap = {
|
|
129
|
-
t: 0x09,
|
|
130
|
-
n: 0x0a,
|
|
131
|
-
r: 0x0d,
|
|
132
|
-
b: 0x08,
|
|
133
|
-
f: 0x0c,
|
|
134
|
-
v: 0x0b,
|
|
135
|
-
a: 0x07,
|
|
136
|
-
'\\': 0x5c,
|
|
137
|
-
'"': 0x22,
|
|
138
|
-
' ': 0x20,
|
|
139
|
-
};
|
|
140
128
|
for (let i = 0; i < withoutPrefix.length; i++) {
|
|
141
129
|
const char = withoutPrefix[i];
|
|
142
130
|
if (char === '\\' && i + 1 < withoutPrefix.length) {
|
|
@@ -156,12 +144,40 @@ export class GitDiffParser {
|
|
|
156
144
|
i += read; // Skip consumed digits
|
|
157
145
|
continue;
|
|
158
146
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
147
|
+
switch (next) {
|
|
148
|
+
case 't':
|
|
149
|
+
bytes.push(0x09);
|
|
150
|
+
break;
|
|
151
|
+
case 'n':
|
|
152
|
+
bytes.push(0x0a);
|
|
153
|
+
break;
|
|
154
|
+
case 'r':
|
|
155
|
+
bytes.push(0x0d);
|
|
156
|
+
break;
|
|
157
|
+
case 'b':
|
|
158
|
+
bytes.push(0x08);
|
|
159
|
+
break;
|
|
160
|
+
case 'f':
|
|
161
|
+
bytes.push(0x0c);
|
|
162
|
+
break;
|
|
163
|
+
case 'v':
|
|
164
|
+
bytes.push(0x0b);
|
|
165
|
+
break;
|
|
166
|
+
case 'a':
|
|
167
|
+
bytes.push(0x07);
|
|
168
|
+
break;
|
|
169
|
+
case '\\':
|
|
170
|
+
bytes.push(0x5c);
|
|
171
|
+
break;
|
|
172
|
+
case '"':
|
|
173
|
+
bytes.push(0x22);
|
|
174
|
+
break;
|
|
175
|
+
case ' ':
|
|
176
|
+
bytes.push(0x20);
|
|
177
|
+
break;
|
|
178
|
+
default:
|
|
179
|
+
bytes.push(next.charCodeAt(0));
|
|
180
|
+
break;
|
|
165
181
|
}
|
|
166
182
|
i++; // Skip the escaped character
|
|
167
183
|
continue;
|
|
@@ -337,9 +353,7 @@ export class GitDiffParser {
|
|
|
337
353
|
}
|
|
338
354
|
else if (currentChunk &&
|
|
339
355
|
(line.startsWith('+') || line.startsWith('-') || line.startsWith(' '))) {
|
|
340
|
-
const type = line.startsWith('+') ? 'add'
|
|
341
|
-
: line.startsWith('-') ? 'delete'
|
|
342
|
-
: 'normal';
|
|
356
|
+
const type = line.startsWith('+') ? 'add' : line.startsWith('-') ? 'delete' : 'normal';
|
|
343
357
|
const diffLine = {
|
|
344
358
|
type,
|
|
345
359
|
content: line.slice(1),
|
|
@@ -390,7 +404,9 @@ export class GitDiffParser {
|
|
|
390
404
|
if (ref === 'working' || ref === '.') {
|
|
391
405
|
const fs = await import('fs');
|
|
392
406
|
const path = await import('path');
|
|
393
|
-
const absolutePath = path.isAbsolute(filepath)
|
|
407
|
+
const absolutePath = path.isAbsolute(filepath)
|
|
408
|
+
? filepath
|
|
409
|
+
: path.resolve(this.repoPath, filepath);
|
|
394
410
|
return fs.readFileSync(absolutePath);
|
|
395
411
|
}
|
|
396
412
|
// For git refs, we need to use child_process to execute git cat-file
|
package/dist/server/server.d.ts
CHANGED
package/dist/server/server.js
CHANGED
|
@@ -213,8 +213,8 @@ export async function startServer(options) {
|
|
|
213
213
|
let finalComments = [];
|
|
214
214
|
// Parse comments from request body (handles both JSON and text/plain)
|
|
215
215
|
function parseCommentsPayload(body) {
|
|
216
|
-
const payload = typeof body === 'string'
|
|
217
|
-
JSON.parse(body)
|
|
216
|
+
const payload = typeof body === 'string'
|
|
217
|
+
? JSON.parse(body)
|
|
218
218
|
: body;
|
|
219
219
|
return payload.comments || [];
|
|
220
220
|
}
|
|
@@ -340,14 +340,20 @@ export async function startServer(options) {
|
|
|
340
340
|
// When client disconnects (tab closed, navigation, etc.)
|
|
341
341
|
req.on('close', () => {
|
|
342
342
|
clearInterval(heartbeatInterval);
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
console.log('
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
343
|
+
if (options.keepAlive) {
|
|
344
|
+
console.log('Client disconnected, but server is staying alive (--keep-alive)');
|
|
345
|
+
console.log('Press Ctrl+C to stop the server');
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
// Add a small delay to ensure any pending sendBeacon requests are processed
|
|
349
|
+
setTimeout(async () => {
|
|
350
|
+
console.log('Client disconnected, shutting down server...');
|
|
351
|
+
// Stop file watcher
|
|
352
|
+
await fileWatcher.stop();
|
|
353
|
+
outputFinalComments();
|
|
354
|
+
process.exit(0);
|
|
355
|
+
}, 100);
|
|
356
|
+
}
|
|
351
357
|
});
|
|
352
358
|
});
|
|
353
359
|
// Always runs in production mode when distributed as a CLI tool
|
|
@@ -543,6 +543,82 @@ describe('Server Integration Tests', () => {
|
|
|
543
543
|
}
|
|
544
544
|
});
|
|
545
545
|
});
|
|
546
|
+
describe('Keep-alive option', () => {
|
|
547
|
+
it('accepts keepAlive option without error', async () => {
|
|
548
|
+
const { port, server } = await startServer({
|
|
549
|
+
targetCommitish: 'HEAD',
|
|
550
|
+
baseCommitish: 'HEAD^',
|
|
551
|
+
keepAlive: true,
|
|
552
|
+
});
|
|
553
|
+
servers.push(server);
|
|
554
|
+
expect(port).toBeGreaterThanOrEqual(4966);
|
|
555
|
+
});
|
|
556
|
+
it('starts normally without keepAlive option', async () => {
|
|
557
|
+
const { port, server } = await startServer({
|
|
558
|
+
targetCommitish: 'HEAD',
|
|
559
|
+
baseCommitish: 'HEAD^',
|
|
560
|
+
});
|
|
561
|
+
servers.push(server);
|
|
562
|
+
expect(port).toBeGreaterThanOrEqual(4966);
|
|
563
|
+
});
|
|
564
|
+
it('does not call process.exit on client disconnect when keepAlive is true', async () => {
|
|
565
|
+
const { port, server } = await startServer({
|
|
566
|
+
targetCommitish: 'HEAD',
|
|
567
|
+
baseCommitish: 'HEAD^',
|
|
568
|
+
keepAlive: true,
|
|
569
|
+
preferredPort: 9070,
|
|
570
|
+
});
|
|
571
|
+
servers.push(server);
|
|
572
|
+
// Connect to heartbeat SSE endpoint and then abort
|
|
573
|
+
const controller = new AbortController();
|
|
574
|
+
const responsePromise = fetch(`http://localhost:${port}/api/heartbeat`, {
|
|
575
|
+
signal: controller.signal,
|
|
576
|
+
});
|
|
577
|
+
// Wait for the connection to be established
|
|
578
|
+
const response = await responsePromise.catch(() => null);
|
|
579
|
+
if (response) {
|
|
580
|
+
// Start reading the stream to ensure connection is established
|
|
581
|
+
const reader = response.body?.getReader();
|
|
582
|
+
if (reader) {
|
|
583
|
+
await reader.read(); // Read the initial "connected" message
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
// Disconnect by aborting
|
|
587
|
+
controller.abort();
|
|
588
|
+
// Wait for the server's close handler + setTimeout(100ms) to run
|
|
589
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
590
|
+
// With keepAlive, process.exit should NOT have been called
|
|
591
|
+
expect(process.exit).not.toHaveBeenCalled();
|
|
592
|
+
});
|
|
593
|
+
it('calls process.exit on client disconnect when keepAlive is false', async () => {
|
|
594
|
+
const { port, server } = await startServer({
|
|
595
|
+
targetCommitish: 'HEAD',
|
|
596
|
+
baseCommitish: 'HEAD^',
|
|
597
|
+
keepAlive: false,
|
|
598
|
+
preferredPort: 9080,
|
|
599
|
+
});
|
|
600
|
+
servers.push(server);
|
|
601
|
+
// Connect to heartbeat SSE endpoint and then abort
|
|
602
|
+
const controller = new AbortController();
|
|
603
|
+
const responsePromise = fetch(`http://localhost:${port}/api/heartbeat`, {
|
|
604
|
+
signal: controller.signal,
|
|
605
|
+
});
|
|
606
|
+
// Wait for the connection to be established
|
|
607
|
+
const response = await responsePromise.catch(() => null);
|
|
608
|
+
if (response) {
|
|
609
|
+
const reader = response.body?.getReader();
|
|
610
|
+
if (reader) {
|
|
611
|
+
await reader.read(); // Read the initial "connected" message
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// Disconnect by aborting
|
|
615
|
+
controller.abort();
|
|
616
|
+
// Wait for the server's close handler + setTimeout(100ms) to run
|
|
617
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
618
|
+
// Without keepAlive, process.exit SHOULD have been called
|
|
619
|
+
expect(process.exit).toHaveBeenCalledWith(0);
|
|
620
|
+
});
|
|
621
|
+
});
|
|
546
622
|
describe('Clear Comments functionality', () => {
|
|
547
623
|
it('includes clearComments flag in diff response when provided', async () => {
|
|
548
624
|
const { port, server } = await startServer({
|
package/dist/tui/App.js
CHANGED
|
@@ -27,8 +27,9 @@ const App = ({ targetCommitish, baseCommitish, mode, repoPath }) => {
|
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
useEffect(() => {
|
|
30
|
+
// oxlint-disable-next-line react-hooks-js/set-state-in-effect -- intentional: trigger initial diff load when revisions change
|
|
30
31
|
void loadDiff();
|
|
31
|
-
//
|
|
32
|
+
// oxlint-disable-next-line react/exhaustive-deps
|
|
32
33
|
}, [targetCommitish, baseCommitish]);
|
|
33
34
|
useInput((input, key) => {
|
|
34
35
|
if (input === 'q' || (key.ctrl && input === 'c')) {
|
|
@@ -80,16 +81,12 @@ const App = ({ targetCommitish, baseCommitish, mode, repoPath }) => {
|
|
|
80
81
|
}
|
|
81
82
|
return (React.createElement(Box, { flexDirection: "column", height: process.stdout.rows },
|
|
82
83
|
React.createElement(StatusBar, { commitish: targetCommitish, totalFiles: files.length, currentMode: viewMode }),
|
|
83
|
-
React.createElement(Box, { flexGrow: 1, flexDirection: "column" }, viewMode === 'list' ?
|
|
84
|
-
React.createElement(FileList, { files: files, selectedIndex: selectedFileIndex })
|
|
85
|
-
: viewMode === 'split' ?
|
|
86
|
-
React.createElement(SideBySideDiffViewer, { files: files, initialFileIndex: selectedFileIndex, onBack: () => setViewMode('list') })
|
|
87
|
-
: React.createElement(DiffViewer, { files: files, initialFileIndex: selectedFileIndex })),
|
|
84
|
+
React.createElement(Box, { flexGrow: 1, flexDirection: "column" }, viewMode === 'list' ? (React.createElement(FileList, { files: files, selectedIndex: selectedFileIndex })) : viewMode === 'split' ? (React.createElement(SideBySideDiffViewer, { files: files, initialFileIndex: selectedFileIndex, onBack: () => setViewMode('list') })) : (React.createElement(DiffViewer, { files: files, initialFileIndex: selectedFileIndex }))),
|
|
88
85
|
React.createElement(Box, { borderStyle: "single", paddingX: 1 },
|
|
89
|
-
React.createElement(Text, { dimColor: true }, viewMode === 'list'
|
|
90
|
-
'↑/↓ or j/k: navigate | Enter/Space: split | d: unified diff | r: reload | q: quit'
|
|
91
|
-
: viewMode === 'split'
|
|
92
|
-
'Tab: next file | Shift+Tab: prev | ↑/↓ or j/k: scroll | ESC/b: list | r: reload | q: quit'
|
|
86
|
+
React.createElement(Text, { dimColor: true }, viewMode === 'list'
|
|
87
|
+
? '↑/↓ or j/k: navigate | Enter/Space: split | d: unified diff | r: reload | q: quit'
|
|
88
|
+
: viewMode === 'split'
|
|
89
|
+
? 'Tab: next file | Shift+Tab: prev | ↑/↓ or j/k: scroll | ESC/b: list | r: reload | q: quit'
|
|
93
90
|
: 'Tab: next | Shift+Tab: prev | ↑/↓ or j/k: scroll | ESC/b: list | r: reload | q: quit'))));
|
|
94
91
|
};
|
|
95
92
|
export default App;
|
|
@@ -209,20 +209,20 @@ const SideBySideDiffViewer = ({ files, initialFileIndex, onBack, }) => {
|
|
|
209
209
|
React.createElement(Text, { dimColor: true }, line.oldNum ? String(line.oldNum).padStart(4) : ' '),
|
|
210
210
|
React.createElement(Text, { dimColor: true }, " \u2502 "),
|
|
211
211
|
React.createElement(Text, { color: line.type === 'remove' || line.type === 'modified' ? 'red' : undefined, dimColor: line.type === 'header' }, line.type === 'remove' || line.type === 'modified' ? '- ' : ' '),
|
|
212
|
-
React.createElement(Text, { color: line.type === 'remove' || line.type === 'modified'
|
|
213
|
-
'red'
|
|
214
|
-
: getLineColor(line.type) }, line.old
|
|
215
|
-
truncateLine(line.old, columnWidth - 10)
|
|
212
|
+
React.createElement(Text, { color: line.type === 'remove' || line.type === 'modified'
|
|
213
|
+
? 'red'
|
|
214
|
+
: getLineColor(line.type) }, line.old
|
|
215
|
+
? truncateLine(line.old, columnWidth - 10)
|
|
216
216
|
: ' '.repeat(columnWidth - 10))),
|
|
217
217
|
React.createElement(Text, { dimColor: true }, " \u2503 "),
|
|
218
218
|
React.createElement(Box, { width: columnWidth },
|
|
219
219
|
React.createElement(Text, { dimColor: true }, line.newNum ? String(line.newNum).padStart(4) : ' '),
|
|
220
220
|
React.createElement(Text, { dimColor: true }, " \u2502 "),
|
|
221
221
|
React.createElement(Text, { color: line.type === 'add' || line.type === 'modified' ? 'green' : undefined, dimColor: line.type === 'header' }, line.type === 'add' || line.type === 'modified' ? '+ ' : ' '),
|
|
222
|
-
React.createElement(Text, { color: line.type === 'add' || line.type === 'modified'
|
|
223
|
-
'green'
|
|
224
|
-
: getLineColor(line.type) }, line.new
|
|
225
|
-
truncateLine(line.new, columnWidth - 10)
|
|
222
|
+
React.createElement(Text, { color: line.type === 'add' || line.type === 'modified'
|
|
223
|
+
? 'green'
|
|
224
|
+
: getLineColor(line.type) }, line.new
|
|
225
|
+
? truncateLine(line.new, columnWidth - 10)
|
|
226
226
|
: ' '.repeat(columnWidth - 10)))))))),
|
|
227
227
|
React.createElement(Box, { marginTop: 1, justifyContent: "space-between" },
|
|
228
228
|
React.createElement(Text, { dimColor: true },
|
|
@@ -13,11 +13,7 @@ const StatusBar = ({ commitish, totalFiles, currentMode }) => {
|
|
|
13
13
|
React.createElement(Box, null,
|
|
14
14
|
React.createElement(Text, { dimColor: true },
|
|
15
15
|
"[",
|
|
16
|
-
currentMode === 'list' ?
|
|
17
|
-
'File List'
|
|
18
|
-
: currentMode === 'split' ?
|
|
19
|
-
'Split'
|
|
20
|
-
: 'Unified',
|
|
16
|
+
currentMode === 'list' ? 'File List' : currentMode === 'split' ? 'Split' : 'Unified',
|
|
21
17
|
"]"))));
|
|
22
18
|
};
|
|
23
19
|
export default StatusBar;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { hasSuggestionBlock, parseSuggestionBlocks } from './suggestionUtils.js';
|
|
2
2
|
export function formatCommentPrompt(file, line, body, codeContent) {
|
|
3
|
-
const lineInfo = typeof line === 'number' ? `L${line}`
|
|
4
|
-
: Array.isArray(line) ? `L${line[0]}-L${line[1]}`
|
|
5
|
-
: '';
|
|
3
|
+
const lineInfo = typeof line === 'number' ? `L${line}` : Array.isArray(line) ? `L${line[0]}-L${line[1]}` : '';
|
|
6
4
|
// Handle undefined or null file paths
|
|
7
5
|
const filePath = file || '<unknown file>';
|
|
8
6
|
// Check if body contains suggestion blocks
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "difit",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.10",
|
|
4
4
|
"description": "A lightweight command-line tool that spins up a local web server to display Git commit diffs in a GitHub-like Files changed view",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"build": "tsc -b && vite build",
|
|
25
25
|
"build:cli": "tsc --project tsconfig.cli.json",
|
|
26
26
|
"start": "pnpm run build && node dist/cli/index.js",
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"format": "
|
|
30
|
-
"
|
|
27
|
+
"check": "oxlint . --type-aware --type-check --deny-warnings --report-unused-disable-directives",
|
|
28
|
+
"check:fix": "oxlint . --type-aware --type-check --deny-warnings --report-unused-disable-directives --fix",
|
|
29
|
+
"format": "biome format .",
|
|
30
|
+
"format:fix": "biome format . --write",
|
|
31
31
|
"knip": "knip --use-tsconfig-files",
|
|
32
32
|
"test": "vitest run",
|
|
33
33
|
"test:watch": "vitest",
|
|
@@ -42,7 +42,6 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@floating-ui/react": "^0.27.16",
|
|
45
|
-
"@octokit/rest": "^22.0.0",
|
|
46
45
|
"@parcel/watcher": "^2.5.1",
|
|
47
46
|
"commander": "^14.0.0",
|
|
48
47
|
"diff": "^8.0.2",
|
|
@@ -60,8 +59,7 @@
|
|
|
60
59
|
"simple-git": "^3.28.0"
|
|
61
60
|
},
|
|
62
61
|
"devDependencies": {
|
|
63
|
-
"@
|
|
64
|
-
"@prettier/plugin-oxc": "^0.1.0",
|
|
62
|
+
"@biomejs/biome": "^2.4.3",
|
|
65
63
|
"@tailwindcss/postcss": "^4.1.11",
|
|
66
64
|
"@testing-library/jest-dom": "^6.6.3",
|
|
67
65
|
"@testing-library/react": "^16.3.0",
|
|
@@ -71,24 +69,16 @@
|
|
|
71
69
|
"@types/node": "^24.0.8",
|
|
72
70
|
"@types/react": "^19.1.8",
|
|
73
71
|
"@types/react-dom": "^19.1.6",
|
|
74
|
-
"@typescript-eslint/eslint-plugin": "^8.35.1",
|
|
75
|
-
"@typescript-eslint/parser": "^8.35.1",
|
|
76
72
|
"@vitejs/plugin-react": "^5.0.0",
|
|
77
73
|
"autoprefixer": "^10.4.21",
|
|
78
|
-
"eslint": "^
|
|
79
|
-
"eslint-config-prettier": "^10.1.5",
|
|
80
|
-
"eslint-plugin-import": "^2.32.0",
|
|
81
|
-
"eslint-plugin-react": "^7.37.5",
|
|
82
|
-
"eslint-plugin-react-hooks": "^7.0.0",
|
|
83
|
-
"eslint-plugin-unused-imports": "^4.1.4",
|
|
84
|
-
"globals": "^17.0.0",
|
|
74
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
85
75
|
"happy-dom": "^20.0.0",
|
|
86
76
|
"knip": "^5.83.0",
|
|
87
77
|
"lefthook": "^2.0.0",
|
|
88
|
-
"
|
|
78
|
+
"oxlint": "^1.49.0",
|
|
79
|
+
"oxlint-tsgolint": "^0.14.1",
|
|
89
80
|
"playwright": "^1.54.1",
|
|
90
81
|
"postcss": "^8.5.6",
|
|
91
|
-
"prettier": "^3.6.2",
|
|
92
82
|
"tailwindcss": "^4.1.11",
|
|
93
83
|
"typescript": "^5.8.3",
|
|
94
84
|
"undici": "^7.11.0",
|