@lokascript/compilation-service 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,595 @@
1
+ /**
2
+ * Abstract Operation Types
3
+ *
4
+ * The core abstraction layer between semantic roles and output format.
5
+ * Each operation describes a single DOM/state change without prescribing
6
+ * how to emit it — the same operations power test generation (Phase 2)
7
+ * and cross-framework codegen (Phase 3).
8
+ */
9
+ /** A reference to the target of an operation */
10
+ type TargetRef = {
11
+ kind: 'self';
12
+ } | {
13
+ kind: 'selector';
14
+ value: string;
15
+ } | {
16
+ kind: 'variable';
17
+ value: string;
18
+ };
19
+ interface ToggleClassOp {
20
+ op: 'toggleClass';
21
+ className: string;
22
+ target: TargetRef;
23
+ }
24
+ interface AddClassOp {
25
+ op: 'addClass';
26
+ className: string;
27
+ target: TargetRef;
28
+ }
29
+ interface RemoveClassOp {
30
+ op: 'removeClass';
31
+ className: string;
32
+ target: TargetRef;
33
+ }
34
+ interface SetContentOp {
35
+ op: 'setContent';
36
+ content: string;
37
+ target: TargetRef;
38
+ position: 'into' | 'before' | 'after' | 'start' | 'end';
39
+ }
40
+ interface AppendContentOp {
41
+ op: 'appendContent';
42
+ content: string;
43
+ target: TargetRef;
44
+ }
45
+ interface ShowOp {
46
+ op: 'show';
47
+ target: TargetRef;
48
+ }
49
+ interface HideOp {
50
+ op: 'hide';
51
+ target: TargetRef;
52
+ }
53
+ interface SetVariableOp {
54
+ op: 'setVariable';
55
+ name: string;
56
+ value: string;
57
+ scope: 'local' | 'element' | 'global';
58
+ }
59
+ interface IncrementOp {
60
+ op: 'increment';
61
+ target: TargetRef;
62
+ amount: number;
63
+ }
64
+ interface DecrementOp {
65
+ op: 'decrement';
66
+ target: TargetRef;
67
+ amount: number;
68
+ }
69
+ interface NavigateOp {
70
+ op: 'navigate';
71
+ url: string;
72
+ }
73
+ interface HistoryBackOp {
74
+ op: 'historyBack';
75
+ }
76
+ interface HistoryForwardOp {
77
+ op: 'historyForward';
78
+ }
79
+ interface FetchOp {
80
+ op: 'fetch';
81
+ url: string;
82
+ format: 'json' | 'text' | 'html';
83
+ target?: TargetRef;
84
+ }
85
+ interface WaitOp {
86
+ op: 'wait';
87
+ durationMs: number;
88
+ }
89
+ interface TriggerEventOp {
90
+ op: 'triggerEvent';
91
+ eventName: string;
92
+ target: TargetRef;
93
+ detail?: string;
94
+ }
95
+ interface FocusOp {
96
+ op: 'focus';
97
+ target: TargetRef;
98
+ }
99
+ interface BlurOp {
100
+ op: 'blur';
101
+ target: TargetRef;
102
+ }
103
+ interface LogOp {
104
+ op: 'log';
105
+ values: string[];
106
+ }
107
+ /** Union of all abstract operations */
108
+ type AbstractOperation = ToggleClassOp | AddClassOp | RemoveClassOp | SetContentOp | AppendContentOp | ShowOp | HideOp | SetVariableOp | IncrementOp | DecrementOp | NavigateOp | HistoryBackOp | HistoryForwardOp | FetchOp | WaitOp | TriggerEventOp | FocusOp | BlurOp | LogOp;
109
+ /**
110
+ * A complete behavior specification: what triggers it and what it does.
111
+ * Extracted from a semantic event handler node.
112
+ */
113
+ interface BehaviorSpec {
114
+ /** The triggering event */
115
+ trigger: {
116
+ event: string;
117
+ modifiers?: Record<string, unknown>;
118
+ };
119
+ /** The element that listens for the trigger */
120
+ triggerTarget: TargetRef;
121
+ /** The operations performed when triggered */
122
+ operations: AbstractOperation[];
123
+ /** Whether any operation is async */
124
+ async: boolean;
125
+ /** Original hyperscript source (for test naming) */
126
+ source?: string;
127
+ }
128
+
129
+ /**
130
+ * Component Renderer Types
131
+ *
132
+ * Interface for pluggable component renderers. Each renderer takes a BehaviorSpec
133
+ * and produces a complete framework-specific component file.
134
+ * Parallel to TestRenderer (test generation) — this is for code generation.
135
+ */
136
+
137
+ /**
138
+ * A component renderer converts a BehaviorSpec into framework-specific component code.
139
+ */
140
+ interface ComponentRenderer {
141
+ /** The framework this renderer targets */
142
+ readonly framework: string;
143
+ /** Render a behavior spec into a complete component */
144
+ render(spec: BehaviorSpec, options?: ComponentRenderOptions): GeneratedComponent;
145
+ }
146
+ interface ComponentRenderOptions {
147
+ /** Override auto-generated component name */
148
+ componentName?: string;
149
+ /** TypeScript output (default true) */
150
+ typescript?: boolean;
151
+ }
152
+ /**
153
+ * A generated component file.
154
+ */
155
+ interface GeneratedComponent {
156
+ /** Component name (e.g., "ToggleActiveButton") */
157
+ name: string;
158
+ /** Full component file content */
159
+ code: string;
160
+ /** Target framework */
161
+ framework: string;
162
+ /** Abstract operations for introspection */
163
+ operations: AbstractOperation[];
164
+ /** Framework-specific reactive primitives (React hooks, Vue composables, Svelte runes) */
165
+ hooks: string[];
166
+ }
167
+
168
+ /**
169
+ * Test Renderer Types
170
+ *
171
+ * Interface for pluggable test renderers. Each renderer takes a BehaviorSpec
172
+ * and produces a complete test file in a specific framework format.
173
+ */
174
+
175
+ /**
176
+ * A test renderer converts a BehaviorSpec into a framework-specific test file.
177
+ */
178
+ interface TestRenderer {
179
+ /** The framework this renderer targets */
180
+ readonly framework: string;
181
+ /** Render a behavior spec into a complete test */
182
+ render(spec: BehaviorSpec, options: TestRenderOptions): GeneratedTest;
183
+ }
184
+ interface TestRenderOptions {
185
+ /** Override auto-generated test name */
186
+ testName?: string;
187
+ /** How to load the hyperscript behavior in the test */
188
+ executionMode?: 'runtime' | 'compiled';
189
+ /** Path to LokaScript bundle (runtime mode) */
190
+ bundlePath?: string;
191
+ /** Original hyperscript source (for embedding in fixture) */
192
+ hyperscript?: string;
193
+ /** Compiled JS code (for compiled mode) */
194
+ compiledJs?: string;
195
+ }
196
+ /**
197
+ * A generated test file.
198
+ */
199
+ interface GeneratedTest {
200
+ /** Test name (e.g., "on click toggle .active on #btn") */
201
+ name: string;
202
+ /** Full test file content */
203
+ code: string;
204
+ /** HTML fixture embedded in the test */
205
+ html: string;
206
+ /** Target framework */
207
+ framework: string;
208
+ /** Abstract operations for introspection */
209
+ operations: AbstractOperation[];
210
+ }
211
+
212
+ /**
213
+ * Semantic Diff Types
214
+ *
215
+ * Types for comparing two hyperscript behaviors at the abstract operation level.
216
+ */
217
+
218
+ /** One side of a diff comparison — accepts any input format */
219
+ interface DiffInput {
220
+ /** Natural language hyperscript (requires `language`) */
221
+ code?: string;
222
+ /** Explicit syntax: [command role:value ...] */
223
+ explicit?: string;
224
+ /** LLM JSON — structured semantic representation */
225
+ semantic?: SemanticJSON;
226
+ /** ISO 639-1 language code (required for `code`) */
227
+ language?: string;
228
+ }
229
+ /** Diff request — compare two hyperscript inputs */
230
+ interface DiffRequest {
231
+ a: DiffInput;
232
+ b: DiffInput;
233
+ /** Minimum confidence for natural language parsing (default 0.7) */
234
+ confidence?: number;
235
+ }
236
+ /** Diff response — structured comparison result */
237
+ interface DiffResponse {
238
+ /** Whether both sides parsed successfully */
239
+ ok: boolean;
240
+ /** Whether the two behaviors are semantically identical */
241
+ identical: boolean;
242
+ /** Trigger comparison (null when triggers match) */
243
+ trigger: TriggerDiff | null;
244
+ /** Per-operation comparison */
245
+ operations: OperationDiff[];
246
+ /** Human-readable summary */
247
+ summary: string;
248
+ /** Diagnostics from parsing both sides */
249
+ diagnostics: Diagnostic[];
250
+ }
251
+ /** Trigger difference */
252
+ interface TriggerDiff {
253
+ a: {
254
+ event: string;
255
+ modifiers?: Record<string, unknown>;
256
+ };
257
+ b: {
258
+ event: string;
259
+ modifiers?: Record<string, unknown>;
260
+ };
261
+ changes: string[];
262
+ }
263
+ /** Kind of operation change */
264
+ type OperationChangeKind = 'added' | 'removed' | 'changed' | 'reordered' | 'unchanged';
265
+ /** A single operation difference */
266
+ interface OperationDiff {
267
+ kind: OperationChangeKind;
268
+ index: {
269
+ a?: number;
270
+ b?: number;
271
+ };
272
+ a?: AbstractOperation;
273
+ b?: AbstractOperation;
274
+ changes?: string[];
275
+ }
276
+
277
+ /**
278
+ * Types for the Compilation Service.
279
+ *
280
+ * Three input formats converge to a single compilation pipeline:
281
+ * - Natural language hyperscript (24 languages)
282
+ * - Explicit syntax: [toggle patient:.active destination:#btn]
283
+ * - LLM JSON: { action: "toggle", roles: { patient: { type: "selector", value: ".active" } } }
284
+ */
285
+ /**
286
+ * Compilation request — provide exactly one of: code, explicit, or semantic.
287
+ */
288
+ interface CompileRequest {
289
+ /** Natural language hyperscript (requires `language`) */
290
+ code?: string;
291
+ /** Explicit syntax: [command role:value ...] */
292
+ explicit?: string;
293
+ /** LLM JSON — structured semantic representation */
294
+ semantic?: SemanticJSON;
295
+ /** ISO 639-1 language code (required for `code`, ignored for `explicit`/`semantic`) */
296
+ language?: string;
297
+ /** Minimum confidence for natural language parsing (default 0.7) */
298
+ confidence?: number;
299
+ /** Optimization level: 0=none, 1=basic, 2=full (default 2) */
300
+ optimization?: 0 | 1 | 2;
301
+ /** Output module format (default 'esm') */
302
+ target?: 'esm' | 'iife';
303
+ /** Minify output (default false) */
304
+ minify?: boolean;
305
+ }
306
+ /**
307
+ * Translation request.
308
+ */
309
+ interface TranslateRequest {
310
+ /** Source code or explicit syntax */
311
+ code: string;
312
+ /** Source language */
313
+ from: string;
314
+ /** Target language */
315
+ to: string;
316
+ }
317
+ /**
318
+ * Structured semantic representation for LLM output.
319
+ * This is the "reliable input format" — no parsing ambiguity.
320
+ */
321
+ interface SemanticJSON {
322
+ /** Command name (e.g., "toggle", "add", "set", "put") */
323
+ action: string;
324
+ /** Semantic roles mapping */
325
+ roles: Record<string, SemanticJSONValue>;
326
+ /** Event trigger (for event handlers) */
327
+ trigger?: {
328
+ event: string;
329
+ modifiers?: Record<string, unknown>;
330
+ };
331
+ }
332
+ /**
333
+ * A typed value in a semantic role.
334
+ */
335
+ interface SemanticJSONValue {
336
+ /** Value type */
337
+ type: 'selector' | 'literal' | 'reference' | 'expression' | 'property-path';
338
+ /** The value */
339
+ value: string | number | boolean;
340
+ }
341
+ /**
342
+ * Compilation response.
343
+ */
344
+ interface CompileResponse {
345
+ /** Whether compilation succeeded */
346
+ ok: boolean;
347
+ /** Compiled JavaScript (on success) */
348
+ js?: string;
349
+ /** Runtime helpers needed by the compiled code */
350
+ helpers?: string[];
351
+ /** Output size in bytes */
352
+ size?: number;
353
+ /** Normalized semantic representation (always present on success) */
354
+ semantic?: SemanticJSON;
355
+ /** Parse confidence (natural language input only) */
356
+ confidence?: number;
357
+ /** Errors, warnings, and info messages */
358
+ diagnostics: Diagnostic[];
359
+ }
360
+ /**
361
+ * Validation-only response (no compilation).
362
+ */
363
+ interface ValidationResponse {
364
+ /** Whether validation passed */
365
+ ok: boolean;
366
+ /** Normalized semantic representation (if parse succeeded) */
367
+ semantic?: SemanticJSON;
368
+ /** Parse confidence */
369
+ confidence?: number;
370
+ /** Diagnostics */
371
+ diagnostics: Diagnostic[];
372
+ }
373
+ /**
374
+ * Translation response.
375
+ */
376
+ interface TranslateResponse {
377
+ /** Whether translation succeeded */
378
+ ok: boolean;
379
+ /** Translated code */
380
+ code?: string;
381
+ /** Diagnostics */
382
+ diagnostics: Diagnostic[];
383
+ }
384
+ /**
385
+ * A diagnostic message (error, warning, or info).
386
+ */
387
+ interface Diagnostic {
388
+ /** Severity level */
389
+ severity: 'error' | 'warning' | 'info';
390
+ /** Machine-readable code */
391
+ code: string;
392
+ /** Human-readable message */
393
+ message: string;
394
+ /** Suggested fix */
395
+ suggestion?: string;
396
+ }
397
+ /**
398
+ * Test generation request.
399
+ */
400
+ interface TestRequest {
401
+ /** Natural language hyperscript (requires `language`) */
402
+ code?: string;
403
+ /** Explicit syntax: [command role:value ...] */
404
+ explicit?: string;
405
+ /** LLM JSON — structured semantic representation */
406
+ semantic?: SemanticJSON;
407
+ /** ISO 639-1 language code (required for `code`, ignored for `explicit`/`semantic`) */
408
+ language?: string;
409
+ /** Minimum confidence for natural language parsing (default 0.7) */
410
+ confidence?: number;
411
+ /** Test framework to target (default 'playwright') */
412
+ framework?: string;
413
+ /** How to load hyperscript in the test (default 'runtime') */
414
+ executionMode?: 'runtime' | 'compiled';
415
+ /** Override auto-generated test name */
416
+ testName?: string;
417
+ /** Path to LokaScript bundle (runtime mode) */
418
+ bundlePath?: string;
419
+ }
420
+ /**
421
+ * Test generation response.
422
+ */
423
+ interface TestResponse {
424
+ /** Whether test generation succeeded */
425
+ ok: boolean;
426
+ /** Generated test files */
427
+ tests: GeneratedTestOutput[];
428
+ /** Raw abstract operations (for introspection) */
429
+ operations: AbstractOperation[];
430
+ /** Normalized semantic representation */
431
+ semantic?: SemanticJSON;
432
+ /** Diagnostics */
433
+ diagnostics: Diagnostic[];
434
+ }
435
+ /**
436
+ * A single generated test output.
437
+ */
438
+ interface GeneratedTestOutput {
439
+ /** Test name */
440
+ name: string;
441
+ /** Full test file content */
442
+ code: string;
443
+ /** HTML fixture */
444
+ html: string;
445
+ /** Target framework */
446
+ framework: string;
447
+ }
448
+ /**
449
+ * Component generation request.
450
+ */
451
+ interface ComponentRequest {
452
+ /** Natural language hyperscript (requires `language`) */
453
+ code?: string;
454
+ /** Explicit syntax: [command role:value ...] */
455
+ explicit?: string;
456
+ /** LLM JSON — structured semantic representation */
457
+ semantic?: SemanticJSON;
458
+ /** ISO 639-1 language code (required for `code`) */
459
+ language?: string;
460
+ /** Minimum confidence for natural language parsing (default 0.7) */
461
+ confidence?: number;
462
+ /** Target framework (default 'react') */
463
+ framework?: string;
464
+ /** Override auto-generated component name */
465
+ componentName?: string;
466
+ /** TypeScript output (default true) */
467
+ typescript?: boolean;
468
+ }
469
+ /**
470
+ * Component generation response.
471
+ */
472
+ interface ComponentResponse {
473
+ /** Whether generation succeeded */
474
+ ok: boolean;
475
+ /** Generated component */
476
+ component?: {
477
+ /** Component name */
478
+ name: string;
479
+ /** Full component file content */
480
+ code: string;
481
+ /** Framework-specific reactive primitives (React hooks, Vue composables, Svelte runes) */
482
+ hooks: string[];
483
+ /** Target framework */
484
+ framework: string;
485
+ };
486
+ /** Raw abstract operations (for introspection) */
487
+ operations: AbstractOperation[];
488
+ /** Normalized semantic representation */
489
+ semantic?: SemanticJSON;
490
+ /** Diagnostics */
491
+ diagnostics: Diagnostic[];
492
+ }
493
+
494
+ /**
495
+ * Options for creating a CompilationService.
496
+ */
497
+ interface ServiceOptions {
498
+ /** Default confidence threshold (default 0.7) */
499
+ confidenceThreshold?: number;
500
+ /** Maximum cache entries (default 500, 0 to disable) */
501
+ cacheSize?: number;
502
+ /** Custom test renderers keyed by framework name (default: { playwright: PlaywrightRenderer }) */
503
+ testRenderers?: Record<string, TestRenderer>;
504
+ /** Custom component renderers keyed by framework name (default: { react: ReactRenderer }) */
505
+ componentRenderers?: Record<string, ComponentRenderer>;
506
+ }
507
+ /** Detected input format */
508
+ type InputFormat = 'natural' | 'explicit' | 'json';
509
+
510
+ /**
511
+ * CompilationService — the main orchestrator.
512
+ *
513
+ * Accepts hyperscript in three formats (natural language, explicit syntax, LLM JSON),
514
+ * validates through semantic schemas, and compiles to optimized JavaScript.
515
+ */
516
+
517
+ declare class CompilationService {
518
+ private cache;
519
+ private confidenceThreshold;
520
+ private translateFn;
521
+ private testRenderers;
522
+ private componentRenderers;
523
+ private constructor();
524
+ /**
525
+ * Register a test renderer for a given framework.
526
+ */
527
+ registerTestRenderer(framework: string, renderer: TestRenderer): void;
528
+ /**
529
+ * Register a component renderer for a given framework.
530
+ */
531
+ registerComponentRenderer(framework: string, renderer: ComponentRenderer): void;
532
+ /**
533
+ * Create a CompilationService by dynamically importing dependencies.
534
+ *
535
+ * This async factory resolves @lokascript/semantic and @hyperfixi/aot-compiler
536
+ * at runtime, following the same pattern as createMultilingualCompiler().
537
+ */
538
+ static create(options?: ServiceOptions): Promise<CompilationService>;
539
+ /**
540
+ * Compile hyperscript to JavaScript.
541
+ *
542
+ * Accepts any of three input formats:
543
+ * - `code` + `language`: Natural language hyperscript
544
+ * - `explicit`: Bracket syntax [command role:value ...]
545
+ * - `semantic`: LLM JSON { action, roles, trigger }
546
+ *
547
+ * Returns compiled JS, semantic representation, and diagnostics.
548
+ */
549
+ compile(request: CompileRequest): CompileResponse;
550
+ /**
551
+ * Validate input without compiling.
552
+ * Returns semantic representation and diagnostics.
553
+ */
554
+ validate(request: CompileRequest): ValidationResponse;
555
+ /**
556
+ * Translate hyperscript between languages.
557
+ */
558
+ translate(request: TranslateRequest): TranslateResponse;
559
+ /**
560
+ * Generate behavior-level tests from hyperscript.
561
+ *
562
+ * Parses the input, extracts abstract operations (what the behavior does),
563
+ * and renders them as test code in the requested framework.
564
+ */
565
+ generateTests(request: TestRequest): TestResponse;
566
+ /**
567
+ * Generate a framework component from hyperscript.
568
+ *
569
+ * Parses the input, extracts abstract operations, and renders
570
+ * them as a framework-specific component (React, Vue, or Svelte).
571
+ */
572
+ generateComponent(request: ComponentRequest): ComponentResponse;
573
+ /**
574
+ * Compare two hyperscript inputs at the behavior level.
575
+ *
576
+ * Both sides are independently normalized and validated, then compared
577
+ * as abstract operations. Same behavior in different languages → identical.
578
+ */
579
+ diff(request: DiffRequest): DiffResponse;
580
+ /**
581
+ * Get cache statistics.
582
+ */
583
+ getCacheStats(): {
584
+ size: number;
585
+ hits: number;
586
+ misses: number;
587
+ hitRate: number;
588
+ };
589
+ /**
590
+ * Clear the compilation cache.
591
+ */
592
+ clearCache(): void;
593
+ }
594
+
595
+ export { type AbstractOperation as A, type BehaviorSpec as B, CompilationService as C, type Diagnostic as D, type SetVariableOp as E, type IncrementOp as F, type GeneratedTest as G, type HideOp as H, type InputFormat as I, type DecrementOp as J, type FetchOp as K, type TriggerEventOp as L, type FocusOp as M, type NavigateOp as N, type OperationDiff as O, type BlurOp as P, type LogOp as Q, type RemoveClassOp as R, type SemanticJSON as S, type TriggerDiff as T, type ValidationResponse as V, type WaitOp as W, type CompileResponse as a, type TestRenderer as b, type TestRenderOptions as c, type ComponentRenderer as d, type ComponentRenderOptions as e, type GeneratedComponent as f, type CompileRequest as g, type TranslateRequest as h, type TranslateResponse as i, type TestRequest as j, type TestResponse as k, type GeneratedTestOutput as l, type ComponentRequest as m, type ComponentResponse as n, type DiffRequest as o, type DiffResponse as p, type DiffInput as q, type OperationChangeKind as r, type ServiceOptions as s, type SemanticJSONValue as t, type TargetRef as u, type ToggleClassOp as v, type AddClassOp as w, type SetContentOp as x, type AppendContentOp as y, type ShowOp as z };
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@lokascript/compilation-service",
3
+ "version": "2.0.0",
4
+ "description": "Semantic compilation service for LokaScript - validates and compiles hyperscript from 24 languages, explicit syntax, or LLM JSON",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./http": {
16
+ "types": "./dist/http.d.ts",
17
+ "import": "./dist/http.js",
18
+ "require": "./dist/http.cjs"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "pretest": "../../scripts/ensure-fresh.sh ../semantic ../aot-compiler",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "serve": "tsx src/serve.ts",
31
+ "test:check": "vitest run --reporter=dot 2>&1 | tail -5",
32
+ "typecheck": "tsc --noEmit",
33
+ "clean": "rm -rf dist"
34
+ },
35
+ "dependencies": {
36
+ "hono": "^4.11.7"
37
+ },
38
+ "devDependencies": {
39
+ "@hono/node-server": "^1.13.0",
40
+ "@hyperfixi/aot-compiler": "*",
41
+ "@lokascript/semantic": "*",
42
+ "@types/node": "^20.11.0",
43
+ "tsup": "^8.0.1",
44
+ "typescript": "^5.3.3",
45
+ "vitest": "^1.2.0"
46
+ },
47
+ "peerDependencies": {
48
+ "@lokascript/semantic": "*"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "@lokascript/semantic": {
52
+ "optional": false
53
+ }
54
+ },
55
+ "keywords": [
56
+ "hyperscript",
57
+ "lokascript",
58
+ "compilation",
59
+ "semantic",
60
+ "multilingual",
61
+ "llm",
62
+ "http",
63
+ "edge",
64
+ "react"
65
+ ],
66
+ "author": "LokaScript Contributors",
67
+ "license": "MIT",
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "git+https://github.com/codetalcott/hyperfixi.git",
71
+ "directory": "packages/compilation-service"
72
+ }
73
+ }