django-cotton-lsp 1.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,258 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.UsageIndex = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const fast_glob_1 = __importDefault(require("fast-glob"));
43
+ const vscode_languageserver_1 = require("vscode-languageserver");
44
+ const vscode_uri_1 = require("vscode-uri");
45
+ /**
46
+ * Workspace-wide index of where every Cotton component is *used* (as opposed to
47
+ * ComponentIndex, which tracks where components are *defined*). Powers "Find All
48
+ * References" and unused-component detection.
49
+ *
50
+ * Performance approach:
51
+ * - A full workspace scan only happens once, lazily, in the background.
52
+ * - After that, individual file edits/saves update the index incrementally by
53
+ * re-scanning only the changed file (cheap: proportional to that file's size),
54
+ * not the whole workspace.
55
+ */
56
+ class UsageIndex {
57
+ constructor(workspaceRoot) {
58
+ this.usagesByComponent = new Map();
59
+ this.componentsByUri = new Map();
60
+ this.builtPromise = null;
61
+ this.onChangeCallbacks = [];
62
+ this.workspaceRoot = workspaceRoot;
63
+ }
64
+ onChange(callback) {
65
+ this.onChangeCallbacks.push(callback);
66
+ }
67
+ notifyChange() {
68
+ this.onChangeCallbacks.forEach(cb => cb());
69
+ }
70
+ /**
71
+ * Kick off (or await, if already running) the initial full-workspace scan.
72
+ * Safe to call multiple times - subsequent calls just await the same promise.
73
+ */
74
+ async ensureBuilt() {
75
+ if (!this.builtPromise) {
76
+ this.builtPromise = this.buildFullIndex();
77
+ }
78
+ return this.builtPromise;
79
+ }
80
+ rebuild() {
81
+ this.builtPromise = this.buildFullIndex();
82
+ }
83
+ async buildFullIndex() {
84
+ this.usagesByComponent = new Map();
85
+ this.componentsByUri = new Map();
86
+ let files;
87
+ try {
88
+ files = await (0, fast_glob_1.default)('**/*.html', {
89
+ cwd: this.workspaceRoot,
90
+ absolute: true,
91
+ ignore: UsageIndex.IGNORE_GLOBS,
92
+ onlyFiles: true
93
+ });
94
+ }
95
+ catch {
96
+ files = [];
97
+ }
98
+ // Read/scan in small concurrent batches so we don't open thousands of file
99
+ // handles at once on very large workspaces, while still parallelizing I/O.
100
+ const BATCH_SIZE = 25;
101
+ for (let i = 0; i < files.length; i += BATCH_SIZE) {
102
+ const batch = files.slice(i, i + BATCH_SIZE);
103
+ await Promise.all(batch.map(async (filePath) => {
104
+ try {
105
+ const content = await fs.promises.readFile(filePath, 'utf-8');
106
+ this.indexFileContent(vscode_uri_1.URI.file(filePath).toString(), content);
107
+ }
108
+ catch {
109
+ // Unreadable file, skip
110
+ }
111
+ }));
112
+ }
113
+ this.notifyChange();
114
+ }
115
+ /**
116
+ * Incrementally re-index a single file (called on document open/change/save).
117
+ * Cheap: only rescans the one file, not the whole workspace.
118
+ */
119
+ updateFile(uri, content) {
120
+ this.removeFile(uri);
121
+ this.indexFileContent(uri, content);
122
+ this.notifyChange();
123
+ }
124
+ removeFile(uri) {
125
+ const previousComponents = this.componentsByUri.get(uri);
126
+ if (!previousComponents)
127
+ return;
128
+ for (const name of previousComponents) {
129
+ const entries = this.usagesByComponent.get(name);
130
+ if (!entries)
131
+ continue;
132
+ const filtered = entries.filter(e => e.uri !== uri);
133
+ if (filtered.length > 0) {
134
+ this.usagesByComponent.set(name, filtered);
135
+ }
136
+ else {
137
+ this.usagesByComponent.delete(name);
138
+ }
139
+ }
140
+ this.componentsByUri.delete(uri);
141
+ }
142
+ indexFileContent(uri, content) {
143
+ const componentNamesInFile = new Set();
144
+ // Computed once per file, then reused via binary search for every offset->position
145
+ // conversion below, so indexing a file stays roughly O(size + usages log lines).
146
+ const newlineOffsets = this.computeNewlineOffsets(content);
147
+ // Doc comments routinely show example usage (e.g. `<!-- rendered as <c-card /> -->`,
148
+ // exactly the pattern getComponentDocumentation()/hover encourage). Blank out comment
149
+ // bodies (preserving length and newlines, so offsets stay valid) before scanning, so
150
+ // documentation examples don't get counted as real usages.
151
+ const scannable = this.stripComments(content);
152
+ // <c-foo ...> and <c-foo /> opening tags
153
+ const tagRegex = /<c-([\w.-]+)/g;
154
+ let match;
155
+ while ((match = tagRegex.exec(scannable)) !== null) {
156
+ const name = this.normalizeComponentName(match[1]);
157
+ if (name === 'vars' || name === 'slot' || name === 'component')
158
+ continue;
159
+ const start = match.index + 1; // skip '<', keep the "c-foo" span (tag name incl. prefix)
160
+ const end = start + 2 + name.length;
161
+ this.addUsage(name, uri, newlineOffsets, start, end);
162
+ componentNamesInFile.add(name);
163
+ }
164
+ // <c-component is="literal.name" /> - static dynamic-component usages.
165
+ // Note: requires whitespace (not just a word boundary) immediately before "is", so
166
+ // the colon-prefixed dynamic-expression form (`:is="expr"`) is correctly excluded -
167
+ // a plain `\b` would also match right after the colon.
168
+ const isAttrRegex = /<c-component\b[^>]*?\sis\s*=\s*"([^"{}%]*)"/g;
169
+ while ((match = isAttrRegex.exec(scannable)) !== null) {
170
+ const rawName = match[1];
171
+ if (!rawName)
172
+ continue;
173
+ const valueStart = match.index + match[0].lastIndexOf(rawName);
174
+ const valueEnd = valueStart + rawName.length;
175
+ this.addUsage(this.normalizeComponentName(rawName), uri, newlineOffsets, valueStart, valueEnd);
176
+ componentNamesInFile.add(this.normalizeComponentName(rawName));
177
+ }
178
+ if (componentNamesInFile.size > 0) {
179
+ this.componentsByUri.set(uri, componentNamesInFile);
180
+ }
181
+ }
182
+ /**
183
+ * Canonicalize a component name so that kebab-case and snake_case spellings of the same
184
+ * tag/`is` value (e.g. `icons.circle-check` and `icons.circle_check`) are treated as the
185
+ * same component for reference tracking - matching the canonical (kebab-case) form
186
+ * ComponentIndex uses when listing components from disk.
187
+ */
188
+ normalizeComponentName(name) {
189
+ return name.replace(/_/g, '-');
190
+ }
191
+ addUsage(componentName, uri, newlineOffsets, start, end) {
192
+ const range = vscode_languageserver_1.Range.create(this.offsetToPosition(newlineOffsets, start), this.offsetToPosition(newlineOffsets, end));
193
+ const entries = this.usagesByComponent.get(componentName) || [];
194
+ entries.push({ componentName, uri, range });
195
+ this.usagesByComponent.set(componentName, entries);
196
+ }
197
+ stripComments(content) {
198
+ return content.replace(/<!--[\s\S]*?-->/g, comment => comment.replace(/[^\n]/g, ' '));
199
+ }
200
+ computeNewlineOffsets(content) {
201
+ const offsets = [];
202
+ for (let i = 0; i < content.length; i++) {
203
+ if (content.charCodeAt(i) === 10 /* \n */) {
204
+ offsets.push(i);
205
+ }
206
+ }
207
+ return offsets;
208
+ }
209
+ /** Binary search over precomputed newline offsets - O(log lines) per conversion. */
210
+ offsetToPosition(newlineOffsets, offset) {
211
+ let lo = 0;
212
+ let hi = newlineOffsets.length;
213
+ while (lo < hi) {
214
+ const mid = (lo + hi) >>> 1;
215
+ if (newlineOffsets[mid] < offset) {
216
+ lo = mid + 1;
217
+ }
218
+ else {
219
+ hi = mid;
220
+ }
221
+ }
222
+ const line = lo;
223
+ const lineStart = line === 0 ? 0 : newlineOffsets[line - 1] + 1;
224
+ return vscode_languageserver_1.Position.create(line, offset - lineStart);
225
+ }
226
+ /**
227
+ * All Locations where the given component name is used, across the workspace.
228
+ */
229
+ getReferences(componentName) {
230
+ const entries = this.usagesByComponent.get(this.normalizeComponentName(componentName)) || [];
231
+ return entries.map(e => vscode_languageserver_1.Location.create(e.uri, e.range));
232
+ }
233
+ getUsageCount(componentName) {
234
+ return this.usagesByComponent.get(this.normalizeComponentName(componentName))?.length || 0;
235
+ }
236
+ /**
237
+ * File paths (absolute, fs-style) of every known component that has zero usages
238
+ * anywhere in the indexed workspace files.
239
+ */
240
+ getUnusedComponentPaths(allComponentFilePaths) {
241
+ return allComponentFilePaths
242
+ .filter(c => this.getUsageCount(c.name) === 0)
243
+ .map(c => path.normalize(c.filePath));
244
+ }
245
+ }
246
+ exports.UsageIndex = UsageIndex;
247
+ UsageIndex.IGNORE_GLOBS = [
248
+ '**/node_modules/**',
249
+ '**/.git/**',
250
+ '**/venv/**',
251
+ '**/.venv/**',
252
+ '**/__pycache__/**',
253
+ '**/out/**',
254
+ '**/dist/**',
255
+ '**/build/**',
256
+ '**/.vscode-test/**'
257
+ ];
258
+ //# sourceMappingURL=usageIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageIndex.js","sourceRoot":"","sources":["../../src/utils/usageIndex.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,0DAA2B;AAC3B,iEAAkE;AAClE,2CAAiC;AAQjC;;;;;;;;;;GAUG;AACH,MAAa,UAAU;IAmBnB,YAAY,aAAqB;QAjBzB,sBAAiB,GAA8B,IAAI,GAAG,EAAE,CAAC;QACzD,oBAAe,GAA6B,IAAI,GAAG,EAAE,CAAC;QACtD,iBAAY,GAAyB,IAAI,CAAC;QAC1C,sBAAiB,GAAmB,EAAE,CAAC;QAe3C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,QAAQ,CAAC,QAAoB;QACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,OAAO;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QAEjC,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACD,KAAK,GAAG,MAAM,IAAA,mBAAE,EAAC,WAAW,EAAE;gBAC1B,GAAG,EAAE,IAAI,CAAC,aAAa;gBACvB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,UAAU,CAAC,YAAY;gBAC/B,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACL,KAAK,GAAG,EAAE,CAAC;QACf,CAAC;QAED,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;gBACzC,IAAI,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC9D,IAAI,CAAC,gBAAgB,CAAC,gBAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;gBAClE,CAAC;gBAAC,MAAM,CAAC;oBACL,wBAAwB;gBAC5B,CAAC;YACL,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,GAAW,EAAE,OAAe;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,GAAW;QAClB,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAEhC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,GAAW,EAAE,OAAe;QACjD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/C,mFAAmF;QACnF,iFAAiF;QACjF,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAE3D,qFAAqF;QACrF,sFAAsF;QACtF,qFAAqF;QACrF,2DAA2D;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE9C,yCAAyC;QACzC,MAAM,QAAQ,GAAG,eAAe,CAAC;QACjC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW;gBAAE,SAAS;YAEzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,0DAA0D;YACzF,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACrD,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,uEAAuE;QACvE,mFAAmF;QACnF,oFAAoF;QACpF,uDAAuD;QACvD,MAAM,WAAW,GAAG,8CAA8C,CAAC;QACnE,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC/F,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,IAAY;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAEO,QAAQ,CAAC,aAAqB,EAAE,GAAW,EAAE,cAAwB,EAAE,KAAa,EAAE,GAAW;QACrG,MAAM,KAAK,GAAG,6BAAK,CAAC,MAAM,CACtB,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,EAC5C,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,CAAC,CAC7C,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEO,aAAa,CAAC,OAAe;QACjC,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1F,CAAC;IAEO,qBAAqB,CAAC,OAAe;QACzC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,oFAAoF;IAC5E,gBAAgB,CAAC,cAAwB,EAAE,MAAc;QAC7D,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC;QAE/B,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;gBAC/B,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,EAAE,GAAG,GAAG,CAAC;YACb,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,gCAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,aAAqB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7F,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gCAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,aAAa,CAAC,aAAqB;QAC/B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,qBAA2D;QAC/E,OAAO,qBAAqB;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;;AAlOL,gCAmOC;AA5N2B,uBAAY,GAAG;IACnC,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,WAAW;IACX,YAAY;IACZ,aAAa;IACb,oBAAoB;CACvB,AAVmC,CAUlC"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "django-cotton-lsp",
3
+ "version": "1.0.0",
4
+ "description": "Language Server for Django Cotton templates",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/twentyforty/cotton-vscode-ext",
9
+ "directory": "packages/language-server"
10
+ },
11
+ "main": "./out/server.js",
12
+ "bin": {
13
+ "django-cotton-lsp": "./out/server.js"
14
+ },
15
+ "files": [
16
+ "out"
17
+ ],
18
+ "scripts": {
19
+ "compile": "tsc -p ./",
20
+ "prepare": "npm run compile"
21
+ },
22
+ "dependencies": {
23
+ "fast-glob": "^3.3.2",
24
+ "vscode-html-languageservice": "^5.3.0",
25
+ "vscode-languageserver": "^9.0.1",
26
+ "vscode-languageserver-textdocument": "^1.0.11",
27
+ "vscode-uri": "^3.0.8"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^16.18.34",
31
+ "typescript": "^5.1.3"
32
+ },
33
+ "keywords": [
34
+ "django",
35
+ "cotton",
36
+ "language-server",
37
+ "lsp",
38
+ "html",
39
+ "templates"
40
+ ]
41
+ }