@borrowdev/docval 0.1.0 → 0.1.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.
|
@@ -5,7 +5,7 @@ import { ADAPTER_OPTIONS } from "./constants.mjs";
|
|
|
5
5
|
|
|
6
6
|
//#region src/adapters/rust/index.ts
|
|
7
7
|
async function adapterRust(code, options) {
|
|
8
|
-
const environmentPath = await createEnvironment(code, getImports(code), { environmentPath: options.environment });
|
|
8
|
+
const environmentPath = await createEnvironment(code, await getImports(code), { environmentPath: options.environment });
|
|
9
9
|
try {
|
|
10
10
|
await execUntilExit("cargo run", environmentPath);
|
|
11
11
|
} finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/adapters/rust/index.ts"],"sourcesContent":["import { getOptions } from \"@/remark/utils\";\nimport { createEnvironment, getImports } from \"./utils\";\nimport { ADAPTER_OPTIONS } from \"./constants\";\nimport { cleanupEnvironment, execUntilExit } from \"@/utils\";\n\ntype AdapterOptions = {\n environment?: string;\n};\n\nasync function adapterRust(code: string, options: AdapterOptions): Promise<void> {\n const imports = getImports(code);\n const environmentPath = await createEnvironment(code, imports, {\n environmentPath: options.environment,\n });\n\n try {\n await execUntilExit(\"cargo run\", environmentPath);\n } finally {\n if (!options.environment) {\n await cleanupEnvironment(environmentPath);\n }\n }\n}\n\nexport default (code: string, metadata: string[]) =>\n adapterRust(code, getOptions(metadata, ADAPTER_OPTIONS));\n"],"mappings":";;;;;;AASA,eAAe,YAAY,MAAc,SAAwC;CAE/E,MAAM,kBAAkB,MAAM,kBAAkB,MADhC,WAAW,KAAK,
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/adapters/rust/index.ts"],"sourcesContent":["import { getOptions } from \"@/remark/utils\";\nimport { createEnvironment, getImports } from \"./utils\";\nimport { ADAPTER_OPTIONS } from \"./constants\";\nimport { cleanupEnvironment, execUntilExit } from \"@/utils\";\n\ntype AdapterOptions = {\n environment?: string;\n};\n\nasync function adapterRust(code: string, options: AdapterOptions): Promise<void> {\n const imports = await getImports(code);\n const environmentPath = await createEnvironment(code, imports, {\n environmentPath: options.environment,\n });\n\n try {\n await execUntilExit(\"cargo run\", environmentPath);\n } finally {\n if (!options.environment) {\n await cleanupEnvironment(environmentPath);\n }\n }\n}\n\nexport default (code: string, metadata: string[]) =>\n adapterRust(code, getOptions(metadata, ADAPTER_OPTIONS));\n"],"mappings":";;;;;;AASA,eAAe,YAAY,MAAc,SAAwC;CAE/E,MAAM,kBAAkB,MAAM,kBAAkB,MADhC,MAAM,WAAW,KAAK,EACyB,EAC7D,iBAAiB,QAAQ,aAC1B,CAAC;AAEF,KAAI;AACF,QAAM,cAAc,aAAa,gBAAgB;WACzC;AACR,MAAI,CAAC,QAAQ,YACX,OAAM,mBAAmB,gBAAgB;;;AAK/C,oBAAgB,MAAc,aAC5B,YAAY,MAAM,WAAW,UAAU,gBAAgB,CAAC"}
|
|
@@ -3,10 +3,19 @@ import { randomUUID } from "crypto";
|
|
|
3
3
|
import { tmpdir } from "os";
|
|
4
4
|
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
5
5
|
import { join } from "path";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
6
|
+
import { createRequire } from "module";
|
|
7
|
+
import { Language, Parser } from "web-tree-sitter";
|
|
8
8
|
|
|
9
9
|
//#region src/adapters/rust/utils.ts
|
|
10
|
+
const RUST_WASM_PATH = createRequire(import.meta.url).resolve("tree-sitter-rust/tree-sitter-rust.wasm");
|
|
11
|
+
let rustLanguage;
|
|
12
|
+
async function getRustLanguage() {
|
|
13
|
+
if (!rustLanguage) {
|
|
14
|
+
await Parser.init();
|
|
15
|
+
rustLanguage = await Language.load(RUST_WASM_PATH);
|
|
16
|
+
}
|
|
17
|
+
return rustLanguage;
|
|
18
|
+
}
|
|
10
19
|
const BUILTIN_CRATES = new Set([
|
|
11
20
|
"std",
|
|
12
21
|
"core",
|
|
@@ -18,9 +27,10 @@ const ERROR_CRATES = new Set([
|
|
|
18
27
|
"super",
|
|
19
28
|
"self"
|
|
20
29
|
]);
|
|
21
|
-
function getImports(code) {
|
|
30
|
+
async function getImports(code) {
|
|
31
|
+
const language = await getRustLanguage();
|
|
22
32
|
const parser = new Parser();
|
|
23
|
-
parser.setLanguage(
|
|
33
|
+
parser.setLanguage(language);
|
|
24
34
|
const tree = parser.parse(code);
|
|
25
35
|
const imports = [];
|
|
26
36
|
for (const node of tree.rootNode.children) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/adapters/rust/utils.ts"],"sourcesContent":["import Parser from \"tree-sitter\";\nimport
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/adapters/rust/utils.ts"],"sourcesContent":["import { Language, Parser } from \"web-tree-sitter\";\nimport { createRequire } from \"module\";\nimport { tmpdir } from \"os\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { execUntilExit, logger } from \"@/utils\";\n\nconst require = createRequire(import.meta.url);\nconst RUST_WASM_PATH = require.resolve(\"tree-sitter-rust/tree-sitter-rust.wasm\");\n\nlet rustLanguage: Language | undefined;\n\nasync function getRustLanguage(): Promise<Language> {\n if (!rustLanguage) {\n await Parser.init();\n rustLanguage = await Language.load(RUST_WASM_PATH);\n }\n return rustLanguage!;\n}\n\nconst BUILTIN_CRATES = new Set([\"std\", \"core\", \"alloc\", \"crate\"]);\nconst ERROR_CRATES = new Set([\"crate\", \"super\", \"self\"]);\n\ntype Import = {\n isExternal: boolean;\n package: string;\n};\n\nasync function getImports(code: string): Promise<Import[]> {\n const language = await getRustLanguage();\n const parser = new Parser();\n parser.setLanguage(language);\n const tree = parser.parse(code);\n const imports: Import[] = [];\n\n for (const node of tree!.rootNode.children) {\n let crateName: string | undefined;\n\n if (node.type === \"use_declaration\") {\n const arg = node.child(1);\n if (!arg) continue;\n if (arg.type === \"identifier\" || arg.type === \"scoped_identifier\") {\n crateName = arg.text.split(\"::\")[0];\n }\n }\n\n if (crateName) {\n if (ERROR_CRATES.has(crateName)) {\n throw new Error(\n `Unsupported import of \"${crateName}\". ` +\n `Imports of ${Array.from(ERROR_CRATES)\n .map((c) => `\"${c}\"`)\n .join(\", \")} are not supported.`,\n );\n }\n\n imports.push({\n package: crateName,\n isExternal: !BUILTIN_CRATES.has(crateName),\n });\n }\n }\n\n return imports;\n}\n\ntype EnvironmentOptions = {\n environmentPath?: string;\n};\n\nfunction getEntryPath(environmentPath: string) {\n return `${environmentPath}/src/main.rs`;\n}\n\nasync function createEnvironment(\n code: string,\n imports: Import[],\n options: EnvironmentOptions = {},\n) {\n logger.info(\n \"Creating Rust environment with crates\",\n imports.map((i) => i.package),\n );\n\n if (options.environmentPath) {\n logger.info(\"Using explicit environment at\", options.environmentPath);\n await mkdir(`${options.environmentPath}/src`, { recursive: true });\n await writeFile(getEntryPath(options.environmentPath), code);\n return options.environmentPath;\n }\n\n const manifest = await readFile(new URL(\"../../../assets/Cargo.toml\", import.meta.url), \"utf-8\");\n const path = join(tmpdir(), \"docval\", randomUUID());\n await mkdir(`${path}/src`, { recursive: true });\n await Promise.all([\n writeFile(`${path}/Cargo.toml`, manifest),\n writeFile(`${path}/src/main.rs`, code),\n ]);\n if (imports.length > 0) {\n const crates = imports.filter((i) => i.isExternal).map((i) => i.package);\n logger.info(\"Installing crates\", crates);\n await execUntilExit(`cargo add ${crates.join(\" \")}`, path);\n }\n logger.info(\"Created Rust environment at\", path);\n return path;\n}\n\nexport { getImports, createEnvironment, getEntryPath };\nexport type { Import };\n"],"mappings":";;;;;;;;;AASA,MAAM,iBADU,cAAc,OAAO,KAAK,IAAI,CACf,QAAQ,yCAAyC;AAEhF,IAAI;AAEJ,eAAe,kBAAqC;AAClD,KAAI,CAAC,cAAc;AACjB,QAAM,OAAO,MAAM;AACnB,iBAAe,MAAM,SAAS,KAAK,eAAe;;AAEpD,QAAO;;AAGT,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAO;CAAQ;CAAS;CAAQ,CAAC;AACjE,MAAM,eAAe,IAAI,IAAI;CAAC;CAAS;CAAS;CAAO,CAAC;AAOxD,eAAe,WAAW,MAAiC;CACzD,MAAM,WAAW,MAAM,iBAAiB;CACxC,MAAM,SAAS,IAAI,QAAQ;AAC3B,QAAO,YAAY,SAAS;CAC5B,MAAM,OAAO,OAAO,MAAM,KAAK;CAC/B,MAAM,UAAoB,EAAE;AAE5B,MAAK,MAAM,QAAQ,KAAM,SAAS,UAAU;EAC1C,IAAI;AAEJ,MAAI,KAAK,SAAS,mBAAmB;GACnC,MAAM,MAAM,KAAK,MAAM,EAAE;AACzB,OAAI,CAAC,IAAK;AACV,OAAI,IAAI,SAAS,gBAAgB,IAAI,SAAS,oBAC5C,aAAY,IAAI,KAAK,MAAM,KAAK,CAAC;;AAIrC,MAAI,WAAW;AACb,OAAI,aAAa,IAAI,UAAU,CAC7B,OAAM,IAAI,MACR,0BAA0B,UAAU,gBACpB,MAAM,KAAK,aAAa,CACnC,KAAK,MAAM,IAAI,EAAE,GAAG,CACpB,KAAK,KAAK,CAAC,qBACjB;AAGH,WAAQ,KAAK;IACX,SAAS;IACT,YAAY,CAAC,eAAe,IAAI,UAAU;IAC3C,CAAC;;;AAIN,QAAO;;AAOT,SAAS,aAAa,iBAAyB;AAC7C,QAAO,GAAG,gBAAgB;;AAG5B,eAAe,kBACb,MACA,SACA,UAA8B,EAAE,EAChC;AACA,QAAO,KACL,yCACA,QAAQ,KAAK,MAAM,EAAE,QAAQ,CAC9B;AAED,KAAI,QAAQ,iBAAiB;AAC3B,SAAO,KAAK,iCAAiC,QAAQ,gBAAgB;AACrE,QAAM,MAAM,GAAG,QAAQ,gBAAgB,OAAO,EAAE,WAAW,MAAM,CAAC;AAClE,QAAM,UAAU,aAAa,QAAQ,gBAAgB,EAAE,KAAK;AAC5D,SAAO,QAAQ;;CAGjB,MAAM,WAAW,MAAM,SAAS,IAAI,IAAI,8BAA8B,OAAO,KAAK,IAAI,EAAE,QAAQ;CAChG,MAAM,OAAO,KAAK,QAAQ,EAAE,UAAU,YAAY,CAAC;AACnD,OAAM,MAAM,GAAG,KAAK,OAAO,EAAE,WAAW,MAAM,CAAC;AAC/C,OAAM,QAAQ,IAAI,CAChB,UAAU,GAAG,KAAK,cAAc,SAAS,EACzC,UAAU,GAAG,KAAK,eAAe,KAAK,CACvC,CAAC;AACF,KAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,SAAS,QAAQ,QAAQ,MAAM,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,QAAQ;AACxE,SAAO,KAAK,qBAAqB,OAAO;AACxC,QAAM,cAAc,aAAa,OAAO,KAAK,IAAI,IAAI,KAAK;;AAE5D,QAAO,KAAK,+BAA+B,KAAK;AAChD,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@borrowdev/docval",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Validate your documentation codeblocks at build-time",
|
|
5
5
|
"homepage": "https://borrow.dev",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"consola": "^3.4.2",
|
|
27
27
|
"oxc-parser": "^0.123.0",
|
|
28
|
-
"tree-sitter": "^0.25.0",
|
|
29
28
|
"tree-sitter-rust": "^0.24.0",
|
|
30
|
-
"typescript": "~6.0.2"
|
|
29
|
+
"typescript": "~6.0.2",
|
|
30
|
+
"web-tree-sitter": "^0.26.8"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/mdast": "^4.0.4",
|