@stackflow-lab/tef-elgin 1.0.3
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 +21 -0
- package/README.md +546 -0
- package/dist/index.cjs +536 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +232 -0
- package/dist/index.d.ts +232 -0
- package/dist/index.js +506 -0
- package/dist/index.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +107 -0
- package/dist/worker.js.map +1 -0
- package/package.json +78 -0
package/dist/worker.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// src/worker.ts
|
|
2
|
+
import { parentPort } from "worker_threads";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
import koffi from "koffi";
|
|
6
|
+
var DEFAULT_DLL_PATH = join("C:", "Elgin", "TEF", "E1_Tef01.dll");
|
|
7
|
+
function loadDll(dllPath = DEFAULT_DLL_PATH) {
|
|
8
|
+
if (!existsSync(dllPath)) {
|
|
9
|
+
throw new Error(`DLL n\xE3o encontrada: ${dllPath}`);
|
|
10
|
+
}
|
|
11
|
+
const lib = koffi.load(dllPath);
|
|
12
|
+
return {
|
|
13
|
+
GetProdutoTef: lib.func("__stdcall", "GetProdutoTef", "int", []),
|
|
14
|
+
GetClientTCP: lib.func("__stdcall", "GetClientTCP", "string", []),
|
|
15
|
+
SetClientTCP: lib.func("__stdcall", "SetClientTCP", "string", ["string", "int"]),
|
|
16
|
+
ConfigurarDadosPDV: lib.func("__stdcall", "ConfigurarDadosPDV", "string", ["string", "string", "string", "string", "string"]),
|
|
17
|
+
IniciarOperacaoTEF: lib.func("__stdcall", "IniciarOperacaoTEF", "string", ["string"]),
|
|
18
|
+
RecuperarOperacaoTEF: lib.func("__stdcall", "RecuperarOperacaoTEF", "string", ["string"]),
|
|
19
|
+
RealizarPagamentoTEF: lib.func("__stdcall", "RealizarPagamentoTEF", "string", ["int", "string", "bool"]),
|
|
20
|
+
RealizarPixTEF: lib.func("__stdcall", "RealizarPixTEF", "string", ["string", "bool"]),
|
|
21
|
+
RealizarAdmTEF: lib.func("__stdcall", "RealizarAdmTEF", "string", ["int", "string", "bool"]),
|
|
22
|
+
ConfirmarOperacaoTEF: lib.func("__stdcall", "ConfirmarOperacaoTEF", "string", ["int", "int"]),
|
|
23
|
+
FinalizarOperacaoTEF: lib.func("__stdcall", "FinalizarOperacaoTEF", "string", ["int"]),
|
|
24
|
+
unload: () => lib.unload()
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
var dll = null;
|
|
28
|
+
if (!parentPort) {
|
|
29
|
+
throw new Error("Este arquivo deve ser executado como Worker Thread");
|
|
30
|
+
}
|
|
31
|
+
parentPort.on("message", (message) => {
|
|
32
|
+
try {
|
|
33
|
+
switch (message.type) {
|
|
34
|
+
case "load": {
|
|
35
|
+
dll = loadDll(message.dllPath);
|
|
36
|
+
parentPort.postMessage({ type: "loaded" });
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case "configure": {
|
|
40
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
41
|
+
dll.SetClientTCP(message.ip, message.port);
|
|
42
|
+
dll.ConfigurarDadosPDV(
|
|
43
|
+
message.pdv.pinpadText,
|
|
44
|
+
message.pdv.version,
|
|
45
|
+
message.pdv.storeName,
|
|
46
|
+
message.pdv.storeCode,
|
|
47
|
+
message.pdv.terminalId
|
|
48
|
+
);
|
|
49
|
+
parentPort.postMessage({ type: "configured" });
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "IniciarOperacaoTEF": {
|
|
53
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
54
|
+
const result = dll.IniciarOperacaoTEF(message.payload);
|
|
55
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case "RealizarPagamentoTEF": {
|
|
59
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
60
|
+
const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew);
|
|
61
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case "RealizarPixTEF": {
|
|
65
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
66
|
+
const result = dll.RealizarPixTEF(message.payload, message.isNew);
|
|
67
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case "RealizarAdmTEF": {
|
|
71
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
72
|
+
const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew);
|
|
73
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case "ConfirmarOperacaoTEF": {
|
|
77
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
78
|
+
const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action);
|
|
79
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case "FinalizarOperacaoTEF": {
|
|
83
|
+
if (!dll) throw new Error("DLL n\xE3o carregada");
|
|
84
|
+
const result = dll.FinalizarOperacaoTEF(message.id);
|
|
85
|
+
parentPort.postMessage({ type: "result", data: result });
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case "unload": {
|
|
89
|
+
if (dll) {
|
|
90
|
+
dll.unload();
|
|
91
|
+
dll = null;
|
|
92
|
+
}
|
|
93
|
+
parentPort.postMessage({ type: "unloaded" });
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
default: {
|
|
97
|
+
throw new Error(`Tipo de mensagem desconhecido: ${message.type}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} catch (error) {
|
|
101
|
+
parentPort.postMessage({
|
|
102
|
+
type: "error",
|
|
103
|
+
error: error instanceof Error ? error.message : String(error)
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/worker.ts"],"sourcesContent":["/**\r\n * Worker thread que executa todas as chamadas à DLL nativa\r\n * Isso evita bloquear a thread principal do Node.js\r\n *\r\n * Este arquivo é auto-contido (não importa módulos locais) para funcionar\r\n * tanto em desenvolvimento (tsx) quanto compilado (tsup).\r\n */\r\nimport { parentPort } from 'node:worker_threads'\r\nimport { join } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport koffi from 'koffi'\r\n\r\nconst DEFAULT_DLL_PATH = join('C:', 'Elgin', 'TEF', 'E1_Tef01.dll')\r\n\r\nfunction loadDll(dllPath: string = DEFAULT_DLL_PATH) {\r\n if (!existsSync(dllPath)) {\r\n throw new Error(`DLL não encontrada: ${dllPath}`)\r\n }\r\n const lib = koffi.load(dllPath)\r\n return {\r\n GetProdutoTef: lib.func('__stdcall', 'GetProdutoTef', 'int', []),\r\n GetClientTCP: lib.func('__stdcall', 'GetClientTCP', 'string', []),\r\n SetClientTCP: lib.func('__stdcall', 'SetClientTCP', 'string', ['string', 'int']),\r\n ConfigurarDadosPDV: lib.func('__stdcall', 'ConfigurarDadosPDV', 'string', ['string', 'string', 'string', 'string', 'string']),\r\n IniciarOperacaoTEF: lib.func('__stdcall', 'IniciarOperacaoTEF', 'string', ['string']),\r\n RecuperarOperacaoTEF: lib.func('__stdcall', 'RecuperarOperacaoTEF', 'string', ['string']),\r\n RealizarPagamentoTEF: lib.func('__stdcall', 'RealizarPagamentoTEF', 'string', ['int', 'string', 'bool']),\r\n RealizarPixTEF: lib.func('__stdcall', 'RealizarPixTEF', 'string', ['string', 'bool']),\r\n RealizarAdmTEF: lib.func('__stdcall', 'RealizarAdmTEF', 'string', ['int', 'string', 'bool']),\r\n ConfirmarOperacaoTEF: lib.func('__stdcall', 'ConfirmarOperacaoTEF', 'string', ['int', 'int']),\r\n FinalizarOperacaoTEF: lib.func('__stdcall', 'FinalizarOperacaoTEF', 'string', ['int']),\r\n unload: () => lib.unload(),\r\n }\r\n}\r\n\r\ntype Dll = ReturnType<typeof loadDll>\r\n\r\ntype WorkerMessage = \r\n | { type: 'load'; dllPath?: string }\r\n | { type: 'configure'; ip: string; port: number; pdv: { pinpadText: string; version: string; storeName: string; storeCode: string; terminalId: string } }\r\n | { type: 'IniciarOperacaoTEF'; payload: string }\r\n | { type: 'RealizarPagamentoTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'RealizarPixTEF'; payload: string; isNew: boolean }\r\n | { type: 'RealizarAdmTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'ConfirmarOperacaoTEF'; sequenceId: number; action: number }\r\n | { type: 'FinalizarOperacaoTEF'; id: number }\r\n | { type: 'unload' }\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\nlet dll: Dll | null = null\r\n\r\nif (!parentPort) {\r\n throw new Error('Este arquivo deve ser executado como Worker Thread')\r\n}\r\n\r\nparentPort.on('message', (message: WorkerMessage) => {\r\n try {\r\n switch (message.type) {\r\n case 'load': {\r\n dll = loadDll(message.dllPath)\r\n parentPort!.postMessage({ type: 'loaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'configure': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n dll.SetClientTCP(message.ip, message.port)\r\n dll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n parentPort!.postMessage({ type: 'configured' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'IniciarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.IniciarOperacaoTEF(message.payload)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPagamentoTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPixTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.RealizarPixTEF(message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarAdmTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'ConfirmarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'FinalizarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL não carregada')\r\n const result = dll.FinalizarOperacaoTEF(message.id)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'unload': {\r\n if (dll) {\r\n dll.unload()\r\n dll = null\r\n }\r\n parentPort!.postMessage({ type: 'unloaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n default: {\r\n throw new Error(`Tipo de mensagem desconhecido: ${(message as any).type}`)\r\n }\r\n }\r\n } catch (error) {\r\n parentPort!.postMessage({ \r\n type: 'error', \r\n error: error instanceof Error ? error.message : String(error) \r\n } as WorkerResponse)\r\n }\r\n})\r\n"],"mappings":";AAOA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,OAAO,WAAW;AAElB,IAAM,mBAAmB,KAAK,MAAM,SAAS,OAAO,cAAc;AAElE,SAAS,QAAQ,UAAkB,kBAAkB;AACnD,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,UAAM,IAAI,MAAM,0BAAuB,OAAO,EAAE;AAAA,EAClD;AACA,QAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,SAAO;AAAA,IACL,eAAe,IAAI,KAAK,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAC/D,cAAc,IAAI,KAAK,aAAa,gBAAgB,UAAU,CAAC,CAAC;AAAA,IAChE,cAAc,IAAI,KAAK,aAAa,gBAAgB,UAAU,CAAC,UAAU,KAAK,CAAC;AAAA,IAC/E,oBAAoB,IAAI,KAAK,aAAa,sBAAsB,UAAU,CAAC,UAAU,UAAU,UAAU,UAAU,QAAQ,CAAC;AAAA,IAC5H,oBAAoB,IAAI,KAAK,aAAa,sBAAsB,UAAU,CAAC,QAAQ,CAAC;AAAA,IACpF,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,QAAQ,CAAC;AAAA,IACxF,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,OAAO,UAAU,MAAM,CAAC;AAAA,IACvG,gBAAgB,IAAI,KAAK,aAAa,kBAAkB,UAAU,CAAC,UAAU,MAAM,CAAC;AAAA,IACpF,gBAAgB,IAAI,KAAK,aAAa,kBAAkB,UAAU,CAAC,OAAO,UAAU,MAAM,CAAC;AAAA,IAC3F,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,OAAO,KAAK,CAAC;AAAA,IAC5F,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,KAAK,CAAC;AAAA,IACrF,QAAQ,MAAM,IAAI,OAAO;AAAA,EAC3B;AACF;AAsBA,IAAI,MAAkB;AAEtB,IAAI,CAAC,YAAY;AACf,QAAM,IAAI,MAAM,oDAAoD;AACtE;AAEA,WAAW,GAAG,WAAW,CAAC,YAA2B;AACnD,MAAI;AACF,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,QAAQ;AACX,cAAM,QAAQ,QAAQ,OAAO;AAC7B,mBAAY,YAAY,EAAE,MAAM,SAAS,CAAmB;AAC5D;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,YAAI,aAAa,QAAQ,IAAI,QAAQ,IAAI;AACzC,YAAI;AAAA,UACF,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,QACd;AACA,mBAAY,YAAY,EAAE,MAAM,aAAa,CAAmB;AAChE;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,mBAAmB,QAAQ,OAAO;AACrD,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AACpF,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,eAAe,QAAQ,SAAS,QAAQ,KAAK;AAChE,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,eAAe,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAC9E,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,YAAY,QAAQ,MAAM;AAC1E,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sBAAmB;AAC7C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,EAAE;AAClD,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,YAAI,KAAK;AACP,cAAI,OAAO;AACX,gBAAM;AAAA,QACR;AACA,mBAAY,YAAY,EAAE,MAAM,WAAW,CAAmB;AAC9D;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,IAAI,MAAM,kCAAmC,QAAgB,IAAI,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,eAAY,YAAY;AAAA,MACtB,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAmB;AAAA,EACrB;AACF,CAAC;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stackflow-lab/tef-elgin",
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "SDK Node.js para integração com Elgin TEF - Terminal de pagamentos eletrônicos",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"import": "./dist/index.mjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"dev": "tsup --watch",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"playground": "tsx playground/index.ts",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=22"
|
|
32
|
+
},
|
|
33
|
+
"os": [
|
|
34
|
+
"win32"
|
|
35
|
+
],
|
|
36
|
+
"keywords": [
|
|
37
|
+
"elgin",
|
|
38
|
+
"tef",
|
|
39
|
+
"payment",
|
|
40
|
+
"pagamento",
|
|
41
|
+
"pos",
|
|
42
|
+
"terminal",
|
|
43
|
+
"pinpad",
|
|
44
|
+
"pix",
|
|
45
|
+
"credit-card",
|
|
46
|
+
"debit-card",
|
|
47
|
+
"sdk",
|
|
48
|
+
"typescript"
|
|
49
|
+
],
|
|
50
|
+
"author": "stackflow-lab",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://github.com/stackflow-lab/tef-elgin.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/stackflow-lab/tef-elgin/issues"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/stackflow-lab/tef-elgin#readme",
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
62
|
+
"@semantic-release/commit-analyzer": "^13.0.0",
|
|
63
|
+
"@semantic-release/git": "^10.0.1",
|
|
64
|
+
"@semantic-release/github": "^11.0.0",
|
|
65
|
+
"@semantic-release/npm": "^12.0.1",
|
|
66
|
+
"@semantic-release/release-notes-generator": "^14.0.1",
|
|
67
|
+
"@types/node": "^25.4.0",
|
|
68
|
+
"conventional-changelog-conventionalcommits": "^8.0.0",
|
|
69
|
+
"semantic-release": "^24.2.0",
|
|
70
|
+
"tsup": "^8.5.1",
|
|
71
|
+
"tsx": "^4.19.2",
|
|
72
|
+
"typescript": "^5.9.3",
|
|
73
|
+
"vitest": "^4.0.18"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"koffi": "^2.15.2"
|
|
77
|
+
}
|
|
78
|
+
}
|