vzcode 0.64.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,7 +20,7 @@
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-ozxHHf72.js"></script>
23
+ <script type="module" crossorigin src="/assets/index-DqZSunfv.js"></script>
24
24
  <link rel="stylesheet" crossorigin href="/assets/index-Bh7FzEWq.css">
25
25
  </head>
26
26
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vzcode",
3
- "version": "0.64.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",
@@ -119,7 +119,7 @@
119
119
  "prettier": "^3.2.5",
120
120
  "sass": "^1.70.0",
121
121
  "typescript": "^5.3.3",
122
- "vite": "^5.1.0",
122
+ "vite": "^5.1.1",
123
123
  "vitest": "^1.2.2"
124
124
  }
125
125
  }
@@ -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
@@ -1,16 +1,8 @@
1
- import {
2
- useCallback,
3
- useContext,
4
- useMemo,
5
- useState,
6
- useEffect,
7
- } from 'react';
1
+ import { useCallback, useContext, useMemo } from 'react';
8
2
  import {
9
3
  FileId,
10
4
  FileTree,
11
5
  FileTreeFile,
12
- FileTreePath,
13
- Files,
14
6
  } from '../../types';
15
7
  import { Tooltip, OverlayTrigger } from '../bootstrap';
16
8
  import { getFileTree } from '../getFileTree';
@@ -19,7 +11,7 @@ import { disableSettings } from '../featureFlags';
19
11
  import { SplitPaneResizeContext } from '../SplitPaneResizeContext';
20
12
  import { BugSVG, GearSVG, NewSVG } from '../Icons';
21
13
  import { Listing } from './Listing';
22
- import { CreateFileModal } from './CreateFileModal';
14
+ import { VZCodeContext } from '../VZCodeContext';
23
15
  import './styles.scss';
24
16
 
25
17
  // TODO turn this UI back on when we are actually detecting
@@ -28,89 +20,32 @@ import './styles.scss';
28
20
  const enableConnectionStatus = false;
29
21
 
30
22
  export const VZSidebar = ({
31
- files,
32
- createFile,
33
23
  createFileTooltipText = 'New File',
34
- renameFile,
35
- deleteFile,
36
- deleteDirectory,
37
- openTab,
38
- closeTabs,
39
- setIsSettingsOpen,
40
- isDirectoryOpen,
41
- toggleDirectory,
42
- activeFileId,
43
24
  openSettingsTooltipText = 'Open Settings',
44
25
  reportBugTooltipText = 'Report Bug',
45
26
  }: {
46
- files: Files;
47
- createFile: (fileName) => void;
48
27
  createFileTooltipText?: string;
49
- renameFile: (fileId: FileId, newName: string) => void;
50
- deleteFile: (fileId: FileId) => void;
51
- deleteDirectory: (path: FileTreePath) => void;
52
- openTab: ({
53
- fileId,
54
- isTransient,
55
- }: {
56
- fileId: FileId;
57
- isTransient?: boolean;
58
- }) => void;
59
- closeTabs: (fileIds: FileId[]) => void;
60
- setIsSettingsOpen: (isSettingsOpen: boolean) => void;
61
- isDirectoryOpen: (path: string) => boolean;
62
- toggleDirectory: (path: string) => void;
63
- activeFileId?: FileId;
64
28
  openSettingsTooltipText?: string;
65
29
  reportBugTooltipText?: string;
66
30
  }) => {
31
+ const {
32
+ files,
33
+ renameFile,
34
+ deleteFile,
35
+ deleteDirectory,
36
+ activeFileId,
37
+ openTab,
38
+ setIsSettingsOpen,
39
+ isDirectoryOpen,
40
+ toggleDirectory,
41
+ handleOpenCreateFileModal,
42
+ } = useContext(VZCodeContext);
43
+
67
44
  const fileTree = useMemo(
68
45
  () => (files ? sortFileTree(getFileTree(files)) : null),
69
46
  [files],
70
47
  );
71
48
 
72
- const [isModalOpen, setIsModalOpen] = useState(false); // State to control the modal's visibility
73
-
74
- const handleCreateFile = useCallback(() => {
75
- setIsModalOpen(true);
76
- }, [setIsModalOpen]);
77
-
78
- const handleCloseModal = useCallback(() => {
79
- setIsModalOpen(false);
80
- }, [setIsModalOpen]);
81
-
82
- const handleRename = useCallback(
83
- (newFileName: string) => {
84
- createFile(newFileName);
85
- setIsModalOpen(false);
86
- },
87
- [createFile, setIsModalOpen],
88
- );
89
-
90
- const handleKeyPress = useCallback(
91
- (event: { altKey: boolean; key: string }) => {
92
- if (event.altKey == true) {
93
- if (event.key == 'w') {
94
- closeTabs([activeFileId]);
95
- }
96
- if (event.key == 'n') {
97
- handleCreateFile();
98
- }
99
- }
100
- },
101
- [createFile, closeTabs, activeFileId],
102
- );
103
-
104
- useEffect(() => {
105
- document.addEventListener('keydown', handleKeyPress);
106
- return () => {
107
- document.removeEventListener(
108
- 'keydown',
109
- handleKeyPress,
110
- );
111
- };
112
- }, [handleKeyPress]);
113
-
114
49
  const handleSettingsClick = useCallback(() => {
115
50
  setIsSettingsOpen(true);
116
51
  }, []);
@@ -196,7 +131,7 @@ export const VZSidebar = ({
196
131
  }
197
132
  >
198
133
  <i
199
- onClick={handleCreateFile}
134
+ onClick={handleOpenCreateFileModal}
200
135
  className="icon-button icon-button-dark"
201
136
  >
202
137
  <NewSVG />
@@ -246,11 +181,6 @@ export const VZSidebar = ({
246
181
  </div>
247
182
  </div>
248
183
  )}
249
- <CreateFileModal
250
- show={isModalOpen}
251
- onClose={handleCloseModal}
252
- onRename={handleRename}
253
- />
254
184
  </div>
255
185
  );
256
186
  };
@@ -18,6 +18,14 @@ export const useActions = (
18
18
  [dispatch],
19
19
  );
20
20
 
21
+ const setActiveFileLeft = useCallback(() => {
22
+ dispatch({ type: 'set_active_file_left' });
23
+ }, [dispatch]);
24
+
25
+ const setActiveFileRight = useCallback(() => {
26
+ dispatch({ type: 'set_active_file_right' });
27
+ }, [dispatch]);
28
+
21
29
  const openTab = useCallback(
22
30
  (tabState: TabState): void => {
23
31
  dispatch({
@@ -82,6 +90,8 @@ export const useActions = (
82
90
 
83
91
  return {
84
92
  setActiveFileId,
93
+ setActiveFileLeft,
94
+ setActiveFileRight,
85
95
  openTab,
86
96
  closeTabs,
87
97
  setTheme,