@514labs/moose-lsp 0.1.0-dev.11.3.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 (104) hide show
  1. package/dist/clickhouseData.d.ts +78 -0
  2. package/dist/clickhouseData.js +111 -0
  3. package/dist/clickhouseData.js.map +1 -0
  4. package/dist/clickhouseData.test.d.ts +2 -0
  5. package/dist/clickhouseData.test.js +92 -0
  6. package/dist/clickhouseData.test.js.map +1 -0
  7. package/dist/clickhouseVersion.d.ts +49 -0
  8. package/dist/clickhouseVersion.js +148 -0
  9. package/dist/clickhouseVersion.js.map +1 -0
  10. package/dist/clickhouseVersion.test.d.ts +2 -0
  11. package/dist/clickhouseVersion.test.js +113 -0
  12. package/dist/clickhouseVersion.test.js.map +1 -0
  13. package/dist/codeActions.d.ts +27 -0
  14. package/dist/codeActions.js +172 -0
  15. package/dist/codeActions.js.map +1 -0
  16. package/dist/codeActions.test.d.ts +2 -0
  17. package/dist/codeActions.test.js +206 -0
  18. package/dist/codeActions.test.js.map +1 -0
  19. package/dist/completions.d.ts +22 -0
  20. package/dist/completions.js +227 -0
  21. package/dist/completions.js.map +1 -0
  22. package/dist/completions.test.d.ts +2 -0
  23. package/dist/completions.test.js +282 -0
  24. package/dist/completions.test.js.map +1 -0
  25. package/dist/data/clickhouse-25.6.json +30772 -0
  26. package/dist/data/clickhouse-25.8.json +31872 -0
  27. package/dist/diagnostics.d.ts +18 -0
  28. package/dist/diagnostics.js +53 -0
  29. package/dist/diagnostics.js.map +1 -0
  30. package/dist/diagnostics.test.d.ts +2 -0
  31. package/dist/diagnostics.test.js +109 -0
  32. package/dist/diagnostics.test.js.map +1 -0
  33. package/dist/formatting.d.ts +36 -0
  34. package/dist/formatting.js +69 -0
  35. package/dist/formatting.js.map +1 -0
  36. package/dist/formatting.test.d.ts +2 -0
  37. package/dist/formatting.test.js +92 -0
  38. package/dist/formatting.test.js.map +1 -0
  39. package/dist/hover.d.ts +44 -0
  40. package/dist/hover.js +209 -0
  41. package/dist/hover.js.map +1 -0
  42. package/dist/hover.test.d.ts +2 -0
  43. package/dist/hover.test.js +354 -0
  44. package/dist/hover.test.js.map +1 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.js +25 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/node_modules/@514labs/moose-sql-validator-wasm/dist/index.js +56 -0
  49. package/dist/node_modules/@514labs/moose-sql-validator-wasm/dist/index.js.map +1 -0
  50. package/dist/node_modules/@514labs/moose-sql-validator-wasm/dist/index.test.js +185 -0
  51. package/dist/node_modules/@514labs/moose-sql-validator-wasm/dist/index.test.js.map +1 -0
  52. package/dist/node_modules/@514labs/moose-sql-validator-wasm/package.json +40 -0
  53. package/dist/node_modules/@514labs/moose-sql-validator-wasm/pkg/package.json +11 -0
  54. package/dist/node_modules/@514labs/moose-sql-validator-wasm/pkg/sql_validator.js +176 -0
  55. package/dist/node_modules/@514labs/moose-sql-validator-wasm/pkg/sql_validator_bg.wasm +0 -0
  56. package/dist/projectDetector.d.ts +21 -0
  57. package/dist/projectDetector.js +162 -0
  58. package/dist/projectDetector.js.map +1 -0
  59. package/dist/projectDetector.test.d.ts +2 -0
  60. package/dist/projectDetector.test.js +303 -0
  61. package/dist/projectDetector.test.js.map +1 -0
  62. package/dist/pythonService.d.ts +40 -0
  63. package/dist/pythonService.js +121 -0
  64. package/dist/pythonService.js.map +1 -0
  65. package/dist/pythonService.test.d.ts +2 -0
  66. package/dist/pythonService.test.js +208 -0
  67. package/dist/pythonService.test.js.map +1 -0
  68. package/dist/pythonSqlExtractor.d.ts +25 -0
  69. package/dist/pythonSqlExtractor.js +258 -0
  70. package/dist/pythonSqlExtractor.js.map +1 -0
  71. package/dist/pythonSqlExtractor.test.d.ts +2 -0
  72. package/dist/pythonSqlExtractor.test.js +227 -0
  73. package/dist/pythonSqlExtractor.test.js.map +1 -0
  74. package/dist/server.d.ts +2 -0
  75. package/dist/server.integration.test.d.ts +2 -0
  76. package/dist/server.integration.test.js +189 -0
  77. package/dist/server.integration.test.js.map +1 -0
  78. package/dist/server.js +228412 -0
  79. package/dist/server.js.map +1 -0
  80. package/dist/serverLogic.d.ts +40 -0
  81. package/dist/serverLogic.js +61 -0
  82. package/dist/serverLogic.js.map +1 -0
  83. package/dist/serverLogic.test.d.ts +2 -0
  84. package/dist/serverLogic.test.js +263 -0
  85. package/dist/serverLogic.test.js.map +1 -0
  86. package/dist/sqlExtractor.d.ts +15 -0
  87. package/dist/sqlExtractor.js +105 -0
  88. package/dist/sqlExtractor.js.map +1 -0
  89. package/dist/sqlExtractor.test.d.ts +2 -0
  90. package/dist/sqlExtractor.test.js +267 -0
  91. package/dist/sqlExtractor.test.js.map +1 -0
  92. package/dist/sqlLocations.d.ts +31 -0
  93. package/dist/sqlLocations.js +51 -0
  94. package/dist/sqlLocations.js.map +1 -0
  95. package/dist/sqlLocations.test.d.ts +2 -0
  96. package/dist/sqlLocations.test.js +94 -0
  97. package/dist/sqlLocations.test.js.map +1 -0
  98. package/dist/typescriptService.d.ts +29 -0
  99. package/dist/typescriptService.js +137 -0
  100. package/dist/typescriptService.js.map +1 -0
  101. package/dist/typescriptService.test.d.ts +2 -0
  102. package/dist/typescriptService.test.js +200 -0
  103. package/dist/typescriptService.test.js.map +1 -0
  104. package/package.json +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/typescriptService.ts"],"sourcesContent":["import * as path from 'node:path';\nimport ts from 'typescript';\n\n/**\n * Service that manages a TypeScript Program lifecycle for SQL extraction.\n * Holds the Program and TypeChecker in memory for fast incremental updates.\n */\nexport interface TypeScriptService {\n /** Initialize with tsconfig.json path. Builds initial Program. */\n initialize(tsconfigPath: string): void;\n\n /** Update file content, rebuild program incrementally. */\n updateFile(filePath: string, content: string): void;\n\n /** Get TypeChecker for symbol resolution. */\n getTypeChecker(): ts.TypeChecker;\n\n /** Get all source files (for initial scan). Excludes declaration files and node_modules. */\n getSourceFiles(): readonly ts.SourceFile[];\n\n /** Get specific source file by path. */\n getSourceFile(filePath: string): ts.SourceFile | undefined;\n\n /** Check if service is initialized and healthy. */\n isHealthy(): boolean;\n\n /** Get initialization error if any. */\n getError(): string | null;\n}\n\n/**\n * Creates a TypeScript service that manages Program lifecycle.\n * Uses incremental compilation for fast updates on file changes.\n */\nexport function createTypeScriptService(): TypeScriptService {\n let program: ts.Program | null = null;\n let compilerOptions: ts.CompilerOptions = {};\n let rootFiles: string[] = [];\n const fileContents = new Map<string, string>(); // In-memory file cache\n let error: string | null = null;\n\n /**\n * Creates a custom CompilerHost that uses our in-memory cache.\n * Falls back to disk for files not in cache.\n */\n const createCompilerHost = (): ts.CompilerHost => {\n const defaultHost = ts.createCompilerHost(compilerOptions);\n return {\n ...defaultHost,\n getSourceFile: (\n fileName: string,\n languageVersion: ts.ScriptTarget,\n onError?: (message: string) => void,\n ): ts.SourceFile | undefined => {\n // Check our cache first\n const normalizedPath = path.normalize(fileName);\n const cached = fileContents.get(normalizedPath);\n if (cached !== undefined) {\n return ts.createSourceFile(fileName, cached, languageVersion);\n }\n // Fall back to disk\n return defaultHost.getSourceFile(fileName, languageVersion, onError);\n },\n fileExists: (fileName: string): boolean => {\n const normalizedPath = path.normalize(fileName);\n if (fileContents.has(normalizedPath)) return true;\n return defaultHost.fileExists(fileName);\n },\n readFile: (fileName: string): string | undefined => {\n const normalizedPath = path.normalize(fileName);\n const cached = fileContents.get(normalizedPath);\n if (cached !== undefined) return cached;\n return defaultHost.readFile(fileName);\n },\n };\n };\n\n return {\n initialize(tsconfigPath: string): void {\n try {\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n if (configFile.error) {\n error = ts.flattenDiagnosticMessageText(\n configFile.error.messageText,\n '\\n',\n );\n return;\n }\n\n const projectRoot = path.dirname(tsconfigPath);\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n projectRoot,\n );\n\n if (parsed.errors.length > 0) {\n error = parsed.errors\n .map((e) => ts.flattenDiagnosticMessageText(e.messageText, '\\n'))\n .join('\\n');\n return;\n }\n\n compilerOptions = parsed.options;\n rootFiles = parsed.fileNames;\n\n program = ts.createProgram({\n rootNames: rootFiles,\n options: compilerOptions,\n host: createCompilerHost(),\n });\n\n error = null;\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n },\n\n updateFile(filePath: string, content: string): void {\n if (!program) return;\n\n const normalizedPath = path.normalize(filePath);\n fileContents.set(normalizedPath, content);\n\n // Rebuild program incrementally using oldProgram\n program = ts.createProgram({\n rootNames: rootFiles,\n options: compilerOptions,\n host: createCompilerHost(),\n oldProgram: program,\n });\n },\n\n getTypeChecker(): ts.TypeChecker {\n if (!program) throw new Error('TypeScript service not initialized');\n return program.getTypeChecker();\n },\n\n getSourceFiles(): readonly ts.SourceFile[] {\n if (!program) return [];\n // Filter out declaration files and node_modules\n return program.getSourceFiles().filter((sf) => {\n return !sf.isDeclarationFile && !sf.fileName.includes('node_modules');\n });\n },\n\n getSourceFile(filePath: string): ts.SourceFile | undefined {\n if (!program) return undefined;\n return program.getSourceFile(path.normalize(filePath));\n },\n\n isHealthy(): boolean {\n return program !== null && error === null;\n },\n\n getError(): string | null {\n return error;\n },\n };\n}\n"],"mappings":"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","names":["ts"]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var import_node_assert = __toESM(require("node:assert"));
25
+ var fs = __toESM(require("node:fs"));
26
+ var os = __toESM(require("node:os"));
27
+ var path = __toESM(require("node:path"));
28
+ var import_node_test = require("node:test");
29
+ var import_typescriptService = require("./typescriptService");
30
+ function createTestProject(files) {
31
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "ts-service-test-"));
32
+ for (const [fileName, content] of Object.entries(files)) {
33
+ const filePath = path.join(tmpDir, fileName);
34
+ const dir = path.dirname(filePath);
35
+ fs.mkdirSync(dir, { recursive: true });
36
+ fs.writeFileSync(filePath, content);
37
+ }
38
+ return tmpDir;
39
+ }
40
+ function cleanupTestProject(dir) {
41
+ fs.rmSync(dir, { recursive: true, force: true });
42
+ }
43
+ (0, import_node_test.describe)("TypeScriptService", () => {
44
+ (0, import_node_test.describe)("initialize", () => {
45
+ (0, import_node_test.it)("initializes successfully with valid tsconfig", () => {
46
+ const projectDir = createTestProject({
47
+ "tsconfig.json": JSON.stringify({
48
+ compilerOptions: {
49
+ target: "ES2020",
50
+ module: "commonjs",
51
+ strict: true
52
+ },
53
+ include: ["src/**/*"]
54
+ }),
55
+ "src/index.ts": "export const x = 1;"
56
+ });
57
+ try {
58
+ const service = (0, import_typescriptService.createTypeScriptService)();
59
+ service.initialize(path.join(projectDir, "tsconfig.json"));
60
+ import_node_assert.default.strictEqual(service.isHealthy(), true);
61
+ import_node_assert.default.strictEqual(service.getError(), null);
62
+ } finally {
63
+ cleanupTestProject(projectDir);
64
+ }
65
+ });
66
+ (0, import_node_test.it)("reports error for invalid tsconfig", () => {
67
+ const projectDir = createTestProject({
68
+ "tsconfig.json": "invalid json {{{"
69
+ });
70
+ try {
71
+ const service = (0, import_typescriptService.createTypeScriptService)();
72
+ service.initialize(path.join(projectDir, "tsconfig.json"));
73
+ import_node_assert.default.strictEqual(service.isHealthy(), false);
74
+ import_node_assert.default.ok(service.getError() !== null);
75
+ } finally {
76
+ cleanupTestProject(projectDir);
77
+ }
78
+ });
79
+ (0, import_node_test.it)("reports error for non-existent tsconfig", () => {
80
+ const service = (0, import_typescriptService.createTypeScriptService)();
81
+ service.initialize("/non/existent/tsconfig.json");
82
+ import_node_assert.default.strictEqual(service.isHealthy(), false);
83
+ import_node_assert.default.ok(service.getError() !== null);
84
+ });
85
+ });
86
+ (0, import_node_test.describe)("getSourceFiles", () => {
87
+ (0, import_node_test.it)("returns source files from the project", () => {
88
+ const projectDir = createTestProject({
89
+ "tsconfig.json": JSON.stringify({
90
+ compilerOptions: {
91
+ target: "ES2020",
92
+ module: "commonjs"
93
+ },
94
+ include: ["src/**/*"]
95
+ }),
96
+ "src/index.ts": "export const x = 1;",
97
+ "src/utils.ts": "export function add(a: number, b: number) { return a + b; }"
98
+ });
99
+ try {
100
+ const service = (0, import_typescriptService.createTypeScriptService)();
101
+ service.initialize(path.join(projectDir, "tsconfig.json"));
102
+ const sourceFiles = service.getSourceFiles();
103
+ import_node_assert.default.strictEqual(sourceFiles.length, 2);
104
+ const fileNames = sourceFiles.map((sf) => path.basename(sf.fileName));
105
+ import_node_assert.default.ok(fileNames.includes("index.ts"));
106
+ import_node_assert.default.ok(fileNames.includes("utils.ts"));
107
+ } finally {
108
+ cleanupTestProject(projectDir);
109
+ }
110
+ });
111
+ (0, import_node_test.it)("excludes node_modules and declaration files", () => {
112
+ const projectDir = createTestProject({
113
+ "tsconfig.json": JSON.stringify({
114
+ compilerOptions: {
115
+ target: "ES2020",
116
+ module: "commonjs"
117
+ },
118
+ include: ["src/**/*"]
119
+ }),
120
+ "src/index.ts": "export const x = 1;"
121
+ });
122
+ try {
123
+ const service = (0, import_typescriptService.createTypeScriptService)();
124
+ service.initialize(path.join(projectDir, "tsconfig.json"));
125
+ const sourceFiles = service.getSourceFiles();
126
+ for (const sf of sourceFiles) {
127
+ import_node_assert.default.ok(
128
+ !sf.fileName.includes("node_modules"),
129
+ `Should not include node_modules: ${sf.fileName}`
130
+ );
131
+ import_node_assert.default.ok(
132
+ !sf.isDeclarationFile,
133
+ `Should not include declaration files: ${sf.fileName}`
134
+ );
135
+ }
136
+ } finally {
137
+ cleanupTestProject(projectDir);
138
+ }
139
+ });
140
+ });
141
+ (0, import_node_test.describe)("updateFile", () => {
142
+ (0, import_node_test.it)("updates file content and rebuilds program", () => {
143
+ const projectDir = createTestProject({
144
+ "tsconfig.json": JSON.stringify({
145
+ compilerOptions: {
146
+ target: "ES2020",
147
+ module: "commonjs"
148
+ },
149
+ include: ["src/**/*"]
150
+ }),
151
+ "src/index.ts": "export const x = 1;"
152
+ });
153
+ try {
154
+ const service = (0, import_typescriptService.createTypeScriptService)();
155
+ service.initialize(path.join(projectDir, "tsconfig.json"));
156
+ const indexPath = path.join(projectDir, "src/index.ts");
157
+ const initialSf = service.getSourceFile(indexPath);
158
+ import_node_assert.default.ok(initialSf);
159
+ import_node_assert.default.ok(initialSf.text.includes("const x = 1"));
160
+ service.updateFile(indexPath, "export const y = 2;");
161
+ const updatedSf = service.getSourceFile(indexPath);
162
+ import_node_assert.default.ok(updatedSf);
163
+ import_node_assert.default.ok(updatedSf.text.includes("const y = 2"));
164
+ import_node_assert.default.ok(!updatedSf.text.includes("const x = 1"));
165
+ } finally {
166
+ cleanupTestProject(projectDir);
167
+ }
168
+ });
169
+ });
170
+ (0, import_node_test.describe)("getTypeChecker", () => {
171
+ (0, import_node_test.it)("returns a working type checker", () => {
172
+ const projectDir = createTestProject({
173
+ "tsconfig.json": JSON.stringify({
174
+ compilerOptions: {
175
+ target: "ES2020",
176
+ module: "commonjs"
177
+ },
178
+ include: ["src/**/*"]
179
+ }),
180
+ "src/index.ts": "export const x: number = 1;"
181
+ });
182
+ try {
183
+ const service = (0, import_typescriptService.createTypeScriptService)();
184
+ service.initialize(path.join(projectDir, "tsconfig.json"));
185
+ const typeChecker = service.getTypeChecker();
186
+ import_node_assert.default.ok(typeChecker);
187
+ import_node_assert.default.strictEqual(typeof typeChecker.getSymbolAtLocation, "function");
188
+ } finally {
189
+ cleanupTestProject(projectDir);
190
+ }
191
+ });
192
+ (0, import_node_test.it)("throws if not initialized", () => {
193
+ const service = (0, import_typescriptService.createTypeScriptService)();
194
+ import_node_assert.default.throws(() => service.getTypeChecker(), {
195
+ message: "TypeScript service not initialized"
196
+ });
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=typescriptService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/typescriptService.test.ts"],"sourcesContent":["import assert from 'node:assert';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { describe, it } from 'node:test';\nimport { createTypeScriptService } from './typescriptService';\n\n/**\n * Creates a temporary directory with test files for TypeScript service tests\n */\nfunction createTestProject(files: Record<string, string>): string {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ts-service-test-'));\n\n for (const [fileName, content] of Object.entries(files)) {\n const filePath = path.join(tmpDir, fileName);\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, content);\n }\n\n return tmpDir;\n}\n\n/**\n * Cleans up a temporary test directory\n */\nfunction cleanupTestProject(dir: string): void {\n fs.rmSync(dir, { recursive: true, force: true });\n}\n\ndescribe('TypeScriptService', () => {\n describe('initialize', () => {\n it('initializes successfully with valid tsconfig', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n strict: true,\n },\n include: ['src/**/*'],\n }),\n 'src/index.ts': 'export const x = 1;',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n assert.strictEqual(service.isHealthy(), true);\n assert.strictEqual(service.getError(), null);\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n\n it('reports error for invalid tsconfig', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': 'invalid json {{{',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n assert.strictEqual(service.isHealthy(), false);\n assert.ok(service.getError() !== null);\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n\n it('reports error for non-existent tsconfig', () => {\n const service = createTypeScriptService();\n service.initialize('/non/existent/tsconfig.json');\n\n assert.strictEqual(service.isHealthy(), false);\n assert.ok(service.getError() !== null);\n });\n });\n\n describe('getSourceFiles', () => {\n it('returns source files from the project', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n },\n include: ['src/**/*'],\n }),\n 'src/index.ts': 'export const x = 1;',\n 'src/utils.ts':\n 'export function add(a: number, b: number) { return a + b; }',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n const sourceFiles = service.getSourceFiles();\n\n // Should have our two source files (excludes declaration files and node_modules)\n assert.strictEqual(sourceFiles.length, 2);\n\n const fileNames = sourceFiles.map((sf) => path.basename(sf.fileName));\n assert.ok(fileNames.includes('index.ts'));\n assert.ok(fileNames.includes('utils.ts'));\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n\n it('excludes node_modules and declaration files', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n },\n include: ['src/**/*'],\n }),\n 'src/index.ts': 'export const x = 1;',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n const sourceFiles = service.getSourceFiles();\n\n // None should be from node_modules or be .d.ts files\n for (const sf of sourceFiles) {\n assert.ok(\n !sf.fileName.includes('node_modules'),\n `Should not include node_modules: ${sf.fileName}`,\n );\n assert.ok(\n !sf.isDeclarationFile,\n `Should not include declaration files: ${sf.fileName}`,\n );\n }\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n });\n\n describe('updateFile', () => {\n it('updates file content and rebuilds program', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n },\n include: ['src/**/*'],\n }),\n 'src/index.ts': 'export const x = 1;',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n // Get initial source file\n const indexPath = path.join(projectDir, 'src/index.ts');\n const initialSf = service.getSourceFile(indexPath);\n assert.ok(initialSf);\n assert.ok(initialSf.text.includes('const x = 1'));\n\n // Update the file\n service.updateFile(indexPath, 'export const y = 2;');\n\n // Get updated source file\n const updatedSf = service.getSourceFile(indexPath);\n assert.ok(updatedSf);\n assert.ok(updatedSf.text.includes('const y = 2'));\n assert.ok(!updatedSf.text.includes('const x = 1'));\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n });\n\n describe('getTypeChecker', () => {\n it('returns a working type checker', () => {\n const projectDir = createTestProject({\n 'tsconfig.json': JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'commonjs',\n },\n include: ['src/**/*'],\n }),\n 'src/index.ts': 'export const x: number = 1;',\n });\n\n try {\n const service = createTypeScriptService();\n service.initialize(path.join(projectDir, 'tsconfig.json'));\n\n const typeChecker = service.getTypeChecker();\n assert.ok(typeChecker);\n assert.strictEqual(typeof typeChecker.getSymbolAtLocation, 'function');\n } finally {\n cleanupTestProject(projectDir);\n }\n });\n\n it('throws if not initialized', () => {\n const service = createTypeScriptService();\n\n assert.throws(() => service.getTypeChecker(), {\n message: 'TypeScript service not initialized',\n });\n });\n });\n});\n"],"mappings":"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","names":["assert"]}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@514labs/moose-lsp",
3
+ "version": "0.1.0-dev.11.3.1",
4
+ "description": "Language Server for Moose TypeScript projects",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/514-labs/moosestack-lsp.git",
9
+ "directory": "packages/lsp-server"
10
+ },
11
+ "keywords": [
12
+ "lsp",
13
+ "language-server",
14
+ "sql",
15
+ "moose",
16
+ "clickhouse",
17
+ "typescript",
18
+ "python"
19
+ ],
20
+ "main": "dist/server.js",
21
+ "bin": {
22
+ "moosestack-lsp": "./dist/server.js"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "watch": "tsup --watch",
33
+ "test": "node --test dist/*.test.js",
34
+ "test:coverage": "c8 --reporter=text --reporter=lcov node --test dist/*.test.js",
35
+ "clean": "rm -rf dist coverage"
36
+ },
37
+ "dependencies": {
38
+ "glob": "^10.5.0",
39
+ "tree-sitter": "^0.25.0",
40
+ "tree-sitter-python": "^0.25.0",
41
+ "typescript": "^5.9.3",
42
+ "vscode-languageserver": "^9.0.1",
43
+ "vscode-languageserver-textdocument": "^1.0.12"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^20.19.32",
47
+ "tsup": "^8.5.1"
48
+ }
49
+ }