pinoy-kredit-parser 1.1.2 → 1.2.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.
package/README.MD CHANGED
@@ -1,6 +1,6 @@
1
1
  # pinoy-kredit-parser
2
2
 
3
- A lightweight Node.js library for parsing Philippine credit card statement PDFs into structured transaction data.
3
+ A lightweight, isomorphic library for parsing Philippine credit card statement PDFs into structured transaction data. Works in Node.js, Browsers, and Next.js.
4
4
 
5
5
  Currently supports:
6
6
 
@@ -39,44 +39,50 @@ npm install pinoy-kredit-parser
39
39
  ---
40
40
 
41
41
  ## Usage
42
+ The library automatically detects your environment (Node vs. Browser) to provide the correct parsing engine.
43
+
42
44
  ### Using a file path (Node.js)
43
45
  ```javascript
44
- const { parseKredit, BankType } = require('pinoy-kredit-parser')
46
+ import { parseKredit, BankType } from 'pinoy-kredit-parser';
45
47
 
46
- async function main() {
47
- const transactions = await parseKredit('statement.pdf', {
48
+ const transactions = await parseKredit('./statement.pdf', {
48
49
  bank: BankType.RCBC,
49
- })
50
-
51
- console.log(transactions)
52
- }
53
-
54
- main()
50
+ });
55
51
  ```
56
- ### Using a File object (Browser / modern runtimes)
52
+ ### Browser / Next.js Client Components (File or ArrayBuffer)
57
53
  ```javascript
58
- import { parseKredit, BankType } from 'pinoy-kredit-parser'
59
-
60
- async function handleFile(file) {
61
- const transactions = await parseKredit(file, {
62
- bank: BankType.METROBANK,
63
- })
54
+ import { parseKredit, BankType } from 'pinoy-kredit-parser';
55
+
56
+ const handleUpload = async (event) => {
57
+ const file = event.target.files[0];
58
+ const transactions = await parseKredit(file, {
59
+ bank: BankType.UNIONBANK,
60
+ });
61
+ };
62
+ ```
64
63
 
65
- console.log(transactions)
66
- }
64
+ ### Next.js (App Router / API Routes)
65
+ When using this library in Next.js, you must add it to `serverExternalPackages` in your `next.config.ts` to correctly handle the native PDF rendering binaries.
66
+ ```javascript
67
+ // next.config.ts
68
+ const nextConfig = {
69
+ experimental: {
70
+ serverExternalPackages: ['pinoy-kredit-parser', 'pdf-parse', '@napi-rs/canvas'],
71
+ },
72
+ };
67
73
  ```
68
74
 
69
75
  ---
70
76
 
71
77
  ## Output Format
72
78
 
73
- Each transaction is returned as:
79
+ Transactions are returned in a clean, structured format:
74
80
  ```typescript
75
81
  type KreditTransaction = {
76
- saleDate: string
77
- postDate: string
78
- description: string
79
- amount: number
82
+ saleDate: string; // MM/DD/YY
83
+ postDate: string; // MM/DD/YY
84
+ description: string;
85
+ amount: number; // Positive for purchases, negative for payments/credits
80
86
  }
81
87
  ```
82
88
  Example:
@@ -90,6 +96,12 @@ Example:
90
96
  }
91
97
  ]
92
98
  ```
99
+ ---
100
+ ## Features
101
+ - **Isomorphic:** Shared logic for server-side and client-side parsing.
102
+ - **Zero Global Pollution:** No need for manual DOMMatrix or Canvas polyfills.
103
+ - **Next.js Ready:** Optimized for modern frameworks with automatic environment detection.
104
+ - **Privacy-First:** All parsing happens locally on your machine. No data is ever sent to a server.
93
105
 
94
106
  ---
95
107
 
@@ -0,0 +1,6 @@
1
+ import { BankType } from './types';
2
+ export * from './types';
3
+ type BrowserInput = File | Blob | ArrayBuffer | Uint8Array;
4
+ export declare const parseKredit: (input: BrowserInput, options: {
5
+ bank: BankType;
6
+ }) => Promise<import("./types").KreditTransaction[]>;
@@ -14,6 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.parseKredit = void 0;
18
+ const core_1 = require("./core");
17
19
  __exportStar(require("./types"), exports);
18
- __exportStar(require("./parseKredit"), exports);
19
- //# sourceMappingURL=index.js.map
20
+ const parseKredit = async (input, options) => {
21
+ const data = input instanceof File || input instanceof Blob ? await input.arrayBuffer() : input;
22
+ return (0, core_1.baseParseKredit)(new Uint8Array(data), options);
23
+ };
24
+ exports.parseKredit = parseKredit;
25
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iCAAwC;AAGxC,0CAAuB;AAIhB,MAAM,WAAW,GAAG,KAAK,EAAE,KAAmB,EAAE,OAA2B,EAAE,EAAE;IACpF,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAE/F,OAAO,IAAA,sBAAe,EAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AACvD,CAAC,CAAA;AAJY,QAAA,WAAW,eAIvB"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { BankType, KreditTransaction } from './types';
2
+ export declare const baseParseKredit: (data: Buffer | Uint8Array, options: {
3
+ bank: BankType;
4
+ CanvasFactory?: any;
5
+ }) => Promise<KreditTransaction[]>;
@@ -1,24 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseKredit = void 0;
3
+ exports.baseParseKredit = void 0;
4
4
  const pdf_parse_1 = require("pdf-parse");
5
5
  const types_1 = require("./types");
6
6
  const rcbc_1 = require("./parsers/rcbc");
7
7
  const metrobank_1 = require("./parsers/metrobank");
8
8
  const unionbank_1 = require("./parsers/unionbank");
9
- const node_fs_1 = require("node:fs");
10
- const parseKredit = async (input, options) => {
11
- let buffer;
12
- if (typeof input === 'string') {
13
- buffer = (0, node_fs_1.readFileSync)(input);
14
- }
15
- else {
16
- const arrayBuffer = await input.arrayBuffer();
17
- buffer = Buffer.from(arrayBuffer);
18
- }
19
- const parser = new pdf_parse_1.PDFParse({ data: buffer });
20
- const textResult = await parser.getText();
21
- const text = textResult.text;
9
+ const baseParseKredit = async (data, options) => {
10
+ const parser = new pdf_parse_1.PDFParse({
11
+ data: Buffer.from(data),
12
+ CanvasFactory: options.CanvasFactory,
13
+ });
14
+ const { text } = await parser.getText();
22
15
  switch (options.bank) {
23
16
  case types_1.BankType.RCBC:
24
17
  return (0, rcbc_1.parseRCBC)(text);
@@ -30,5 +23,5 @@ const parseKredit = async (input, options) => {
30
23
  throw new Error('Unsupported bank type');
31
24
  }
32
25
  };
33
- exports.parseKredit = parseKredit;
34
- //# sourceMappingURL=parseKredit.js.map
26
+ exports.baseParseKredit = baseParseKredit;
27
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,mCAAqD;AACrD,yCAA0C;AAC1C,mDAAoD;AACpD,mDAAoD;AAE7C,MAAM,eAAe,GAAG,KAAK,EAClC,IAAyB,EACzB,OAAgD,EAClB,EAAE;IAChC,MAAM,MAAM,GAAG,IAAI,oBAAQ,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAA;IAEF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IAEvC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,gBAAQ,CAAC,IAAI;YAChB,OAAO,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAA;QACxB,KAAK,gBAAQ,CAAC,SAAS;YACrB,OAAO,IAAA,0BAAc,EAAC,IAAI,CAAC,CAAA;QAC7B,KAAK,gBAAQ,CAAC,SAAS;YACrB,OAAO,IAAA,0BAAc,EAAC,IAAI,CAAC,CAAA;QAC7B;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AArBY,QAAA,eAAe,mBAqB3B"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { BankType } from './types';
2
+ export * from './types';
3
+ type NodeInput = string | Buffer | Uint8Array;
4
+ export declare const parseKredit: (input: NodeInput, options: {
5
+ bank: BankType;
6
+ }) => Promise<import("./types").KreditTransaction[]>;
package/dist/node.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.parseKredit = void 0;
18
+ const node_fs_1 = require("node:fs");
19
+ const worker_1 = require("pdf-parse/worker");
20
+ const core_1 = require("./core");
21
+ __exportStar(require("./types"), exports);
22
+ const parseKredit = async (input, options) => {
23
+ const buffer = typeof input === 'string' ? (0, node_fs_1.readFileSync)(input) : input;
24
+ return (0, core_1.baseParseKredit)(buffer, { ...options, CanvasFactory: worker_1.CanvasFactory });
25
+ };
26
+ exports.parseKredit = parseKredit;
27
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAsC;AACtC,6CAAgD;AAChD,iCAAwC;AAGxC,0CAAuB;AAIhB,MAAM,WAAW,GAAG,KAAK,EAAE,KAAgB,EAAE,OAA2B,EAAE,EAAE;IACjF,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAEtE,OAAO,IAAA,sBAAe,EAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAb,sBAAa,EAAE,CAAC,CAAA;AAC/D,CAAC,CAAA;AAJY,QAAA,WAAW,eAIvB"}
package/package.json CHANGED
@@ -1,9 +1,24 @@
1
1
  {
2
2
  "name": "pinoy-kredit-parser",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "description": "Philippine credit card statement parser",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
5
+ "main": "./dist/node.js",
6
+ "browser": "./dist/browser.js",
7
+ "types": "./dist/node.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "node": {
11
+ "types": "./dist/node.d.ts",
12
+ "import": "./dist/node.js",
13
+ "require": "./dist/node.js"
14
+ },
15
+ "browser": {
16
+ "types": "./dist/browser.d.ts",
17
+ "import": "./dist/browser.js"
18
+ },
19
+ "default": "./dist/browser.js"
20
+ }
21
+ },
7
22
  "repository": {
8
23
  "type": "git",
9
24
  "url": "git+https://github.com/baldonharris/pinoy-kredit-parser.git"
@@ -16,7 +31,7 @@
16
31
  "dist"
17
32
  ],
18
33
  "scripts": {
19
- "build": "tsc",
34
+ "build": "rm -rf dist && tsc",
20
35
  "format": "prettier --write 'src/**/*.ts'",
21
36
  "format:check": "prettier --check 'src/**/*.ts'",
22
37
  "prepublishOnly": "npm run build"
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './types';
2
- export * from './parseKredit';
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,gDAA6B"}
@@ -1,7 +0,0 @@
1
- import { BankType, KreditTransaction } from './types';
2
- type Input = File | string;
3
- type ParseKredit = (file: Input, options: {
4
- bank: BankType;
5
- }) => Promise<KreditTransaction[]>;
6
- export declare const parseKredit: ParseKredit;
7
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseKredit.js","sourceRoot":"","sources":["../src/parseKredit.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,mCAAqD;AACrD,yCAA0C;AAC1C,mDAAoD;AACpD,mDAAoD;AACpD,qCAAsC;AAI/B,MAAM,WAAW,GAAgB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/D,IAAI,MAAc,CAAA;IAElB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,IAAA,sBAAY,EAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;QAC7C,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,oBAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IAEzC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAE5B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,gBAAQ,CAAC,IAAI;YAChB,OAAO,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAA;QAExB,KAAK,gBAAQ,CAAC,SAAS;YACrB,OAAO,IAAA,0BAAc,EAAC,IAAI,CAAC,CAAA;QAE7B,KAAK,gBAAQ,CAAC,SAAS;YACrB,OAAO,IAAA,0BAAc,EAAC,IAAI,CAAC,CAAA;QAE7B;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AA5BY,QAAA,WAAW,eA4BvB"}