@jesscss/plugin-js 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Matthew Dean
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,6 @@
1
+ # @jesscss/plugin-js
2
+
3
+ Jess plugin that enables JavaScript/TypeScript module imports.
4
+
5
+ This package checks for a usable Deno runtime before executing non-`@jesscss/fns`
6
+ modules. It is intended to be auto-loaded by `jess` when installed.
package/lib/index.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { AbstractPlugin } from '@jesscss/core';
2
+ export type JavaScriptSandboxConfig = {
3
+ allowHttp?: boolean;
4
+ allowNetHosts?: string[];
5
+ jsReadRoot?: string;
6
+ };
7
+ export interface JsPluginOptions extends JavaScriptSandboxConfig {
8
+ denoCommand?: string;
9
+ }
10
+ export declare class JsPlugin extends AbstractPlugin {
11
+ opts: JsPluginOptions;
12
+ name: string;
13
+ supportedExtensions: string[];
14
+ private runtimeState;
15
+ private brokerServer;
16
+ private brokerSocketPath;
17
+ private worker;
18
+ private workerBuffer;
19
+ private nextRequestId;
20
+ private pending;
21
+ constructor(opts?: JsPluginOptions);
22
+ prewarm(): Promise<void | undefined>;
23
+ private ensureRuntimeAvailable;
24
+ private ensureRuntime;
25
+ private createBrokerPath;
26
+ private isReadAllowed;
27
+ private isNetAllowed;
28
+ private handleBrokerRequest;
29
+ private startBroker;
30
+ private startWorker;
31
+ private startRuntime;
32
+ private onWorkerStdout;
33
+ private rejectAllPending;
34
+ private callWorker;
35
+ private shutdown;
36
+ dispose(): void;
37
+ private assertAllowedPath;
38
+ import(absoluteFilePath: string): Promise<Record<string, any>>;
39
+ }
40
+ /**
41
+ * Global flag set when @jesscss/plugin-js is loaded.
42
+ * less-compat checks this before running @plugin scripts (scripts must be run when plugin-js/Deno is present).
43
+ */
44
+ export declare const JESS_PLUGIN_JS_GLOBAL = "__JESS_PLUGIN_JS_AVAILABLE__";
45
+ declare const jsPlugin: (opts?: JsPluginOptions) => JsPlugin;
46
+ export default jsPlugin;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACf,MAAM,eAAe,CAAC;AAOvB,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,uBAAuB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoGD,qBAAa,QAAS,SAAQ,cAAc;IAevB,IAAI,EAAE,eAAe;IAdxC,IAAI,SAAQ;IACZ,mBAAmB,WAAiC;IACpD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAIV;gBAEc,IAAI,GAAE,eAAoB;IAI7C,OAAO;IAIP,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,mBAAmB;YA0Bb,WAAW;IA2CzB,OAAO,CAAC,WAAW;YAkEL,YAAY;IAW1B,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,gBAAgB;YAQV,UAAU;IAqBxB,OAAO,CAAC,QAAQ;IAqBhB,OAAO;IAKP,OAAO,CAAC,iBAAiB;IAgBnB,MAAM,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CA6CrE;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAOpE,QAAA,MAAM,QAAQ,UAAY,eAAe,aAEtB,CAAC;AAEpB,eAAe,QAAQ,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,442 @@
1
+ import { AbstractPlugin } from '@jesscss/core';
2
+ import * as fs from 'node:fs';
3
+ import * as net from 'node:net';
4
+ import * as path from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+ import { spawn, spawnSync } from 'node:child_process';
7
+ const SCRIPT_EXTENSIONS = new Set([
8
+ '.js',
9
+ '.mjs',
10
+ '.cjs',
11
+ '.ts',
12
+ '.mts',
13
+ '.cts'
14
+ ]);
15
+ const RUNTIME_MISSING_MESSAGE = [
16
+ 'Deno runtime is required for @jesscss/plugin-js, but no usable Deno binary was found.',
17
+ 'If using pnpm, approve build scripts for "deno" (pnpm approve-builds).',
18
+ 'If using npm with ignored scripts, reinstall with lifecycle scripts enabled.',
19
+ 'Or install native Deno and ensure "deno" is on PATH.'
20
+ ].join('\n');
21
+ const BOOT_TIMEOUT_MS = 8000;
22
+ const REQUEST_TIMEOUT_MS = 10_000;
23
+ const isPathInside = (candidatePath, rootPath) => {
24
+ const rel = path.relative(rootPath, candidatePath);
25
+ return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
26
+ };
27
+ const canonicalPath = (p) => {
28
+ try {
29
+ return fs.realpathSync.native(p);
30
+ }
31
+ catch {
32
+ return p;
33
+ }
34
+ };
35
+ const normalizePermissionPath = (value) => {
36
+ if (!value) {
37
+ return null;
38
+ }
39
+ if (value.startsWith('file://')) {
40
+ try {
41
+ return fileURLToPath(value);
42
+ }
43
+ catch {
44
+ return value;
45
+ }
46
+ }
47
+ return value;
48
+ };
49
+ const isFnsPath = (importPath) => {
50
+ const normalized = importPath.replace(/\\/g, '/');
51
+ const isFnsPackagePath = /(^|\/)(@jesscss\/fns|packages\/fns)(\/|$)/.test(normalized);
52
+ return (normalized === '@jesscss/fns'
53
+ || normalized.startsWith('@jesscss/fns/')
54
+ || normalized === '#less'
55
+ || normalized.startsWith('#less/')
56
+ || normalized === '#sass'
57
+ || normalized.startsWith('#sass/')
58
+ || isFnsPackagePath);
59
+ };
60
+ const isJsonValue = (value) => {
61
+ try {
62
+ JSON.stringify(value);
63
+ return true;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ };
69
+ export class JsPlugin extends AbstractPlugin {
70
+ opts;
71
+ name = 'js';
72
+ supportedExtensions = Array.from(SCRIPT_EXTENSIONS);
73
+ runtimeState = { status: 'idle' };
74
+ brokerServer;
75
+ brokerSocketPath;
76
+ worker;
77
+ workerBuffer = '';
78
+ nextRequestId = 1;
79
+ pending = new Map();
80
+ constructor(opts = {}) {
81
+ super();
82
+ this.opts = opts;
83
+ }
84
+ prewarm() {
85
+ return this.ensureRuntime().catch(() => undefined);
86
+ }
87
+ ensureRuntimeAvailable() {
88
+ const denoCommand = this.opts.denoCommand ?? 'deno';
89
+ const result = spawnSync(denoCommand, ['--version'], {
90
+ stdio: 'ignore'
91
+ });
92
+ if (result.status !== 0) {
93
+ throw new Error(RUNTIME_MISSING_MESSAGE);
94
+ }
95
+ }
96
+ ensureRuntime() {
97
+ if (this.runtimeState.status === 'ready') {
98
+ return Promise.resolve();
99
+ }
100
+ if (this.runtimeState.status === 'initializing') {
101
+ return this.runtimeState.promise;
102
+ }
103
+ if (this.runtimeState.status === 'failed') {
104
+ return Promise.reject(this.runtimeState.error);
105
+ }
106
+ const promise = this.startRuntime().then(() => {
107
+ this.runtimeState = { status: 'ready' };
108
+ }, (err) => {
109
+ this.runtimeState = { status: 'failed', error: err };
110
+ throw err;
111
+ });
112
+ this.runtimeState = { status: 'initializing', promise };
113
+ return promise;
114
+ }
115
+ createBrokerPath() {
116
+ if (process.platform === 'win32') {
117
+ const rand = `${process.pid}-${Date.now()}-${Math.floor(Math.random() * 10000)}`;
118
+ return `\\\\.\\pipe\\jess-deno-broker-${rand}`;
119
+ }
120
+ // macOS temp dir paths can exceed unix socket limits. Keep this short.
121
+ const rand = Math.floor(Math.random() * 10000);
122
+ return `/tmp/jd-${process.pid}-${Date.now()}-${rand}.sock`;
123
+ }
124
+ isReadAllowed(value) {
125
+ const normalized = normalizePermissionPath(value);
126
+ if (!normalized) {
127
+ return false;
128
+ }
129
+ const requestedPath = canonicalPath(path.resolve(normalized));
130
+ const jsReadRoot = this.opts.jsReadRoot ? canonicalPath(path.resolve(this.opts.jsReadRoot)) : undefined;
131
+ if (jsReadRoot && isPathInside(requestedPath, jsReadRoot)) {
132
+ return true;
133
+ }
134
+ return requestedPath.includes(`${path.sep}node_modules${path.sep}`);
135
+ }
136
+ isNetAllowed(value) {
137
+ if (!this.opts.allowHttp) {
138
+ return false;
139
+ }
140
+ const allowHosts = this.opts.allowNetHosts ?? [];
141
+ if (allowHosts.length === 0) {
142
+ return true;
143
+ }
144
+ if (!value) {
145
+ return false;
146
+ }
147
+ const host = value.split(':')[0] ?? value;
148
+ return allowHosts.includes(host);
149
+ }
150
+ handleBrokerRequest(request) {
151
+ const deny = (reason) => ({
152
+ id: request.id,
153
+ result: 'deny',
154
+ reason
155
+ });
156
+ switch (request.permission) {
157
+ case 'read':
158
+ return this.isReadAllowed(request.value)
159
+ ? { id: request.id, result: 'allow' }
160
+ : deny('Read access denied by Jess policy.');
161
+ case 'net':
162
+ return this.isNetAllowed(request.value)
163
+ ? { id: request.id, result: 'allow' }
164
+ : deny('Network access denied by Jess policy.');
165
+ case 'env':
166
+ case 'run':
167
+ case 'ffi':
168
+ case 'sys':
169
+ case 'write':
170
+ return deny(`${request.permission} permission denied by Jess policy.`);
171
+ default:
172
+ return deny(`Permission "${request.permission}" denied by Jess policy.`);
173
+ }
174
+ }
175
+ async startBroker() {
176
+ const socketPath = this.createBrokerPath();
177
+ if (process.platform !== 'win32' && fs.existsSync(socketPath)) {
178
+ fs.unlinkSync(socketPath);
179
+ }
180
+ const server = net.createServer((socket) => {
181
+ let buf = '';
182
+ socket.setEncoding('utf8');
183
+ socket.on('data', (chunk) => {
184
+ buf += chunk;
185
+ let idx = buf.indexOf('\n');
186
+ while (idx >= 0) {
187
+ const line = buf.slice(0, idx).trim();
188
+ buf = buf.slice(idx + 1);
189
+ idx = buf.indexOf('\n');
190
+ if (!line) {
191
+ continue;
192
+ }
193
+ let req;
194
+ try {
195
+ req = JSON.parse(line);
196
+ }
197
+ catch {
198
+ socket.write(JSON.stringify({
199
+ id: -1,
200
+ result: 'deny',
201
+ reason: 'Malformed permission request.'
202
+ }) + '\n');
203
+ continue;
204
+ }
205
+ const response = this.handleBrokerRequest(req);
206
+ socket.write(`${JSON.stringify(response)}\n`);
207
+ }
208
+ });
209
+ });
210
+ await new Promise((resolve, reject) => {
211
+ server.once('error', reject);
212
+ server.listen(socketPath, () => resolve());
213
+ });
214
+ this.brokerServer = server;
215
+ this.brokerSocketPath = socketPath;
216
+ return socketPath;
217
+ }
218
+ startWorker(socketPath) {
219
+ const denoCommand = this.opts.denoCommand ?? 'deno';
220
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
221
+ const compiledWorkerPath = path.join(moduleDir, 'runtime-worker.js');
222
+ const sourceWorkerPath = path.join(moduleDir, 'runtime-worker.ts');
223
+ const workerScriptPath = fs.existsSync(compiledWorkerPath)
224
+ ? compiledWorkerPath
225
+ : sourceWorkerPath;
226
+ const child = spawn(denoCommand, ['run', '--no-prompt', workerScriptPath], {
227
+ stdio: ['pipe', 'pipe', 'pipe'],
228
+ env: {
229
+ ...process.env,
230
+ DENO_PERMISSION_BROKER_PATH: socketPath
231
+ }
232
+ });
233
+ this.worker = child;
234
+ child.stdout.setEncoding('utf8');
235
+ child.stderr.setEncoding('utf8');
236
+ child.stdout.on('data', chunk => this.onWorkerStdout(chunk));
237
+ child.on('exit', () => {
238
+ const err = new Error('Deno worker exited unexpectedly.');
239
+ this.rejectAllPending(err);
240
+ if (this.runtimeState.status !== 'failed') {
241
+ this.runtimeState = { status: 'failed', error: err };
242
+ }
243
+ });
244
+ return new Promise((resolve, reject) => {
245
+ const timer = setTimeout(() => {
246
+ reject(new Error('Timed out waiting for Deno worker startup.'));
247
+ }, BOOT_TIMEOUT_MS);
248
+ const onData = (chunk) => {
249
+ this.workerBuffer += chunk;
250
+ let idx = this.workerBuffer.indexOf('\n');
251
+ while (idx >= 0) {
252
+ const line = this.workerBuffer.slice(0, idx).trim();
253
+ this.workerBuffer = this.workerBuffer.slice(idx + 1);
254
+ idx = this.workerBuffer.indexOf('\n');
255
+ if (!line) {
256
+ continue;
257
+ }
258
+ try {
259
+ const parsed = JSON.parse(line);
260
+ if (parsed.type === 'ready') {
261
+ clearTimeout(timer);
262
+ child.stdout.off('data', onData);
263
+ resolve();
264
+ return;
265
+ }
266
+ }
267
+ catch {
268
+ // ignore until ready payload appears
269
+ }
270
+ }
271
+ };
272
+ child.stdout.on('data', onData);
273
+ child.once('error', (err) => {
274
+ clearTimeout(timer);
275
+ child.stdout.off('data', onData);
276
+ reject(err);
277
+ });
278
+ });
279
+ }
280
+ async startRuntime() {
281
+ this.ensureRuntimeAvailable();
282
+ const socketPath = await this.startBroker();
283
+ try {
284
+ await this.startWorker(socketPath);
285
+ }
286
+ catch (err) {
287
+ this.shutdown();
288
+ throw err instanceof Error ? err : new Error(String(err));
289
+ }
290
+ }
291
+ onWorkerStdout(chunk) {
292
+ this.workerBuffer += chunk;
293
+ let idx = this.workerBuffer.indexOf('\n');
294
+ while (idx >= 0) {
295
+ const line = this.workerBuffer.slice(0, idx).trim();
296
+ this.workerBuffer = this.workerBuffer.slice(idx + 1);
297
+ idx = this.workerBuffer.indexOf('\n');
298
+ if (!line) {
299
+ continue;
300
+ }
301
+ let parsed;
302
+ try {
303
+ parsed = JSON.parse(line);
304
+ }
305
+ catch {
306
+ continue;
307
+ }
308
+ if (!parsed || typeof parsed.id !== 'number') {
309
+ continue;
310
+ }
311
+ const pending = this.pending.get(parsed.id);
312
+ if (!pending) {
313
+ continue;
314
+ }
315
+ this.pending.delete(parsed.id);
316
+ clearTimeout(pending.timeout);
317
+ pending.resolve(parsed);
318
+ }
319
+ }
320
+ rejectAllPending(err) {
321
+ for (const pending of this.pending.values()) {
322
+ clearTimeout(pending.timeout);
323
+ pending.reject(err);
324
+ }
325
+ this.pending.clear();
326
+ }
327
+ async callWorker(request) {
328
+ await this.ensureRuntime();
329
+ if (!this.worker || !this.worker.stdin.writable) {
330
+ throw new Error('Deno worker is not available.');
331
+ }
332
+ const id = this.nextRequestId++;
333
+ const payload = { ...request, id };
334
+ return await new Promise((resolve, reject) => {
335
+ const timeout = setTimeout(() => {
336
+ this.pending.delete(id);
337
+ reject(new Error('Timed out waiting for Deno worker response.'));
338
+ }, REQUEST_TIMEOUT_MS);
339
+ this.pending.set(id, { resolve, reject, timeout });
340
+ this.worker.stdin.write(`${JSON.stringify(payload)}\n`);
341
+ });
342
+ }
343
+ shutdown() {
344
+ if (this.worker && !this.worker.killed) {
345
+ this.worker.kill();
346
+ }
347
+ this.worker = undefined;
348
+ if (this.brokerServer) {
349
+ this.brokerServer.close();
350
+ this.brokerServer = undefined;
351
+ }
352
+ if (this.brokerSocketPath && process.platform !== 'win32') {
353
+ try {
354
+ if (fs.existsSync(this.brokerSocketPath)) {
355
+ fs.unlinkSync(this.brokerSocketPath);
356
+ }
357
+ }
358
+ catch {
359
+ // ignore
360
+ }
361
+ }
362
+ this.brokerSocketPath = undefined;
363
+ }
364
+ dispose() {
365
+ this.shutdown();
366
+ this.runtimeState = { status: 'idle' };
367
+ }
368
+ assertAllowedPath(absoluteFilePath) {
369
+ const resolvedPath = path.resolve(absoluteFilePath);
370
+ const jsReadRoot = this.opts.jsReadRoot ? path.resolve(this.opts.jsReadRoot) : undefined;
371
+ if (!jsReadRoot) {
372
+ return;
373
+ }
374
+ if (isPathInside(resolvedPath, jsReadRoot)) {
375
+ return;
376
+ }
377
+ // pnpm layouts may resolve package files outside project root.
378
+ if (resolvedPath.includes(`${path.sep}node_modules${path.sep}`)) {
379
+ return;
380
+ }
381
+ throw new Error(`Script path "${resolvedPath}" is outside jsReadRoot "${jsReadRoot}"`);
382
+ }
383
+ async import(absoluteFilePath) {
384
+ const ext = path.extname(absoluteFilePath);
385
+ if (!SCRIPT_EXTENSIONS.has(ext)) {
386
+ throw new Error(`Plugin "${this.name}" cannot import "${absoluteFilePath}"`);
387
+ }
388
+ if (!isFnsPath(absoluteFilePath)) {
389
+ this.assertAllowedPath(absoluteFilePath);
390
+ await this.ensureRuntime();
391
+ const modulePath = path.resolve(absoluteFilePath);
392
+ const loadResult = await this.callWorker({ type: 'load', modulePath });
393
+ if (!loadResult.ok) {
394
+ throw new Error(loadResult.error);
395
+ }
396
+ const moduleObject = {};
397
+ const exported = loadResult.exports ?? [];
398
+ for (const item of exported) {
399
+ if (item.kind === 'function') {
400
+ moduleObject[item.name] = async (...args) => {
401
+ const invokeResult = await this.callWorker({
402
+ type: 'invoke',
403
+ modulePath,
404
+ exportName: item.name,
405
+ args
406
+ });
407
+ if (!invokeResult.ok) {
408
+ throw new Error(invokeResult.error);
409
+ }
410
+ return invokeResult.value;
411
+ };
412
+ }
413
+ else {
414
+ moduleObject[item.name] = item.value;
415
+ }
416
+ }
417
+ return moduleObject;
418
+ }
419
+ const modulePath = pathToFileURL(path.resolve(absoluteFilePath)).href;
420
+ const module = await import(modulePath);
421
+ const safeModule = {};
422
+ for (const [key, value] of Object.entries(module)) {
423
+ if (typeof value === 'function' || isJsonValue(value)) {
424
+ safeModule[key] = value;
425
+ }
426
+ }
427
+ return safeModule;
428
+ }
429
+ }
430
+ /**
431
+ * Global flag set when @jesscss/plugin-js is loaded.
432
+ * less-compat checks this before running @plugin scripts (scripts must be run when plugin-js/Deno is present).
433
+ */
434
+ export const JESS_PLUGIN_JS_GLOBAL = '__JESS_PLUGIN_JS_AVAILABLE__';
435
+ if (typeof globalThis !== 'undefined') {
436
+ globalThis[JESS_PLUGIN_JS_GLOBAL] = true;
437
+ }
438
+ const jsPlugin = ((opts) => {
439
+ return new JsPlugin(opts);
440
+ });
441
+ export default jsPlugin;
442
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAuC,MAAM,oBAAoB,CAAC;AAY3F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG;IAC9B,uFAAuF;IACvF,wEAAwE;IACxE,8EAA8E;IAC9E,sDAAsD;CACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,aAAqB,EAAE,QAAgB,EAAW,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,CAAS,EAAU,EAAE;IAC1C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAiB,EAAE;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,UAAkB,EAAW,EAAE;IAChD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,2CAA2C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,OAAO,CACL,UAAU,KAAK,cAAc;WAC1B,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;WACtC,UAAU,KAAK,OAAO;WACtB,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;WAC/B,UAAU,KAAK,OAAO;WACtB,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;WAC/B,gBAAgB,CACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,EAAE;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AA+BF,MAAM,OAAO,QAAS,SAAQ,cAAc;IAevB;IAdnB,IAAI,GAAG,IAAI,CAAC;IACZ,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,YAAY,GAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChD,YAAY,CAAyB;IACrC,gBAAgB,CAAqB;IACrC,MAAM,CAA6C;IACnD,YAAY,GAAG,EAAE,CAAC;IAClB,aAAa,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,IAAI,GAAG,EAIrB,CAAC;IAEL,YAAmB,OAAwB,EAAE;QAC3C,KAAK,EAAE,CAAC;QADS,SAAI,GAAJ,IAAI,CAAsB;IAE7C,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAEO,sBAAsB;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE;YACnD,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CACtC,GAAG,EAAE;YACH,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC,EACD,CAAC,GAAU,EAAE,EAAE;YACb,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC,CACF,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;QACxD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,gBAAgB;QACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACjF,OAAO,iCAAiC,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,uEAAuE;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;QAC/C,OAAO,WAAW,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC;IAC7D,CAAC;IAEO,aAAa,CAAC,KAAoB;QACxC,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxG,IAAI,UAAU,IAAI,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IAEO,YAAY,CAAC,KAAoB;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,mBAAmB,CAAC,OAAsB;QAChD,MAAM,IAAI,GAAG,CAAC,MAAc,EAAkB,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM,EAAE,MAAM;YACd,MAAM;SACP,CAAC,CAAC;QACH,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;oBACtC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrC,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACjD,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;oBACrC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrC,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACpD,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,oCAAoC,CAAC,CAAC;YACzE;gBACE,OAAO,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,0BAA0B,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,GAAG,IAAI,KAAK,CAAC;gBACb,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACxB,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,SAAS;oBACX,CAAC;oBACD,IAAI,GAA8B,CAAC;oBACnC,IAAI,CAAC;wBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;oBAC1C,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;4BAC1B,EAAE,EAAE,CAAC,CAAC;4BACN,MAAM,EAAE,MAAM;4BACd,MAAM,EAAE,+BAA+B;yBACxC,CAAC,GAAG,IAAI,CAAC,CAAC;wBACX,SAAS;oBACX,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;QACnC,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,UAAkB;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;YACxD,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,gBAAgB,CAAC;QACrB,MAAM,KAAK,GAAG,KAAK,CACjB,WAAW,EACX,CAAC,KAAK,EAAE,aAAa,EAAE,gBAAgB,CAAC,EACxC;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,2BAA2B,EAAE,UAAU;aACxC;SACF,CACF,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACpB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAClE,CAAC,EAAE,eAAe,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;gBAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1C,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACrD,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;wBACrD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;4BACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;4BACjC,OAAO,EAAE,CAAC;4BACV,OAAO;wBACT,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,qCAAqC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;QAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACrD,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,IAAI,MAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,GAAU;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,OAE+E;QAE/E,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,OAAO,GAAe,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/C,OAAO,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACnE,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACzC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAEO,iBAAiB,CAAC,gBAAwB;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,+DAA+D;QAC/D,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,4BAA4B,UAAU,GAAG,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,gBAAwB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,oBAAoB,gBAAgB,GAAG,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,YAAY,GAAwB,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC7B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBACrD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;4BACzC,IAAI,EAAE,QAAQ;4BACd,UAAU;4BACV,UAAU,EAAE,IAAI,CAAC,IAAI;4BACrB,IAAI;yBACL,CAAC,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;4BACrB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBACtC,CAAC;wBACD,OAAO,YAAY,CAAC,KAAK,CAAC;oBAC5B,CAAC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,UAAU,GAAwB,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAA6B,CAAC,EAAE,CAAC;YACzE,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAGpE,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;IACtC,UAAU,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAsB,EAAE,EAAE;IAC3C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAkB,CAAC;AAEpB,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-worker.d.ts","sourceRoot":"","sources":["../src/runtime-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ // @ts-nocheck
2
+ import { pathToFileURL } from 'node:url';
3
+ const encoder = new TextEncoder();
4
+ const decoder = new TextDecoder();
5
+ const moduleCache = new Map();
6
+ const isJsonValue = (value) => {
7
+ try {
8
+ JSON.stringify(value);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ };
15
+ const send = (payload) => {
16
+ Deno.stdout.writeSync(encoder.encode(`${JSON.stringify(payload)}\n`));
17
+ };
18
+ const loadModule = async (modulePath) => {
19
+ let mod = moduleCache.get(modulePath);
20
+ if (!mod) {
21
+ const href = pathToFileURL(modulePath).href;
22
+ mod = await import(href);
23
+ moduleCache.set(modulePath, mod);
24
+ }
25
+ const exports = [];
26
+ for (const [name, value] of Object.entries(mod)) {
27
+ if (typeof value === 'function') {
28
+ exports.push({ name, kind: 'function' });
29
+ continue;
30
+ }
31
+ if (isJsonValue(value)) {
32
+ exports.push({ name, kind: 'value', value });
33
+ }
34
+ }
35
+ return exports;
36
+ };
37
+ const invokeExport = async (modulePath, exportName, args) => {
38
+ const mod = moduleCache.get(modulePath) ?? await import(pathToFileURL(modulePath).href);
39
+ moduleCache.set(modulePath, mod);
40
+ const target = mod?.[exportName];
41
+ if (typeof target !== 'function') {
42
+ throw new Error(`Export "${exportName}" is not callable.`);
43
+ }
44
+ const result = await target(...args);
45
+ if (!isJsonValue(result)) {
46
+ throw new Error(`Result for "${exportName}" is not JSON-serializable.`);
47
+ }
48
+ return result;
49
+ };
50
+ const handleRequest = async (req) => {
51
+ if (!req || typeof req.id !== 'number' || typeof req.type !== 'string') {
52
+ return;
53
+ }
54
+ try {
55
+ if (req.type === 'load') {
56
+ const exports = await loadModule(req.modulePath);
57
+ send({ id: req.id, ok: true, exports });
58
+ return;
59
+ }
60
+ if (req.type === 'invoke') {
61
+ const value = await invokeExport(req.modulePath, req.exportName, req.args ?? []);
62
+ send({ id: req.id, ok: true, value });
63
+ return;
64
+ }
65
+ send({ id: req.id, ok: false, error: `Unknown request type "${req.type}".` });
66
+ }
67
+ catch (err) {
68
+ send({ id: req.id, ok: false, error: err?.message ?? String(err) });
69
+ }
70
+ };
71
+ send({ type: 'ready' });
72
+ let buffer = '';
73
+ for await (const chunk of Deno.stdin.readable) {
74
+ buffer += decoder.decode(chunk, { stream: true });
75
+ let idx = buffer.indexOf('\n');
76
+ while (idx >= 0) {
77
+ const line = buffer.slice(0, idx).trim();
78
+ buffer = buffer.slice(idx + 1);
79
+ idx = buffer.indexOf('\n');
80
+ if (!line) {
81
+ continue;
82
+ }
83
+ let req;
84
+ try {
85
+ req = JSON.parse(line);
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ await handleRequest(req);
91
+ }
92
+ }
93
+ //# sourceMappingURL=runtime-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-worker.js","sourceRoot":"","sources":["../src/runtime-worker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@jesscss/plugin-js",
3
+ "version": "2.0.0-alpha.1",
4
+ "description": "Jess plugin for JavaScript/TypeScript module imports with Deno runtime checks",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./lib/index.js",
10
+ "types": "./lib/index.d.ts",
11
+ "source": "./src/index.ts"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "lib"
17
+ ],
18
+ "dependencies": {
19
+ "deno": "^2.6.8",
20
+ "@jesscss/core": "2.0.0-alpha.1"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.0.0",
24
+ "typescript": "^5.0.0",
25
+ "vitest": "^3.2.4"
26
+ },
27
+ "author": "Matthew Dean <matthew-dean@users.noreply.github.com>",
28
+ "license": "MIT",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "pnpm compile",
34
+ "compile": "tsc -b tsconfig.build.json",
35
+ "dev": "tsc -b tsconfig.json -w",
36
+ "lint:fix": "eslint --fix '**/*.{js,ts}'",
37
+ "lint": "eslint '**/*.{js,ts}'",
38
+ "test": "vitest --run --passWithNoTests"
39
+ }
40
+ }