qsharp-lang 0.1.0-dev.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.
Files changed (55) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +74 -0
  3. package/dist/browser.d.ts +26 -0
  4. package/dist/browser.js +156 -0
  5. package/dist/cancellation.d.ts +10 -0
  6. package/dist/cancellation.js +31 -0
  7. package/dist/compiler/common.d.ts +31 -0
  8. package/dist/compiler/common.js +47 -0
  9. package/dist/compiler/compiler.d.ts +28 -0
  10. package/dist/compiler/compiler.js +62 -0
  11. package/dist/compiler/events.d.ts +54 -0
  12. package/dist/compiler/events.js +92 -0
  13. package/dist/compiler/worker-browser.d.ts +1 -0
  14. package/dist/compiler/worker-browser.js +43 -0
  15. package/dist/compiler/worker-node.d.ts +1 -0
  16. package/dist/compiler/worker-node.js +41 -0
  17. package/dist/compiler/worker-proxy.d.ts +7 -0
  18. package/dist/compiler/worker-proxy.js +16 -0
  19. package/dist/debug-service/debug-service.d.ts +35 -0
  20. package/dist/debug-service/debug-service.js +136 -0
  21. package/dist/debug-service/worker-browser.d.ts +1 -0
  22. package/dist/debug-service/worker-browser.js +32 -0
  23. package/dist/debug-service/worker-node.d.ts +1 -0
  24. package/dist/debug-service/worker-node.js +30 -0
  25. package/dist/debug-service/worker-proxy.d.ts +7 -0
  26. package/dist/debug-service/worker-proxy.js +22 -0
  27. package/dist/katas-content.generated.d.ts +61 -0
  28. package/dist/katas-content.generated.js +2499 -0
  29. package/dist/katas.d.ts +55 -0
  30. package/dist/katas.js +16 -0
  31. package/dist/language-service/language-service.d.ts +48 -0
  32. package/dist/language-service/language-service.js +85 -0
  33. package/dist/language-service/worker-browser.d.ts +1 -0
  34. package/dist/language-service/worker-browser.js +32 -0
  35. package/dist/language-service/worker-node.d.ts +1 -0
  36. package/dist/language-service/worker-node.js +30 -0
  37. package/dist/language-service/worker-proxy.d.ts +6 -0
  38. package/dist/language-service/worker-proxy.js +20 -0
  39. package/dist/log.d.ts +33 -0
  40. package/dist/log.js +92 -0
  41. package/dist/main.d.ts +11 -0
  42. package/dist/main.js +82 -0
  43. package/dist/samples.generated.d.ts +6 -0
  44. package/dist/samples.generated.js +62 -0
  45. package/dist/vsdiagnostic.d.ts +27 -0
  46. package/dist/vsdiagnostic.js +117 -0
  47. package/dist/worker-proxy.d.ts +95 -0
  48. package/dist/worker-proxy.js +226 -0
  49. package/lib/node/qsc_wasm.cjs +1010 -0
  50. package/lib/node/qsc_wasm.d.cts +266 -0
  51. package/lib/node/qsc_wasm_bg.wasm +0 -0
  52. package/lib/web/qsc_wasm.d.ts +328 -0
  53. package/lib/web/qsc_wasm.js +1026 -0
  54. package/lib/web/qsc_wasm_bg.wasm +0 -0
  55. package/package.json +35 -0
@@ -0,0 +1,55 @@
1
+ export type Example = {
2
+ type: "example";
3
+ id: string;
4
+ code: string;
5
+ };
6
+ export type TextContent = {
7
+ type: "text-content";
8
+ asHtml: string;
9
+ asMarkdown: string;
10
+ };
11
+ export type ContentItem = Example | TextContent;
12
+ export type Solution = {
13
+ type: "solution";
14
+ id: string;
15
+ code: string;
16
+ };
17
+ export type ExplainedSolutionItem = ContentItem | Solution;
18
+ export type ExplainedSolution = {
19
+ type: "explained-solution";
20
+ items: ExplainedSolutionItem[];
21
+ };
22
+ export type Exercise = {
23
+ type: "exercise";
24
+ id: string;
25
+ title: string;
26
+ description: TextContent;
27
+ sourceIds: string[];
28
+ placeholderCode: string;
29
+ explainedSolution: ExplainedSolution;
30
+ };
31
+ export type Answer = {
32
+ type: "answer";
33
+ items: ContentItem[];
34
+ };
35
+ export type Question = {
36
+ type: "question";
37
+ description: TextContent;
38
+ answer: Answer;
39
+ };
40
+ export type LessonItem = ContentItem | Question;
41
+ export type Lesson = {
42
+ type: "lesson";
43
+ id: string;
44
+ title: string;
45
+ items: LessonItem[];
46
+ };
47
+ export type KataSection = Exercise | Lesson;
48
+ export type Kata = {
49
+ id: string;
50
+ title: string;
51
+ sections: KataSection[];
52
+ };
53
+ export declare function getAllKatas(): Promise<Kata[]>;
54
+ export declare function getKata(id: string): Promise<Kata>;
55
+ export declare function getExerciseSources(exercise: Exercise): Promise<string[]>;
package/dist/katas.js ADDED
@@ -0,0 +1,16 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { default as katasContent } from "./katas-content.generated.js";
4
+ export async function getAllKatas() {
5
+ return katasContent.katas;
6
+ }
7
+ export async function getKata(id) {
8
+ const katas = await getAllKatas();
9
+ return (katas.find((k) => k.id === id) ||
10
+ Promise.reject(`Failed to get kata with id: ${id}`));
11
+ }
12
+ export async function getExerciseSources(exercise) {
13
+ return katasContent.globalCodeSources
14
+ .filter((source) => exercise.sourceIds.indexOf(source.id) > -1)
15
+ .map((source) => source.code);
16
+ }
@@ -0,0 +1,48 @@
1
+ import type { IDiagnostic, ICompletionList, IHover, IDefinition } from "../../lib/node/qsc_wasm.cjs";
2
+ import { VSDiagnostic } from "../vsdiagnostic.js";
3
+ import { IServiceProxy } from "../worker-proxy.js";
4
+ type QscWasm = typeof import("../../lib/node/qsc_wasm.cjs");
5
+ export type LanguageServiceEvent = {
6
+ type: "diagnostics";
7
+ detail: {
8
+ uri: string;
9
+ version: number;
10
+ diagnostics: VSDiagnostic[];
11
+ };
12
+ };
13
+ export interface ILanguageService {
14
+ updateDocument(uri: string, version: number, code: string, isExe: boolean): Promise<void>;
15
+ closeDocument(uri: string): Promise<void>;
16
+ getCompletions(documentUri: string, offset: number): Promise<ICompletionList>;
17
+ getHover(documentUri: string, offset: number): Promise<IHover | null>;
18
+ getDefinition(documentUri: string, offset: number): Promise<IDefinition | null>;
19
+ dispose(): Promise<void>;
20
+ addEventListener<T extends LanguageServiceEvent["type"]>(type: T, listener: (event: Extract<LanguageServiceEvent, {
21
+ type: T;
22
+ }>) => void): void;
23
+ removeEventListener<T extends LanguageServiceEvent["type"]>(type: T, listener: (event: Extract<LanguageServiceEvent, {
24
+ type: T;
25
+ }>) => void): void;
26
+ }
27
+ export declare const qsharpLibraryUriScheme = "qsharp-library-source";
28
+ export type ILanguageServiceWorker = ILanguageService & IServiceProxy;
29
+ export declare class QSharpLanguageService implements ILanguageService {
30
+ private languageService;
31
+ private eventHandler;
32
+ private code;
33
+ constructor(wasm: QscWasm);
34
+ updateDocument(documentUri: string, version: number, code: string, isExe: boolean): Promise<void>;
35
+ closeDocument(documentUri: string): Promise<void>;
36
+ getCompletions(documentUri: string, offset: number): Promise<ICompletionList>;
37
+ getHover(documentUri: string, offset: number): Promise<IHover | null>;
38
+ getDefinition(documentUri: string, offset: number): Promise<IDefinition | null>;
39
+ dispose(): Promise<void>;
40
+ addEventListener<T extends LanguageServiceEvent["type"]>(type: T, listener: (event: Extract<LanguageServiceEvent, {
41
+ type: T;
42
+ }>) => void): void;
43
+ removeEventListener<T extends LanguageServiceEvent["type"]>(type: T, listener: (event: Extract<LanguageServiceEvent, {
44
+ type: T;
45
+ }>) => void): void;
46
+ onDiagnostics(uri: string, version: number, diagnostics: IDiagnostic[]): void;
47
+ }
48
+ export {};
@@ -0,0 +1,85 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import * as wasm from "../../lib/web/qsc_wasm.js";
4
+ import { log } from "../log.js";
5
+ import { mapDiagnostics, mapUtf16UnitsToUtf8Units, mapUtf8UnitsToUtf16Units, } from "../vsdiagnostic.js";
6
+ export const qsharpLibraryUriScheme = "qsharp-library-source";
7
+ export class QSharpLanguageService {
8
+ constructor(wasm) {
9
+ this.eventHandler = new EventTarget();
10
+ // We need to keep a copy of the code for mapping diagnostics to utf16 offsets
11
+ this.code = {};
12
+ log.info("Constructing a QSharpLanguageService instance");
13
+ this.languageService = new wasm.LanguageService(this.onDiagnostics.bind(this));
14
+ }
15
+ async updateDocument(documentUri, version, code, isExe) {
16
+ this.code[documentUri] = code;
17
+ this.languageService.update_document(documentUri, version, code, isExe);
18
+ }
19
+ async closeDocument(documentUri) {
20
+ delete this.code[documentUri];
21
+ this.languageService.close_document(documentUri);
22
+ }
23
+ async getCompletions(documentUri, offset) {
24
+ const code = this.code[documentUri];
25
+ const convertedOffset = mapUtf16UnitsToUtf8Units([offset], code)[offset];
26
+ const result = this.languageService.get_completions(documentUri, convertedOffset);
27
+ result.items.forEach((item) => item.additionalTextEdits?.forEach((edit) => {
28
+ const mappedSpan = mapUtf8UnitsToUtf16Units([edit.range.start, edit.range.end], code);
29
+ edit.range.start = mappedSpan[edit.range.start];
30
+ edit.range.end = mappedSpan[edit.range.end];
31
+ }));
32
+ return result;
33
+ }
34
+ async getHover(documentUri, offset) {
35
+ const code = this.code[documentUri];
36
+ const convertedOffset = mapUtf16UnitsToUtf8Units([offset], code)[offset];
37
+ const result = this.languageService.get_hover(documentUri, convertedOffset);
38
+ if (result) {
39
+ const mappedSpan = mapUtf8UnitsToUtf16Units([result.span.start, result.span.end], code);
40
+ result.span.start = mappedSpan[result.span.start];
41
+ result.span.end = mappedSpan[result.span.end];
42
+ }
43
+ return result;
44
+ }
45
+ async getDefinition(documentUri, offset) {
46
+ let code = this.code[documentUri];
47
+ const convertedOffset = mapUtf16UnitsToUtf8Units([offset], code)[offset];
48
+ const result = this.languageService.get_definition(documentUri, convertedOffset);
49
+ if (result) {
50
+ // Inspect the URL protocol (equivalent to the URI scheme + ":").
51
+ // If the scheme is our library scheme, we need to call the wasm to
52
+ // provide the library file's contents to do the utf8->utf16 mapping.
53
+ const url = new URL(result.source);
54
+ if (url.protocol === qsharpLibraryUriScheme + ":") {
55
+ code = wasm.get_library_source_content(url.pathname);
56
+ }
57
+ result.offset = mapUtf8UnitsToUtf16Units([result.offset], code)[result.offset];
58
+ }
59
+ return result;
60
+ }
61
+ async dispose() {
62
+ this.languageService.free();
63
+ }
64
+ addEventListener(type, listener) {
65
+ this.eventHandler.addEventListener(type, listener);
66
+ }
67
+ removeEventListener(type, listener) {
68
+ this.eventHandler.removeEventListener(type, listener);
69
+ }
70
+ onDiagnostics(uri, version, diagnostics) {
71
+ try {
72
+ const code = this.code[uri];
73
+ const event = new Event("diagnostics");
74
+ event.detail = {
75
+ uri,
76
+ version,
77
+ diagnostics: mapDiagnostics(diagnostics, code),
78
+ };
79
+ this.eventHandler.dispatchEvent(event);
80
+ }
81
+ catch (e) {
82
+ log.error("Error in onDiagnostics", e);
83
+ }
84
+ }
85
+ }
@@ -0,0 +1 @@
1
+ export declare function messageHandler(e: MessageEvent): void;
@@ -0,0 +1,32 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import * as wasm from "../../lib/web/qsc_wasm.js";
4
+ import { log } from "../log.js";
5
+ import { QSharpLanguageService } from "./language-service.js";
6
+ import { createLanguageServiceDispatcher } from "./worker-proxy.js";
7
+ let invokeCompiler = null;
8
+ // This export should be assigned to 'self.onmessage' in a WebWorker
9
+ export function messageHandler(e) {
10
+ const data = e.data;
11
+ if (!data.type || typeof data.type !== "string") {
12
+ log.error(`Unrecognized msg: ${data}`);
13
+ return;
14
+ }
15
+ switch (data.type) {
16
+ case "init":
17
+ {
18
+ log.setLogLevel(data.qscLogLevel);
19
+ wasm.initSync(data.wasmModule);
20
+ const languageService = new QSharpLanguageService(wasm);
21
+ invokeCompiler = createLanguageServiceDispatcher(self.postMessage.bind(self), languageService);
22
+ }
23
+ break;
24
+ default:
25
+ if (!invokeCompiler) {
26
+ log.error(`Received message before the compiler was initialized: %o`, data);
27
+ }
28
+ else {
29
+ invokeCompiler(data);
30
+ }
31
+ }
32
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ // This module supports running the qsharp compiler in a Node.js worker thread. It should be
4
+ // used in a Node.js module in a manner similar to the below to create it with the right log level:
5
+ //
6
+ // const worker = new Worker(join(thisDir,"worker-node.js"), {
7
+ // workerData: {qscLogLevel: log.getLogLevel() }
8
+ // });
9
+ import { isMainThread, parentPort, workerData } from "node:worker_threads";
10
+ import * as wasm from "../../lib/node/qsc_wasm.cjs";
11
+ import { log } from "../log.js";
12
+ import { QSharpLanguageService } from "./language-service.js";
13
+ import { createLanguageServiceDispatcher } from "./worker-proxy.js";
14
+ if (isMainThread)
15
+ throw "Worker script should be loaded in a Worker thread only";
16
+ if (workerData && typeof workerData.qscLogLevel === "number") {
17
+ log.setLogLevel(workerData.qscLogLevel);
18
+ }
19
+ const port = parentPort; // eslint-disable-line @typescript-eslint/no-non-null-assertion
20
+ const postMessage = port.postMessage.bind(port);
21
+ const compiler = new QSharpLanguageService(wasm);
22
+ const invokeCompiler = createLanguageServiceDispatcher(postMessage, compiler);
23
+ function messageHandler(data) {
24
+ if (!data.type || typeof data.type !== "string") {
25
+ log.error(`Unrecognized msg: %O"`, data);
26
+ return;
27
+ }
28
+ invokeCompiler(data);
29
+ }
30
+ port.addListener("message", messageHandler);
@@ -0,0 +1,6 @@
1
+ import { EventMessage, RequestMessage, ResponseMessage } from "../worker-proxy.js";
2
+ import { ILanguageService, LanguageServiceEvent } from "./language-service.js";
3
+ export declare function createLanguageServiceDispatcher(postMessage: (msg: ResponseMessage<ILanguageService> | EventMessage<LanguageServiceEvent>) => void, service: ILanguageService): (req: RequestMessage<ILanguageService>) => any;
4
+ export declare function createLanguageServiceProxy(postMessage: (msg: RequestMessage<ILanguageService>) => void, terminator: () => void): ILanguageService & import("../worker-proxy.js").IServiceProxy & {
5
+ onMsgFromWorker: (msg: ResponseMessage<ILanguageService> | EventMessage<LanguageServiceEvent>) => void;
6
+ };
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { createDispatcher, createProxy, } from "../worker-proxy.js";
4
+ const requests = {
5
+ updateDocument: "request",
6
+ closeDocument: "request",
7
+ getCompletions: "request",
8
+ getHover: "request",
9
+ getDefinition: "request",
10
+ dispose: "request",
11
+ addEventListener: "addEventListener",
12
+ removeEventListener: "removeEventListener",
13
+ };
14
+ const events = ["diagnostics"];
15
+ export function createLanguageServiceDispatcher(postMessage, service) {
16
+ return createDispatcher(postMessage, service, requests, events);
17
+ }
18
+ export function createLanguageServiceProxy(postMessage, terminator) {
19
+ return createProxy(postMessage, terminator, requests);
20
+ }
package/dist/log.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ declare global {
2
+ var qscLog: typeof log;
3
+ var qscGitHash: string;
4
+ }
5
+ export type LogLevel = "off" | "error" | "warn" | "info" | "debug" | "trace";
6
+ export type TelemetryEvent = {
7
+ id: string;
8
+ data?: any;
9
+ };
10
+ export type TelemetryCollector = (event: TelemetryEvent) => void;
11
+ export declare const log: {
12
+ setLogLevel(level: LogLevel | number): void;
13
+ onLevelChanged: ((level: number) => void) | null;
14
+ getLogLevel(): number;
15
+ error(...args: any): void;
16
+ warn(...args: any): void;
17
+ info(...args: any): void;
18
+ debug(...args: any): void;
19
+ trace(...args: any): void;
20
+ never(val: never): void;
21
+ /**
22
+ * @param level - A number indicating severity: 1 = Error, 2 = Warn, 3 = Info, 4 = Debug, 5 = Trace
23
+ * @param target - The area or component sending the messsage, e.g. "parser" (useful for filtering)
24
+ * @param args - The format string and args to log, e.g. ["Index of %s is %i", str, index]
25
+ */
26
+ logWithLevel(level: number, target: string, ...args: any): void;
27
+ setTelemetryCollector(handler: TelemetryCollector): void;
28
+ logTelemetry(event: {
29
+ id: string;
30
+ data?: any;
31
+ }): void;
32
+ isTelemetryEnabled(): boolean;
33
+ };
package/dist/log.js ADDED
@@ -0,0 +1,92 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ let telemetryCollector = null;
4
+ const levels = ["off", "error", "warn", "info", "debug", "trace"];
5
+ let logLevel = 0;
6
+ export const log = {
7
+ setLogLevel(level) {
8
+ if (typeof level === "string") {
9
+ // Convert to number
10
+ const lowerLevel = level.toLowerCase();
11
+ let newLevel = 0;
12
+ levels.forEach((name, idx) => {
13
+ if (name === lowerLevel)
14
+ newLevel = idx;
15
+ });
16
+ logLevel = newLevel;
17
+ }
18
+ else {
19
+ logLevel = level;
20
+ }
21
+ this.onLevelChanged?.(logLevel);
22
+ },
23
+ onLevelChanged: null,
24
+ getLogLevel() {
25
+ return logLevel;
26
+ },
27
+ error(...args) {
28
+ if (logLevel >= 1)
29
+ console.error(...args);
30
+ },
31
+ warn(...args) {
32
+ if (logLevel >= 2)
33
+ console.warn(...args);
34
+ },
35
+ info(...args) {
36
+ if (logLevel >= 3)
37
+ console.info(...args);
38
+ },
39
+ debug(...args) {
40
+ if (logLevel >= 4)
41
+ console.debug(...args);
42
+ },
43
+ trace(...args) {
44
+ // console.trace in JavaScript just writes a stack trace at info level, so use 'debug'
45
+ if (logLevel >= 5)
46
+ console.debug(...args);
47
+ },
48
+ never(val) {
49
+ // Utility function to ensure exhaustive type checking. See https://stackoverflow.com/a/39419171
50
+ log.error("Exhaustive type checking didn't account for: %o", val);
51
+ },
52
+ /**
53
+ * @param level - A number indicating severity: 1 = Error, 2 = Warn, 3 = Info, 4 = Debug, 5 = Trace
54
+ * @param target - The area or component sending the messsage, e.g. "parser" (useful for filtering)
55
+ * @param args - The format string and args to log, e.g. ["Index of %s is %i", str, index]
56
+ */
57
+ logWithLevel(level, target, ...args) {
58
+ // Convert to a format string containing the target (if present)
59
+ const [, ...trailingArgs] = args; // All but first element of args
60
+ const outArgs = [`[%s] ${args[0]}`, target || "", ...trailingArgs];
61
+ switch (level) {
62
+ case 1:
63
+ log.error(...outArgs);
64
+ break;
65
+ case 2:
66
+ log.warn(...outArgs);
67
+ break;
68
+ case 3:
69
+ log.info(...outArgs);
70
+ break;
71
+ case 4:
72
+ log.debug(...outArgs);
73
+ break;
74
+ case 5:
75
+ log.trace(...outArgs);
76
+ break;
77
+ default:
78
+ log.error("Invalid logLevel: ", level);
79
+ }
80
+ },
81
+ setTelemetryCollector(handler) {
82
+ telemetryCollector = handler;
83
+ },
84
+ logTelemetry(event) {
85
+ telemetryCollector?.(event);
86
+ },
87
+ isTelemetryEnabled() {
88
+ return !!telemetryCollector;
89
+ },
90
+ };
91
+ // Enable globally for easy interaction and debugging in live environments
92
+ globalThis.qscLog = log;
package/dist/main.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { ICompiler, ICompilerWorker } from "./compiler/compiler.js";
2
+ import { ILanguageService, ILanguageServiceWorker, qsharpLibraryUriScheme } from "./language-service/language-service.js";
3
+ import { IDebugService, IDebugServiceWorker } from "./debug-service/debug-service.js";
4
+ export { qsharpLibraryUriScheme };
5
+ export declare function getLibrarySourceContent(path: string): Promise<string | undefined>;
6
+ export declare function getCompiler(): ICompiler;
7
+ export declare function getCompilerWorker(): ICompilerWorker;
8
+ export declare function getDebugService(): IDebugService;
9
+ export declare function getDebugServiceWorker(): IDebugServiceWorker;
10
+ export declare function getLanguageService(): ILanguageService;
11
+ export declare function getLanguageServiceWorker(): ILanguageServiceWorker;
package/dist/main.js ADDED
@@ -0,0 +1,82 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ // This module is the main entry point for use in Node.js environments. For browser environments,
4
+ // the "./browser.js" file is the entry point module.
5
+ import { createRequire } from "node:module";
6
+ import { Worker } from "node:worker_threads";
7
+ import { dirname, join } from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ import { log } from "./log.js";
10
+ import { Compiler } from "./compiler/compiler.js";
11
+ import { createCompilerProxy } from "./compiler/worker-proxy.js";
12
+ import { QSharpLanguageService, qsharpLibraryUriScheme, } from "./language-service/language-service.js";
13
+ import { createLanguageServiceProxy } from "./language-service/worker-proxy.js";
14
+ import { QSharpDebugService, } from "./debug-service/debug-service.js";
15
+ import { createDebugServiceProxy } from "./debug-service/worker-proxy.js";
16
+ export { qsharpLibraryUriScheme };
17
+ let wasm = null;
18
+ const require = createRequire(import.meta.url);
19
+ export async function getLibrarySourceContent(path) {
20
+ if (!wasm) {
21
+ wasm = require("../lib/node/qsc_wasm.cjs");
22
+ return wasm.get_library_source_content(path);
23
+ }
24
+ }
25
+ export function getCompiler() {
26
+ if (!wasm) {
27
+ wasm = require("../lib/node/qsc_wasm.cjs");
28
+ // Set up logging and telemetry as soon as possible after instantiating
29
+ wasm.initLogging(log.logWithLevel, log.getLogLevel());
30
+ log.onLevelChanged = (level) => wasm?.setLogLevel(level);
31
+ }
32
+ return new Compiler(wasm);
33
+ }
34
+ export function getCompilerWorker() {
35
+ const thisDir = dirname(fileURLToPath(import.meta.url));
36
+ const worker = new Worker(join(thisDir, "./compiler/worker-node.js"), {
37
+ workerData: { qscLogLevel: log.getLogLevel() },
38
+ });
39
+ // Create the proxy which will forward method calls to the worker
40
+ const proxy = createCompilerProxy(
41
+ // If you lose the 'this' binding, some environments have issues.
42
+ worker.postMessage.bind(worker), () => worker.terminate());
43
+ // Let proxy handle response and event messages from the worker
44
+ worker.addListener("message", proxy.onMsgFromWorker);
45
+ return proxy;
46
+ }
47
+ export function getDebugService() {
48
+ if (!wasm)
49
+ wasm = require("../lib/node/qsc_wasm.cjs");
50
+ return new QSharpDebugService(wasm);
51
+ }
52
+ export function getDebugServiceWorker() {
53
+ const thisDir = dirname(fileURLToPath(import.meta.url));
54
+ const worker = new Worker(join(thisDir, "./debug-service/worker-node.js"), {
55
+ workerData: { qscLogLevel: log.getLogLevel() },
56
+ });
57
+ // Create the proxy which will forward method calls to the worker
58
+ const proxy = createDebugServiceProxy(
59
+ // If you lose the 'this' binding, some environments have issues.
60
+ worker.postMessage.bind(worker), () => worker.terminate());
61
+ // Let proxy handle response and event messages from the worker
62
+ worker.addListener("message", proxy.onMsgFromWorker);
63
+ return proxy;
64
+ }
65
+ export function getLanguageService() {
66
+ if (!wasm)
67
+ wasm = require("../lib/node/qsc_wasm.cjs");
68
+ return new QSharpLanguageService(wasm);
69
+ }
70
+ export function getLanguageServiceWorker() {
71
+ const thisDir = dirname(fileURLToPath(import.meta.url));
72
+ const worker = new Worker(join(thisDir, "./language-service/worker-node.js"), {
73
+ workerData: { qscLogLevel: log.getLogLevel() },
74
+ });
75
+ // Create the proxy which will forward method calls to the worker
76
+ const proxy = createLanguageServiceProxy(
77
+ // If you lose the 'this' binding, some environments have issues.
78
+ worker.postMessage.bind(worker), () => worker.terminate());
79
+ // Let proxy handle response and event messages from the worker
80
+ worker.addListener("message", proxy.onMsgFromWorker);
81
+ return proxy;
82
+ }
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ title: string;
3
+ shots: number;
4
+ code: string;
5
+ }[];
6
+ export default _default;