vzcode 0.63.0 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -230,4 +230,4 @@ ${j.join(`
230
230
  `;P=P.replace(n,"").replace(r,"").replace(v,"$1");let d="";for(;d!==P;)d=P,P=P.replace(_,`${L}$1 $2${L}`);P=P.replace(u,"").trimRight();let N=Object.create(null),$=P.replace(f,"").replace(u,"").trimRight(),O;for(;O=f.exec(P);){let R=O[2].replace(s,"");typeof N[O[1]]=="string"||Array.isArray(N[O[1]])?N[O[1]]=D.concat(N[O[1]],R):N[O[1]]=R}return{comments:$,pragmas:N}}function E({comments:P="",pragmas:L={}}){let d=`
231
231
  `,N="/**",$=" *",O=" */",R=Object.keys(L),H=R.flatMap(ee=>C(ee,L[ee])).map(ee=>`${$} ${ee}${d}`).join("");if(!P){if(R.length===0)return"";if(R.length===1&&!Array.isArray(L[R[0]])){let ee=L[R[0]];return`${N} ${C(R[0],ee)[0]}${O}`}}let Z=P.split(d).map(ee=>`${$} ${ee}`).join(d)+d;return N+d+(P?Z:"")+(P&&R.length?$+d:"")+H+O}function C(P,L){return D.concat(L).map(d=>`@${P} ${d}`.trim())}}),hN={};bT(hN,{parsers:()=>AT});var AT={};bT(AT,{typescript:()=>bue});var joe=dn(Loe(),1);function Roe(t,r){let n=new SyntaxError(t+" ("+r.loc.start.line+":"+r.loc.start.column+")");return Object.assign(n,r)}var $oe=Roe;function Joe(t){let r=[];for(let n of t)try{return n()}catch(a){r.push(a)}throw Object.assign(new Error("All combinations failed"),{errors:r})}var qoe=Joe,Uoe=(t,r,n)=>{if(!(t&&r==null))return Array.isArray(r)||typeof r=="string"?r[n<0?r.length+n:n]:r.at(n)},yN=Uoe;function zoe(t){return Array.isArray(t)&&t.length>0}var Koe=zoe;function eo(t){var r,n,a;let s=((r=t.range)==null?void 0:r[0])??t.start,u=(a=((n=t.declaration)==null?void 0:n.decorators)??t.decorators)==null?void 0:a[0];return u?Math.min(eo(u),s):s}function Dl(t){var r;return((r=t.range)==null?void 0:r[1])??t.end}function Woe(t){let r=new Set(t);return n=>r.has(n==null?void 0:n.type)}var Hoe=Woe,Voe=Hoe(["Block","CommentBlock","MultiLine"]),wT=Voe;function Goe(t){let r=`*${t.value}*`.split(`
232
232
  `);return r.length>1&&r.every(n=>n.trimStart()[0]==="*")}var gN=Goe;function Xoe(t){return wT(t)&&t.value[0]==="*"&&/@(?:type|satisfies)\b/.test(t.value)}var Yoe=Xoe,Tf=null;function Ef(t){if(Tf!==null&&typeof Tf.property){let r=Tf;return Tf=Ef.prototype=null,r}return Tf=Ef.prototype=t??Object.create(null),new Ef}var Qoe=10;for(let t=0;t<=Qoe;t++)Ef();function Zoe(t){return Ef(t)}function eue(t,r="type"){Zoe(t);function n(a){let s=a[r],u=t[s];if(!Array.isArray(u))throw Object.assign(new Error(`Missing visitor keys for '${s}'.`),{node:a});return u}return n}var tue=eue,rue={ArrayExpression:["elements"],AssignmentExpression:["left","right"],BinaryExpression:["left","right"],InterpreterDirective:[],Directive:["value"],DirectiveLiteral:[],BlockStatement:["directives","body"],BreakStatement:["label"],CallExpression:["callee","arguments","typeParameters","typeArguments"],CatchClause:["param","body"],ConditionalExpression:["test","consequent","alternate"],ContinueStatement:["label"],DebuggerStatement:[],DoWhileStatement:["test","body"],EmptyStatement:[],ExpressionStatement:["expression"],File:["program"],ForInStatement:["left","right","body"],ForStatement:["init","test","update","body"],FunctionDeclaration:["id","params","body","returnType","typeParameters","predicate"],FunctionExpression:["id","params","body","returnType","typeParameters"],Identifier:["typeAnnotation","decorators"],IfStatement:["test","consequent","alternate"],LabeledStatement:["label","body"],StringLiteral:[],NumericLiteral:[],NullLiteral:[],BooleanLiteral:[],RegExpLiteral:[],LogicalExpression:["left","right"],MemberExpression:["object","property"],NewExpression:["callee","arguments","typeParameters","typeArguments"],Program:["directives","body"],ObjectExpression:["properties"],ObjectMethod:["key","params","body","decorators","returnType","typeParameters"],ObjectProperty:["key","value","decorators"],RestElement:["argument","typeAnnotation","decorators"],ReturnStatement:["argument"],SequenceExpression:["expressions"],ParenthesizedExpression:["expression"],SwitchCase:["test","consequent"],SwitchStatement:["discriminant","cases"],ThisExpression:[],ThrowStatement:["argument"],TryStatement:["block","handler","finalizer"],UnaryExpression:["argument"],UpdateExpression:["argument"],VariableDeclaration:["declarations"],VariableDeclarator:["id","init"],WhileStatement:["test","body"],WithStatement:["object","body"],AssignmentPattern:["left","right","decorators","typeAnnotation"],ArrayPattern:["elements","typeAnnotation","decorators"],ArrowFunctionExpression:["params","body","returnType","typeParameters","predicate"],ClassBody:["body"],ClassExpression:["id","body","superClass","mixins","typeParameters","superTypeParameters","implements","decorators","superTypeArguments"],ClassDeclaration:["id","body","superClass","mixins","typeParameters","superTypeParameters","implements","decorators","superTypeArguments"],ExportAllDeclaration:["source","attributes","exported"],ExportDefaultDeclaration:["declaration"],ExportNamedDeclaration:["declaration","specifiers","source","attributes"],ExportSpecifier:["local","exported"],ForOfStatement:["left","right","body"],ImportDeclaration:["specifiers","source","attributes"],ImportDefaultSpecifier:["local"],ImportNamespaceSpecifier:["local"],ImportSpecifier:["local","imported"],ImportExpression:["source","options","attributes"],MetaProperty:["meta","property"],ClassMethod:["key","params","body","decorators","returnType","typeParameters"],ObjectPattern:["properties","typeAnnotation","decorators"],SpreadElement:["argument"],Super:[],TaggedTemplateExpression:["tag","quasi","typeParameters","typeArguments"],TemplateElement:[],TemplateLiteral:["quasis","expressions"],YieldExpression:["argument"],AwaitExpression:["argument"],Import:[],BigIntLiteral:[],ExportNamespaceSpecifier:["exported"],OptionalMemberExpression:["object","property"],OptionalCallExpression:["callee","arguments","typeParameters","typeArguments"],ClassProperty:["key","value","typeAnnotation","decorators","variance"],ClassAccessorProperty:["key","value","typeAnnotation","decorators"],ClassPrivateProperty:["key","value","decorators","typeAnnotation","variance"],ClassPrivateMethod:["key","params","body","decorators","returnType","typeParameters"],PrivateName:["id"],StaticBlock:["body"],AnyTypeAnnotation:[],ArrayTypeAnnotation:["elementType"],BooleanTypeAnnotation:[],BooleanLiteralTypeAnnotation:[],NullLiteralTypeAnnotation:[],ClassImplements:["id","typeParameters"],DeclareClass:["id","typeParameters","extends","mixins","implements","body"],DeclareFunction:["id","predicate"],DeclareInterface:["id","typeParameters","extends","body"],DeclareModule:["id","body"],DeclareModuleExports:["typeAnnotation"],DeclareTypeAlias:["id","typeParameters","right"],DeclareOpaqueType:["id","typeParameters","supertype"],DeclareVariable:["id"],DeclareExportDeclaration:["declaration","specifiers","source"],DeclareExportAllDeclaration:["source"],DeclaredPredicate:["value"],ExistsTypeAnnotation:[],FunctionTypeAnnotation:["typeParameters","params","rest","returnType","this"],FunctionTypeParam:["name","typeAnnotation"],GenericTypeAnnotation:["id","typeParameters"],InferredPredicate:[],InterfaceExtends:["id","typeParameters"],InterfaceDeclaration:["id","typeParameters","extends","body"],InterfaceTypeAnnotation:["extends","body"],IntersectionTypeAnnotation:["types"],MixedTypeAnnotation:[],EmptyTypeAnnotation:[],NullableTypeAnnotation:["typeAnnotation"],NumberLiteralTypeAnnotation:[],NumberTypeAnnotation:[],ObjectTypeAnnotation:["properties","indexers","callProperties","internalSlots"],ObjectTypeInternalSlot:["id","value","optional","static","method"],ObjectTypeCallProperty:["value"],ObjectTypeIndexer:["id","key","value","variance"],ObjectTypeProperty:["key","value","variance"],ObjectTypeSpreadProperty:["argument"],OpaqueType:["id","typeParameters","supertype","impltype"],QualifiedTypeIdentifier:["id","qualification"],StringLiteralTypeAnnotation:[],StringTypeAnnotation:[],SymbolTypeAnnotation:[],ThisTypeAnnotation:[],TupleTypeAnnotation:["types","elementTypes"],TypeofTypeAnnotation:["argument","typeArguments"],TypeAlias:["id","typeParameters","right"],TypeAnnotation:["typeAnnotation"],TypeCastExpression:["expression","typeAnnotation"],TypeParameter:["bound","default","variance"],TypeParameterDeclaration:["params"],TypeParameterInstantiation:["params"],UnionTypeAnnotation:["types"],Variance:[],VoidTypeAnnotation:[],EnumDeclaration:["id","body"],EnumBooleanBody:["members"],EnumNumberBody:["members"],EnumStringBody:["members"],EnumSymbolBody:["members"],EnumBooleanMember:["id","init"],EnumNumberMember:["id","init"],EnumStringMember:["id","init"],EnumDefaultedMember:["id"],IndexedAccessType:["objectType","indexType"],OptionalIndexedAccessType:["objectType","indexType"],JSXAttribute:["name","value"],JSXClosingElement:["name"],JSXElement:["openingElement","children","closingElement"],JSXEmptyExpression:[],JSXExpressionContainer:["expression"],JSXSpreadChild:["expression"],JSXIdentifier:[],JSXMemberExpression:["object","property"],JSXNamespacedName:["namespace","name"],JSXOpeningElement:["name","attributes","typeArguments","typeParameters"],JSXSpreadAttribute:["argument"],JSXText:[],JSXFragment:["openingFragment","children","closingFragment"],JSXOpeningFragment:[],JSXClosingFragment:[],Noop:[],Placeholder:[],V8IntrinsicIdentifier:[],ArgumentPlaceholder:[],BindExpression:["object","callee"],ImportAttribute:["key","value"],Decorator:["expression"],DoExpression:["body"],ExportDefaultSpecifier:["exported"],RecordExpression:["properties"],TupleExpression:["elements"],DecimalLiteral:[],ModuleExpression:["body"],TopicReference:[],PipelineTopicExpression:["expression"],PipelineBareFunction:["callee"],PipelinePrimaryTopicReference:[],TSParameterProperty:["parameter","decorators"],TSDeclareFunction:["id","typeParameters","params","returnType","body"],TSDeclareMethod:["decorators","key","typeParameters","params","returnType"],TSQualifiedName:["left","right"],TSCallSignatureDeclaration:["typeParameters","parameters","typeAnnotation","params","returnType"],TSConstructSignatureDeclaration:["typeParameters","parameters","typeAnnotation","params","returnType"],TSPropertySignature:["key","typeAnnotation"],TSMethodSignature:["key","typeParameters","parameters","typeAnnotation","params","returnType"],TSIndexSignature:["parameters","typeAnnotation"],TSAnyKeyword:[],TSBooleanKeyword:[],TSBigIntKeyword:[],TSIntrinsicKeyword:[],TSNeverKeyword:[],TSNullKeyword:[],TSNumberKeyword:[],TSObjectKeyword:[],TSStringKeyword:[],TSSymbolKeyword:[],TSUndefinedKeyword:[],TSUnknownKeyword:[],TSVoidKeyword:[],TSThisType:[],TSFunctionType:["typeParameters","parameters","typeAnnotation","params","returnType"],TSConstructorType:["typeParameters","parameters","typeAnnotation","params","returnType"],TSTypeReference:["typeName","typeParameters","typeArguments"],TSTypePredicate:["parameterName","typeAnnotation"],TSTypeQuery:["exprName","typeParameters","typeArguments"],TSTypeLiteral:["members"],TSArrayType:["elementType"],TSTupleType:["elementTypes"],TSOptionalType:["typeAnnotation"],TSRestType:["typeAnnotation"],TSNamedTupleMember:["label","elementType"],TSUnionType:["types"],TSIntersectionType:["types"],TSConditionalType:["checkType","extendsType","trueType","falseType"],TSInferType:["typeParameter"],TSParenthesizedType:["typeAnnotation"],TSTypeOperator:["typeAnnotation"],TSIndexedAccessType:["objectType","indexType"],TSMappedType:["typeParameter","typeAnnotation","nameType"],TSLiteralType:["literal"],TSExpressionWithTypeArguments:["expression","typeParameters"],TSInterfaceDeclaration:["id","typeParameters","extends","body"],TSInterfaceBody:["body"],TSTypeAliasDeclaration:["id","typeParameters","typeAnnotation"],TSInstantiationExpression:["expression","typeParameters","typeArguments"],TSAsExpression:["expression","typeAnnotation"],TSSatisfiesExpression:["expression","typeAnnotation"],TSTypeAssertion:["typeAnnotation","expression"],TSEnumDeclaration:["id","members"],TSEnumMember:["id","initializer"],TSModuleDeclaration:["id","body"],TSModuleBlock:["body"],TSImportType:["argument","qualifier","typeParameters","typeArguments"],TSImportEqualsDeclaration:["id","moduleReference"],TSExternalModuleReference:["expression"],TSNonNullExpression:["expression"],TSExportAssignment:["expression"],TSNamespaceExportDeclaration:["id"],TSTypeAnnotation:["typeAnnotation"],TSTypeParameterInstantiation:["params"],TSTypeParameterDeclaration:["params"],TSTypeParameter:["constraint","default","name"],ChainExpression:["expression"],ExperimentalRestProperty:["argument"],ExperimentalSpreadProperty:["argument"],Literal:[],MethodDefinition:["decorators","key","value"],PrivateIdentifier:[],Property:["key","value"],PropertyDefinition:["decorators","key","typeAnnotation","value","variance"],AccessorProperty:["decorators","key","typeAnnotation","value"],TSAbstractAccessorProperty:["decorators","key","typeAnnotation"],TSAbstractKeyword:[],TSAbstractMethodDefinition:["key","value"],TSAbstractPropertyDefinition:["decorators","key","typeAnnotation"],TSAsyncKeyword:[],TSClassImplements:["expression","typeArguments","typeParameters"],TSDeclareKeyword:[],TSEmptyBodyFunctionExpression:["id","typeParameters","params","returnType"],TSExportKeyword:[],TSInterfaceHeritage:["expression","typeArguments","typeParameters"],TSPrivateKeyword:[],TSProtectedKeyword:[],TSPublicKeyword:[],TSReadonlyKeyword:[],TSStaticKeyword:[],TSTemplateLiteralType:["quasis","types"],AsExpression:["expression","typeAnnotation"],BigIntLiteralTypeAnnotation:[],BigIntTypeAnnotation:[],ConditionalTypeAnnotation:["checkType","extendsType","trueType","falseType"],DeclareEnum:["id","body"],InferTypeAnnotation:["typeParameter"],KeyofTypeAnnotation:["argument"],ObjectTypeMappedTypeProperty:["keyTparam","propType","sourceType","variance"],QualifiedTypeofIdentifier:["qualification","id"],TupleTypeLabeledElement:["label","elementType","variance"],TupleTypeSpreadElement:["label","typeAnnotation"],TypeOperator:["typeAnnotation"],TypePredicate:["parameterName","typeAnnotation","asserts"],NGRoot:["node"],NGPipeExpression:["left","right","arguments"],NGChainedExpression:["expressions"],NGEmptyExpression:[],NGMicrosyntax:["body"],NGMicrosyntaxKey:[],NGMicrosyntaxExpression:["expression","alias"],NGMicrosyntaxKeyedExpression:["key","expression"],NGMicrosyntaxLet:["key","value"],NGMicrosyntaxAs:["key","alias"],JsExpressionRoot:["node"],JsonRoot:["node"],TSJSDocAllType:[],TSJSDocUnknownType:[],TSJSDocNullableType:["typeAnnotation"],TSJSDocNonNullableType:["typeAnnotation"],NeverTypeAnnotation:[],UndefinedTypeAnnotation:[],UnknownTypeAnnotation:[],AsConstExpression:["expression"],SatisfiesExpression:["expression","typeAnnotation"]},nue=tue(rue),iue=nue;function FT(t,r){if(!(t!==null&&typeof t=="object"))return t;if(Array.isArray(t)){for(let a=0;a<t.length;a++)t[a]=FT(t[a],r);return t}let n=iue(t);for(let a=0;a<n.length;a++)t[n[a]]=FT(t[n[a]],r);return r(t)||t}var kT=FT;function aue(t,r){let{parser:n,text:a}=r;if(t.type==="File"&&t.program.interpreter){let{program:{interpreter:s},comments:u}=t;delete t.program.interpreter,u.unshift(s)}if(n==="babel"){let s=new Set;t=kT(t,u=>{var _;(_=u.leadingComments)!=null&&_.some(Yoe)&&s.add(eo(u))}),t=kT(t,u=>{if(u.type==="ParenthesizedExpression"){let{expression:_}=u;if(_.type==="TypeCastExpression")return _.range=[...u.range],_;let f=eo(u);if(!s.has(f))return _.extra={..._.extra,parenthesized:!0},_}})}if(t=kT(t,s=>{var u;switch(s.type){case"LogicalExpression":if(DN(s))return PT(s);break;case"VariableDeclaration":{let _=yN(!1,s.declarations,-1);_!=null&&_.init&&a[Dl(_)]!==";"&&(s.range=[eo(s),Dl(_)]);break}case"TSParenthesizedType":return s.typeAnnotation;case"TSTypeParameter":if(typeof s.name=="string"){let _=eo(s);s.name={type:"Identifier",name:s.name,range:[_,_+s.name.length]}}break;case"TopicReference":t.extra={...t.extra,__isUsingHackPipeline:!0};break;case"ExportAllDeclaration":if(n==="meriyah"&&((u=s.exported)==null?void 0:u.type)==="Identifier"){let{exported:_}=s,f=a.slice(eo(_),Dl(_));(f.startsWith('"')||f.startsWith("'"))&&(s.exported={...s.exported,type:"Literal",value:s.exported.name,raw:f})}break;case"TSUnionType":case"TSIntersectionType":if(s.types.length===1)return s.types[0];break}}),Koe(t.comments)){let s=yN(!1,t.comments,-1);for(let u=t.comments.length-2;u>=0;u--){let _=t.comments[u];Dl(_)===eo(s)&&wT(_)&&wT(s)&&gN(_)&&gN(s)&&(t.comments.splice(u+1,1),_.value+="*//*"+s.value,_.range=[eo(_),Dl(s)]),s=_}}return t.type==="Program"&&(t.range=[0,a.length]),t}function DN(t){return t.type==="LogicalExpression"&&t.right.type==="LogicalExpression"&&t.operator===t.right.operator}function PT(t){return DN(t)?PT({type:"LogicalExpression",operator:t.operator,left:PT({type:"LogicalExpression",operator:t.operator,left:t.left,right:t.right.left,range:[eo(t.left),Dl(t.right.left)]}),right:t.right.right,range:[eo(t),Dl(t)]}):t}var sue=aue,bN=dn(Moe(),1);function oue(t){if(!t.startsWith("#!"))return"";let r=t.indexOf(`
233
- `);return r===-1?t:t.slice(0,r)}var uue=oue;function lue(t){let r=uue(t);r&&(t=t.slice(r.length+1));let n=(0,bN.extract)(t),{pragmas:a,comments:s}=(0,bN.parseWithComments)(n);return{shebang:r,text:t,pragmas:a,comments:s}}function cue(t){let{pragmas:r}=lue(t);return Object.prototype.hasOwnProperty.call(r,"prettier")||Object.prototype.hasOwnProperty.call(r,"format")}function _ue(t){return t=typeof t=="function"?{parse:t}:t,{astFormat:"estree",hasPragma:cue,locStart:eo,locEnd:Dl,...t}}var pue=_ue;function due(t){return t.charAt(0)==="#"&&t.charAt(1)==="!"?"//"+t.slice(2):t}var mue=due,NT={loc:!0,range:!0,comment:!0,tokens:!0,loggerFn:!1,project:[],jsDocParsingMode:"none",suppressDeprecatedPropertyWarnings:!0};function fue(t){let{message:r,location:n}=t;if(!n)return t;let{start:a,end:s}=n;return $oe(r,{loc:{start:{line:a.line,column:a.column+1},end:{line:s.line,column:s.column+1}},cause:t})}var hue=t=>/\.(?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$/i.test(t);function yue(t,r){let n=r==null?void 0:r.filepath;if(n&&hue(n))return[{...NT,filePath:n}];let a=Due(t);return[{...NT,jsx:a},{...NT,jsx:!a}]}function gue(t,r){let n=mue(t),a=yue(t,r),s;try{s=qoe(a.map(u=>()=>(0,joe.parse)(n,u)))}catch({errors:[u]}){throw fue(u)}return sue(s,{text:t})}function Due(t){return new RegExp(["(?:^[^\"'`]*</)","|","(?:^[^/]{2}.*/>)"].join(""),"m").test(t)}var bue=pue(gue),xue=hN,vue=Object.freeze({__proto__:null,default:xue,parsers:AT});const Tue={js:"babel",jsx:"babel",mjs:"babel",cjs:"babel",ts:"typescript",tsx:"typescript",css:"css",html:"html",json:"json",json5:"json5",md:"markdown",markdown:"markdown",svelte:"svelte"},Eue=[nz,XG,zZ,Cne,vue,aoe];onmessage=async({data:t})=>{const{fileExtension:r,fileText:n,fileId:a}=t,s=Tue[r];if(s)try{const u=await jx(n,{parser:s,plugins:Eue,proseWrap:"always",singleQuote:!0,printWidth:60});postMessage({fileId:a,fileTextPrettified:u})}catch(u){postMessage({fileId:a,error:u.toString()})}}})();
233
+ `);return r===-1?t:t.slice(0,r)}var uue=oue;function lue(t){let r=uue(t);r&&(t=t.slice(r.length+1));let n=(0,bN.extract)(t),{pragmas:a,comments:s}=(0,bN.parseWithComments)(n);return{shebang:r,text:t,pragmas:a,comments:s}}function cue(t){let{pragmas:r}=lue(t);return Object.prototype.hasOwnProperty.call(r,"prettier")||Object.prototype.hasOwnProperty.call(r,"format")}function _ue(t){return t=typeof t=="function"?{parse:t}:t,{astFormat:"estree",hasPragma:cue,locStart:eo,locEnd:Dl,...t}}var pue=_ue;function due(t){return t.charAt(0)==="#"&&t.charAt(1)==="!"?"//"+t.slice(2):t}var mue=due,NT={loc:!0,range:!0,comment:!0,tokens:!0,loggerFn:!1,project:[],jsDocParsingMode:"none",suppressDeprecatedPropertyWarnings:!0};function fue(t){let{message:r,location:n}=t;if(!n)return t;let{start:a,end:s}=n;return $oe(r,{loc:{start:{line:a.line,column:a.column+1},end:{line:s.line,column:s.column+1}},cause:t})}var hue=t=>/\.(?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$/i.test(t);function yue(t,r){let n=r==null?void 0:r.filepath;if(n&&hue(n))return[{...NT,filePath:n}];let a=Due(t);return[{...NT,jsx:a},{...NT,jsx:!a}]}function gue(t,r){let n=mue(t),a=yue(t,r),s;try{s=qoe(a.map(u=>()=>(0,joe.parse)(n,u)))}catch({errors:[u]}){throw fue(u)}return sue(s,{text:t})}function Due(t){return new RegExp(["(?:^[^\"'`]*</)","|","(?:^[^/]{2}.*/>)"].join(""),"m").test(t)}var bue=pue(gue),xue=hN,vue=Object.freeze({__proto__:null,default:xue,parsers:AT});const Tue={js:"babel",jsx:"babel",mjs:"babel",cjs:"babel",ts:"typescript",tsx:"typescript",css:"css",html:"html",json:"json",json5:"json5",md:"markdown",markdown:"markdown"},Eue=[nz,XG,zZ,Cne,vue,aoe];onmessage=async({data:t})=>{const{fileExtension:r,fileText:n,fileId:a}=t,s=Tue[r];if(s)try{const u=await jx(n,{parser:s,plugins:Eue,proseWrap:"always",singleQuote:!0,printWidth:60});postMessage({fileId:a,fileTextPrettified:u})}catch(u){postMessage({fileId:a,error:u.toString()})}}})();
package/dist/index.html CHANGED
@@ -20,8 +20,8 @@
20
20
  href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap"
21
21
  rel="stylesheet"
22
22
  />
23
- <script type="module" crossorigin src="/assets/index-cVB2xPdw.js"></script>
24
- <link rel="stylesheet" crossorigin href="/assets/index-7hPfA_d2.css">
23
+ <script type="module" crossorigin src="/assets/index-DqZSunfv.js"></script>
24
+ <link rel="stylesheet" crossorigin href="/assets/index-Bh7FzEWq.css">
25
25
  </head>
26
26
  <body>
27
27
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vzcode",
3
- "version": "0.63.0",
3
+ "version": "0.65.0",
4
4
  "description": "Multiplayer code editor system",
5
5
  "main": "src/index.ts",
6
6
  "type": "module",
@@ -71,7 +71,7 @@
71
71
  "@codemirror/lang-markdown": "^6.2.4",
72
72
  "@codemirror/state": "^6.4.0",
73
73
  "@codemirror/theme-one-dark": "^6.1.2",
74
- "@codemirror/view": "^6.23.1",
74
+ "@codemirror/view": "^6.24.0",
75
75
  "@lezer/highlight": "^1.2.0",
76
76
  "@replit/codemirror-indentation-markers": "^6.5.0",
77
77
  "@replit/codemirror-interact": "^6.3.0",
@@ -94,16 +94,16 @@
94
94
  "color-hash": "^2.0.2",
95
95
  "d3-array": "^3.2.4",
96
96
  "diff-match-patch": "^1.0.5",
97
- "dotenv": "^16.4.1",
97
+ "dotenv": "^16.4.2",
98
98
  "express": "^4.18.2",
99
99
  "ignore": "^5.3.1",
100
100
  "json0-ot-diff": "^1.1.2",
101
101
  "ngrok": "^4.3.3",
102
102
  "open": "^10.0.3",
103
- "openai": "^4.26.1",
103
+ "openai": "^4.27.0",
104
104
  "prettier-plugin-svelte": "^3.1.2",
105
105
  "react": "^18.2.0",
106
- "react-bootstrap": "^2.10.0",
106
+ "react-bootstrap": "^2.10.1",
107
107
  "react-dom": "^18.2.0",
108
108
  "react-router-dom": "^6.22.0",
109
109
  "sharedb": "^4.1.2",
@@ -113,13 +113,13 @@
113
113
  },
114
114
  "devDependencies": {
115
115
  "@types/react": "^18.2.55",
116
- "@types/react-dom": "^18.2.18",
116
+ "@types/react-dom": "^18.2.19",
117
117
  "@vitejs/plugin-react": "^4.2.1",
118
118
  "concurrently": "^8.2.2",
119
119
  "prettier": "^3.2.5",
120
120
  "sass": "^1.70.0",
121
121
  "typescript": "^5.3.3",
122
- "vite": "^5.0.12",
122
+ "vite": "^5.1.1",
123
123
  "vitest": "^1.2.2"
124
124
  }
125
125
  }
@@ -14,6 +14,7 @@ import {
14
14
  import { SparklesSVG, StopSVG } from '../../Icons';
15
15
  import { startAIAssist } from '../startAIAssist';
16
16
  import './style.scss';
17
+ import { Spinner } from '../Spinner';
17
18
 
18
19
  const enableStopGeneration = false;
19
20
 
@@ -80,30 +81,28 @@ export const AIAssistWidget = ({
80
81
  : aiStreamId === null;
81
82
 
82
83
  return (
83
- showWidget && (
84
- <div className="vz-code-ai-assist-widget">
85
- <OverlayTrigger
86
- placement="left"
87
- overlay={
88
- <Tooltip id="ai-assist-widget-tooltip">
89
- {aiAssistTooltipText}
90
- </Tooltip>
91
- }
92
- >
93
- <i
94
- className="icon-button icon-button-dark"
95
- onClick={aiAssistClickOverride || handleClick}
84
+ <div className="vz-code-ai-assist-widget">
85
+ {aiStreamId ? (
86
+ <Spinner /> // Show spinner when aiStreamId is not null
87
+ ) : (
88
+ showWidget && (
89
+ <OverlayTrigger
90
+ placement="left"
91
+ overlay={
92
+ <Tooltip id="ai-assist-widget-tooltip">
93
+ {aiAssistTooltipText}
94
+ </Tooltip>
95
+ }
96
96
  >
97
- {aiStreamId ? (
98
- enableStopGeneration ? (
99
- <StopSVG />
100
- ) : null
101
- ) : (
97
+ <i
98
+ className="icon-button icon-button-dark"
99
+ onClick={aiAssistClickOverride || handleClick}
100
+ >
102
101
  <SparklesSVG />
103
- )}
104
- </i>
105
- </OverlayTrigger>
106
- </div>
107
- )
102
+ </i>
103
+ </OverlayTrigger>
104
+ )
105
+ )}
106
+ </div>
108
107
  );
109
108
  };
@@ -4,3 +4,42 @@
4
4
  right: 32px;
5
5
  color: var(--vh-color-caution-01);
6
6
  }
7
+
8
+ .vh-spinner {
9
+ display: flex;
10
+ height: 100%;
11
+ flex-direction: column;
12
+ align-items: center;
13
+ justify-content: center;
14
+ overflow: hidden;
15
+ }
16
+
17
+ /* Fade in after a delay */
18
+ /* https://stackoverflow.com/questions/29846224/css-animation-with-delay-and-opacity */
19
+ .vh-spinner.fade-in svg {
20
+ animation: 1s linear 0s normal forwards 1 fadein;
21
+ }
22
+
23
+ @keyframes fadein {
24
+ 0% {
25
+ opacity: 0;
26
+ }
27
+ 50% {
28
+ opacity: 0;
29
+ }
30
+ 100% {
31
+ opacity: 1;
32
+ }
33
+ }
34
+
35
+ /* Infinite rotation */
36
+ /* https://stackoverflow.com/questions/6410730/css-endless-rotation-animation */
37
+ .vh-spinner-dots {
38
+ animation: rotate 3s linear infinite;
39
+ }
40
+
41
+ @keyframes rotate {
42
+ to {
43
+ transform: rotate(360deg);
44
+ }
45
+ }
@@ -0,0 +1,76 @@
1
+ // From https://github.com/vizhub-core/vizhub/commit/6ca078935b9771dc6e05a6065bcfd522a4724dcf
2
+ import { useEffect, useState } from 'react';
3
+ import './AIAssistWidget/style.scss';
4
+
5
+ // const minRadius = 4;
6
+ // const maxRadius = 10;
7
+ // const numDots = 8;
8
+ // const wheelRadius = 40;
9
+ // const round = (number) => Math.floor(number * 100) / 100;
10
+ // const dots = [];
11
+ // for (let i = 0; i < numDots; i++) {
12
+ // const angle = (i / numDots) * Math.PI * 2;
13
+ // dots.push({
14
+ // x: round(Math.cos(angle) * wheelRadius),
15
+ // y: round(Math.sin(angle) * wheelRadius),
16
+ // r: round(
17
+ // minRadius +
18
+ // (i / (numDots - 1)) * (maxRadius - minRadius),
19
+ // ),
20
+ // });
21
+ // }
22
+ // console.log(JSON.stringify(dots));
23
+
24
+ // Hardcoded to avoid the computation.
25
+ const dots = [
26
+ { x: 40, y: 0, r: 4 },
27
+ { x: 28.28, y: 28.28, r: 4.85 },
28
+ { x: 0, y: 40, r: 5.71 },
29
+ { x: -28.29, y: 28.28, r: 6.57 },
30
+ { x: -40, y: 0, r: 7.42 },
31
+ { x: -28.29, y: -28.29, r: 8.28 },
32
+ { x: -0.01, y: -40, r: 9.14 },
33
+ { x: 28.28, y: -28.29, r: 10 },
34
+ ];
35
+
36
+ // From https://bl.ocks.org/curran/685fa8300650c4324d571c6b0ecc55de
37
+ // And vizhub-v2/packages/neoFrontend/src/LoadingScreen/index.js
38
+ export const Spinner = ({
39
+ height = 40,
40
+ fill = 'currentcolor',
41
+ fadeIn = true,
42
+ }) => {
43
+ const [show, setShow] = useState(false);
44
+
45
+ // Avoid SSR of all the SVG elements.
46
+ useEffect(() => {
47
+ setShow(true);
48
+ }, []);
49
+
50
+ return (
51
+ show && (
52
+ <div
53
+ className={`vh-spinner${fadeIn ? ' fade-in' : ''}`}
54
+ >
55
+ <svg
56
+ height={height}
57
+ viewBox="0 0 100 100"
58
+ style={{ opacity: 1 }}
59
+ >
60
+ <g transform="translate(50, 50)" fill={fill}>
61
+ <g className="vh-spinner-dots">
62
+ {dots.map(({ x, y, r }, i) => (
63
+ <circle
64
+ key={i}
65
+ cx={x}
66
+ cy={y}
67
+ r={r}
68
+ ></circle>
69
+ ))}
70
+ </g>
71
+ </g>
72
+ </svg>
73
+ </div>
74
+ )
75
+ );
76
+ };
@@ -1,4 +1,9 @@
1
- import { createContext, useReducer } from 'react';
1
+ import {
2
+ createContext,
3
+ useCallback,
4
+ useReducer,
5
+ useState,
6
+ } from 'react';
2
7
  import {
3
8
  Files,
4
9
  ShareDBDoc,
@@ -25,6 +30,7 @@ import {
25
30
  useEditorCache,
26
31
  } from './useEditorCache';
27
32
  import { useURLSync } from './useURLSync';
33
+ import { useKeyboardShortcuts } from './useKeyboardShortcuts';
28
34
 
29
35
  // This context centralizes all the "smart" logic
30
36
  // to do with the application state. This includes
@@ -51,6 +57,8 @@ export type VZCodeContextValue = {
51
57
 
52
58
  activeFileId: string | null;
53
59
  setActiveFileId: (fileId: string | null) => void;
60
+ setActiveFileLeft: () => void;
61
+ setActiveFileRight: () => void;
54
62
 
55
63
  tabList: Array<TabState>;
56
64
  openTab: ({
@@ -82,6 +90,11 @@ export type VZCodeContextValue = {
82
90
  errorMessage: string | null;
83
91
 
84
92
  typeScriptWorker: Worker | null;
93
+
94
+ isCreateFileModalOpen: boolean;
95
+ handleOpenCreateFileModal: () => void;
96
+ handleCloseCreateFileModal: () => void;
97
+ handleCreateFileClick: (newFileName: string) => void;
85
98
  };
86
99
 
87
100
  export const VZCodeProvider = ({
@@ -164,6 +177,8 @@ export const VZCodeProvider = ({
164
177
  // Functions for dispatching actions to the reducer.
165
178
  const {
166
179
  setActiveFileId,
180
+ setActiveFileLeft,
181
+ setActiveFileRight,
167
182
  openTab,
168
183
  closeTabs,
169
184
  setTheme,
@@ -205,6 +220,34 @@ export const VZCodeProvider = ({
205
220
  openTab,
206
221
  });
207
222
 
223
+ // State to control the create file modal's visibility
224
+ const [isCreateFileModalOpen, setIsCreateFileModalOpen] =
225
+ useState(false);
226
+
227
+ const handleOpenCreateFileModal = useCallback(() => {
228
+ setIsCreateFileModalOpen(true);
229
+ }, []);
230
+
231
+ const handleCloseCreateFileModal = useCallback(() => {
232
+ setIsCreateFileModalOpen(false);
233
+ }, []);
234
+
235
+ const handleCreateFileClick = useCallback(
236
+ (newFileName: string) => {
237
+ createFile(newFileName);
238
+ setIsCreateFileModalOpen(false);
239
+ },
240
+ [createFile, setIsCreateFileModalOpen],
241
+ );
242
+
243
+ useKeyboardShortcuts({
244
+ closeTabs,
245
+ activeFileId,
246
+ handleOpenCreateFileModal,
247
+ setActiveFileLeft,
248
+ setActiveFileRight,
249
+ });
250
+
208
251
  // Isolate the files object from the document.
209
252
  const files: Files | null = content
210
253
  ? content.files
@@ -226,6 +269,8 @@ export const VZCodeProvider = ({
226
269
 
227
270
  activeFileId,
228
271
  setActiveFileId,
272
+ setActiveFileLeft,
273
+ setActiveFileRight,
229
274
 
230
275
  tabList,
231
276
  openTab,
@@ -251,6 +296,11 @@ export const VZCodeProvider = ({
251
296
  errorMessage,
252
297
 
253
298
  typeScriptWorker,
299
+
300
+ isCreateFileModalOpen,
301
+ handleOpenCreateFileModal,
302
+ handleCloseCreateFileModal,
303
+ handleCreateFileClick,
254
304
  };
255
305
 
256
306
  return (
@@ -1,57 +1,19 @@
1
- import { useContext } from 'react';
2
1
  import { VZSettings } from './VZSettings';
3
2
  import { VZSidebar } from './VZSidebar';
4
- import { VZCodeContext } from './VZCodeContext';
3
+ import { CreateFileModal } from './VZSidebar/CreateFileModal';
5
4
 
6
5
  // The middle portion of the VZCode environment, containing:
7
6
  // * The sidebar
8
7
  // * The settings modal
8
+ // * The create file modal
9
9
  export const VZLeft = ({ enableUsernameField = true }) => {
10
- // TODO leverage this context in deeper levels of the component tree.
11
- const {
12
- files,
13
- createFile,
14
- renameFile,
15
- deleteFile,
16
- deleteDirectory,
17
- activeFileId,
18
- openTab,
19
- closeTabs,
20
- isSettingsOpen,
21
- setIsSettingsOpen,
22
- closeSettings,
23
- theme,
24
- setTheme,
25
- username,
26
- setUsername,
27
- isDirectoryOpen,
28
- toggleDirectory,
29
- } = useContext(VZCodeContext);
30
-
31
10
  return (
32
11
  <div className="left">
33
- <VZSidebar
34
- files={files}
35
- createFile={createFile}
36
- renameFile={renameFile}
37
- deleteFile={deleteFile}
38
- deleteDirectory={deleteDirectory}
39
- openTab={openTab}
40
- closeTabs={closeTabs}
41
- setIsSettingsOpen={setIsSettingsOpen}
42
- isDirectoryOpen={isDirectoryOpen}
43
- toggleDirectory={toggleDirectory}
44
- activeFileId={activeFileId}
45
- />
12
+ <VZSidebar />
46
13
  <VZSettings
47
- show={isSettingsOpen}
48
- onClose={closeSettings}
49
- theme={theme}
50
- setTheme={setTheme}
51
- username={username}
52
- setUsername={setUsername}
53
14
  enableUsernameField={enableUsernameField}
54
15
  />
16
+ <CreateFileModal />
55
17
  </div>
56
18
  );
57
19
  };
@@ -1,67 +1,40 @@
1
- import { useCallback, useRef } from 'react';
1
+ import { useCallback, useContext, useRef } from 'react';
2
2
  import { Button, Modal, Form } from './bootstrap';
3
- import { ThemeLabel, themes } from './themes';
4
- import { Username } from '../types';
5
-
6
- // const saveTimes = [
7
- // { value: 1, label: '1 second' },
8
- // { value: 5, label: '5 seconds' },
9
- // { value: 10, label: '10 seconds' },
10
- // { value: 30, label: '30 seconds' },
11
- // ];
3
+ import { themes } from './themes';
4
+ import { VZCodeContext } from './VZCodeContext';
12
5
 
13
6
  export const VZSettings = ({
14
- show,
15
- onClose,
16
- theme,
17
- setTheme,
18
- username,
19
- setUsername,
20
-
21
7
  enableUsernameField = true,
22
8
  }: {
23
- show: boolean;
24
- onClose: () => void;
25
- theme: ThemeLabel;
26
- setTheme: (theme: ThemeLabel) => void;
27
- username: Username;
28
- setUsername: (username: Username) => void;
29
-
30
9
  // Feature flag to enable/disable username field
31
10
  enableUsernameField?: boolean;
32
11
  }) => {
12
+ const {
13
+ isSettingsOpen,
14
+ closeSettings,
15
+ theme,
16
+ setTheme,
17
+ username,
18
+ setUsername,
19
+ } = useContext(VZCodeContext);
20
+
33
21
  const handleThemeChange = useCallback((event) => {
34
22
  const selectedValue = event.target.value;
35
23
  console.log(selectedValue);
36
24
  setTheme(selectedValue);
37
25
  }, []);
38
26
 
39
- // TODO https://github.com/vizhub-core/vzcode/issues/95
40
- // const handleSaveTimeChange = useCallback(
41
- // (selectedOption) => {
42
- // const time = [{ value: selectedOption.value }];
43
- // fetch('/saveTime', {
44
- // method: 'POST',
45
- // headers: {
46
- // 'Content-Type': 'application/json',
47
- // },
48
- // body: JSON.stringify(time),
49
- // });
50
- // },
51
- // [],
52
- // );
53
-
54
27
  const usernameRef = useRef<HTMLInputElement>(null);
55
28
 
56
29
  const handleUsernameChange = useCallback(() => {
57
30
  setUsername(usernameRef.current?.value || '');
58
31
  }, [setUsername]);
59
32
 
60
- return show ? (
33
+ return isSettingsOpen ? (
61
34
  <Modal
62
35
  className="vz-settings"
63
- show={show}
64
- onHide={onClose}
36
+ show={isSettingsOpen}
37
+ onHide={closeSettings}
65
38
  animation={false}
66
39
  >
67
40
  <Modal.Header closeButton>
@@ -104,21 +77,9 @@ export const VZSettings = ({
104
77
  Select a color theme for the editor
105
78
  </Form.Text>
106
79
  </Form.Group>
107
- {/*
108
- TODO https://github.com/vizhub-core/vzcode/issues/95
109
- <Form.Group className="mb-3" controlId="formFork">
110
- <Form.Label>Auto-Save Time</Form.Label>
111
- <Select
112
- options={saveTimes}
113
- onChange={handleSaveTimeChange}
114
- />
115
- <Form.Text className="text-muted">
116
- Select an auto save time
117
- </Form.Text>
118
- </Form.Group> */}
119
80
  </Modal.Body>
120
81
  <Modal.Footer>
121
- <Button variant="primary" onClick={onClose}>
82
+ <Button variant="primary" onClick={closeSettings}>
122
83
  Done
123
84
  </Button>
124
85
  </Modal.Footer>
@@ -3,32 +3,37 @@ import {
3
3
  useCallback,
4
4
  useRef,
5
5
  useEffect,
6
+ useContext,
6
7
  } from 'react';
7
8
  import { Modal, Form, Button } from '../bootstrap';
9
+ import { VZCodeContext } from '../VZCodeContext';
8
10
 
9
11
  export const CreateFileModal = ({
10
- show,
11
- onClose,
12
- onRename,
13
12
  initialFileName = '',
14
13
  }) => {
15
14
  const [newName, setNewName] = useState(initialFileName);
16
15
  const inputRef = useRef(null);
17
16
 
17
+ const {
18
+ isCreateFileModalOpen,
19
+ handleCloseCreateFileModal,
20
+ handleCreateFileClick,
21
+ } = useContext(VZCodeContext);
22
+
18
23
  useEffect(() => {
19
- if (show && inputRef.current) {
24
+ if (isCreateFileModalOpen && inputRef.current) {
20
25
  inputRef.current.focus();
21
26
  }
22
- }, [show]);
27
+ }, [isCreateFileModalOpen]);
23
28
 
24
29
  const handleNameChange = useCallback((event) => {
25
30
  setNewName(event.target.value);
26
31
  }, []);
27
32
 
28
- const handleRenameClick = useCallback(() => {
29
- onRename(newName);
33
+ const onCreateClick = useCallback(() => {
34
+ handleCreateFileClick(newName);
30
35
  setNewName('');
31
- }, [newName, onRename]);
36
+ }, [newName, handleCreateFileClick]);
32
37
 
33
38
  // Returns true if file name is valid, false otherwise.
34
39
  const validateFileName = useCallback(
@@ -48,16 +53,16 @@ export const CreateFileModal = ({
48
53
  e.shiftKey ||
49
54
  (!e.altKey && !e.metaKey))
50
55
  ) {
51
- handleRenameClick();
56
+ onCreateClick();
52
57
  }
53
58
  },
54
- [handleRenameClick],
59
+ [onCreateClick],
55
60
  );
56
61
 
57
- return show ? (
62
+ return isCreateFileModalOpen ? (
58
63
  <Modal
59
- show={show}
60
- onHide={onClose}
64
+ show={isCreateFileModalOpen}
65
+ onHide={handleCloseCreateFileModal}
61
66
  animation={false}
62
67
  onKeyDown={handleKeyDown}
63
68
  >
@@ -82,7 +87,7 @@ export const CreateFileModal = ({
82
87
  <Modal.Footer>
83
88
  <Button
84
89
  variant="primary"
85
- onClick={handleRenameClick}
90
+ onClick={onCreateClick}
86
91
  disabled={!validateFileName(newName)}
87
92
  >
88
93
  Create File