@macroforge/mcp-server 0.1.39 → 0.1.42

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.
@@ -3,31 +3,32 @@
3
3
  ## Compile-Time Expansion
4
4
  Unlike runtime solutions that use reflection or proxies, Macroforge expands macros at compile time:
5
5
  1. **Parse**: Your TypeScript code is parsed into an AST using SWC
6
- 2. **Find**: Macroforge finds `@derive` decorators and their associated items
6
+ 2. **Find**: Macroforge finds <code class="shiki-inline"><span class="line"><span style="--shiki-dark:#E1E4E8;--shiki-light:#24292E">@derive</code> decorators and their associated items
7
7
  3. **Expand**: Each macro generates new code based on the class structure
8
8
  4. **Output**: The transformed TypeScript is written out, ready for normal compilation
9
- **Before:**
9
+ <div><div class="flex items-center justify-between gap-2 px-4 py-2 bg-muted rounded-t-lg border border-b-0 border-border">
10
+ **Before:**
10
11
  ```
11
12
  /** @derive(Debug) */
12
- class User {
13
+ class User &#123;
13
14
  name: string;
14
- }
15
- ```
15
+ &#125;
16
+ ``` <div class="flex items-center justify-between gap-2 px-4 py-2 bg-muted rounded-t-lg border border-b-0 border-border">
16
17
  **After:**
17
18
  ```
18
- class User {
19
+ class User &#123;
19
20
  name: string;
20
21
 
21
- static toString(value: User): string {
22
+ static toString(value: User): string &#123;
22
23
  return userToString(value);
23
- }
24
- }
24
+ &#125;
25
+ &#125;
25
26
 
26
- export function userToString(value: User): string {
27
+ export function userToString(value: User): string &#123;
27
28
  const parts: string[] = [];
28
29
  parts.push('name: ' + value.name);
29
- return 'User { ' + parts.join(', ') + ' }';
30
- }
30
+ return 'User &#123; ' + parts.join(', ') + ' &#125;';
31
+ &#125;
31
32
  ``` ## Zero Runtime Overhead
32
33
  Because code generation happens at compile time, there's no:
33
34
  - Runtime reflection or metadata
@@ -3,57 +3,57 @@
3
3
  ## Overview
4
4
  Custom macros are written in Rust and compiled to native Node.js addons. The process involves:
5
5
  1. Creating a Rust crate with NAPI bindings
6
- 2. Defining macro functions with `#[ts_macro_derive]`
7
- 3. Using `macroforge_ts_quote` to generate TypeScript code
6
+ 2. Defining macro functions with <code class="shiki-inline"><span class="line"><span style="--shiki-dark:#E1E4E8;--shiki-light:#24292E">#[ts_macro_derive]</code>
7
+ 3. Using <code class="shiki-inline"><span class="line"><span style="--shiki-dark:#E1E4E8;--shiki-light:#24292E">macroforge_ts_quote</code> to generate TypeScript code
8
8
  4. Building and publishing as an npm package
9
9
  ## Quick Example
10
10
  ```
11
- use macroforge_ts::macros::&#123;ts_macro_derive, body&#125;;
12
- use macroforge_ts::ts_syn::&#123;Data, DeriveInput, MacroforgeError, TsStream, parse_ts_macro_input&#125;;
11
+ use&nbsp;macroforge_ts::macros::&#123;ts_macro_derive,&nbsp;body&#125;;
12
+ use&nbsp;macroforge_ts::ts_syn::&#123;Data,&nbsp;DeriveInput,&nbsp;MacroforgeError,&nbsp;TsStream,&nbsp;parse_ts_macro_input&#125;;
13
13
 
14
14
  #[ts_macro_derive(
15
- JSON,
16
- description = "Generates toJSON() returning a plain object"
15
+ &nbsp;&nbsp;&nbsp;&nbsp;JSON,
16
+ &nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;=&nbsp;"Generates&nbsp;toJSON()&nbsp;returning&nbsp;a&nbsp;plain&nbsp;object"
17
17
  )]
18
- pub fn derive_json(mut input: TsStream) -> Result&#x3C;TsStream, MacroforgeError> &#123;
19
- let input = parse_ts_macro_input!(input as DeriveInput);
18
+ pub&nbsp;fn&nbsp;derive_json(mut&nbsp;input:&nbsp;TsStream)&nbsp;->&nbsp;Result&#x3C;TsStream,&nbsp;MacroforgeError>&nbsp;&#123;
19
+ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;input&nbsp;=&nbsp;parse_ts_macro_input!(input&nbsp;as&nbsp;DeriveInput);
20
20
 
21
- match &#x26;input.data &#123;
22
- Data::Class(class) => &#123;
23
- Ok(body! &#123;
24
- toJSON(): Record&#x3C;string, unknown> &#123;
25
- return &#123;
26
- &#123;#for field in class.field_names()&#125;
27
- @&#123;field&#125;: this.@&#123;field&#125;,
28
- &#123;/for&#125;
29
- &#125;;
30
- &#125;
31
- &#125;)
32
- &#125;
33
- _ => Err(MacroforgeError::new(
34
- input.decorator_span(),
35
- "@derive(JSON) only works on classes",
36
- )),
37
- &#125;
21
+ &nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;&#x26;input.data&nbsp;&#123;
22
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data::Class(class)&nbsp;=>&nbsp;&#123;
23
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ok(body!&nbsp;&#123;
24
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toJSON():&nbsp;Record&#x3C;string,&nbsp;unknown>&nbsp;&#123;
25
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&#123;
26
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;#for&nbsp;field&nbsp;in&nbsp;class.field_names()&#125;
27
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&#123;field&#125;:&nbsp;this.@&#123;field&#125;,
28
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;/for&#125;
29
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;
30
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
31
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;)
32
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
33
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;=>&nbsp;Err(MacroforgeError::new(
34
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input.decorator_span(),
35
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"@derive(JSON)&nbsp;only&nbsp;works&nbsp;on&nbsp;classes",
36
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)),
37
+ &nbsp;&nbsp;&nbsp;&nbsp;&#125;
38
38
  &#125;
39
39
  ``` ## Using Custom Macros
40
40
  Once your macro package is published, users can import and use it:
41
41
  ```
42
- /** import macro &#123; JSON &#125; from "@my/macros"; */
42
+ /**&nbsp;import&nbsp;macro&nbsp;&#123;&nbsp;JSON&nbsp;&#125;&nbsp;from&nbsp;"@my/macros";&nbsp;*/
43
43
 
44
- /** @derive(JSON) */
45
- class User &#123;
46
- name: string;
47
- age: number;
44
+ /**&nbsp;@derive(JSON)&nbsp;*/
45
+ class&nbsp;User&nbsp;&#123;
46
+ &nbsp;&nbsp;name:&nbsp;string;
47
+ &nbsp;&nbsp;age:&nbsp;number;
48
48
 
49
- constructor(name: string, age: number) &#123;
50
- this.name = name;
51
- this.age = age;
52
- &#125;
49
+ &nbsp;&nbsp;constructor(name:&nbsp;string,&nbsp;age:&nbsp;number)&nbsp;&#123;
50
+ &nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;
51
+ &nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age;
52
+ &nbsp;&nbsp;&#125;
53
53
  &#125;
54
54
 
55
- const user = new User("Alice", 30);
56
- console.log(user.toJSON()); // &#123; name: "Alice", age: 30 &#125;
55
+ const&nbsp;user&nbsp;=&nbsp;new&nbsp;User("Alice",&nbsp;30);
56
+ console.log(user.toJSON());&nbsp;//&nbsp;&#123;&nbsp;name:&nbsp;"Alice",&nbsp;age:&nbsp;30&nbsp;&#125;
57
57
  ``` > **Note:** The import macro comment tells Macroforge which package provides the macro. ## Getting Started
58
58
  Follow these guides to create your own macros:
59
59
  - [Set up a Rust macro crate](../docs/custom-macros/rust-setup)
@@ -3,109 +3,109 @@
3
3
  ## Prerequisites
4
4
  - Rust toolchain (1.88 or later)
5
5
  - Node.js 24 or later
6
- - NAPI-RS CLI: `cargo install macroforge_ts`
6
+ - NAPI-RS CLI: <code class="shiki-inline"><span class="line"><span style="--shiki-dark:#B392F0;--shiki-light:#6F42C1">cargo<span style="--shiki-dark:#9ECBFF;--shiki-light:#032F62"> install<span style="--shiki-dark:#9ECBFF;--shiki-light:#032F62"> macroforge_ts</code>
7
7
  ## Create the Project
8
8
  ```
9
- # Create a new directory
10
- mkdir my-macros
11
- cd my-macros
9
+ #&nbsp;Create&nbsp;a&nbsp;new&nbsp;directory
10
+ mkdir&nbsp;my-macros
11
+ cd&nbsp;my-macros
12
12
 
13
- # Initialize with NAPI-RS
14
- napi new --platform --name my-macros
13
+ #&nbsp;Initialize&nbsp;with&nbsp;NAPI-RS
14
+ napi&nbsp;new&nbsp;--platform&nbsp;--name&nbsp;my-macros
15
15
  ``` ## Configure Cargo.toml
16
- Update your `Cargo.toml` with the required dependencies:
16
+ Update your <code class="shiki-inline"><span class="line"><span style="--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic">Cargo.toml</code> with the required dependencies:
17
17
  ```
18
18
  [package]
19
- name = "my-macros"
20
- version = "0.1.0"
21
- edition = "2024"
19
+ name&nbsp;=&nbsp;"my-macros"
20
+ version&nbsp;=&nbsp;"0.1.0"
21
+ edition&nbsp;=&nbsp;"2024"
22
22
 
23
23
  [lib]
24
- crate-type = ["cdylib"]
24
+ crate-type&nbsp;=&nbsp;["cdylib"]
25
25
 
26
26
  [dependencies]
27
- macroforge_ts = "0.1"
28
- napi = &#123; version = "3", features = ["napi8", "compat-mode"] &#125;
29
- napi-derive = "3"
27
+ macroforge_ts&nbsp;=&nbsp;"0.1"
28
+ napi&nbsp;=&nbsp;&#123;&nbsp;version&nbsp;=&nbsp;"3",&nbsp;features&nbsp;=&nbsp;["napi8",&nbsp;"compat-mode"]&nbsp;&#125;
29
+ napi-derive&nbsp;=&nbsp;"3"
30
30
 
31
31
  [build-dependencies]
32
- napi-build = "2"
32
+ napi-build&nbsp;=&nbsp;"2"
33
33
 
34
34
  [profile.release]
35
- lto = true
36
- strip = true
35
+ lto&nbsp;=&nbsp;true
36
+ strip&nbsp;=&nbsp;true
37
37
  ``` ## Create build.rs
38
38
  ```
39
- fn main() &#123;
40
- napi_build::setup();
39
+ fn&nbsp;main()&nbsp;&#123;
40
+ &nbsp;&nbsp;&nbsp;&nbsp;napi_build::setup();
41
41
  &#125;
42
42
  ``` ## Create src/lib.rs
43
43
  ```
44
- use macroforge_ts::macros::&#123;ts_macro_derive, body&#125;;
45
- use macroforge_ts::ts_syn::&#123;
46
- Data, DeriveInput, MacroforgeError, TsStream, parse_ts_macro_input,
44
+ use&nbsp;macroforge_ts::macros::&#123;ts_macro_derive,&nbsp;body&#125;;
45
+ use&nbsp;macroforge_ts::ts_syn::&#123;
46
+ &nbsp;&nbsp;&nbsp;&nbsp;Data,&nbsp;DeriveInput,&nbsp;MacroforgeError,&nbsp;TsStream,&nbsp;parse_ts_macro_input,
47
47
  &#125;;
48
48
 
49
49
  #[ts_macro_derive(
50
- JSON,
51
- description = "Generates toJSON() returning a plain object"
50
+ &nbsp;&nbsp;&nbsp;&nbsp;JSON,
51
+ &nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;=&nbsp;"Generates&nbsp;toJSON()&nbsp;returning&nbsp;a&nbsp;plain&nbsp;object"
52
52
  )]
53
- pub fn derive_json(mut input: TsStream) -> Result&#x3C;TsStream, MacroforgeError> &#123;
54
- let input = parse_ts_macro_input!(input as DeriveInput);
53
+ pub&nbsp;fn&nbsp;derive_json(mut&nbsp;input:&nbsp;TsStream)&nbsp;->&nbsp;Result&#x3C;TsStream,&nbsp;MacroforgeError>&nbsp;&#123;
54
+ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;input&nbsp;=&nbsp;parse_ts_macro_input!(input&nbsp;as&nbsp;DeriveInput);
55
55
 
56
- match &#x26;input.data &#123;
57
- Data::Class(class) => &#123;
58
- Ok(body! &#123;
59
- toJSON(): Record&#x3C;string, unknown> &#123;
60
- return &#123;
61
- &#123;#for field in class.field_names()&#125;
62
- @&#123;field&#125;: this.@&#123;field&#125;,
63
- &#123;/for&#125;
64
- &#125;;
65
- &#125;
66
- &#125;)
67
- &#125;
68
- _ => Err(MacroforgeError::new(
69
- input.decorator_span(),
70
- "@derive(JSON) only works on classes",
71
- )),
72
- &#125;
56
+ &nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;&#x26;input.data&nbsp;&#123;
57
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data::Class(class)&nbsp;=>&nbsp;&#123;
58
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ok(body!&nbsp;&#123;
59
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toJSON():&nbsp;Record&#x3C;string,&nbsp;unknown>&nbsp;&#123;
60
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&#123;
61
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;#for&nbsp;field&nbsp;in&nbsp;class.field_names()&#125;
62
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&#123;field&#125;:&nbsp;this.@&#123;field&#125;,
63
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;/for&#125;
64
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;
65
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
66
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;)
67
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
68
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;=>&nbsp;Err(MacroforgeError::new(
69
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input.decorator_span(),
70
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"@derive(JSON)&nbsp;only&nbsp;works&nbsp;on&nbsp;classes",
71
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)),
72
+ &nbsp;&nbsp;&nbsp;&nbsp;&#125;
73
73
  &#125;
74
74
  ``` ## Create package.json
75
75
  ```
76
76
  &#123;
77
- "name": "@my-org/macros",
78
- "version": "0.1.0",
79
- "main": "index.js",
80
- "types": "index.d.ts",
81
- "napi": &#123;
82
- "name": "my-macros",
83
- "triples": &#123;
84
- "defaults": true
85
- &#125;
86
- &#125;,
87
- "files": [
88
- "index.js",
89
- "index.d.ts",
90
- "*.node"
91
- ],
92
- "scripts": &#123;
93
- "build": "napi build --release",
94
- "prepublishOnly": "napi build --release"
95
- &#125;,
96
- "devDependencies": &#123;
97
- "@napi-rs/cli": "^3.0.0-alpha.0"
98
- &#125;
77
+ &nbsp;&nbsp;"name":&nbsp;"@my-org/macros",
78
+ &nbsp;&nbsp;"version":&nbsp;"0.1.0",
79
+ &nbsp;&nbsp;"main":&nbsp;"index.js",
80
+ &nbsp;&nbsp;"types":&nbsp;"index.d.ts",
81
+ &nbsp;&nbsp;"napi":&nbsp;&#123;
82
+ &nbsp;&nbsp;&nbsp;&nbsp;"name":&nbsp;"my-macros",
83
+ &nbsp;&nbsp;&nbsp;&nbsp;"triples":&nbsp;&#123;
84
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"defaults":&nbsp;true
85
+ &nbsp;&nbsp;&nbsp;&nbsp;&#125;
86
+ &nbsp;&nbsp;&#125;,
87
+ &nbsp;&nbsp;"files":&nbsp;[
88
+ &nbsp;&nbsp;&nbsp;&nbsp;"index.js",
89
+ &nbsp;&nbsp;&nbsp;&nbsp;"index.d.ts",
90
+ &nbsp;&nbsp;&nbsp;&nbsp;"*.node"
91
+ &nbsp;&nbsp;],
92
+ &nbsp;&nbsp;"scripts":&nbsp;&#123;
93
+ &nbsp;&nbsp;&nbsp;&nbsp;"build":&nbsp;"napi&nbsp;build&nbsp;--release",
94
+ &nbsp;&nbsp;&nbsp;&nbsp;"prepublishOnly":&nbsp;"napi&nbsp;build&nbsp;--release"
95
+ &nbsp;&nbsp;&#125;,
96
+ &nbsp;&nbsp;"devDependencies":&nbsp;&#123;
97
+ &nbsp;&nbsp;&nbsp;&nbsp;"@napi-rs/cli":&nbsp;"^3.0.0-alpha.0"
98
+ &nbsp;&nbsp;&#125;
99
99
  &#125;
100
100
  ``` ## Build the Package
101
101
  ```
102
- # Build the native addon
103
- npm run build
102
+ #&nbsp;Build&nbsp;the&nbsp;native&nbsp;addon
103
+ npm&nbsp;run&nbsp;build
104
104
 
105
- # This creates:
106
- # - index.js (JavaScript bindings)
107
- # - index.d.ts (TypeScript types)
108
- # - *.node (native binary)
105
+ #&nbsp;This&nbsp;creates:
106
+ #&nbsp;-&nbsp;index.js&nbsp;(JavaScript&nbsp;bindings)
107
+ #&nbsp;-&nbsp;index.d.ts&nbsp;(TypeScript&nbsp;types)
108
+ #&nbsp;-&nbsp;*.node&nbsp;(native&nbsp;binary)
109
109
  ``` **Tip For cross-platform builds, use GitHub Actions with the NAPI-RS CI template. ## Next Steps
110
110
  - [Learn the #[ts_macro_derive] attribute](../../docs/custom-macros/ts-macro-derive)
111
111
  - [Master the template syntax](../../docs/custom-macros/ts-quote)