difit 3.1.9 → 3.1.11
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 +30 -13
- package/README.ko.md +30 -13
- package/README.md +30 -13
- package/README.zh.md +30 -13
- package/dist/cli/index.js +56 -46
- package/dist/cli/index.test.js +143 -56
- package/dist/cli/utils.d.ts +4 -7
- package/dist/cli/utils.js +17 -98
- package/dist/client/assets/{index-B1Ye1njT.js → index-0eidGb4G.js} +30 -30
- package/dist/client/assets/{prism-csharp-Dv4F6oYg.js → prism-csharp-Bz_zphOC.js} +1 -1
- package/dist/client/assets/{prism-hcl-BKiQPDt1.js → prism-hcl-HO7lwwhc.js} +1 -1
- package/dist/client/assets/{prism-java-CsLA9BYF.js → prism-java-Dh0Q2eOX.js} +1 -1
- package/dist/client/assets/{prism-perl-CjbksjRr.js → prism-perl-D_qbRz8N.js} +1 -1
- package/dist/client/assets/{prism-php-Blls7Q4g.js → prism-php-Dgr7EUBn.js} +1 -1
- package/dist/client/assets/{prism-ruby-DVHs5uYA.js → prism-ruby-CaFchRnn.js} +1 -1
- package/dist/client/assets/{prism-solidity-BxgmEX2j.js → prism-solidity-CDfI790k.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/generated-file-check.d.ts +2 -1
- package/dist/server/git-diff.js +38 -22
- package/dist/server/server.d.ts +1 -0
- package/dist/server/server.js +17 -10
- package/dist/server/server.test.js +104 -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/types/diff.d.ts +1 -0
- package/dist/utils/commentFormatting.js +1 -3
- package/dist/utils/suggestionUtils.d.ts +2 -1
- package/package.json +39 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as U}from"./index-
|
|
1
|
+
import{g as U}from"./index-0eidGb4G.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-0eidGb4G.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-0eidGb4G.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-0eidGb4G.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-0eidGb4G.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-0eidGb4G.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-0eidGb4G.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-0eidGb4G.js"></script>
|
|
11
11
|
<link rel="stylesheet" crossorigin href="/assets/index-D4vctQX_.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
interface GeneratedCheckResult {
|
|
2
2
|
isGenerated: boolean;
|
|
3
3
|
reason?: 'path' | 'universal' | 'language-specific';
|
|
4
4
|
matchedPattern?: string;
|
|
@@ -14,3 +14,4 @@ export interface GeneratedCheckResult {
|
|
|
14
14
|
* @param getHeaderLines A function that lazily provides the first 20 lines of the file content
|
|
15
15
|
*/
|
|
16
16
|
export declare function isGeneratedFile(parsedPath: string, getHeaderLines?: () => string[]): GeneratedCheckResult;
|
|
17
|
+
export {};
|
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
|
@@ -102,6 +102,7 @@ export async function startServer(options) {
|
|
|
102
102
|
...diffDataCache,
|
|
103
103
|
ignoreWhitespace,
|
|
104
104
|
mode: diffMode,
|
|
105
|
+
openInEditorAvailable: !options.stdinDiff,
|
|
105
106
|
baseCommitish: resolvedBase,
|
|
106
107
|
targetCommitish: resolvedTarget,
|
|
107
108
|
requestedBaseCommitish,
|
|
@@ -213,8 +214,8 @@ export async function startServer(options) {
|
|
|
213
214
|
let finalComments = [];
|
|
214
215
|
// Parse comments from request body (handles both JSON and text/plain)
|
|
215
216
|
function parseCommentsPayload(body) {
|
|
216
|
-
const payload = typeof body === 'string'
|
|
217
|
-
JSON.parse(body)
|
|
217
|
+
const payload = typeof body === 'string'
|
|
218
|
+
? JSON.parse(body)
|
|
218
219
|
: body;
|
|
219
220
|
return payload.comments || [];
|
|
220
221
|
}
|
|
@@ -340,14 +341,20 @@ export async function startServer(options) {
|
|
|
340
341
|
// When client disconnects (tab closed, navigation, etc.)
|
|
341
342
|
req.on('close', () => {
|
|
342
343
|
clearInterval(heartbeatInterval);
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
console.log('
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
344
|
+
if (options.keepAlive) {
|
|
345
|
+
console.log('Client disconnected, but server is staying alive (--keep-alive)');
|
|
346
|
+
console.log('Press Ctrl+C to stop the server');
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
// Add a small delay to ensure any pending sendBeacon requests are processed
|
|
350
|
+
setTimeout(async () => {
|
|
351
|
+
console.log('Client disconnected, shutting down server...');
|
|
352
|
+
// Stop file watcher
|
|
353
|
+
await fileWatcher.stop();
|
|
354
|
+
outputFinalComments();
|
|
355
|
+
process.exit(0);
|
|
356
|
+
}, 100);
|
|
357
|
+
}
|
|
351
358
|
});
|
|
352
359
|
});
|
|
353
360
|
// Always runs in production mode when distributed as a CLI tool
|
|
@@ -42,6 +42,22 @@ vi.mock('./git-diff.js', () => {
|
|
|
42
42
|
stats: { additions: 10, deletions: 5 },
|
|
43
43
|
isEmpty: false,
|
|
44
44
|
});
|
|
45
|
+
parseStdinDiff = vi.fn().mockReturnValue({
|
|
46
|
+
targetCommit: 'stdin-target',
|
|
47
|
+
baseCommit: 'stdin-base',
|
|
48
|
+
targetMessage: 'stdin target',
|
|
49
|
+
baseMessage: 'stdin base',
|
|
50
|
+
files: [
|
|
51
|
+
{
|
|
52
|
+
path: 'stdin-test.js',
|
|
53
|
+
additions: 1,
|
|
54
|
+
deletions: 0,
|
|
55
|
+
chunks: [],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
stats: { additions: 1, deletions: 0 },
|
|
59
|
+
isEmpty: false,
|
|
60
|
+
});
|
|
45
61
|
getBlobContent = vi.fn().mockResolvedValue(Buffer.from('mock image data'));
|
|
46
62
|
getRevisionOptions = vi.fn().mockResolvedValue({
|
|
47
63
|
branches: [{ name: 'main', current: true }],
|
|
@@ -226,6 +242,7 @@ describe('Server Integration Tests', () => {
|
|
|
226
242
|
expect(data.files).toHaveLength(1);
|
|
227
243
|
expect(data.files[0]).toHaveProperty('path', 'test.js');
|
|
228
244
|
expect(data).toHaveProperty('ignoreWhitespace', false);
|
|
245
|
+
expect(data).toHaveProperty('openInEditorAvailable', true);
|
|
229
246
|
});
|
|
230
247
|
it('GET /api/diff?ignoreWhitespace=true handles whitespace ignore', async () => {
|
|
231
248
|
const response = await fetch(`http://localhost:${port}/api/diff?ignoreWhitespace=true`);
|
|
@@ -317,6 +334,17 @@ describe('Server Integration Tests', () => {
|
|
|
317
334
|
// SSE endpoint functionality is verified through manual testing
|
|
318
335
|
expect(true).toBe(true);
|
|
319
336
|
});
|
|
337
|
+
it('GET /api/diff sets openInEditorAvailable=false for stdin diff', async () => {
|
|
338
|
+
const stdinServer = await startServer({
|
|
339
|
+
stdinDiff: 'diff --git a/stdin-test.js b/stdin-test.js',
|
|
340
|
+
preferredPort: 9035,
|
|
341
|
+
});
|
|
342
|
+
servers.push(stdinServer.server);
|
|
343
|
+
const response = await fetch(`http://localhost:${stdinServer.port}/api/diff`);
|
|
344
|
+
const data = (await response.json());
|
|
345
|
+
expect(response.ok).toBe(true);
|
|
346
|
+
expect(data).toHaveProperty('openInEditorAvailable', false);
|
|
347
|
+
});
|
|
320
348
|
});
|
|
321
349
|
describe('Static file serving', () => {
|
|
322
350
|
let originalNodeEnv;
|
|
@@ -543,6 +571,82 @@ describe('Server Integration Tests', () => {
|
|
|
543
571
|
}
|
|
544
572
|
});
|
|
545
573
|
});
|
|
574
|
+
describe('Keep-alive option', () => {
|
|
575
|
+
it('accepts keepAlive option without error', async () => {
|
|
576
|
+
const { port, server } = await startServer({
|
|
577
|
+
targetCommitish: 'HEAD',
|
|
578
|
+
baseCommitish: 'HEAD^',
|
|
579
|
+
keepAlive: true,
|
|
580
|
+
});
|
|
581
|
+
servers.push(server);
|
|
582
|
+
expect(port).toBeGreaterThanOrEqual(4966);
|
|
583
|
+
});
|
|
584
|
+
it('starts normally without keepAlive option', async () => {
|
|
585
|
+
const { port, server } = await startServer({
|
|
586
|
+
targetCommitish: 'HEAD',
|
|
587
|
+
baseCommitish: 'HEAD^',
|
|
588
|
+
});
|
|
589
|
+
servers.push(server);
|
|
590
|
+
expect(port).toBeGreaterThanOrEqual(4966);
|
|
591
|
+
});
|
|
592
|
+
it('does not call process.exit on client disconnect when keepAlive is true', async () => {
|
|
593
|
+
const { port, server } = await startServer({
|
|
594
|
+
targetCommitish: 'HEAD',
|
|
595
|
+
baseCommitish: 'HEAD^',
|
|
596
|
+
keepAlive: true,
|
|
597
|
+
preferredPort: 9070,
|
|
598
|
+
});
|
|
599
|
+
servers.push(server);
|
|
600
|
+
// Connect to heartbeat SSE endpoint and then abort
|
|
601
|
+
const controller = new AbortController();
|
|
602
|
+
const responsePromise = fetch(`http://localhost:${port}/api/heartbeat`, {
|
|
603
|
+
signal: controller.signal,
|
|
604
|
+
});
|
|
605
|
+
// Wait for the connection to be established
|
|
606
|
+
const response = await responsePromise.catch(() => null);
|
|
607
|
+
if (response) {
|
|
608
|
+
// Start reading the stream to ensure connection is established
|
|
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
|
+
// With keepAlive, process.exit should NOT have been called
|
|
619
|
+
expect(process.exit).not.toHaveBeenCalled();
|
|
620
|
+
});
|
|
621
|
+
it('calls process.exit on client disconnect when keepAlive is false', async () => {
|
|
622
|
+
const { port, server } = await startServer({
|
|
623
|
+
targetCommitish: 'HEAD',
|
|
624
|
+
baseCommitish: 'HEAD^',
|
|
625
|
+
keepAlive: false,
|
|
626
|
+
preferredPort: 9080,
|
|
627
|
+
});
|
|
628
|
+
servers.push(server);
|
|
629
|
+
// Connect to heartbeat SSE endpoint and then abort
|
|
630
|
+
const controller = new AbortController();
|
|
631
|
+
const responsePromise = fetch(`http://localhost:${port}/api/heartbeat`, {
|
|
632
|
+
signal: controller.signal,
|
|
633
|
+
});
|
|
634
|
+
// Wait for the connection to be established
|
|
635
|
+
const response = await responsePromise.catch(() => null);
|
|
636
|
+
if (response) {
|
|
637
|
+
const reader = response.body?.getReader();
|
|
638
|
+
if (reader) {
|
|
639
|
+
await reader.read(); // Read the initial "connected" message
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// Disconnect by aborting
|
|
643
|
+
controller.abort();
|
|
644
|
+
// Wait for the server's close handler + setTimeout(100ms) to run
|
|
645
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
646
|
+
// Without keepAlive, process.exit SHOULD have been called
|
|
647
|
+
expect(process.exit).toHaveBeenCalledWith(0);
|
|
648
|
+
});
|
|
649
|
+
});
|
|
546
650
|
describe('Clear Comments functionality', () => {
|
|
547
651
|
it('includes clearComments flag in diff response when provided', async () => {
|
|
548
652
|
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;
|
package/dist/types/diff.d.ts
CHANGED
|
@@ -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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
interface SuggestionBlock {
|
|
2
2
|
suggestedCode: string;
|
|
3
3
|
startIndex: number;
|
|
4
4
|
endIndex: number;
|
|
@@ -16,3 +16,4 @@ export declare function parseSuggestionBlocks(body: string): SuggestionBlock[];
|
|
|
16
16
|
* Create a suggestion template with the given code
|
|
17
17
|
*/
|
|
18
18
|
export declare function createSuggestionTemplate(code: string): string;
|
|
19
|
+
export {};
|