@ripast/vue 0.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.
- package/LICENSE.md +21 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +348 -0
- package/package.json +64 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Harlan Wilton <harlan@harlanzw.com>
|
|
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/dist/index.d.mts
ADDED
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { extractTemplateExpressions, posToLineCol, rewriteTemplateReferences } from "@ripast/core/adapter";
|
|
4
|
+
import { URI } from "vscode-uri";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import process from "node:process";
|
|
7
|
+
import { FileType, createLanguage, createLanguageService, createUriMap } from "@volar/language-service";
|
|
8
|
+
import { createLanguageServiceHost, resolveFileLanguageId } from "@volar/typescript";
|
|
9
|
+
import { createParsedCommandLine, createVueLanguagePlugin, getAllExtensions } from "@vue/language-core";
|
|
10
|
+
import { createVueLanguageServicePlugins } from "@vue/language-service";
|
|
11
|
+
import ts from "typescript";
|
|
12
|
+
import { create } from "volar-service-typescript";
|
|
13
|
+
import { TextDocument } from "vscode-languageserver-textdocument";
|
|
14
|
+
function createVueService(tsconfigPath, cwd) {
|
|
15
|
+
const commandLine = createParsedCommandLine(ts, ts.sys, tsconfigPath);
|
|
16
|
+
const vueExts = getAllExtensions(commandLine.vueOptions).map((ext) => {
|
|
17
|
+
return {
|
|
18
|
+
extension: ext.startsWith(".") ? ext.slice(1) : ext,
|
|
19
|
+
isMixedContent: true,
|
|
20
|
+
scriptKind: ts.ScriptKind.Deferred
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
const fileNames = ts.parseJsonSourceFileConfigFileContent(ts.readJsonConfigFile(tsconfigPath, ts.sys.readFile), ts.sys, resolve(tsconfigPath, ".."), void 0, tsconfigPath, void 0, vueExts).fileNames;
|
|
24
|
+
if (commandLine.options.allowNonTsExtensions === void 0) commandLine.options.allowNonTsExtensions = true;
|
|
25
|
+
const fileToUri = (fileName) => URI.file(resolve(cwd, fileName));
|
|
26
|
+
const uriToFile = (uri) => uri.fsPath;
|
|
27
|
+
const language = createLanguage([createVueLanguagePlugin(ts, commandLine.options, commandLine.vueOptions, (uri) => uriToFile(uri)), { getLanguageId: (uri) => resolveFileLanguageId(uri.path) }], createUriMap(ts.sys.useCaseSensitiveFileNames), (uri, includeFsFiles) => {
|
|
28
|
+
if (!includeFsFiles) return;
|
|
29
|
+
const fileName = uriToFile(uri);
|
|
30
|
+
if (existsSync(fileName) && statSync(fileName).isFile()) {
|
|
31
|
+
const text = readFileSync(fileName, "utf8");
|
|
32
|
+
language.scripts.set(uri, ts.ScriptSnapshot.fromString(text));
|
|
33
|
+
} else language.scripts.delete(uri);
|
|
34
|
+
});
|
|
35
|
+
let projectVersion = 0;
|
|
36
|
+
const projectHost = {
|
|
37
|
+
getCurrentDirectory: () => cwd,
|
|
38
|
+
getCompilationSettings: () => commandLine.options,
|
|
39
|
+
getProjectReferences: () => commandLine.projectReferences,
|
|
40
|
+
getScriptFileNames: () => fileNames.map((f) => resolve(cwd, f)),
|
|
41
|
+
getProjectVersion: () => String(projectVersion)
|
|
42
|
+
};
|
|
43
|
+
const env = {
|
|
44
|
+
workspaceFolders: [URI.file(cwd)],
|
|
45
|
+
fs: {
|
|
46
|
+
stat(uri) {
|
|
47
|
+
if (uri.scheme !== "file") return void 0;
|
|
48
|
+
try {
|
|
49
|
+
const s = statSync(uri.fsPath);
|
|
50
|
+
return {
|
|
51
|
+
type: s.isFile() ? FileType.File : s.isDirectory() ? FileType.Directory : s.isSymbolicLink() ? FileType.SymbolicLink : FileType.Unknown,
|
|
52
|
+
ctime: s.ctimeMs,
|
|
53
|
+
mtime: s.mtimeMs,
|
|
54
|
+
size: s.size
|
|
55
|
+
};
|
|
56
|
+
} catch {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
readFile(uri) {
|
|
61
|
+
if (uri.scheme !== "file") return void 0;
|
|
62
|
+
try {
|
|
63
|
+
return readFileSync(uri.fsPath, "utf8");
|
|
64
|
+
} catch {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
readDirectory() {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
console: {
|
|
73
|
+
log() {},
|
|
74
|
+
warn() {},
|
|
75
|
+
error: process.stderr.write.bind(process.stderr),
|
|
76
|
+
info() {}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const project = { typescript: {
|
|
80
|
+
configFileName: tsconfigPath,
|
|
81
|
+
sys: ts.sys,
|
|
82
|
+
uriConverter: {
|
|
83
|
+
asFileName: uriToFile,
|
|
84
|
+
asUri: fileToUri
|
|
85
|
+
},
|
|
86
|
+
...createLanguageServiceHost(ts, ts.sys, language, fileToUri, projectHost)
|
|
87
|
+
} };
|
|
88
|
+
const service = createLanguageService(language, [...create(ts), ...createVueLanguageServicePlugins(ts)], env, project);
|
|
89
|
+
return {
|
|
90
|
+
service,
|
|
91
|
+
fileToUri,
|
|
92
|
+
uriToFile,
|
|
93
|
+
read: (fileName) => {
|
|
94
|
+
try {
|
|
95
|
+
return readFileSync(fileName, "utf8");
|
|
96
|
+
} catch {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
setSnapshot: (fileName, text) => {
|
|
101
|
+
language.scripts.set(URI.file(resolve(cwd, fileName)), ts.ScriptSnapshot.fromString(text));
|
|
102
|
+
projectVersion++;
|
|
103
|
+
},
|
|
104
|
+
dispose: () => service.dispose()
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function workspaceEditToChanges(edit, vue, cwd, filter) {
|
|
108
|
+
const out = [];
|
|
109
|
+
const seen = /* @__PURE__ */ new Set();
|
|
110
|
+
const apply = (uriStr, edits) => {
|
|
111
|
+
const fileName = URI.parse(uriStr).fsPath;
|
|
112
|
+
if (filter && !filter(fileName)) return;
|
|
113
|
+
if (seen.has(fileName)) return;
|
|
114
|
+
seen.add(fileName);
|
|
115
|
+
const before = vue.read(fileName);
|
|
116
|
+
if (before === void 0) return;
|
|
117
|
+
const doc = TextDocument.create(uriStr, "plaintext", 0, before);
|
|
118
|
+
const after = TextDocument.applyEdits(doc, edits);
|
|
119
|
+
if (after === before) return;
|
|
120
|
+
out.push({
|
|
121
|
+
path: fileName,
|
|
122
|
+
rel: relPath$1(fileName, cwd),
|
|
123
|
+
before,
|
|
124
|
+
after
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
if (edit.changes) for (const [uriStr, edits] of Object.entries(edit.changes)) apply(uriStr, edits);
|
|
128
|
+
if (edit.documentChanges) {
|
|
129
|
+
for (const change of edit.documentChanges) if ("textDocument" in change && "edits" in change) apply(change.textDocument.uri, change.edits);
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
function relPath$1(fileName, cwd) {
|
|
134
|
+
return fileName.startsWith(cwd) ? fileName.slice(cwd.length).replace(/^[/\\]/, "") : fileName;
|
|
135
|
+
}
|
|
136
|
+
function hasVueFilesContaining(cwd, pattern) {
|
|
137
|
+
return !!spawnSync("rg", [
|
|
138
|
+
"--files-with-matches",
|
|
139
|
+
"--hidden",
|
|
140
|
+
"--no-messages",
|
|
141
|
+
"--fixed-strings",
|
|
142
|
+
"-g",
|
|
143
|
+
"*.vue",
|
|
144
|
+
pattern,
|
|
145
|
+
"."
|
|
146
|
+
], {
|
|
147
|
+
cwd,
|
|
148
|
+
encoding: "utf8"
|
|
149
|
+
}).stdout.trim();
|
|
150
|
+
}
|
|
151
|
+
async function applyVueRename(tsconfigPath, cwd, from, to, sites) {
|
|
152
|
+
const vue = createVueService(tsconfigPath, cwd);
|
|
153
|
+
try {
|
|
154
|
+
const byPath = /* @__PURE__ */ new Map();
|
|
155
|
+
for (const site of sites) {
|
|
156
|
+
const uri = URI.file(resolve(cwd, site.filePath));
|
|
157
|
+
const { line, col } = posToLineCol(site.source, site.pos);
|
|
158
|
+
const edits = await vue.service.getRenameEdits(uri, {
|
|
159
|
+
line: line - 1,
|
|
160
|
+
character: col - 1
|
|
161
|
+
}, to);
|
|
162
|
+
if (!edits) continue;
|
|
163
|
+
const vueChanges = workspaceEditToChanges(edits, vue, cwd, (fileName) => fileName.endsWith(".vue"));
|
|
164
|
+
for (const c of vueChanges) {
|
|
165
|
+
if (byPath.has(c.path)) continue;
|
|
166
|
+
byPath.set(c.path, c);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const consumerPaths = new Set(byPath.keys());
|
|
170
|
+
for (const p of listVueFilesContaining(cwd, from)) consumerPaths.add(p);
|
|
171
|
+
for (const path of consumerPaths) {
|
|
172
|
+
const existing = byPath.get(path);
|
|
173
|
+
const before = existing?.before ?? safeReadFile(path);
|
|
174
|
+
if (before === void 0) continue;
|
|
175
|
+
const baseAfter = existing?.after ?? before;
|
|
176
|
+
const rewritten = rewriteTemplateReferences(baseAfter, from, to);
|
|
177
|
+
if (rewritten === baseAfter) continue;
|
|
178
|
+
byPath.set(path, {
|
|
179
|
+
path,
|
|
180
|
+
rel: existing?.rel ?? relPath(path, cwd),
|
|
181
|
+
before,
|
|
182
|
+
after: rewritten
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return [...byPath.values()];
|
|
186
|
+
} finally {
|
|
187
|
+
vue.dispose();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function listVueFilesContaining(cwd, pattern) {
|
|
191
|
+
return spawnSync("rg", [
|
|
192
|
+
"--files-with-matches",
|
|
193
|
+
"--hidden",
|
|
194
|
+
"--no-messages",
|
|
195
|
+
"--fixed-strings",
|
|
196
|
+
"-g",
|
|
197
|
+
"*.vue",
|
|
198
|
+
pattern,
|
|
199
|
+
"."
|
|
200
|
+
], {
|
|
201
|
+
cwd,
|
|
202
|
+
encoding: "utf8"
|
|
203
|
+
}).stdout.split("\n").filter(Boolean).map((p) => resolve(cwd, p));
|
|
204
|
+
}
|
|
205
|
+
function safeReadFile(path) {
|
|
206
|
+
try {
|
|
207
|
+
return readFileSync(path, "utf8");
|
|
208
|
+
} catch {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function relPath(fileName, cwd) {
|
|
213
|
+
return fileName.startsWith(cwd) ? fileName.slice(cwd.length).replace(/^[/\\]/, "") : fileName;
|
|
214
|
+
}
|
|
215
|
+
async function applyVueImportRewrite(tsconfigPath, cwd, fromAbs, toAbs) {
|
|
216
|
+
const vue = createVueService(tsconfigPath, cwd);
|
|
217
|
+
try {
|
|
218
|
+
const oldUri = URI.file(fromAbs);
|
|
219
|
+
const newUri = URI.file(toAbs);
|
|
220
|
+
const edits = await vue.service.getFileRenameEdits(oldUri, newUri);
|
|
221
|
+
if (!edits) return [];
|
|
222
|
+
return workspaceEditToChanges(edits, vue, cwd, (fileName) => fileName.endsWith(".vue"));
|
|
223
|
+
} finally {
|
|
224
|
+
vue.dispose();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async function vueRegressions(tsconfigPath, cwd, pendingChanges) {
|
|
228
|
+
const vueFiles = listVueFiles(cwd);
|
|
229
|
+
if (!vueFiles.length) return [];
|
|
230
|
+
const vue = createVueService(tsconfigPath, cwd);
|
|
231
|
+
try {
|
|
232
|
+
const baselinePairs = await Promise.all(vueFiles.map(async (file) => [file, await collectDiagKeys(vue, file)]));
|
|
233
|
+
const baseline = new Map(baselinePairs);
|
|
234
|
+
for (const c of pendingChanges) vue.setSnapshot(c.path, c.after);
|
|
235
|
+
const checkSet = [...new Set([...vueFiles, ...pendingChanges.filter((c) => c.path.endsWith(".vue")).map((c) => c.path)])];
|
|
236
|
+
const postPairs = await Promise.all(checkSet.map(async (file) => [file, await getDiags(vue, file)]));
|
|
237
|
+
const out = [];
|
|
238
|
+
for (const [file, post] of postPairs) {
|
|
239
|
+
const before = baseline.get(file) ?? /* @__PURE__ */ new Set();
|
|
240
|
+
for (const d of post) {
|
|
241
|
+
const key = diagKey(d);
|
|
242
|
+
if (before.has(key)) continue;
|
|
243
|
+
if (d.severity !== 1) continue;
|
|
244
|
+
out.push({
|
|
245
|
+
file,
|
|
246
|
+
line: d.range.start.line + 1,
|
|
247
|
+
col: d.range.start.character + 1,
|
|
248
|
+
code: typeof d.code === "number" ? d.code : 0,
|
|
249
|
+
message: typeof d.message === "string" ? d.message : String(d.message)
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
} finally {
|
|
255
|
+
vue.dispose();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async function collectDiagKeys(vue, fileName) {
|
|
259
|
+
const diags = await getDiags(vue, fileName);
|
|
260
|
+
return new Set(diags.map(diagKey));
|
|
261
|
+
}
|
|
262
|
+
async function getDiags(vue, fileName) {
|
|
263
|
+
const uri = URI.file(fileName);
|
|
264
|
+
return await vue.service.getDiagnostics(uri);
|
|
265
|
+
}
|
|
266
|
+
function diagKey(d) {
|
|
267
|
+
return `${d.range.start.line}:${d.range.start.character}:${d.code ?? ""}:${d.message}`;
|
|
268
|
+
}
|
|
269
|
+
function listVueFiles(cwd) {
|
|
270
|
+
return spawnSync("rg", [
|
|
271
|
+
"--files",
|
|
272
|
+
"--hidden",
|
|
273
|
+
"--no-messages",
|
|
274
|
+
"-g",
|
|
275
|
+
"*.vue",
|
|
276
|
+
"."
|
|
277
|
+
], {
|
|
278
|
+
cwd,
|
|
279
|
+
encoding: "utf8"
|
|
280
|
+
}).stdout.split("\n").filter(Boolean).map((p) => resolve(cwd, p));
|
|
281
|
+
}
|
|
282
|
+
const adapter = {
|
|
283
|
+
name: "vue",
|
|
284
|
+
hasFilesContaining: hasVueFilesContaining,
|
|
285
|
+
applyRename: applyVueRename,
|
|
286
|
+
applyImportRewrite: applyVueImportRewrite,
|
|
287
|
+
regressions: vueRegressions,
|
|
288
|
+
extractTemplateExpressions,
|
|
289
|
+
async applyFileRenameEdits(tsconfigPath, cwd, oldAbs, newAbs) {
|
|
290
|
+
const vue = createVueService(tsconfigPath, cwd);
|
|
291
|
+
try {
|
|
292
|
+
const edits = await vue.service.getFileRenameEdits(URI.file(oldAbs), URI.file(newAbs));
|
|
293
|
+
return edits ? workspaceEditToChanges(edits, vue, cwd) : [];
|
|
294
|
+
} finally {
|
|
295
|
+
vue.dispose();
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
autoImportScopes(cwd) {
|
|
299
|
+
if (!isNuxtProject(cwd)) return /* @__PURE__ */ new Set();
|
|
300
|
+
return nuxtAutoImportScopes(cwd);
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
const DEFAULT_NUXT_AUTO_IMPORT_DIRS = [
|
|
304
|
+
"composables",
|
|
305
|
+
"utils",
|
|
306
|
+
"components",
|
|
307
|
+
"server/utils",
|
|
308
|
+
"middleware"
|
|
309
|
+
];
|
|
310
|
+
function isNuxtProject(cwd) {
|
|
311
|
+
if (existsSync(join(cwd, "nuxt.config.ts")) || existsSync(join(cwd, "nuxt.config.js")) || existsSync(join(cwd, ".nuxt"))) return true;
|
|
312
|
+
const pkgPath = join(cwd, "package.json");
|
|
313
|
+
if (!existsSync(pkgPath)) return false;
|
|
314
|
+
try {
|
|
315
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
316
|
+
const deps = {
|
|
317
|
+
...pkg.dependencies,
|
|
318
|
+
...pkg.devDependencies,
|
|
319
|
+
...pkg.peerDependencies
|
|
320
|
+
};
|
|
321
|
+
return Boolean(deps.nuxt || deps["@nuxt/kit"]);
|
|
322
|
+
} catch {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function nuxtAutoImportScopes(cwd) {
|
|
327
|
+
const dirs = new Set(DEFAULT_NUXT_AUTO_IMPORT_DIRS);
|
|
328
|
+
const configPath = [
|
|
329
|
+
"nuxt.config.ts",
|
|
330
|
+
"nuxt.config.js",
|
|
331
|
+
"nuxt.config.mjs",
|
|
332
|
+
"nuxt.config.mts"
|
|
333
|
+
].map((name) => join(cwd, name)).find((path) => existsSync(path));
|
|
334
|
+
if (configPath) try {
|
|
335
|
+
for (const dir of extractConfiguredDirs(readFileSync(configPath, "utf8"))) dirs.add(dir);
|
|
336
|
+
} catch {}
|
|
337
|
+
return new Set([...dirs].map((dir) => resolve(cwd, stripGlob(dir))));
|
|
338
|
+
}
|
|
339
|
+
function extractConfiguredDirs(source) {
|
|
340
|
+
const dirs = [];
|
|
341
|
+
for (const match of source.matchAll(/\bdirs\s*:\s*\[([\s\S]*?)\]/g)) for (const str of match[1].matchAll(/['"`]([^'"`]+)['"`]/g)) dirs.push(str[1]);
|
|
342
|
+
for (const match of source.matchAll(/\bcomponents\s*:\s*\[([\s\S]*?)\]/g)) for (const str of match[1].matchAll(/(?:path\s*:\s*)?['"`]([^'"`]+)['"`]/g)) dirs.push(str[1]);
|
|
343
|
+
return dirs.filter((dir) => !dir.startsWith("#") && !dir.startsWith("~") && !dir.startsWith("@"));
|
|
344
|
+
}
|
|
345
|
+
function stripGlob(dir) {
|
|
346
|
+
return dir.replace(/\/\*\*.*$/, "").replace(/\/\*.*$/, "");
|
|
347
|
+
}
|
|
348
|
+
export { adapter as default };
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ripast/vue",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"description": "Vue (and Nuxt) framework adapter for ripast. Provides Volar/Vue Language Service-backed rename, move, and template rewriting for .vue SFCs.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Harlan Wilton",
|
|
8
|
+
"email": "harlan@harlanzw.com",
|
|
9
|
+
"url": "https://harlanzw.com/"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"homepage": "https://github.com/harlan-zw/ripast#readme",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/harlan-zw/ripast.git",
|
|
16
|
+
"directory": "packages/vue"
|
|
17
|
+
},
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/harlan-zw/ripast/issues"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"ripast",
|
|
23
|
+
"vue",
|
|
24
|
+
"nuxt",
|
|
25
|
+
"volar",
|
|
26
|
+
"ast",
|
|
27
|
+
"refactor"
|
|
28
|
+
],
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.mjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"main": "./dist/index.mjs",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"files": [
|
|
38
|
+
"dist"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20.11"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"typescript": ">=5.4",
|
|
45
|
+
"@ripast/core": "0.0.0"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@volar/language-service": "^2.4.28",
|
|
49
|
+
"@volar/typescript": "^2.4.28",
|
|
50
|
+
"@vue/language-core": "^3.2.8",
|
|
51
|
+
"@vue/language-service": "^3.2.8",
|
|
52
|
+
"volar-service-typescript": "^0.0.71",
|
|
53
|
+
"vscode-languageserver-protocol": "3.17.5",
|
|
54
|
+
"vscode-languageserver-textdocument": "^1.0.12",
|
|
55
|
+
"vscode-uri": "^3.1.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@ripast/core": "0.0.0"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "obuild",
|
|
62
|
+
"dev:prepare": "obuild --stub"
|
|
63
|
+
}
|
|
64
|
+
}
|