diffusers-workflow 0.4.0a3__py3-none-any.whl
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.
- diffusers_workflow-0.4.0a3.dist-info/METADATA +310 -0
- diffusers_workflow-0.4.0a3.dist-info/RECORD +171 -0
- diffusers_workflow-0.4.0a3.dist-info/WHEEL +5 -0
- diffusers_workflow-0.4.0a3.dist-info/entry_points.txt +6 -0
- diffusers_workflow-0.4.0a3.dist-info/licenses/LICENSE +201 -0
- diffusers_workflow-0.4.0a3.dist-info/top_level.txt +1 -0
- dw/__init__.py +353 -0
- dw/arguments.py +906 -0
- dw/cache_blocks.json +16 -0
- dw/cache_blocks.py +145 -0
- dw/community_pipelines/pipeline_flux_rf_inversion.py +1184 -0
- dw/events.py +78 -0
- dw/hub_cache.py +289 -0
- dw/introspection.py +458 -0
- dw/log_setup.py +45 -0
- dw/pipeline_processors/chain.py +750 -0
- dw/pipeline_processors/config_objects.py +235 -0
- dw/pipeline_processors/pipeline.py +1687 -0
- dw/pipeline_processors/remote.py +18 -0
- dw/previous_results.py +259 -0
- dw/prompt_weighting.py +378 -0
- dw/repl.py +298 -0
- dw/repl_commands.py +808 -0
- dw/repl_worker.py +129 -0
- dw/result.py +850 -0
- dw/run.py +92 -0
- dw/schema.py +24 -0
- dw/security.py +379 -0
- dw/serve.py +70 -0
- dw/server/__init__.py +2 -0
- dw/server/app.py +588 -0
- dw/server/jobs.py +547 -0
- dw/server/ui/assets/abap-08VXUWAP.js +1 -0
- dw/server/ui/assets/apex-BWPQTe0t.js +1 -0
- dw/server/ui/assets/azcli-Bc_sGQ0U.js +1 -0
- dw/server/ui/assets/bat-i0X4ZdIN.js +1 -0
- dw/server/ui/assets/bicep-B5-_aFwp.js +2 -0
- dw/server/ui/assets/cameligo-DMUM7wLl.js +1 -0
- dw/server/ui/assets/clojure-Cm7r79vr.js +1 -0
- dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
- dw/server/ui/assets/coffee-Ba7i2nA0.js +1 -0
- dw/server/ui/assets/cpp-C7h46wYY.js +1 -0
- dw/server/ui/assets/csharp-BKxtCVv1.js +1 -0
- dw/server/ui/assets/csp-bTuwJoIa.js +1 -0
- dw/server/ui/assets/css-DIMkf-bt.js +3 -0
- dw/server/ui/assets/css.worker-B3ciXF_0.js +93 -0
- dw/server/ui/assets/cssMode-CEh6hWi2.js +1 -0
- dw/server/ui/assets/cypher-CVaqCwHa.js +1 -0
- dw/server/ui/assets/dart-onAF5SnQ.js +1 -0
- dw/server/ui/assets/dockerfile-DZFCIeNp.js +1 -0
- dw/server/ui/assets/ecl-D05T4iGw.js +1 -0
- dw/server/ui/assets/editor-jjEx9u7D.css +1 -0
- dw/server/ui/assets/editor.api-CExg3_mM.js +847 -0
- dw/server/ui/assets/editor.worker-q-txB4vs.js +30 -0
- dw/server/ui/assets/elixir-6RTg0lbw.js +1 -0
- dw/server/ui/assets/flow9-C5_-GSwl.js +1 -0
- dw/server/ui/assets/freemarker2-DH6orYh2.js +3 -0
- dw/server/ui/assets/fsharp-C8Ef5oNN.js +1 -0
- dw/server/ui/assets/go-C-y9NEjX.js +1 -0
- dw/server/ui/assets/graphql-fmXr3nnJ.js +1 -0
- dw/server/ui/assets/handlebars-CbrMVW4Q.js +1 -0
- dw/server/ui/assets/hcl-CpzslTdj.js +1 -0
- dw/server/ui/assets/html-YDNPZw2M.js +1 -0
- dw/server/ui/assets/html.worker-C93Ht9o9.js +506 -0
- dw/server/ui/assets/htmlMode-B_zSGWO2.js +1 -0
- dw/server/ui/assets/index-B7-VcYS-.css +1 -0
- dw/server/ui/assets/index-D_EiPU3b.js +13 -0
- dw/server/ui/assets/ini-sBoK_t0W.js +1 -0
- dw/server/ui/assets/java-BEtHBSE6.js +1 -0
- dw/server/ui/assets/javascript-dYuBvioq.js +1 -0
- dw/server/ui/assets/json.worker-B2V3pomh.js +62 -0
- dw/server/ui/assets/jsonMode-CUqLM39V.js +7 -0
- dw/server/ui/assets/julia-Bri6UV-V.js +1 -0
- dw/server/ui/assets/kotlin-BOotOW0E.js +1 -0
- dw/server/ui/assets/less-B9JPFI3C.js +2 -0
- dw/server/ui/assets/lexon-CfSJPG6W.js +1 -0
- dw/server/ui/assets/liquid-D6vxBzMv.js +1 -0
- dw/server/ui/assets/lspLanguageFeatures-1WJ2palX.js +4 -0
- dw/server/ui/assets/lua-CsQS60Ue.js +1 -0
- dw/server/ui/assets/m3-D-oSqn_W.js +1 -0
- dw/server/ui/assets/markdown-Cimd5fb3.js +1 -0
- dw/server/ui/assets/mdx-SHQb6vmD.js +1 -0
- dw/server/ui/assets/mips-CIPQ_RoX.js +1 -0
- dw/server/ui/assets/monaco--ixms01u.css +1 -0
- dw/server/ui/assets/monaco-CP-s5rcP.js +56 -0
- dw/server/ui/assets/msdax-DauUninz.js +1 -0
- dw/server/ui/assets/mysql-SOo6toE5.js +1 -0
- dw/server/ui/assets/objective-c-FvmIjYaQ.js +1 -0
- dw/server/ui/assets/pascal-DrH0SRf2.js +1 -0
- dw/server/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
- dw/server/ui/assets/perl-oz_6vUea.js +1 -0
- dw/server/ui/assets/pgsql-DTj74zXo.js +1 -0
- dw/server/ui/assets/php-nr791fC2.js +1 -0
- dw/server/ui/assets/pla-CopQ2nXW.js +1 -0
- dw/server/ui/assets/postiats-43DmfD33.js +1 -0
- dw/server/ui/assets/powerquery-D3hlyOfw.js +1 -0
- dw/server/ui/assets/powershell-DmHpPYUd.js +1 -0
- dw/server/ui/assets/protobuf-C531GsRP.js +2 -0
- dw/server/ui/assets/pug-Z5eAx3Zn.js +1 -0
- dw/server/ui/assets/python-x0_EGHq9.js +1 -0
- dw/server/ui/assets/qsharp-DkqhCAOL.js +1 -0
- dw/server/ui/assets/r-BwWrilGY.js +1 -0
- dw/server/ui/assets/razor-BZC4LQDP.js +1 -0
- dw/server/ui/assets/redis-ClamHrr6.js +1 -0
- dw/server/ui/assets/redshift-DT7zqm-g.js +1 -0
- dw/server/ui/assets/restructuredtext-BYgofb2h.js +1 -0
- dw/server/ui/assets/ruby-DezsRK8O.js +1 -0
- dw/server/ui/assets/rust-DdL9SqIa.js +1 -0
- dw/server/ui/assets/sb-CcwsVR0C.js +1 -0
- dw/server/ui/assets/scala-DHpiXF5c.js +1 -0
- dw/server/ui/assets/scheme-BeGwcela.js +1 -0
- dw/server/ui/assets/scss-gp-XZpBa.js +3 -0
- dw/server/ui/assets/shell-CC2rA5mh.js +1 -0
- dw/server/ui/assets/solidity-BEEn4gHE.js +1 -0
- dw/server/ui/assets/sophia-CRfGWb83.js +1 -0
- dw/server/ui/assets/sparql-D_Lu-MrJ.js +1 -0
- dw/server/ui/assets/sql-NEE52Syq.js +1 -0
- dw/server/ui/assets/st-DbInun42.js +1 -0
- dw/server/ui/assets/swift-Bxkupp3x.js +1 -0
- dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
- dw/server/ui/assets/tcl-DISqw1ZD.js +1 -0
- dw/server/ui/assets/ts.worker-D7T1-Ig5.js +67738 -0
- dw/server/ui/assets/tsMode-BTfA6SbD.js +11 -0
- dw/server/ui/assets/twig-De2hgUGE.js +1 -0
- dw/server/ui/assets/typescript-CWA4MsNk.js +1 -0
- dw/server/ui/assets/typespec-B8J7ngcE.js +1 -0
- dw/server/ui/assets/vb-DV3o63ZY.js +1 -0
- dw/server/ui/assets/wgsl-DpFanUEy.js +298 -0
- dw/server/ui/assets/workers-CWU0uvj5.js +1 -0
- dw/server/ui/assets/xml-KmfTm3rg.js +1 -0
- dw/server/ui/assets/yaml-nFO_dDS6.js +1 -0
- dw/server/ui/index.html +17 -0
- dw/settings.py +77 -0
- dw/step.py +132 -0
- dw/tasks/audio_utils.py +266 -0
- dw/tasks/background_remover.py +43 -0
- dw/tasks/borders.py +113 -0
- dw/tasks/concat_videos.py +80 -0
- dw/tasks/depth_estimator.py +54 -0
- dw/tasks/diffusion_upscale.py +109 -0
- dw/tasks/format_messages.py +24 -0
- dw/tasks/gather.py +139 -0
- dw/tasks/image_to_text.py +43 -0
- dw/tasks/image_utils.py +661 -0
- dw/tasks/interpolate_frames.py +227 -0
- dw/tasks/model_cache.py +39 -0
- dw/tasks/pair_audio.py +58 -0
- dw/tasks/qr_code.py +19 -0
- dw/tasks/restore_faces.py +175 -0
- dw/tasks/rife_model.py +192 -0
- dw/tasks/segment.py +121 -0
- dw/tasks/task.py +474 -0
- dw/tasks/tensor_image.py +57 -0
- dw/tasks/text_generation.py +168 -0
- dw/tasks/text_sections.py +80 -0
- dw/tasks/upscale.py +203 -0
- dw/tasks/video_utils.py +154 -0
- dw/tasks/zoe_depth.py +71 -0
- dw/teacache.py +376 -0
- dw/teacache_models.json +99 -0
- dw/test.py +29 -0
- dw/type_helpers.py +68 -0
- dw/validate.py +43 -0
- dw/variables.py +153 -0
- dw/worker.py +517 -0
- dw/workflow.py +553 -0
- dw/workflow_schema.json +1157 -0
- dw/workflows/augment_prompt.json +65 -0
- dw/workflows/describe_image.json +58 -0
- dw/workflows/h3_context_ir.json +57 -0
- dw/workflows/test.json +31 -0
dw/server/jobs.py
ADDED
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
"""Job queue over the persistent worker process.
|
|
2
|
+
|
|
3
|
+
One runner thread executes jobs FIFO against the single GPU worker - the
|
|
4
|
+
same WorkerManager the REPL uses. Jobs collect their progress events with
|
|
5
|
+
sequence numbers so an SSE client can attach late (or reconnect) and replay
|
|
6
|
+
from where it left off.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import copy
|
|
11
|
+
import json
|
|
12
|
+
import sqlite3
|
|
13
|
+
import time
|
|
14
|
+
import uuid
|
|
15
|
+
import logging
|
|
16
|
+
import threading
|
|
17
|
+
|
|
18
|
+
from ..repl_worker import WorkerManager
|
|
19
|
+
from ..workflow import workflow_from_file, workflow_from_definition
|
|
20
|
+
from ..introspection import workflow_argument_warnings
|
|
21
|
+
from ..security import validate_output_path
|
|
22
|
+
from ..settings import resolve_path
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger("dw")
|
|
25
|
+
|
|
26
|
+
QUEUED = "queued"
|
|
27
|
+
RUNNING = "running"
|
|
28
|
+
SUCCEEDED = "succeeded"
|
|
29
|
+
FAILED = "failed"
|
|
30
|
+
CANCELLED = "cancelled"
|
|
31
|
+
TERMINAL_STATES = (SUCCEEDED, FAILED, CANCELLED)
|
|
32
|
+
|
|
33
|
+
# The spec fields a rerun needs - shared by persistence and live rerun
|
|
34
|
+
RERUN_SPEC_KEYS = ("workflow_path", "workflow", "base_dir")
|
|
35
|
+
|
|
36
|
+
# Finished jobs kept in memory for SSE replay grace; older ones live in
|
|
37
|
+
# history only, so a long-running server's memory stays bounded
|
|
38
|
+
TERMINAL_JOBS_KEPT = 20
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class JobHistory:
|
|
42
|
+
"""Finished jobs, persisted so the Jobs view survives server restarts.
|
|
43
|
+
|
|
44
|
+
Records land at terminal state only - a crash mid-run loses that run's
|
|
45
|
+
row, which is the right trade for never blocking the runner on disk.
|
|
46
|
+
Events are not persisted; a historical job is its outcome (status,
|
|
47
|
+
manifest, error) plus enough of the spec to run it again.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, db_path):
|
|
51
|
+
self.db_path = str(db_path)
|
|
52
|
+
self._lock = threading.Lock()
|
|
53
|
+
with self._connect() as connection:
|
|
54
|
+
connection.execute("""CREATE TABLE IF NOT EXISTS jobs (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
workflow TEXT,
|
|
57
|
+
status TEXT,
|
|
58
|
+
created_at REAL,
|
|
59
|
+
started_at REAL,
|
|
60
|
+
finished_at REAL,
|
|
61
|
+
arguments TEXT,
|
|
62
|
+
spec TEXT,
|
|
63
|
+
manifest TEXT,
|
|
64
|
+
warnings TEXT,
|
|
65
|
+
error TEXT
|
|
66
|
+
)""")
|
|
67
|
+
|
|
68
|
+
def _connect(self):
|
|
69
|
+
return sqlite3.connect(self.db_path, timeout=5)
|
|
70
|
+
|
|
71
|
+
def record(self, job):
|
|
72
|
+
# The spec's workflow_name/warnings are derived; keep what rerun needs
|
|
73
|
+
rerun_spec = {key: job.spec[key] for key in RERUN_SPEC_KEYS if key in job.spec}
|
|
74
|
+
with self._lock, self._connect() as connection:
|
|
75
|
+
connection.execute(
|
|
76
|
+
"INSERT OR REPLACE INTO jobs VALUES (?,?,?,?,?,?,?,?,?,?,?)",
|
|
77
|
+
(
|
|
78
|
+
job.id,
|
|
79
|
+
job.workflow_name,
|
|
80
|
+
job.status,
|
|
81
|
+
job.created_at,
|
|
82
|
+
job.started_at,
|
|
83
|
+
job.finished_at,
|
|
84
|
+
json.dumps(job.spec.get("arguments", {}), default=str),
|
|
85
|
+
json.dumps(rerun_spec, default=str),
|
|
86
|
+
json.dumps(job.manifest, default=str),
|
|
87
|
+
json.dumps(job.warnings, default=str),
|
|
88
|
+
job.error,
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def recent_summaries(self, limit=200):
|
|
93
|
+
"""Summary rows only - the jobs list is polled, and parsing four JSON
|
|
94
|
+
blobs per row just to show six scalars was pure waste."""
|
|
95
|
+
with self._lock, self._connect() as connection:
|
|
96
|
+
rows = connection.execute(
|
|
97
|
+
"SELECT id, workflow, status, created_at, started_at, finished_at"
|
|
98
|
+
" FROM jobs ORDER BY created_at DESC LIMIT ?",
|
|
99
|
+
(limit,),
|
|
100
|
+
).fetchall()
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
"id": row[0],
|
|
104
|
+
"workflow": row[1],
|
|
105
|
+
"status": row[2],
|
|
106
|
+
"created_at": row[3],
|
|
107
|
+
"started_at": row[4],
|
|
108
|
+
"finished_at": row[5],
|
|
109
|
+
"historical": True,
|
|
110
|
+
}
|
|
111
|
+
for row in rows
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
def get(self, job_id):
|
|
115
|
+
with self._lock, self._connect() as connection:
|
|
116
|
+
row = connection.execute(
|
|
117
|
+
"SELECT id, workflow, status, created_at, started_at, finished_at,"
|
|
118
|
+
" arguments, spec, manifest, warnings, error FROM jobs WHERE id = ?",
|
|
119
|
+
(job_id,),
|
|
120
|
+
).fetchone()
|
|
121
|
+
return self._to_detail(row) if row else None
|
|
122
|
+
|
|
123
|
+
def job_for_file(self, file_name):
|
|
124
|
+
"""The most recent job whose manifest names this output file.
|
|
125
|
+
|
|
126
|
+
LIKE metacharacters are escaped - generated names routinely contain
|
|
127
|
+
'_', which would otherwise match any character and let a similarly
|
|
128
|
+
named later job claim the file.
|
|
129
|
+
"""
|
|
130
|
+
escaped = (
|
|
131
|
+
file_name.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_")
|
|
132
|
+
)
|
|
133
|
+
with self._lock, self._connect() as connection:
|
|
134
|
+
row = connection.execute(
|
|
135
|
+
"SELECT id, status FROM jobs WHERE manifest LIKE ? ESCAPE '\\'"
|
|
136
|
+
" ORDER BY finished_at DESC LIMIT 1",
|
|
137
|
+
(f"%{escaped}%",),
|
|
138
|
+
).fetchone()
|
|
139
|
+
return {"id": row[0], "status": row[1]} if row else None
|
|
140
|
+
|
|
141
|
+
@staticmethod
|
|
142
|
+
def _to_detail(row):
|
|
143
|
+
def parse(text, fallback):
|
|
144
|
+
try:
|
|
145
|
+
return json.loads(text)
|
|
146
|
+
except (TypeError, ValueError):
|
|
147
|
+
return fallback
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
"id": row[0],
|
|
151
|
+
"workflow": row[1],
|
|
152
|
+
"status": row[2],
|
|
153
|
+
"created_at": row[3],
|
|
154
|
+
"started_at": row[4],
|
|
155
|
+
"finished_at": row[5],
|
|
156
|
+
"arguments": parse(row[6], {}),
|
|
157
|
+
"spec": parse(row[7], {}),
|
|
158
|
+
"manifest": parse(row[8], []),
|
|
159
|
+
"warnings": parse(row[9], []),
|
|
160
|
+
"error": row[10],
|
|
161
|
+
"traceback": None,
|
|
162
|
+
"event_count": 0,
|
|
163
|
+
"historical": True,
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class Job:
|
|
168
|
+
"""One workflow execution request and everything observed about it."""
|
|
169
|
+
|
|
170
|
+
def __init__(self, spec):
|
|
171
|
+
self.id = uuid.uuid4().hex[:12]
|
|
172
|
+
self.spec = spec
|
|
173
|
+
self.workflow_name = spec.get("workflow_name", "unknown")
|
|
174
|
+
self.status = QUEUED
|
|
175
|
+
self.created_at = time.time()
|
|
176
|
+
self.started_at = None
|
|
177
|
+
self.finished_at = None
|
|
178
|
+
self.manifest = []
|
|
179
|
+
self.warnings = spec.get("warnings", [])
|
|
180
|
+
self.error = None
|
|
181
|
+
self.traceback = None
|
|
182
|
+
self.events = []
|
|
183
|
+
self.condition = threading.Condition()
|
|
184
|
+
|
|
185
|
+
def add_event(self, event):
|
|
186
|
+
with self.condition:
|
|
187
|
+
self.events.append({"seq": len(self.events), **event})
|
|
188
|
+
self.condition.notify_all()
|
|
189
|
+
|
|
190
|
+
def finish(self, status, error=None, traceback_text=None):
|
|
191
|
+
self.status = status
|
|
192
|
+
self.finished_at = time.time()
|
|
193
|
+
self.error = error
|
|
194
|
+
self.traceback = traceback_text
|
|
195
|
+
self.add_event({"event": "job_status", "status": status})
|
|
196
|
+
|
|
197
|
+
def events_after(self, after_seq):
|
|
198
|
+
with self.condition:
|
|
199
|
+
return self.events[after_seq + 1 :]
|
|
200
|
+
|
|
201
|
+
def wait_for_event(self, after_seq, timeout):
|
|
202
|
+
"""Block until an event past after_seq exists or the job ends."""
|
|
203
|
+
with self.condition:
|
|
204
|
+
if len(self.events) > after_seq + 1 or self.status in TERMINAL_STATES:
|
|
205
|
+
return
|
|
206
|
+
self.condition.wait(timeout)
|
|
207
|
+
|
|
208
|
+
def summary(self):
|
|
209
|
+
return {
|
|
210
|
+
"id": self.id,
|
|
211
|
+
"workflow": self.workflow_name,
|
|
212
|
+
"status": self.status,
|
|
213
|
+
"created_at": self.created_at,
|
|
214
|
+
"started_at": self.started_at,
|
|
215
|
+
"finished_at": self.finished_at,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
def detail(self):
|
|
219
|
+
return {
|
|
220
|
+
**self.summary(),
|
|
221
|
+
"arguments": self.spec.get("arguments", {}),
|
|
222
|
+
"warnings": self.warnings,
|
|
223
|
+
"manifest": self.manifest,
|
|
224
|
+
"error": self.error,
|
|
225
|
+
"traceback": self.traceback,
|
|
226
|
+
"event_count": len(self.events),
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
class JobManager:
|
|
231
|
+
"""Serializes job execution onto the one GPU worker process."""
|
|
232
|
+
|
|
233
|
+
def __init__(
|
|
234
|
+
self, output_dir, log_level="INFO", worker_manager=None, history_path=None
|
|
235
|
+
):
|
|
236
|
+
self.output_dir = validate_output_path(output_dir, None)
|
|
237
|
+
os.makedirs(self.output_dir, exist_ok=True)
|
|
238
|
+
self.log_level = log_level
|
|
239
|
+
self.worker_manager = worker_manager or WorkerManager()
|
|
240
|
+
self.history = JobHistory(history_path or resolve_path("jobs.sqlite"))
|
|
241
|
+
self.jobs = {}
|
|
242
|
+
self.last_memory = None
|
|
243
|
+
# Reentrant: cancel() finishes a queued job while holding it, and
|
|
244
|
+
# _finish's terminal-job trim needs it again on the same thread
|
|
245
|
+
self._lock = threading.RLock() # guards job state transitions
|
|
246
|
+
# Pending job ids in run order - a list, not a Queue, so the queue
|
|
247
|
+
# can be reordered while jobs wait
|
|
248
|
+
self._pending = []
|
|
249
|
+
self._wake = threading.Condition(self._lock)
|
|
250
|
+
self._worker_lock = threading.Lock() # guards worker communication
|
|
251
|
+
self._current_job_id = None
|
|
252
|
+
self._stop = threading.Event()
|
|
253
|
+
self._runner = threading.Thread(
|
|
254
|
+
target=self._run_loop, daemon=True, name="job-runner"
|
|
255
|
+
)
|
|
256
|
+
self._runner.start()
|
|
257
|
+
|
|
258
|
+
# ------------------------------------------------------------- submission
|
|
259
|
+
|
|
260
|
+
def submit(self, workflow_path=None, workflow=None, arguments=None, base_dir=None):
|
|
261
|
+
"""Validate a job request and queue it. Raises ValueError on a bad
|
|
262
|
+
request so the HTTP layer can answer 400 before anything runs."""
|
|
263
|
+
arguments = arguments or {}
|
|
264
|
+
if (workflow_path is None) == (workflow is None):
|
|
265
|
+
raise ValueError("Provide exactly one of workflow_path or workflow")
|
|
266
|
+
|
|
267
|
+
if workflow_path is not None:
|
|
268
|
+
# Loads and schema-validates now - a bad path or file fails the
|
|
269
|
+
# request, not the queue
|
|
270
|
+
loaded = workflow_from_file(workflow_path, self.output_dir)
|
|
271
|
+
loaded.validate()
|
|
272
|
+
spec = {
|
|
273
|
+
"workflow_path": workflow_path,
|
|
274
|
+
"workflow_name": loaded.name,
|
|
275
|
+
"arguments": arguments,
|
|
276
|
+
}
|
|
277
|
+
else:
|
|
278
|
+
# workflow_from_definition validates base_dir - it is HTTP-supplied
|
|
279
|
+
# path input and goes through the security layer like every path
|
|
280
|
+
loaded = workflow_from_definition(
|
|
281
|
+
copy.deepcopy(workflow), self.output_dir, base_dir
|
|
282
|
+
)
|
|
283
|
+
loaded.validate()
|
|
284
|
+
spec = {
|
|
285
|
+
"workflow": workflow,
|
|
286
|
+
"base_dir": base_dir or os.getcwd(),
|
|
287
|
+
"workflow_name": loaded.name,
|
|
288
|
+
"arguments": arguments,
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
# Signature-level check of pipeline arguments - the typo that would
|
|
292
|
+
# otherwise be a TypeError after the model loads becomes a warning
|
|
293
|
+
# the client sees at submission
|
|
294
|
+
spec["warnings"] = workflow_argument_warnings(loaded.workflow_definition)
|
|
295
|
+
|
|
296
|
+
job = Job(spec)
|
|
297
|
+
with self._lock:
|
|
298
|
+
self.jobs[job.id] = job
|
|
299
|
+
job.add_event({"event": "job_status", "status": QUEUED})
|
|
300
|
+
with self._wake:
|
|
301
|
+
self._pending.append(job.id)
|
|
302
|
+
self._wake.notify()
|
|
303
|
+
logger.info(f"Queued job {job.id} for workflow {job.workflow_name}")
|
|
304
|
+
return job
|
|
305
|
+
|
|
306
|
+
def get(self, job_id):
|
|
307
|
+
"""A live Job, or a historical detail dict for a finished past run."""
|
|
308
|
+
job = self.jobs.get(job_id)
|
|
309
|
+
if job is not None:
|
|
310
|
+
return job
|
|
311
|
+
return self.history.get(job_id)
|
|
312
|
+
|
|
313
|
+
def rerun(self, job_id):
|
|
314
|
+
"""Queue a fresh job from a previous job's spec."""
|
|
315
|
+
job = self.jobs.get(job_id)
|
|
316
|
+
if job is not None:
|
|
317
|
+
spec = {
|
|
318
|
+
key: job.spec[key]
|
|
319
|
+
for key in ("workflow_path", "workflow", "base_dir")
|
|
320
|
+
if key in job.spec
|
|
321
|
+
}
|
|
322
|
+
arguments = job.spec.get("arguments", {})
|
|
323
|
+
else:
|
|
324
|
+
historical = self.history.get(job_id)
|
|
325
|
+
if historical is None:
|
|
326
|
+
return None
|
|
327
|
+
spec = {
|
|
328
|
+
key: historical["spec"][key]
|
|
329
|
+
for key in RERUN_SPEC_KEYS
|
|
330
|
+
if key in historical["spec"]
|
|
331
|
+
}
|
|
332
|
+
arguments = historical["arguments"]
|
|
333
|
+
return self.submit(
|
|
334
|
+
workflow_path=spec.get("workflow_path"),
|
|
335
|
+
workflow=spec.get("workflow"),
|
|
336
|
+
arguments=arguments,
|
|
337
|
+
base_dir=spec.get("base_dir"),
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
def list(self):
|
|
341
|
+
with self._lock:
|
|
342
|
+
live = sorted(self.jobs.values(), key=lambda j: j.created_at)
|
|
343
|
+
positions = {job_id: i for i, job_id in enumerate(self._pending)}
|
|
344
|
+
live_ids = {job.id for job in live}
|
|
345
|
+
summaries = []
|
|
346
|
+
for job in live:
|
|
347
|
+
summary = job.summary()
|
|
348
|
+
if job.id in positions:
|
|
349
|
+
summary["queue_position"] = positions[job.id]
|
|
350
|
+
summaries.append(summary)
|
|
351
|
+
for historical in self.history.recent_summaries():
|
|
352
|
+
if historical["id"] not in live_ids:
|
|
353
|
+
summaries.append(historical)
|
|
354
|
+
summaries.sort(key=lambda summary: summary["created_at"] or 0)
|
|
355
|
+
return summaries
|
|
356
|
+
|
|
357
|
+
# ------------------------------------------------------------ cancel/stop
|
|
358
|
+
|
|
359
|
+
def cancel(self, job_id):
|
|
360
|
+
"""Cancel a queued or running job. Returns the job's status after the
|
|
361
|
+
request, or None for an unknown job."""
|
|
362
|
+
job = self.jobs.get(job_id)
|
|
363
|
+
if job is None:
|
|
364
|
+
return None
|
|
365
|
+
with self._lock:
|
|
366
|
+
if job.status in TERMINAL_STATES:
|
|
367
|
+
return job.status
|
|
368
|
+
if job.status == QUEUED:
|
|
369
|
+
if job.id in self._pending:
|
|
370
|
+
self._pending.remove(job.id)
|
|
371
|
+
self._finish(job, CANCELLED)
|
|
372
|
+
return job.status
|
|
373
|
+
if job.status == RUNNING and self._current_job_id == job.id:
|
|
374
|
+
try:
|
|
375
|
+
self.worker_manager.cancel()
|
|
376
|
+
except Exception as e:
|
|
377
|
+
logger.warning(f"Could not send cancel for job {job_id}: {e}")
|
|
378
|
+
return job.status
|
|
379
|
+
|
|
380
|
+
def move(self, job_id, direction):
|
|
381
|
+
"""Reorder a queued job: 'up'/'down' swap with a neighbour,
|
|
382
|
+
'front'/'back' go to the ends. Returns the new pending order, or
|
|
383
|
+
None for a job that is not queued (finished, running, unknown)."""
|
|
384
|
+
if direction not in ("up", "down", "front", "back"):
|
|
385
|
+
raise ValueError(f"Unknown queue direction '{direction}'")
|
|
386
|
+
with self._lock:
|
|
387
|
+
if job_id not in self._pending:
|
|
388
|
+
return None
|
|
389
|
+
index = self._pending.index(job_id)
|
|
390
|
+
self._pending.pop(index)
|
|
391
|
+
if direction == "front":
|
|
392
|
+
index = 0
|
|
393
|
+
elif direction == "back":
|
|
394
|
+
index = len(self._pending)
|
|
395
|
+
elif direction == "up":
|
|
396
|
+
index = max(0, index - 1)
|
|
397
|
+
else:
|
|
398
|
+
index = min(len(self._pending), index + 1)
|
|
399
|
+
self._pending.insert(index, job_id)
|
|
400
|
+
return list(self._pending)
|
|
401
|
+
|
|
402
|
+
def shutdown(self):
|
|
403
|
+
self._stop.set()
|
|
404
|
+
with self._wake:
|
|
405
|
+
self._wake.notify_all()
|
|
406
|
+
self._runner.join(timeout=5)
|
|
407
|
+
self.worker_manager.shutdown_worker()
|
|
408
|
+
|
|
409
|
+
# ---------------------------------------------------------------- runner
|
|
410
|
+
|
|
411
|
+
def _run_loop(self):
|
|
412
|
+
while not self._stop.is_set():
|
|
413
|
+
with self._wake:
|
|
414
|
+
while not self._pending and not self._stop.is_set():
|
|
415
|
+
self._wake.wait()
|
|
416
|
+
if self._stop.is_set():
|
|
417
|
+
return
|
|
418
|
+
job_id = self._pending.pop(0)
|
|
419
|
+
job = self.jobs.get(job_id)
|
|
420
|
+
if job is None or job.status != QUEUED:
|
|
421
|
+
continue # cancelled while waiting
|
|
422
|
+
self._run_job(job)
|
|
423
|
+
|
|
424
|
+
def _finish(self, job, status, error=None, traceback_text=None):
|
|
425
|
+
job.finish(status, error=error, traceback_text=traceback_text)
|
|
426
|
+
try:
|
|
427
|
+
self.history.record(job)
|
|
428
|
+
except Exception as e:
|
|
429
|
+
logger.warning(f"Could not persist job {job.id}: {e}")
|
|
430
|
+
self._trim_terminal_jobs()
|
|
431
|
+
|
|
432
|
+
def _trim_terminal_jobs(self):
|
|
433
|
+
"""Drop the oldest finished jobs from memory - history has them, and
|
|
434
|
+
get()/list() fall through to it. Recent ones stay for event replay."""
|
|
435
|
+
with self._lock:
|
|
436
|
+
terminal = [
|
|
437
|
+
job
|
|
438
|
+
for job in sorted(self.jobs.values(), key=lambda j: j.created_at)
|
|
439
|
+
if job.status in TERMINAL_STATES
|
|
440
|
+
]
|
|
441
|
+
for job in terminal[:-TERMINAL_JOBS_KEPT]:
|
|
442
|
+
del self.jobs[job.id]
|
|
443
|
+
|
|
444
|
+
def _run_job(self, job):
|
|
445
|
+
with self._worker_lock:
|
|
446
|
+
with self._lock:
|
|
447
|
+
if job.status != QUEUED:
|
|
448
|
+
return
|
|
449
|
+
job.status = RUNNING
|
|
450
|
+
job.started_at = time.time()
|
|
451
|
+
self._current_job_id = job.id
|
|
452
|
+
job.add_event({"event": "job_status", "status": RUNNING})
|
|
453
|
+
try:
|
|
454
|
+
self.worker_manager.ensure_worker(self.log_level)
|
|
455
|
+
command = {
|
|
456
|
+
"type": "execute",
|
|
457
|
+
"arguments": job.spec["arguments"],
|
|
458
|
+
"output_dir": self.output_dir,
|
|
459
|
+
"log_level": self.log_level,
|
|
460
|
+
}
|
|
461
|
+
if "workflow_path" in job.spec:
|
|
462
|
+
command["workflow_path"] = job.spec["workflow_path"]
|
|
463
|
+
else:
|
|
464
|
+
command["workflow"] = job.spec["workflow"]
|
|
465
|
+
command["base_dir"] = job.spec["base_dir"]
|
|
466
|
+
self.worker_manager.send_command(command)
|
|
467
|
+
outcome = self._consume_results(job)
|
|
468
|
+
except Exception as e:
|
|
469
|
+
logger.error(f"Job {job.id} failed: {e}", exc_info=True)
|
|
470
|
+
outcome = (FAILED, str(e), None)
|
|
471
|
+
finally:
|
|
472
|
+
# Cleared BEFORE the terminal status becomes visible - a
|
|
473
|
+
# client seeing "succeeded" must find the manager idle
|
|
474
|
+
with self._lock:
|
|
475
|
+
self._current_job_id = None
|
|
476
|
+
if job.status not in TERMINAL_STATES:
|
|
477
|
+
status, error, traceback_text = outcome
|
|
478
|
+
self._finish(job, status, error=error, traceback_text=traceback_text)
|
|
479
|
+
|
|
480
|
+
def _consume_results(self, job):
|
|
481
|
+
"""Read worker messages until the run ends; returns the terminal
|
|
482
|
+
(status, error, traceback) for _run_job to apply once the manager
|
|
483
|
+
no longer counts the job as current."""
|
|
484
|
+
while True:
|
|
485
|
+
message = self.worker_manager.get_result()
|
|
486
|
+
message_type = message.get("type")
|
|
487
|
+
|
|
488
|
+
if message_type == "progress":
|
|
489
|
+
event = {k: v for k, v in message.items() if k != "type"}
|
|
490
|
+
job.add_event(event)
|
|
491
|
+
elif message_type in ("output", "workflow_loaded"):
|
|
492
|
+
text = message.get("message") or message.get("workflow_name", "")
|
|
493
|
+
job.add_event({"event": "log", "message": text})
|
|
494
|
+
elif message_type == "memory_info":
|
|
495
|
+
self.last_memory = message.get("info")
|
|
496
|
+
job.add_event({"event": "memory", "info": self.last_memory})
|
|
497
|
+
elif message_type == "success":
|
|
498
|
+
job.manifest = message.get("manifest", [])
|
|
499
|
+
return (SUCCEEDED, None, None)
|
|
500
|
+
elif message_type == "cancelled":
|
|
501
|
+
return (CANCELLED, None, None)
|
|
502
|
+
elif message_type == "error":
|
|
503
|
+
return (
|
|
504
|
+
FAILED,
|
|
505
|
+
message.get("message"),
|
|
506
|
+
message.get("traceback"),
|
|
507
|
+
)
|
|
508
|
+
elif message_type == "worker_crashed":
|
|
509
|
+
self.worker_manager.mark_crashed()
|
|
510
|
+
return (
|
|
511
|
+
FAILED,
|
|
512
|
+
f"Worker crashed: {message.get('message')}",
|
|
513
|
+
message.get("traceback"),
|
|
514
|
+
)
|
|
515
|
+
else:
|
|
516
|
+
logger.warning(f"Unknown worker message type: {message_type}")
|
|
517
|
+
|
|
518
|
+
def is_busy(self):
|
|
519
|
+
"""True while a job is running or queued - the window in which the
|
|
520
|
+
worker may be reading model files a cache delete would rip out."""
|
|
521
|
+
with self._lock:
|
|
522
|
+
if self._current_job_id is not None:
|
|
523
|
+
return True
|
|
524
|
+
return any(job.status == QUEUED for job in self.jobs.values())
|
|
525
|
+
|
|
526
|
+
# ---------------------------------------------------------------- memory
|
|
527
|
+
|
|
528
|
+
def memory_status(self, timeout=5):
|
|
529
|
+
"""Live memory stats when the worker is idle; the run's last report
|
|
530
|
+
while it is busy. The lock acquire is bounded: the runner holds
|
|
531
|
+
_worker_lock for a job's whole duration, and a poll that raced a job
|
|
532
|
+
start must fall back to the cached reading, not block for hours."""
|
|
533
|
+
if self._current_job_id is not None:
|
|
534
|
+
return {"live": False, "info": self.last_memory}
|
|
535
|
+
if not self.worker_manager.worker_active:
|
|
536
|
+
return {"live": False, "info": self.last_memory}
|
|
537
|
+
if not self._worker_lock.acquire(timeout=2):
|
|
538
|
+
return {"live": False, "info": self.last_memory}
|
|
539
|
+
try:
|
|
540
|
+
self.worker_manager.send_command({"type": "memory_status"})
|
|
541
|
+
result = self.worker_manager.get_result(timeout=timeout)
|
|
542
|
+
finally:
|
|
543
|
+
self._worker_lock.release()
|
|
544
|
+
if result.get("type") == "memory_status":
|
|
545
|
+
self.last_memory = result.get("info")
|
|
546
|
+
return {"live": True, "info": self.last_memory}
|
|
547
|
+
return {"live": False, "info": self.last_memory}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`*`},brackets:[[`[`,`]`],[`(`,`)`]]},t={defaultToken:`invalid`,ignoreCase:!0,tokenPostfix:`.abap`,keywords:`abap-source.abbreviated.abstract.accept.accepting.according.activation.actual.add.add-corresponding.adjacent.after.alias.aliases.align.all.allocate.alpha.analysis.analyzer.and.append.appendage.appending.application.archive.area.arithmetic.as.ascending.aspect.assert.assign.assigned.assigning.association.asynchronous.at.attributes.authority.authority-check.avg.back.background.backup.backward.badi.base.before.begin.between.big.binary.bintohex.bit.black.blank.blanks.blob.block.blocks.blue.bound.boundaries.bounds.boxed.break-point.buffer.by.bypassing.byte.byte-order.call.calling.case.cast.casting.catch.center.centered.chain.chain-input.chain-request.change.changing.channels.character.char-to-hex.check.checkbox.ci_.circular.class.class-coding.class-data.class-events.class-methods.class-pool.cleanup.clear.client.clob.clock.close.coalesce.code.coding.col_background.col_group.col_heading.col_key.col_negative.col_normal.col_positive.col_total.collect.color.column.columns.comment.comments.commit.common.communication.comparing.component.components.compression.compute.concat.concat_with_space.concatenate.cond.condense.condition.connect.connection.constants.context.contexts.continue.control.controls.conv.conversion.convert.copies.copy.corresponding.country.cover.cpi.create.creating.critical.currency.currency_conversion.current.cursor.cursor-selection.customer.customer-function.dangerous.data.database.datainfo.dataset.date.dats_add_days.dats_add_months.dats_days_between.dats_is_valid.daylight.dd/mm/yy.dd/mm/yyyy.ddmmyy.deallocate.decimal_shift.decimals.declarations.deep.default.deferred.define.defining.definition.delete.deleting.demand.department.descending.describe.destination.detail.dialog.directory.disconnect.display.display-mode.distinct.divide.divide-corresponding.division.do.dummy.duplicate.duplicates.duration.during.dynamic.dynpro.edit.editor-call.else.elseif.empty.enabled.enabling.encoding.end.endat.endcase.endcatch.endchain.endclass.enddo.endenhancement.end-enhancement-section.endexec.endform.endfunction.endian.endif.ending.endinterface.end-lines.endloop.endmethod.endmodule.end-of-definition.end-of-editing.end-of-file.end-of-page.end-of-selection.endon.endprovide.endselect.end-test-injection.end-test-seam.endtry.endwhile.endwith.engineering.enhancement.enhancement-point.enhancements.enhancement-section.entries.entry.enum.environment.equiv.errormessage.errors.escaping.event.events.exact.except.exception.exceptions.exception-table.exclude.excluding.exec.execute.exists.exit.exit-command.expand.expanding.expiration.explicit.exponent.export.exporting.extend.extended.extension.extract.fail.fetch.field.field-groups.fields.field-symbol.field-symbols.file.filter.filters.filter-table.final.find.first.first-line.fixed-point.fkeq.fkge.flush.font.for.form.format.forward.found.frame.frames.free.friends.from.function.functionality.function-pool.further.gaps.generate.get.giving.gkeq.gkge.global.grant.green.group.groups.handle.handler.harmless.hashed.having.hdb.header.headers.heading.head-lines.help-id.help-request.hextobin.hide.high.hint.hold.hotspot.icon.id.identification.identifier.ids.if.ignore.ignoring.immediately.implementation.implementations.implemented.implicit.import.importing.in.inactive.incl.include.includes.including.increment.index.index-line.infotypes.inheriting.init.initial.initialization.inner.inout.input.insert.instance.instances.instr.intensified.interface.interface-pool.interfaces.internal.intervals.into.inverse.inverted-date.is.iso.job.join.keep.keeping.kernel.key.keys.keywords.kind.language.last.late.layout.leading.leave.left.left-justified.leftplus.leftspace.legacy.length.let.level.levels.like.line.lines.line-count.linefeed.line-selection.line-size.list.listbox.list-processing.little.llang.load.load-of-program.lob.local.locale.locator.logfile.logical.log-point.long.loop.low.lower.lpad.lpi.ltrim.mail.main.major-id.mapping.margin.mark.mask.match.matchcode.max.maximum.medium.members.memory.mesh.message.message-id.messages.messaging.method.methods.min.minimum.minor-id.mm/dd/yy.mm/dd/yyyy.mmddyy.mode.modif.modifier.modify.module.move.move-corresponding.multiply.multiply-corresponding.name.nametab.native.nested.nesting.new.new-line.new-page.new-section.next.no.no-display.no-extension.no-gap.no-gaps.no-grouping.no-heading.no-scrolling.no-sign.no-title.no-topofpage.no-zero.node.nodes.non-unicode.non-unique.not.null.number.object.objects.obligatory.occurrence.occurrences.occurs.of.off.offset.ole.on.only.open.option.optional.options.or.order.other.others.out.outer.output.output-length.overflow.overlay.pack.package.pad.padding.page.pages.parameter.parameters.parameter-table.part.partially.pattern.percentage.perform.performing.person.pf1.pf10.pf11.pf12.pf13.pf14.pf15.pf2.pf3.pf4.pf5.pf6.pf7.pf8.pf9.pf-status.pink.places.pool.pos_high.pos_low.position.pragmas.precompiled.preferred.preserving.primary.print.print-control.priority.private.procedure.process.program.property.protected.provide.public.push.pushbutton.put.queue-only.quickinfo.radiobutton.raise.raising.range.ranges.read.reader.read-only.receive.received.receiver.receiving.red.redefinition.reduce.reduced.ref.reference.refresh.regex.reject.remote.renaming.replace.replacement.replacing.report.request.requested.reserve.reset.resolution.respecting.responsible.result.results.resumable.resume.retry.return.returncode.returning.returns.right.right-justified.rightplus.rightspace.risk.rmc_communication_failure.rmc_invalid_status.rmc_system_failure.role.rollback.rows.rpad.rtrim.run.sap.sap-spool.saving.scale_preserving.scale_preserving_scientific.scan.scientific.scientific_with_leading_zero.scroll.scroll-boundary.scrolling.search.secondary.seconds.section.select.selection.selections.selection-screen.selection-set.selection-sets.selection-table.select-options.send.separate.separated.set.shared.shift.short.shortdump-id.sign_as_postfix.single.size.skip.skipping.smart.some.sort.sortable.sorted.source.specified.split.spool.spots.sql.sqlscript.stable.stamp.standard.starting.start-of-editing.start-of-selection.state.statement.statements.static.statics.statusinfo.step-loop.stop.structure.structures.style.subkey.submatches.submit.subroutine.subscreen.subtract.subtract-corresponding.suffix.sum.summary.summing.supplied.supply.suppress.switch.switchstates.symbol.syncpoints.syntax.syntax-check.syntax-trace.system-call.system-exceptions.system-exit.tab.tabbed.table.tables.tableview.tabstrip.target.task.tasks.test.testing.test-injection.test-seam.text.textpool.then.throw.time.times.timestamp.timezone.tims_is_valid.title.titlebar.title-lines.to.tokenization.tokens.top-lines.top-of-page.trace-file.trace-table.trailing.transaction.transfer.transformation.translate.transporting.trmac.truncate.truncation.try.tstmp_add_seconds.tstmp_current_utctimestamp.tstmp_is_valid.tstmp_seconds_between.type.type-pool.type-pools.types.uline.unassign.under.unicode.union.unique.unit_conversion.unix.unpack.until.unwind.up.update.upper.user.user-command.using.utf-8.valid.value.value-request.values.vary.varying.verification-message.version.via.view.visible.wait.warning.when.whenever.where.while.width.window.windows.with.with-heading.without.with-title.word.work.write.writer.xml.xsd.yellow.yes.yymmdd.zero.zone.abap_system_timezone.abap_user_timezone.access.action.adabas.adjust_numbers.allow_precision_loss.allowed.amdp.applicationuser.as_geo_json.as400.associations.balance.behavior.breakup.bulk.cds.cds_client.check_before_save.child.clients.corr.corr_spearman.cross.cycles.datn_add_days.datn_add_months.datn_days_between.dats_from_datn.dats_tims_to_tstmp.dats_to_datn.db2.db6.ddl.dense_rank.depth.deterministic.discarding.entities.entity.error.failed.finalize.first_value.fltp_to_dec.following.fractional.full.graph.grouping.hierarchy.hierarchy_ancestors.hierarchy_ancestors_aggregate.hierarchy_descendants.hierarchy_descendants_aggregate.hierarchy_siblings.incremental.indicators.lag.last_value.lead.leaves.like_regexpr.link.locale_sap.lock.locks.many.mapped.matched.measures.median.mssqlnt.multiple.nodetype.ntile.nulls.occurrences_regexpr.one.operations.oracle.orphans.over.parent.parents.partition.pcre.period.pfcg_mapping.preceding.privileged.product.projection.rank.redirected.replace_regexpr.reported.response.responses.root.row.row_number.sap_system_date.save.schema.session.sets.shortdump.siblings.spantree.start.stddev.string_agg.subtotal.sybase.tims_from_timn.tims_to_timn.to_blob.to_clob.total.trace-entry.tstmp_to_dats.tstmp_to_dst.tstmp_to_tims.tstmpl_from_utcl.tstmpl_to_utcl.unbounded.utcl_add_seconds.utcl_current.utcl_seconds_between.uuid.var.verbatim`.split(`.`),builtinFunctions:`abs.acos.asin.atan.bit-set.boolc.boolx.ceil.char_off.charlen.cmax.cmin.concat_lines_of.contains.contains_any_not_of.contains_any_of.cos.cosh.count.count_any_not_of.count_any_of.dbmaxlen.distance.escape.exp.find_any_not_of.find_any_of.find_end.floor.frac.from_mixed.ipow.line_exists.line_index.log.log10.matches.nmax.nmin.numofchar.repeat.rescale.reverse.round.segment.shift_left.shift_right.sign.sin.sinh.sqrt.strlen.substring.substring_after.substring_before.substring_from.substring_to.tan.tanh.to_lower.to_mixed.to_upper.trunc.utclong_add.utclong_current.utclong_diff.xsdbool.xstrlen`.split(`.`),typeKeywords:`b.c.d.decfloat16.decfloat34.f.i.int8.n.p.s.string.t.utclong.x.xstring.any.clike.csequence.decfloat.numeric.simple.xsequence.accp.char.clnt.cuky.curr.datn.dats.d16d.d16n.d16r.d34d.d34n.d34r.dec.df16_dec.df16_raw.df34_dec.df34_raw.fltp.geom_ewkb.int1.int2.int4.lang.lchr.lraw.numc.quan.raw.rawstring.sstring.timn.tims.unit.utcl.df16_scl.df34_scl.prec.varc.abap_bool.abap_false.abap_true.abap_undefined.me.screen.space.super.sy.syst.table_line.*sys*`.split(`.`),builtinMethods:[`class_constructor`,`constructor`],derivedTypes:[`%CID`,`%CID_REF`,`%CONTROL`,`%DATA`,`%ELEMENT`,`%FAIL`,`%KEY`,`%MSG`,`%PARAM`,`%PID`,`%PID_ASSOC`,`%PID_PARENT`,`%_HINTS`],cdsLanguage:[`@AbapAnnotation`,`@AbapCatalog`,`@AccessControl`,`@API`,`@ClientDependent`,`@ClientHandling`,`@CompatibilityContract`,`@DataAging`,`@EndUserText`,`@Environment`,`@LanguageDependency`,`@MappingRole`,`@Metadata`,`@MetadataExtension`,`@ObjectModel`,`@Scope`,`@Semantics`,`$EXTENSION`,`$SELF`],selectors:[`->`,`->*`,`=>`,`~`,`~*`],operators:` +. -./.*.**.div.mod.=.#.@.+=.-=.*=./=.**=.&&=.?=.&.&&.bit-and.bit-not.bit-or.bit-xor.m.o.z.<. >.<=.>=.<>.><.=<.=>.bt.byte-ca.byte-cn.byte-co.byte-cs.byte-na.byte-ns.ca.cn.co.cp.cs.eq.ge.gt.le.lt.na.nb.ne.np.ns.*/.*:.--./*.//`.split(`.`),symbols:/[=><!~?&+\-*\/\^%#@]+/,tokenizer:{root:[[/[a-z_\/$%@]([\w\/$%]|-(?!>))*/,{cases:{"@typeKeywords":`type`,"@keywords":`keyword`,"@cdsLanguage":`annotation`,"@derivedTypes":`type`,"@builtinFunctions":`type`,"@builtinMethods":`type`,"@operators":`key`,"@default":`identifier`}}],[/<[\w]+>/,`identifier`],[/##[\w|_]+/,`comment`],{include:`@whitespace`},[/[:,.]/,`delimiter`],[/[{}()\[\]]/,`@brackets`],[/@symbols/,{cases:{"@selectors":`tag`,"@operators":`key`,"@default":``}}],[/'/,{token:`string`,bracket:`@open`,next:`@stringquote`}],[/`/,{token:`string`,bracket:`@open`,next:`@stringping`}],[/\|/,{token:`string`,bracket:`@open`,next:`@stringtemplate`}],[/\d+/,`number`]],stringtemplate:[[/[^\\\|]+/,`string`],[/\\\|/,`string`],[/\|/,{token:`string`,bracket:`@close`,next:`@pop`}]],stringping:[[/[^\\`]+/,`string`],[/`/,{token:`string`,bracket:`@close`,next:`@pop`}]],stringquote:[[/[^\\']+/,`string`],[/'/,{token:`string`,bracket:`@close`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/^\*.*$/,`comment`],[/\".*$/,`comment`]]}};export{e as conf,t as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:`//`,blockComment:[`/*`,`*/`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))`),end:RegExp(`^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))`)}}},t=`abstract.activate.and.any.array.as.asc.assert.autonomous.begin.bigdecimal.blob.boolean.break.bulk.by.case.cast.catch.char.class.collect.commit.const.continue.convertcurrency.decimal.default.delete.desc.do.double.else.end.enum.exception.exit.export.extends.false.final.finally.float.for.from.future.get.global.goto.group.having.hint.if.implements.import.in.inner.insert.instanceof.int.interface.into.join.last_90_days.last_month.last_n_days.last_week.like.limit.list.long.loop.map.merge.native.new.next_90_days.next_month.next_n_days.next_week.not.null.nulls.number.object.of.on.or.outer.override.package.parallel.pragma.private.protected.public.retrieve.return.returning.rollback.savepoint.search.select.set.short.sort.stat.static.strictfp.super.switch.synchronized.system.testmethod.then.this.this_month.this_week.throw.throws.today.tolabel.tomorrow.transaction.transient.trigger.true.try.type.undelete.update.upsert.using.virtual.void.volatile.webservice.when.where.while.yesterday`.split(`.`),n=e=>e.charAt(0).toUpperCase()+e.substr(1),r=[];t.forEach(e=>{r.push(e),r.push(e.toUpperCase()),r.push(n(e))});var i={defaultToken:``,tokenPostfix:`.apex`,keywords:r,operators:`=.>.<.!.~.?.:.==.<=.>=.!=.&&.||.++.--.+.-.*./.&.|.^.%.<<.>>.>>>.+=.-=.*=./=.&=.|=.^=.%=.<<=.>>=.>>>=`.split(`.`),symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,tokenizer:{root:[[/[a-z_$][\w$]*/,{cases:{"@keywords":{token:`keyword.$0`},"@default":`identifier`}}],[/[A-Z][\w\$]*/,{cases:{"@keywords":{token:`keyword.$0`},"@default":`type.identifier`}}],{include:`@whitespace`},[/[{}()\[\]]/,`@brackets`],[/[<>](?!@symbols)/,`@brackets`],[/@symbols/,{cases:{"@operators":`delimiter`,"@default":``}}],[/@\s*[a-zA-Z_\$][\w\$]*/,`annotation`],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,`number.float`],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,`number.float`],[/(@digits)[fFdD]/,`number.float`],[/(@digits)[lL]?/,`number`],[/[;,.]/,`delimiter`],[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/"/,`string`,`@string."`],[/'/,`string`,`@string.'`],[/'[^\\']'/,`string`],[/(')(@escapes)(')/,[`string`,`string.escape`,`string`]],[/'/,`string.invalid`]],whitespace:[[/[ \t\r\n]+/,``],[/\/\*\*(?!\/)/,`comment.doc`,`@apexdoc`],[/\/\*/,`comment`,`@comment`],[/\/\/.*$/,`comment`]],comment:[[/[^\/*]+/,`comment`],[/\*\//,`comment`,`@pop`],[/[\/*]/,`comment`]],apexdoc:[[/[^\/*]+/,`comment.doc`],[/\*\//,`comment.doc`,`@pop`],[/[\/*]/,`comment.doc`]],string:[[/[^\\"']+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/["']/,{cases:{"$#==$S2":{token:`string`,next:`@pop`},"@default":`string`}}]]}};export{e as conf,i as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`#`}},t={defaultToken:`keyword`,ignoreCase:!0,tokenPostfix:`.azcli`,str:/[^#\s]/,tokenizer:{root:[{include:`@comment`},[/\s-+@str*\s*/,{cases:{"@eos":{token:`key.identifier`,next:`@popall`},"@default":{token:`key.identifier`,next:`@type`}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:`key.identifier`,next:`@popall`},"@default":{token:`key.identifier`,next:`@type`}}}]],type:[{include:`@comment`},[/-+@str*\s*/,{cases:{"@eos":{token:`key.identifier`,next:`@popall`},"@default":`key.identifier`}}],[/@str+\s*/,{cases:{"@eos":{token:`string`,next:`@popall`},"@default":`string`}}]],comment:[[/#.*$/,{cases:{"@eos":{token:`comment`,next:`@popall`}}}]]}};export{e as conf,t as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`REM`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`}],surroundingPairs:[{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`}],folding:{markers:{start:RegExp(`^\\s*(::\\s*|REM\\s+)#region`),end:RegExp(`^\\s*(::\\s*|REM\\s+)#endregion`)}}},t={defaultToken:``,ignoreCase:!0,tokenPostfix:`.bat`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.parenthesis`,open:`(`,close:`)`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=><!~?&|+\-*\/\^;\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)(rem(?:\s.*|))$/,[``,`comment`]],[/(\@?)(@keywords)(?!\w)/,[{token:`keyword`},{token:`keyword.$2`}]],[/[ \t\r\n]+/,``],[/setlocal(?!\w)/,`keyword.tag-setlocal`],[/endlocal(?!\w)/,`keyword.tag-setlocal`],[/[a-zA-Z_]\w*/,``],[/:\w*/,`metatag`],[/%[^%]+%/,`variable`],[/%%[\w]+(?!\w)/,`variable`],[/[{}()\[\]]/,`@brackets`],[/@symbols/,`delimiter`],[/\d*\.\d+([eE][\-+]?\d+)?/,`number.float`],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,`number.hex`],[/\d+/,`number`],[/[;,.]/,`delimiter`],[/"/,`string`,`@string."`],[/'/,`string`,`@string.'`]],string:[[/[^\\"'%]+/,{cases:{"@eos":{token:`string`,next:`@popall`},"@default":`string`}}],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/%[\w ]+%/,`variable`],[/%%[\w]+(?!\w)/,`variable`],[/["']/,{cases:{"$#==$S2":{token:`string`,next:`@pop`},"@default":`string`}}],[/$/,`string`,`@popall`]]}};export{e as conf,t as language};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e=>`\\b${e}\\b`)(`[_a-zA-Z][_a-zA-Z0-9]*`),t=[`targetScope`,`resource`,`module`,`param`,`var`,`output`,`for`,`in`,`if`,`existing`],n=[`true`,`false`,`null`],r=`[ \\t\\r\\n]`,i=`[0-9]+`,a={comments:{lineComment:`//`,blockComment:[`/*`,`*/`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`'`,close:`'`},{open:`'''`,close:`'''`}],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`'`,close:`'`,notIn:[`string`,`comment`]},{open:`'''`,close:`'''`,notIn:[`string`,`comment`]}],autoCloseBefore:`:.,=}])'
|
|
2
|
+
`,indentationRules:{increaseIndentPattern:RegExp(`^((?!\\/\\/).)*(\\{[^}"'\`]*|\\([^)"'\`]*|\\[[^\\]"'\`]*)$`),decreaseIndentPattern:RegExp(`^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$`)}},o={defaultToken:``,tokenPostfix:`.bicep`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`}],symbols:/[=><!~?:&|+\-*/^%]+/,keywords:t,namedLiterals:n,escapes:"\\\\(u{[0-9A-Fa-f]+}|n|r|t|\\\\|'|\\${)",tokenizer:{root:[{include:`@expression`},{include:`@whitespace`}],stringVerbatim:[{regex:`(|'|'')[^']`,action:{token:`string`}},{regex:`'''`,action:{token:`string.quote`,next:`@pop`}}],stringLiteral:[{regex:"\\${",action:{token:`delimiter.bracket`,next:`@bracketCounting`}},{regex:`[^\\\\'$]+`,action:{token:`string`}},{regex:`@escapes`,action:{token:`string.escape`}},{regex:`\\\\.`,action:{token:`string.escape.invalid`}},{regex:`'`,action:{token:`string`,next:`@pop`}}],bracketCounting:[{regex:`{`,action:{token:`delimiter.bracket`,next:`@bracketCounting`}},{regex:`}`,action:{token:`delimiter.bracket`,next:`@pop`}},{include:`expression`}],comment:[{regex:`[^\\*]+`,action:{token:`comment`}},{regex:`\\*\\/`,action:{token:`comment`,next:`@pop`}},{regex:`[\\/*]`,action:{token:`comment`}}],whitespace:[{regex:r},{regex:`\\/\\*`,action:{token:`comment`,next:`@comment`}},{regex:`\\/\\/.*$`,action:{token:`comment`}}],expression:[{regex:`'''`,action:{token:`string.quote`,next:`@stringVerbatim`}},{regex:`'`,action:{token:`string.quote`,next:`@stringLiteral`}},{regex:i,action:{token:`number`}},{regex:e,action:{cases:{"@keywords":{token:`keyword`},"@namedLiterals":{token:`keyword`},"@default":{token:`identifier`}}}}]}};export{a as conf,o as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`//`,blockComment:[`(*`,`*)`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`],[`<`,`>`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`},{open:`(*`,close:`*)`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`},{open:`(*`,close:`*)`}]},t={defaultToken:``,tokenPostfix:`.cameligo`,ignoreCase:!0,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],keywords:`abs.assert.block.Bytes.case.Crypto.Current.else.failwith.false.for.fun.if.in.let.let%entry.let%init.List.list.Map.map.match.match%nat.mod.not.operation.Operation.of.record.Set.set.sender.skip.source.String.then.to.true.type.with`.split(`.`),typeKeywords:[`int`,`unit`,`string`,`tz`,`nat`,`bool`],operators:[`=`,`>`,`<`,`<=`,`>=`,`<>`,`:`,`:=`,`and`,`mod`,`or`,`+`,`-`,`*`,`/`,`@`,`&`,`^`,`%`,`->`,`<-`,`&&`,`||`],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:`keyword.$0`},"@default":`identifier`}}],{include:`@whitespace`},[/[{}()\[\]]/,`@brackets`],[/[<>](?!@symbols)/,`@brackets`],[/@symbols/,{cases:{"@operators":`delimiter`,"@default":``}}],[/\d*\.\d+([eE][\-+]?\d+)?/,`number.float`],[/\$[0-9a-fA-F]{1,16}/,`number.hex`],[/\d+/,`number`],[/[;,.]/,`delimiter`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'/,`string`,`@string`],[/'[^\\']'/,`string`],[/'/,`string.invalid`],[/\#\d+/,`string`]],comment:[[/[^\(\*]+/,`comment`],[/\*\)/,`comment`,`@pop`],[/\(\*/,`comment`]],string:[[/[^\\']+/,`string`],[/\\./,`string.escape.invalid`],[/'/,{token:`string.quote`,bracket:`@close`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,`white`],[/\(\*/,`comment`,`@comment`],[/\/\/.*$/,`comment`]]}};export{e as conf,t as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`;;`},brackets:[[`[`,`]`],[`(`,`)`],[`{`,`}`]],autoClosingPairs:[{open:`[`,close:`]`},{open:`"`,close:`"`},{open:`(`,close:`)`},{open:`{`,close:`}`}],surroundingPairs:[{open:`[`,close:`]`},{open:`"`,close:`"`},{open:`(`,close:`)`},{open:`{`,close:`}`}]},t={defaultToken:``,ignoreCase:!0,tokenPostfix:`.clj`,brackets:[{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`{`,close:`}`,token:`delimiter.curly`}],constants:[`true`,`false`,`nil`],numbers:/^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,characters:/^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,escapes:/^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,qualifiedSymbols:/^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,specialForms:[`.`,`catch`,`def`,`do`,`if`,`monitor-enter`,`monitor-exit`,`new`,`quote`,`recur`,`set!`,`throw`,`try`,`var`],coreSymbols:`*,*',*1,*2,*3,*agent*,*allow-unresolved-vars*,*assert*,*clojure-version*,*command-line-args*,*compile-files*,*compile-path*,*compiler-options*,*data-readers*,*default-data-reader-fn*,*e,*err*,*file*,*flush-on-newline*,*fn-loader*,*in*,*math-context*,*ns*,*out*,*print-dup*,*print-length*,*print-level*,*print-meta*,*print-namespace-maps*,*print-readably*,*read-eval*,*reader-resolver*,*source-path*,*suppress-read*,*unchecked-math*,*use-context-classloader*,*verbose-defrecords*,*warn-on-reflection*,+,+',-,-',->,->>,->ArrayChunk,->Eduction,->Vec,->VecNode,->VecSeq,-cache-protocol-fn,-reset-methods,..,/,<,<=,=,==,>,>=,EMPTY-NODE,Inst,StackTraceElement->vec,Throwable->map,accessor,aclone,add-classpath,add-watch,agent,agent-error,agent-errors,aget,alength,alias,all-ns,alter,alter-meta!,alter-var-root,amap,ancestors,and,any?,apply,areduce,array-map,as->,aset,aset-boolean,aset-byte,aset-char,aset-double,aset-float,aset-int,aset-long,aset-short,assert,assoc,assoc!,assoc-in,associative?,atom,await,await-for,await1,bases,bean,bigdec,bigint,biginteger,binding,bit-and,bit-and-not,bit-clear,bit-flip,bit-not,bit-or,bit-set,bit-shift-left,bit-shift-right,bit-test,bit-xor,boolean,boolean-array,boolean?,booleans,bound-fn,bound-fn*,bound?,bounded-count,butlast,byte,byte-array,bytes,bytes?,case,cast,cat,char,char-array,char-escape-string,char-name-string,char?,chars,chunk,chunk-append,chunk-buffer,chunk-cons,chunk-first,chunk-next,chunk-rest,chunked-seq?,class,class?,clear-agent-errors,clojure-version,coll?,comment,commute,comp,comparator,compare,compare-and-set!,compile,complement,completing,concat,cond,cond->,cond->>,condp,conj,conj!,cons,constantly,construct-proxy,contains?,count,counted?,create-ns,create-struct,cycle,dec,dec',decimal?,declare,dedupe,default-data-readers,definline,definterface,defmacro,defmethod,defmulti,defn,defn-,defonce,defprotocol,defrecord,defstruct,deftype,delay,delay?,deliver,denominator,deref,derive,descendants,destructure,disj,disj!,dissoc,dissoc!,distinct,distinct?,doall,dorun,doseq,dosync,dotimes,doto,double,double-array,double?,doubles,drop,drop-last,drop-while,eduction,empty,empty?,ensure,ensure-reduced,enumeration-seq,error-handler,error-mode,eval,even?,every-pred,every?,ex-data,ex-info,extend,extend-protocol,extend-type,extenders,extends?,false?,ffirst,file-seq,filter,filterv,find,find-keyword,find-ns,find-protocol-impl,find-protocol-method,find-var,first,flatten,float,float-array,float?,floats,flush,fn,fn?,fnext,fnil,for,force,format,frequencies,future,future-call,future-cancel,future-cancelled?,future-done?,future?,gen-class,gen-interface,gensym,get,get-in,get-method,get-proxy-class,get-thread-bindings,get-validator,group-by,halt-when,hash,hash-combine,hash-map,hash-ordered-coll,hash-set,hash-unordered-coll,ident?,identical?,identity,if-let,if-not,if-some,ifn?,import,in-ns,inc,inc',indexed?,init-proxy,inst-ms,inst-ms*,inst?,instance?,int,int-array,int?,integer?,interleave,intern,interpose,into,into-array,ints,io!,isa?,iterate,iterator-seq,juxt,keep,keep-indexed,key,keys,keyword,keyword?,last,lazy-cat,lazy-seq,let,letfn,line-seq,list,list*,list?,load,load-file,load-reader,load-string,loaded-libs,locking,long,long-array,longs,loop,macroexpand,macroexpand-1,make-array,make-hierarchy,map,map-entry?,map-indexed,map?,mapcat,mapv,max,max-key,memfn,memoize,merge,merge-with,meta,method-sig,methods,min,min-key,mix-collection-hash,mod,munge,name,namespace,namespace-munge,nat-int?,neg-int?,neg?,newline,next,nfirst,nil?,nnext,not,not-any?,not-empty,not-every?,not=,ns,ns-aliases,ns-imports,ns-interns,ns-map,ns-name,ns-publics,ns-refers,ns-resolve,ns-unalias,ns-unmap,nth,nthnext,nthrest,num,number?,numerator,object-array,odd?,or,parents,partial,partition,partition-all,partition-by,pcalls,peek,persistent!,pmap,pop,pop!,pop-thread-bindings,pos-int?,pos?,pr,pr-str,prefer-method,prefers,primitives-classnames,print,print-ctor,print-dup,print-method,print-simple,print-str,printf,println,println-str,prn,prn-str,promise,proxy,proxy-call-with-super,proxy-mappings,proxy-name,proxy-super,push-thread-bindings,pvalues,qualified-ident?,qualified-keyword?,qualified-symbol?,quot,rand,rand-int,rand-nth,random-sample,range,ratio?,rational?,rationalize,re-find,re-groups,re-matcher,re-matches,re-pattern,re-seq,read,read-line,read-string,reader-conditional,reader-conditional?,realized?,record?,reduce,reduce-kv,reduced,reduced?,reductions,ref,ref-history-count,ref-max-history,ref-min-history,ref-set,refer,refer-clojure,reify,release-pending-sends,rem,remove,remove-all-methods,remove-method,remove-ns,remove-watch,repeat,repeatedly,replace,replicate,require,reset!,reset-meta!,reset-vals!,resolve,rest,restart-agent,resultset-seq,reverse,reversible?,rseq,rsubseq,run!,satisfies?,second,select-keys,send,send-off,send-via,seq,seq?,seqable?,seque,sequence,sequential?,set,set-agent-send-executor!,set-agent-send-off-executor!,set-error-handler!,set-error-mode!,set-validator!,set?,short,short-array,shorts,shuffle,shutdown-agents,simple-ident?,simple-keyword?,simple-symbol?,slurp,some,some->,some->>,some-fn,some?,sort,sort-by,sorted-map,sorted-map-by,sorted-set,sorted-set-by,sorted?,special-symbol?,spit,split-at,split-with,str,string?,struct,struct-map,subs,subseq,subvec,supers,swap!,swap-vals!,symbol,symbol?,sync,tagged-literal,tagged-literal?,take,take-last,take-nth,take-while,test,the-ns,thread-bound?,time,to-array,to-array-2d,trampoline,transduce,transient,tree-seq,true?,type,unchecked-add,unchecked-add-int,unchecked-byte,unchecked-char,unchecked-dec,unchecked-dec-int,unchecked-divide-int,unchecked-double,unchecked-float,unchecked-inc,unchecked-inc-int,unchecked-int,unchecked-long,unchecked-multiply,unchecked-multiply-int,unchecked-negate,unchecked-negate-int,unchecked-remainder-int,unchecked-short,unchecked-subtract,unchecked-subtract-int,underive,unquote,unquote-splicing,unreduced,unsigned-bit-shift-right,update,update-in,update-proxy,uri?,use,uuid?,val,vals,var-get,var-set,var?,vary-meta,vec,vector,vector-of,vector?,volatile!,volatile?,vreset!,vswap!,when,when-first,when-let,when-not,when-some,while,with-bindings,with-bindings*,with-in-str,with-loading-context,with-local-vars,with-meta,with-open,with-out-str,with-precision,with-redefs,with-redefs-fn,xml-seq,zero?,zipmap`.split(`,`),tokenizer:{root:[{include:`@whitespace`},[/@numbers/,`number`],[/@characters/,`string`],{include:`@string`},[/[()\[\]{}]/,`@brackets`],[/\/#"(?:\.|(?:")|[^"\n])*"\/g/,`regexp`],[/[#'@^`~]/,`meta`],[/@qualifiedSymbols/,{cases:{"^:.+$":`constant`,"@specialForms":`keyword`,"@coreSymbols":`keyword`,"@constants":`constant`,"@default":`identifier`}}]],whitespace:[[/[\s,]+/,`white`],[/;.*$/,`comment`],[/\(comment\b/,`comment`,`@comment`]],comment:[[/\(/,`comment`,`@push`],[/\)/,`comment`,`@pop`],[/[^()]/,`comment`]],string:[[/"/,`string`,`@multiLineString`]],multiLineString:[[/"/,`string`,`@popall`],[/@escapes/,`string.escape`],[/./,`string`]]}};export{e as conf,t as language};
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:[`###`,`###`],lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{markers:{start:RegExp(`^\\s*#region\\b`),end:RegExp(`^\\s*#endregion\\b`)}}},t={defaultToken:``,ignoreCase:!0,tokenPostfix:`.coffee`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:`and.or.is.isnt.not.on.yes.@.no.off.true.false.null.this.new.delete.typeof.in.instanceof.return.throw.break.continue.debugger.if.else.switch.for.while.do.try.catch.finally.class.extends.super.undefined.then.unless.until.loop.of.by.when`.split(`.`),symbols:/[=><!~?&%|+\-*\/\^\.,\:]+/,escapes:/\\(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\@[a-zA-Z_]\w*/,`variable.predefined`],[/[a-zA-Z_]\w*/,{cases:{this:`variable.predefined`,"@keywords":{token:`keyword.$0`},"@default":``}}],[/[ \t\r\n]+/,``],[/###/,`comment`,`@comment`],[/#.*$/,`comment`],[`///`,{token:`regexp`,next:`@hereregexp`}],[/^(\s*)(@regEx)/,[``,`regexp`]],[/(\()(\s*)(@regEx)/,[`@brackets`,``,`regexp`]],[/(\,)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\=)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\:)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\[)(\s*)(@regEx)/,[`@brackets`,``,`regexp`]],[/(\!)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\&)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\|)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\?)(\s*)(@regEx)/,[`delimiter`,``,`regexp`]],[/(\{)(\s*)(@regEx)/,[`@brackets`,``,`regexp`]],[/(\;)(\s*)(@regEx)/,[``,``,`regexp`]],[/}/,{cases:{"$S2==interpolatedstring":{token:`string`,next:`@pop`},"@default":`@brackets`}}],[/[{}()\[\]]/,`@brackets`],[/@symbols/,`delimiter`],[/\d+[eE]([\-+]?\d+)?/,`number.float`],[/\d+\.\d+([eE][\-+]?\d+)?/,`number.float`],[/0[xX][0-9a-fA-F]+/,`number.hex`],[/0[0-7]+(?!\d)/,`number.octal`],[/\d+/,`number`],[/[,.]/,`delimiter`],[/"""/,`string`,`@herestring."""`],[/'''/,`string`,`@herestring.'''`],[/"/,{cases:{"@eos":`string`,"@default":{token:`string`,next:`@string."`}}}],[/'/,{cases:{"@eos":`string`,"@default":{token:`string`,next:`@string.'`}}}]],string:[[/[^"'\#\\]+/,`string`],[/@escapes/,`string.escape`],[/\./,`string.escape.invalid`],[/\./,`string.escape.invalid`],[/#{/,{cases:{'$S2=="':{token:`string`,next:`root.interpolatedstring`},"@default":`string`}}],[/["']/,{cases:{"$#==$S2":{token:`string`,next:`@pop`},"@default":`string`}}],[/#/,`string`]],herestring:[[/("""|''')/,{cases:{"$1==$S2":{token:`string`,next:`@pop`},"@default":`string`}}],[/[^#\\'"]+/,`string`],[/['"]+/,`string`],[/@escapes/,`string.escape`],[/\./,`string.escape.invalid`],[/#{/,{token:`string.quote`,next:`root.interpolatedstring`}],[/#/,`string`]],comment:[[/[^#]+/,`comment`],[/###/,`comment`,`@pop`],[/#/,`comment`]],hereregexp:[[/[^\\\/#]+/,`regexp`],[/\\./,`regexp`],[/#.*$/,`comment`],[`///[igm]*`,{token:`regexp`,next:`@pop`}],[/\//,`regexp`]]}};export{e as conf,t as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={comments:{lineComment:`//`,blockComment:[`/*`,`*/`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`[`,close:`]`},{open:`{`,close:`}`},{open:`(`,close:`)`},{open:`'`,close:`'`,notIn:[`string`,`comment`]},{open:`"`,close:`"`,notIn:[`string`]}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{markers:{start:RegExp(`^\\s*#pragma\\s+region\\b`),end:RegExp(`^\\s*#pragma\\s+endregion\\b`)}}},t={defaultToken:``,tokenPostfix:`.cpp`,brackets:[{token:`delimiter.curly`,open:`{`,close:`}`},{token:`delimiter.parenthesis`,open:`(`,close:`)`},{token:`delimiter.square`,open:`[`,close:`]`},{token:`delimiter.angle`,open:`<`,close:`>`}],keywords:`abstract.amp.array.auto.bool.break.case.catch.char.class.const.constexpr.const_cast.continue.cpu.decltype.default.delegate.delete.do.double.dynamic_cast.each.else.enum.event.explicit.export.extern.false.final.finally.float.for.friend.gcnew.generic.goto.if.in.initonly.inline.int.interface.interior_ptr.internal.literal.long.mutable.namespace.new.noexcept.nullptr.__nullptr.operator.override.partial.pascal.pin_ptr.private.property.protected.public.ref.register.reinterpret_cast.restrict.return.safe_cast.sealed.short.signed.sizeof.static.static_assert.static_cast.struct.switch.template.this.thread_local.throw.tile_static.true.try.typedef.typeid.typename.union.unsigned.using.virtual.void.volatile.wchar_t.where.while._asm._based._cdecl._declspec._fastcall._if_exists._if_not_exists._inline._multiple_inheritance._pascal._single_inheritance._stdcall._virtual_inheritance._w64.__abstract.__alignof.__asm.__assume.__based.__box.__builtin_alignof.__cdecl.__clrcall.__declspec.__delegate.__event.__except.__fastcall.__finally.__forceinline.__gc.__hook.__identifier.__if_exists.__if_not_exists.__inline.__int128.__int16.__int32.__int64.__int8.__interface.__leave.__m128.__m128d.__m128i.__m256.__m256d.__m256i.__m512.__m512d.__m512i.__m64.__multiple_inheritance.__newslot.__nogc.__noop.__nounwind.__novtordisp.__pascal.__pin.__pragma.__property.__ptr32.__ptr64.__raise.__restrict.__resume.__sealed.__single_inheritance.__stdcall.__super.__thiscall.__try.__try_cast.__typeof.__unaligned.__unhook.__uuidof.__value.__virtual_inheritance.__w64.__wchar_t`.split(`.`),operators:`=.>.<.!.~.?.:.==.<=.>=.!=.&&.||.++.--.+.-.*./.&.|.^.%.<<.>>.+=.-=.*=./=.&=.|=.^=.%=.<<=.>>=`.split(`.`),symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[0abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,integersuffix:/([uU](ll|LL|l|L)|(ll|LL|l|L)?[uU]?)/,floatsuffix:/[fFlL]?/,encoding:/u|u8|U|L/,tokenizer:{root:[[/@encoding?R\"(?:([^ ()\\\t]*))\(/,{token:`string.raw.begin`,next:`@raw.$1`}],[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:`keyword.$0`},"@default":`identifier`}}],[/^\s*#\s*include/,{token:`keyword.directive.include`,next:`@include`}],[/^\s*#\s*\w+/,`keyword.directive`],{include:`@whitespace`},[/\[\s*\[/,{token:`annotation`,next:`@annotation`}],[/[{}()<>\[\]]/,`@brackets`],[/@symbols/,{cases:{"@operators":`delimiter`,"@default":``}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,`number.float`],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,`number.float`],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,`number.hex`],[/0[0-7']*[0-7](@integersuffix)/,`number.octal`],[/0[bB][0-1']*[0-1](@integersuffix)/,`number.binary`],[/\d[\d']*\d(@integersuffix)/,`number`],[/\d(@integersuffix)/,`number`],[/[;,.]/,`delimiter`],[/"([^"\\]|\\.)*$/,`string.invalid`],[/"/,`string`,`@string`],[/'[^\\']'/,`string`],[/(')(@escapes)(')/,[`string`,`string.escape`,`string`]],[/'/,`string.invalid`]],whitespace:[[/[ \t\r\n]+/,``],[/\/\*\*(?!\/)/,`comment.doc`,`@doccomment`],[/\/\*/,`comment`,`@comment`],[/\/\/.*\\$/,`comment`,`@linecomment`],[/\/\/.*$/,`comment`]],comment:[[/[^\/*]+/,`comment`],[/\*\//,`comment`,`@pop`],[/[\/*]/,`comment`]],linecomment:[[/.*[^\\]$/,`comment`,`@pop`],[/[^]+/,`comment`]],doccomment:[[/[^\/*]+/,`comment.doc`],[/\*\//,`comment.doc`,`@pop`],[/[\/*]/,`comment.doc`]],string:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],raw:[[/[^)]+/,`string.raw`],[/\)$S2\"/,{token:`string.raw.end`,next:`@pop`}],[/\)/,`string.raw`]],annotation:[{include:`@whitespace`},[/using|alignas/,`keyword`],[/[a-zA-Z0-9_]+/,`annotation`],[/[,:]/,`delimiter`],[/[()]/,`@brackets`],[/\]\s*\]/,{token:`annotation`,next:`@pop`}]],include:[[/(\s*)(<)([^<>]*)(>)/,[``,`keyword.directive.include.begin`,`string.include.identifier`,{token:`keyword.directive.include.end`,next:`@pop`}]],[/(\s*)(")([^"]*)(")/,[``,`keyword.directive.include.begin`,`string.include.identifier`,{token:`keyword.directive.include.end`,next:`@pop`}]]]}};export{e as conf,t as language};
|