langmail 0.1.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/index.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ /** Preprocessed email output optimized for LLM consumption. */
7
+ export interface EmailOutput {
8
+ /** The cleaned email body text, with quotes and signature removed. */
9
+ body: string
10
+ /** Email subject line. */
11
+ subject?: string
12
+ /** Sender address. */
13
+ from?: NapiAddress
14
+ /** Recipient addresses. */
15
+ to: Array<NapiAddress>
16
+ /** CC addresses. */
17
+ cc: Array<NapiAddress>
18
+ /** Date as ISO 8601 string. */
19
+ date?: string
20
+ /** Message-ID header value. */
21
+ messageId?: string
22
+ /** In-Reply-To header values (for threading). */
23
+ inReplyTo?: Array<string>
24
+ /** References header values (for threading). */
25
+ references?: Array<string>
26
+ /** Extracted signature, if found. */
27
+ signature?: string
28
+ /** Length of the original body before cleaning. */
29
+ rawBodyLength: number
30
+ /** Length of the cleaned body. */
31
+ cleanBodyLength: number
32
+ }
33
+ /** An email address with optional display name. */
34
+ export interface NapiAddress {
35
+ /** Display name (e.g. "Alice"). */
36
+ name?: string
37
+ /** Email address (e.g. "alice@example.com"). */
38
+ email: string
39
+ }
40
+ /** Options for customizing preprocessing behavior. */
41
+ export interface PreprocessOptions {
42
+ /** Whether to strip quoted reply content. Default: true. */
43
+ stripQuotes?: boolean
44
+ /** Whether to strip email signatures. Default: true. */
45
+ stripSignature?: boolean
46
+ /** Maximum body length in characters. 0 = no limit. Default: 0. */
47
+ maxBodyLength?: number
48
+ }
49
+ /**
50
+ * Preprocess a raw email into an LLM-ready structure.
51
+ *
52
+ * Accepts raw email bytes (RFC 5322 / EML format) and returns a structured
53
+ * object with clean body text and metadata.
54
+ *
55
+ * @param raw - Raw email as a Buffer or Uint8Array
56
+ * @returns Preprocessed email output
57
+ */
58
+ export declare function preprocess(raw: Buffer): EmailOutput
59
+ /**
60
+ * Preprocess a raw email with custom options.
61
+ *
62
+ * @param raw - Raw email as a Buffer or Uint8Array
63
+ * @param options - Preprocessing options
64
+ * @returns Preprocessed email output
65
+ */
66
+ export declare function preprocessWithOptions(raw: Buffer, options: PreprocessOptions): EmailOutput
67
+ /**
68
+ * Preprocess a raw email string (convenience wrapper).
69
+ *
70
+ * Same as `preprocess` but accepts a string instead of a Buffer.
71
+ *
72
+ * @param raw - Raw email as a string
73
+ * @returns Preprocessed email output
74
+ */
75
+ export declare function preprocessString(raw: string): EmailOutput
package/index.js ADDED
@@ -0,0 +1,317 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /* prettier-ignore */
4
+
5
+ /* auto-generated by NAPI-RS */
6
+
7
+ const { existsSync, readFileSync } = require('fs')
8
+ const { join } = require('path')
9
+
10
+ const { platform, arch } = process
11
+
12
+ let nativeBinding = null
13
+ let localFileExisted = false
14
+ let loadError = null
15
+
16
+ function isMusl() {
17
+ // For Node 10
18
+ if (!process.report || typeof process.report.getReport !== 'function') {
19
+ try {
20
+ const lddPath = require('child_process').execSync('which ldd').toString().trim()
21
+ return readFileSync(lddPath, 'utf8').includes('musl')
22
+ } catch (e) {
23
+ return true
24
+ }
25
+ } else {
26
+ const { glibcVersionRuntime } = process.report.getReport().header
27
+ return !glibcVersionRuntime
28
+ }
29
+ }
30
+
31
+ switch (platform) {
32
+ case 'android':
33
+ switch (arch) {
34
+ case 'arm64':
35
+ localFileExisted = existsSync(join(__dirname, 'langmail.android-arm64.node'))
36
+ try {
37
+ if (localFileExisted) {
38
+ nativeBinding = require('./langmail.android-arm64.node')
39
+ } else {
40
+ nativeBinding = require('@langmail/langmail-android-arm64')
41
+ }
42
+ } catch (e) {
43
+ loadError = e
44
+ }
45
+ break
46
+ case 'arm':
47
+ localFileExisted = existsSync(join(__dirname, 'langmail.android-arm-eabi.node'))
48
+ try {
49
+ if (localFileExisted) {
50
+ nativeBinding = require('./langmail.android-arm-eabi.node')
51
+ } else {
52
+ nativeBinding = require('@langmail/langmail-android-arm-eabi')
53
+ }
54
+ } catch (e) {
55
+ loadError = e
56
+ }
57
+ break
58
+ default:
59
+ throw new Error(`Unsupported architecture on Android ${arch}`)
60
+ }
61
+ break
62
+ case 'win32':
63
+ switch (arch) {
64
+ case 'x64':
65
+ localFileExisted = existsSync(
66
+ join(__dirname, 'langmail.win32-x64-msvc.node')
67
+ )
68
+ try {
69
+ if (localFileExisted) {
70
+ nativeBinding = require('./langmail.win32-x64-msvc.node')
71
+ } else {
72
+ nativeBinding = require('@langmail/langmail-win32-x64-msvc')
73
+ }
74
+ } catch (e) {
75
+ loadError = e
76
+ }
77
+ break
78
+ case 'ia32':
79
+ localFileExisted = existsSync(
80
+ join(__dirname, 'langmail.win32-ia32-msvc.node')
81
+ )
82
+ try {
83
+ if (localFileExisted) {
84
+ nativeBinding = require('./langmail.win32-ia32-msvc.node')
85
+ } else {
86
+ nativeBinding = require('@langmail/langmail-win32-ia32-msvc')
87
+ }
88
+ } catch (e) {
89
+ loadError = e
90
+ }
91
+ break
92
+ case 'arm64':
93
+ localFileExisted = existsSync(
94
+ join(__dirname, 'langmail.win32-arm64-msvc.node')
95
+ )
96
+ try {
97
+ if (localFileExisted) {
98
+ nativeBinding = require('./langmail.win32-arm64-msvc.node')
99
+ } else {
100
+ nativeBinding = require('@langmail/langmail-win32-arm64-msvc')
101
+ }
102
+ } catch (e) {
103
+ loadError = e
104
+ }
105
+ break
106
+ default:
107
+ throw new Error(`Unsupported architecture on Windows: ${arch}`)
108
+ }
109
+ break
110
+ case 'darwin':
111
+ localFileExisted = existsSync(join(__dirname, 'langmail.darwin-universal.node'))
112
+ try {
113
+ if (localFileExisted) {
114
+ nativeBinding = require('./langmail.darwin-universal.node')
115
+ } else {
116
+ nativeBinding = require('langmail-darwin-universal')
117
+ }
118
+ break
119
+ } catch {}
120
+ switch (arch) {
121
+ case 'x64':
122
+ localFileExisted = existsSync(join(__dirname, 'langmail.darwin-x64.node'))
123
+ try {
124
+ if (localFileExisted) {
125
+ nativeBinding = require('./langmail.darwin-x64.node')
126
+ } else {
127
+ nativeBinding = require('@langmail/langmail-darwin-x64')
128
+ }
129
+ } catch (e) {
130
+ loadError = e
131
+ }
132
+ break
133
+ case 'arm64':
134
+ localFileExisted = existsSync(
135
+ join(__dirname, 'langmail.darwin-arm64.node')
136
+ )
137
+ try {
138
+ if (localFileExisted) {
139
+ nativeBinding = require('./langmail.darwin-arm64.node')
140
+ } else {
141
+ nativeBinding = require('@langmail/langmail-darwin-arm64')
142
+ }
143
+ } catch (e) {
144
+ loadError = e
145
+ }
146
+ break
147
+ default:
148
+ throw new Error(`Unsupported architecture on macOS: ${arch}`)
149
+ }
150
+ break
151
+ case 'freebsd':
152
+ if (arch !== 'x64') {
153
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
154
+ }
155
+ localFileExisted = existsSync(join(__dirname, 'langmail.freebsd-x64.node'))
156
+ try {
157
+ if (localFileExisted) {
158
+ nativeBinding = require('./langmail.freebsd-x64.node')
159
+ } else {
160
+ nativeBinding = require('langmail-freebsd-x64')
161
+ }
162
+ } catch (e) {
163
+ loadError = e
164
+ }
165
+ break
166
+ case 'linux':
167
+ switch (arch) {
168
+ case 'x64':
169
+ if (isMusl()) {
170
+ localFileExisted = existsSync(
171
+ join(__dirname, 'langmail.linux-x64-musl.node')
172
+ )
173
+ try {
174
+ if (localFileExisted) {
175
+ nativeBinding = require('./langmail.linux-x64-musl.node')
176
+ } else {
177
+ nativeBinding = require('@langmail/langmail-linux-x64-musl')
178
+ }
179
+ } catch (e) {
180
+ loadError = e
181
+ }
182
+ } else {
183
+ localFileExisted = existsSync(
184
+ join(__dirname, 'langmail.linux-x64-gnu.node')
185
+ )
186
+ try {
187
+ if (localFileExisted) {
188
+ nativeBinding = require('./langmail.linux-x64-gnu.node')
189
+ } else {
190
+ nativeBinding = require('@langmail/langmail-linux-x64-gnu')
191
+ }
192
+ } catch (e) {
193
+ loadError = e
194
+ }
195
+ }
196
+ break
197
+ case 'arm64':
198
+ if (isMusl()) {
199
+ localFileExisted = existsSync(
200
+ join(__dirname, 'langmail.linux-arm64-musl.node')
201
+ )
202
+ try {
203
+ if (localFileExisted) {
204
+ nativeBinding = require('./langmail.linux-arm64-musl.node')
205
+ } else {
206
+ nativeBinding = require('@langmail/langmail-linux-arm64-musl')
207
+ }
208
+ } catch (e) {
209
+ loadError = e
210
+ }
211
+ } else {
212
+ localFileExisted = existsSync(
213
+ join(__dirname, 'langmail.linux-arm64-gnu.node')
214
+ )
215
+ try {
216
+ if (localFileExisted) {
217
+ nativeBinding = require('./langmail.linux-arm64-gnu.node')
218
+ } else {
219
+ nativeBinding = require('@langmail/langmail-linux-arm64-gnu')
220
+ }
221
+ } catch (e) {
222
+ loadError = e
223
+ }
224
+ }
225
+ break
226
+ case 'arm':
227
+ if (isMusl()) {
228
+ localFileExisted = existsSync(
229
+ join(__dirname, 'langmail.linux-arm-musleabihf.node')
230
+ )
231
+ try {
232
+ if (localFileExisted) {
233
+ nativeBinding = require('./langmail.linux-arm-musleabihf.node')
234
+ } else {
235
+ nativeBinding = require('@langmail/langmail-linux-arm-musleabihf')
236
+ }
237
+ } catch (e) {
238
+ loadError = e
239
+ }
240
+ } else {
241
+ localFileExisted = existsSync(
242
+ join(__dirname, 'langmail.linux-arm-gnueabihf.node')
243
+ )
244
+ try {
245
+ if (localFileExisted) {
246
+ nativeBinding = require('./langmail.linux-arm-gnueabihf.node')
247
+ } else {
248
+ nativeBinding = require('@langmail/langmail-linux-arm-gnueabihf')
249
+ }
250
+ } catch (e) {
251
+ loadError = e
252
+ }
253
+ }
254
+ break
255
+ case 'riscv64':
256
+ if (isMusl()) {
257
+ localFileExisted = existsSync(
258
+ join(__dirname, 'langmail.linux-riscv64-musl.node')
259
+ )
260
+ try {
261
+ if (localFileExisted) {
262
+ nativeBinding = require('./langmail.linux-riscv64-musl.node')
263
+ } else {
264
+ nativeBinding = require('@langmail/langmail-linux-riscv64-musl')
265
+ }
266
+ } catch (e) {
267
+ loadError = e
268
+ }
269
+ } else {
270
+ localFileExisted = existsSync(
271
+ join(__dirname, 'langmail.linux-riscv64-gnu.node')
272
+ )
273
+ try {
274
+ if (localFileExisted) {
275
+ nativeBinding = require('./langmail.linux-riscv64-gnu.node')
276
+ } else {
277
+ nativeBinding = require('@langmail/langmail-linux-riscv64-gnu')
278
+ }
279
+ } catch (e) {
280
+ loadError = e
281
+ }
282
+ }
283
+ break
284
+ case 's390x':
285
+ localFileExisted = existsSync(
286
+ join(__dirname, 'langmail.linux-s390x-gnu.node')
287
+ )
288
+ try {
289
+ if (localFileExisted) {
290
+ nativeBinding = require('./langmail.linux-s390x-gnu.node')
291
+ } else {
292
+ nativeBinding = require('@langmail/langmail-linux-s390x-gnu')
293
+ }
294
+ } catch (e) {
295
+ loadError = e
296
+ }
297
+ break
298
+ default:
299
+ throw new Error(`Unsupported architecture on Linux: ${arch}`)
300
+ }
301
+ break
302
+ default:
303
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
304
+ }
305
+
306
+ if (!nativeBinding) {
307
+ if (loadError) {
308
+ throw loadError
309
+ }
310
+ throw new Error(`Failed to load native binding`)
311
+ }
312
+
313
+ const { preprocess, preprocessWithOptions, preprocessString } = nativeBinding
314
+
315
+ module.exports.preprocess = preprocess
316
+ module.exports.preprocessWithOptions = preprocessWithOptions
317
+ module.exports.preprocessString = preprocessString
Binary file
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "langmail",
3
+ "version": "0.1.0",
4
+ "description": "Email preprocessing for LLMs — fast, typed, Rust-powered",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "files": [
8
+ "index.js",
9
+ "index.d.ts",
10
+ "*.node"
11
+ ],
12
+ "napi": {
13
+ "name": "langmail",
14
+ "triples": {
15
+ "defaults": true,
16
+ "additional": [
17
+ "aarch64-apple-darwin",
18
+ "aarch64-unknown-linux-gnu",
19
+ "aarch64-unknown-linux-musl"
20
+ ]
21
+ }
22
+ },
23
+ "keywords": [
24
+ "email",
25
+ "llm",
26
+ "preprocessing",
27
+ "ai",
28
+ "langchain",
29
+ "mime",
30
+ "parsing",
31
+ "nlp",
32
+ "rust",
33
+ "napi"
34
+ ],
35
+ "license": "MIT OR Apache-2.0",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/nicely-done/langmail"
39
+ },
40
+ "engines": {
41
+ "node": ">= 18"
42
+ },
43
+ "scripts": {
44
+ "build": "napi build --platform --release --js index.js --dts index.d.ts --cargo-cwd ../../crates/langmail-node .",
45
+ "build:debug": "napi build --platform --js index.js --dts index.d.ts --cargo-cwd ../../crates/langmail-node .",
46
+ "prepublishOnly": "napi prepublish -t npm",
47
+ "test": "node --test test/*.test.js"
48
+ },
49
+ "devDependencies": {
50
+ "@napi-rs/cli": "^2.18.0"
51
+ },
52
+ "optionalDependencies": {
53
+ "langmail-win32-x64-msvc": "0.1.0",
54
+ "langmail-darwin-x64": "0.1.0",
55
+ "langmail-linux-x64-gnu": "0.1.0",
56
+ "langmail-darwin-arm64": "0.1.0",
57
+ "langmail-linux-arm64-gnu": "0.1.0",
58
+ "langmail-linux-arm64-musl": "0.1.0"
59
+ }
60
+ }