UNPKG

@arcgis/coding-components

Version:
3 lines (2 loc) • 6.99 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */ import{a as l}from"./ER2MKLVA.js";import{a as L}from"./MP6Z45SA.js";import{b as g}from"./Y3KOWWO5.js";import{Qk as C,al as h}from"./LLPQEURF.js";var m=Promise.withResolvers(),u=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._modelLifecycleListeners=[],this._isDisposed=!1,this._configChangeListener=this._defaults.onDidChange(()=>this.stopWorker()),this._modelContextChangeListener=this._defaults.onModelContextDidChange(()=>{this._stopWorkerIfUnused()}),this._registerModelLifecycleListeners()}dispose(){for(this._isDisposed=!0,this._configChangeListener.dispose(),this._modelContextChangeListener.dispose();this._modelLifecycleListeners.length;)this._modelLifecycleListeners.pop()?.dispose();this.stopWorker()}stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null,m=Promise.withResolvers()),this._client=null}static async waitForWorker(){return await m.promise}async _registerModelLifecycleListeners(){let e=await l();this._isDisposed||this._modelLifecycleListeners.push(e.onWillDisposeModel(()=>{this._stopWorkerIfUnused()}),e.onDidChangeModelLanguage(()=>{this._stopWorkerIfUnused()}))}async _stopWorkerIfUnused(){this._worker&&((await l()).getModels().some(e=>e.getLanguageId()===this._defaults.languageId)||this.stopWorker())}async _getClientProxy(){let e=await l();if(!this._client){let{languageId:t}=this._defaults,o=window.MonacoEnvironment?.getWorker;if(!o)throw new Error("MonacoEnvironment.getWorker is not configured. Call setupMonacoEnvironment(...) before creating SQL Layer workers.");this._worker=e.createWebWorker({worker:o("SqlLayerWorker",t),host:this._defaults.workerHost}),m.resolve(this._worker),this._client=this._worker.getProxy()}return await this._client}async getLanguageServiceWorker(...e){let t=await this._getClientProxy();return await this._worker?.withSyncedResources(e),t}},D=i=>{let e=y(i.start),t=y(i.end);return{startRegex:new RegExp(e),contentRegex:new RegExp(`[^${t}]+`),escapedRegex:new RegExp(`${t}${t}`),endRegex:new RegExp(t)}},S=i=>{let e=i.specialChars.identifierQuote;return{comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:e.start,close:e.end}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:e.start,close:e.end}]}},E=i=>{let e=D(i.specialChars.identifierQuote);return{defaultToken:"",tokenPostfix:".arcgis",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:i.keywords,operators:i.operators,builtinFunctions:i.functions,builtinVariables:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[e.startRegex,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[e.contentRegex,"identifier"],[e.escapedRegex,"identifier"],[e.endRegex,{token:"identifier.quote",next:"@pop"}]],scopes:[[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}}},y=i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),_=class{constructor(e,t){this._worker=e,this._defaults=t}async provideCompletionItems(e,t){try{let o=await this._worker(e.uri),a=this._defaults.getApiContextForModel(e.uri),n=e.getWordUntilPosition(t),d={startLineNumber:t.lineNumber,endLineNumber:t.lineNumber,startColumn:n.startColumn,endColumn:n.endColumn};return await o.doComplete(e.uri.toString(),d,t,a)}catch(o){return g("SqlLayerCompletionProvider")(o),{suggestions:[]}}}},f=class{constructor(e,t,{defaults:o,diagnosticService:a}){this._languageId=e,this._worker=t,this._disposables=[],this._modelListeners=new Map,this._defaults=o,this._diagnosticsService=a,l().then(n=>{let d=s=>{let r=s.getLanguageId();if(r!==this._languageId)return;let c=L(()=>{this._doValidate(s,r).catch(M=>{throw M})}),x=s.onDidChangeContent(c),I=s.onDidChangeAttached(c);this._modelListeners.set(s.uri.toString(),[x,I]),this._doValidate(s,r).catch(g("SqlLayerDiagnosticsAdapter"))},p=s=>{let r=s.uri.toString();n.setModelMarkers(s,this._languageId,[]);let c=this._modelListeners.get(r);if(c){for(;c.length;)c.pop()?.dispose();this._modelListeners.delete(r)}};this._disposables.push(n.onDidCreateModel(d)),this._disposables.push(n.onWillDisposeModel(s=>p(s))),this._disposables.push(n.onDidChangeModelLanguage(s=>{p(s.model),d(s.model)})),this._disposables.push(o.onDidChange(()=>{n.getModels().forEach(s=>{s.getLanguageId()===this._languageId&&(p(s),d(s))})})),this._disposables.push(o.onModelContextDidChange(s=>{n.getModels().forEach(r=>{r.getLanguageId()===this._languageId&&r.uri.toString()===s&&this._doValidate(r,this._languageId).catch(g("SqlLayerDiagnosticsAdapter"))})})),this._disposables.push({dispose:()=>{this._modelListeners.forEach(s=>s.forEach(r=>r.dispose())),this._modelListeners.clear()}}),n.getModels().forEach(d)})}async _doValidate(e,t){let o=await l();if(e.isAttachedToEditor())try{let a=await this._worker(e.uri),n=this._defaults.getApiContextForModel(e.uri),d=await a.doValidation(e.uri.toString(),n);this._diagnosticsService.fireDiagnosticsChange(e.uri,d),o.setModelMarkers(e,t,d)}catch(a){g("SqlLayerDiagnosticsAdapter")(a)}}},w;async function T(...i){return await u.waitForWorker(),await new Promise((e,t)=>{if(!w){t(new Error("SQL layer worker not registered!"));return}e(w(...i))})}var k=class{constructor(){this._onDiagnosticsChange=new C}get onDiagnosticsChange(){return this._onDiagnosticsChange.event}fireDiagnosticsChange(e,t){this._onDiagnosticsChange.fire({uri:e,diagnostics:t})}},b=new k;function H(){return b}async function Q(i){let e=new u(i),t=async(...a)=>await e.getLanguageServiceWorker(...a);w=t;let o=await i.getDialectSpec();h.setMonarchTokensProvider(i.languageId,E(o)),h.setLanguageConfiguration(i.languageId,S(o)),h.registerCompletionItemProvider(i.languageId,new _(t,i)),new f(i.languageId,t,{defaults:i,diagnosticService:b})}export{T as a,H as b,Q as c};