Create API PO for add-on PO
This commit is contained in:
parent
55b52e2ea9
commit
7acc2cf82c
|
|
@ -32,12 +32,14 @@
|
|||
"mysql2": "^3.6.0",
|
||||
"nodemailer": "^6.9.5",
|
||||
"path": "^0.12.7",
|
||||
"pdfkit": "^0.17.2",
|
||||
"proxy-addr": "^2.0.7",
|
||||
"puppeteer": "^21.2.1",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"socket.io": "^4.7.2",
|
||||
"socket.io-client": "^4.7.2",
|
||||
"source-map-support": "^0.5.21",
|
||||
"stream-buffers": "^3.0.3",
|
||||
"tough-cookie": "^5.1.2",
|
||||
"turndown": "^7.2.1",
|
||||
"zulip-js": "^2.0.9"
|
||||
|
|
@ -1428,6 +1430,14 @@
|
|||
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
|
||||
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
|
||||
"integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tokenizer/token": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
|
||||
|
|
@ -2352,6 +2362,14 @@
|
|||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/brotli": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
|
||||
"integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
|
||||
"dependencies": {
|
||||
"base64-js": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
||||
|
|
@ -2829,7 +2847,6 @@
|
|||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
|
||||
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
|
|
@ -3132,6 +3149,11 @@
|
|||
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==",
|
||||
"deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in."
|
||||
},
|
||||
"node_modules/crypto-js": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
|
||||
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
|
||||
},
|
||||
"node_modules/cuid": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz",
|
||||
|
|
@ -3330,6 +3352,11 @@
|
|||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/dfa": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
|
||||
"integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
|
||||
},
|
||||
"node_modules/diff-sequences": {
|
||||
"version": "29.6.3",
|
||||
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
|
||||
|
|
@ -4266,6 +4293,22 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/fontkit": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
|
||||
"integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==",
|
||||
"dependencies": {
|
||||
"@swc/helpers": "^0.5.12",
|
||||
"brotli": "^1.3.2",
|
||||
"clone": "^2.1.2",
|
||||
"dfa": "^1.2.0",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"restructure": "^3.0.0",
|
||||
"tiny-inflate": "^1.0.3",
|
||||
"unicode-properties": "^1.4.0",
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/for-in": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
||||
|
|
@ -5863,6 +5906,11 @@
|
|||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/jpeg-exif": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
|
||||
"integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ=="
|
||||
},
|
||||
"node_modules/js-stringify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
|
||||
|
|
@ -6071,6 +6119,23 @@
|
|||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/linebreak": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
|
||||
"integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
|
||||
"dependencies": {
|
||||
"base64-js": "0.0.8",
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/linebreak/node_modules/base64-js": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
|
||||
"integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/lines-and-columns": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
||||
|
|
@ -7215,6 +7280,11 @@
|
|||
"node": ">= 14"
|
||||
}
|
||||
},
|
||||
"node_modules/pako": {
|
||||
"version": "0.2.9",
|
||||
"resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
|
||||
"integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
|
||||
},
|
||||
"node_modules/param-case": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
|
||||
|
|
@ -7377,6 +7447,18 @@
|
|||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/pdfkit": {
|
||||
"version": "0.17.2",
|
||||
"resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.17.2.tgz",
|
||||
"integrity": "sha512-UnwF5fXy08f0dnp4jchFYAROKMNTaPqb/xgR8GtCzIcqoTnbOqtp3bwKvO4688oHI6vzEEs8Q6vqqEnC5IUELw==",
|
||||
"dependencies": {
|
||||
"crypto-js": "^4.2.0",
|
||||
"fontkit": "^2.0.4",
|
||||
"jpeg-exif": "^1.1.4",
|
||||
"linebreak": "^1.1.0",
|
||||
"png-js": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/peek-readable": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
|
||||
|
|
@ -7525,6 +7607,11 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/png-js": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
|
||||
"integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
|
||||
},
|
||||
"node_modules/posix-character-classes": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
||||
|
|
@ -8115,6 +8202,11 @@
|
|||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/restructure": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz",
|
||||
"integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="
|
||||
},
|
||||
"node_modules/ret": {
|
||||
"version": "0.1.15",
|
||||
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
|
||||
|
|
@ -9002,6 +9094,14 @@
|
|||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-buffers": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz",
|
||||
"integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==",
|
||||
"engines": {
|
||||
"node": ">= 0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-events": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
|
||||
|
|
@ -9346,6 +9446,11 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/tiny-inflate": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
||||
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
|
||||
},
|
||||
"node_modules/tldts": {
|
||||
"version": "6.1.86",
|
||||
"resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
|
||||
|
|
@ -9475,9 +9580,9 @@
|
|||
"integrity": "sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg=="
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
|
||||
},
|
||||
"node_modules/turndown": {
|
||||
"version": "7.2.1",
|
||||
|
|
@ -9583,6 +9688,24 @@
|
|||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"node_modules/unicode-properties": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
|
||||
"integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
|
||||
"dependencies": {
|
||||
"base64-js": "^1.3.0",
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/unicode-trie": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
|
||||
"integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
|
||||
"dependencies": {
|
||||
"pako": "^0.2.5",
|
||||
"tiny-inflate": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/union-value": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
|
||||
|
|
@ -11180,6 +11303,14 @@
|
|||
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
|
||||
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
|
||||
},
|
||||
"@swc/helpers": {
|
||||
"version": "0.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
|
||||
"integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
|
||||
"requires": {
|
||||
"tslib": "^2.8.0"
|
||||
}
|
||||
},
|
||||
"@tokenizer/token": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
|
||||
|
|
@ -11912,6 +12043,14 @@
|
|||
"fill-range": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"brotli": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
|
||||
"integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
|
||||
"requires": {
|
||||
"base64-js": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
||||
|
|
@ -12278,8 +12417,7 @@
|
|||
"clone": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
|
||||
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
|
||||
"dev": true
|
||||
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
|
||||
},
|
||||
"clone-deep": {
|
||||
"version": "4.0.1",
|
||||
|
|
@ -12517,6 +12655,11 @@
|
|||
"resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
|
||||
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
|
||||
},
|
||||
"crypto-js": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
|
||||
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
|
||||
},
|
||||
"cuid": {
|
||||
"version": "2.1.8",
|
||||
"resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz",
|
||||
|
|
@ -12664,6 +12807,11 @@
|
|||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"dfa": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
|
||||
"integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
|
||||
},
|
||||
"diff-sequences": {
|
||||
"version": "29.6.3",
|
||||
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
|
||||
|
|
@ -13391,6 +13539,22 @@
|
|||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
|
||||
"integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q=="
|
||||
},
|
||||
"fontkit": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
|
||||
"integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==",
|
||||
"requires": {
|
||||
"@swc/helpers": "^0.5.12",
|
||||
"brotli": "^1.3.2",
|
||||
"clone": "^2.1.2",
|
||||
"dfa": "^1.2.0",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"restructure": "^3.0.0",
|
||||
"tiny-inflate": "^1.0.3",
|
||||
"unicode-properties": "^1.4.0",
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"for-in": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
||||
|
|
@ -14619,6 +14783,11 @@
|
|||
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
|
||||
"integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="
|
||||
},
|
||||
"jpeg-exif": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
|
||||
"integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ=="
|
||||
},
|
||||
"js-stringify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
|
||||
|
|
@ -14771,6 +14940,22 @@
|
|||
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
|
||||
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
|
||||
},
|
||||
"linebreak": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
|
||||
"integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
|
||||
"requires": {
|
||||
"base64-js": "0.0.8",
|
||||
"unicode-trie": "^2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"base64-js": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
|
||||
"integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"lines-and-columns": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
||||
|
|
@ -15648,6 +15833,11 @@
|
|||
"netmask": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"pako": {
|
||||
"version": "0.2.9",
|
||||
"resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
|
||||
"integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
|
||||
},
|
||||
"param-case": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
|
||||
|
|
@ -15776,6 +15966,18 @@
|
|||
"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
|
||||
"dev": true
|
||||
},
|
||||
"pdfkit": {
|
||||
"version": "0.17.2",
|
||||
"resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.17.2.tgz",
|
||||
"integrity": "sha512-UnwF5fXy08f0dnp4jchFYAROKMNTaPqb/xgR8GtCzIcqoTnbOqtp3bwKvO4688oHI6vzEEs8Q6vqqEnC5IUELw==",
|
||||
"requires": {
|
||||
"crypto-js": "^4.2.0",
|
||||
"fontkit": "^2.0.4",
|
||||
"jpeg-exif": "^1.1.4",
|
||||
"linebreak": "^1.1.0",
|
||||
"png-js": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"peek-readable": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
|
||||
|
|
@ -15897,6 +16099,11 @@
|
|||
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
|
||||
"integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="
|
||||
},
|
||||
"png-js": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
|
||||
"integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
|
||||
},
|
||||
"posix-character-classes": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
||||
|
|
@ -16334,6 +16541,11 @@
|
|||
"signal-exit": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"restructure": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz",
|
||||
"integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="
|
||||
},
|
||||
"ret": {
|
||||
"version": "0.1.15",
|
||||
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
|
||||
|
|
@ -17028,6 +17240,11 @@
|
|||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
|
||||
},
|
||||
"stream-buffers": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz",
|
||||
"integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw=="
|
||||
},
|
||||
"stream-events": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
|
||||
|
|
@ -17293,6 +17510,11 @@
|
|||
"convert-hrtime": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"tiny-inflate": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
||||
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
|
||||
},
|
||||
"tldts": {
|
||||
"version": "6.1.86",
|
||||
"resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
|
||||
|
|
@ -17390,9 +17612,9 @@
|
|||
"integrity": "sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg=="
|
||||
},
|
||||
"tslib": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
|
||||
},
|
||||
"turndown": {
|
||||
"version": "7.2.1",
|
||||
|
|
@ -17463,6 +17685,24 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"unicode-properties": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
|
||||
"integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
|
||||
"requires": {
|
||||
"base64-js": "^1.3.0",
|
||||
"unicode-trie": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"unicode-trie": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
|
||||
"integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
|
||||
"requires": {
|
||||
"pako": "^0.2.5",
|
||||
"tiny-inflate": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"union-value": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
|
||||
|
|
|
|||
|
|
@ -45,12 +45,14 @@
|
|||
"mysql2": "^3.6.0",
|
||||
"nodemailer": "^6.9.5",
|
||||
"path": "^0.12.7",
|
||||
"pdfkit": "^0.17.2",
|
||||
"proxy-addr": "^2.0.7",
|
||||
"puppeteer": "^21.2.1",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"socket.io": "^4.7.2",
|
||||
"socket.io-client": "^4.7.2",
|
||||
"source-map-support": "^0.5.21",
|
||||
"stream-buffers": "^3.0.3",
|
||||
"tough-cookie": "^5.1.2",
|
||||
"turndown": "^7.2.1",
|
||||
"zulip-js": "^2.0.9"
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 567 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
230
start/routes.ts
230
start/routes.ts
|
|
@ -335,23 +335,23 @@ Route.post("/api/test", async () => {
|
|||
|
||||
Route.post('/api/wiki/page/insert', async ({ request, response }) => {
|
||||
try {
|
||||
const { title, data: dataPayload, pid, vid,sn, lineNumber, license } = request.all()
|
||||
const { title, data: dataPayload, pid, vid, sn, lineNumber, license } = request.all()
|
||||
if (!title || !dataPayload) {
|
||||
return response.status(422).send({ error: `'title' & 'text' is required` })
|
||||
}
|
||||
|
||||
let text = ""
|
||||
if(typeof dataPayload === "string")
|
||||
text = dataPayload.replace(/\\n/g, '\n')
|
||||
else if(Array.isArray(dataPayload)){
|
||||
if (typeof dataPayload === "string")
|
||||
text = dataPayload.replace(/\\n/g, '\n')
|
||||
else if (Array.isArray(dataPayload)) {
|
||||
const dataPlatform = dataPayload?.find(el => el.command?.trim() === "show platform")
|
||||
const DPELP = dataPlatform && !dataPlatform?.output?.includes("Incomplete") ? true : false
|
||||
text = `<pre>
|
||||
text = `<pre>
|
||||
Line ${lineNumber ?? ""}:
|
||||
PID: ${pid ?? ""}
|
||||
VID: ${vid ?? ""}
|
||||
SN: ${sn ?? ""}
|
||||
Tested mode: ${DPELP? "DPELP" : "DPEL"}
|
||||
Tested mode: ${DPELP ? "DPELP" : "DPEL"}
|
||||
License: ${license ?? ""}
|
||||
</pre>
|
||||
`
|
||||
|
|
@ -432,4 +432,222 @@ License: ${license ?? ""}
|
|||
console.error(err)
|
||||
return response.status(500).send(err)
|
||||
}
|
||||
})
|
||||
|
||||
Route.post("/api/po-email/packing-slip", async ({ request, response }) => {
|
||||
try {
|
||||
const { data } = request.all()
|
||||
const PDFDocument = require('pdfkit')
|
||||
const getStream = require('stream-buffers')
|
||||
|
||||
function generatePackingSlip(inputData) {
|
||||
|
||||
function loadFont(name) {
|
||||
return path.join(__dirname, 'fonts', name + ".ttf")
|
||||
}
|
||||
|
||||
const doc = new PDFDocument({
|
||||
size: 'A4',
|
||||
margins: { top: 50, bottom: 50, left: 50, right: 50 }
|
||||
})
|
||||
const stream = new getStream.WritableStreamBuffer()
|
||||
|
||||
// Layout parameters
|
||||
const leftMargin = 50
|
||||
const pageWidth = 500
|
||||
const rightColumnX = 420
|
||||
let y = doc.y
|
||||
|
||||
doc.pipe(stream)
|
||||
|
||||
// ===== LOGO (LEFT COLUMN) =====
|
||||
const logoPath = '/home/Log_service/start/images/IP-Supply-Logo.png'
|
||||
try {
|
||||
doc.image(logoPath, leftMargin, y, { width: 180 })
|
||||
} catch (err) {
|
||||
console.warn('⚠️ Logo not found:', logoPath)
|
||||
}
|
||||
|
||||
// ===== HEADER (RIGHT COLUMN) =====
|
||||
doc.font(loadFont('calibri-bold')).fontSize(18).fillColor('#396190')
|
||||
.text('IP Supply Pty Ltd', rightColumnX, y, { width: 195, align: 'left' })
|
||||
|
||||
doc.fillColor('black').font(loadFont('calibri-regular')).fontSize(10)
|
||||
doc.text('Unit 8, 4A Bachell Ave', rightColumnX, doc.y, { width: 195, align: 'left' })
|
||||
doc.text('Lidcombe NSW 2141', rightColumnX, doc.y, { width: 195, align: 'left' })
|
||||
doc.text('Australia', rightColumnX, doc.y, { width: 195, align: 'left' })
|
||||
|
||||
doc.moveDown(1.5)
|
||||
|
||||
// ===== CONTACT INFO (TWO COLUMNS) =====
|
||||
const contactY = doc.y
|
||||
|
||||
// Left column - ABN, ACN
|
||||
doc.font(loadFont('calibri-bold')).fontSize(10)
|
||||
doc.text('ABN: ', leftMargin, contactY, { continued: true })
|
||||
doc.font(loadFont('calibri-regular')).text('66 145 174 358')
|
||||
|
||||
doc.font(loadFont('calibri-bold'))
|
||||
doc.text('ACN: ', leftMargin, doc.y, { continued: true })
|
||||
doc.font(loadFont('calibri-regular')).text('145 174 358')
|
||||
|
||||
// Right column - Phone, Mobile, Email
|
||||
doc.font(loadFont('calibri-bold'))
|
||||
doc.text('Ph: ', rightColumnX, contactY, { continued: true })
|
||||
doc.font(loadFont('calibri-regular')).text('02 8061 6886')
|
||||
|
||||
doc.font(loadFont('calibri-bold'))
|
||||
doc.text('M: ', rightColumnX, doc.y, { continued: true })
|
||||
doc.font(loadFont('calibri-regular')).text('04 8881 6886')
|
||||
|
||||
doc.font(loadFont('calibri-bold'))
|
||||
doc.text('E: ', rightColumnX, doc.y, { continued: true })
|
||||
doc.font(loadFont('calibri-regular')).text('sales@ipsupply.com.au')
|
||||
|
||||
doc.moveDown(2)
|
||||
|
||||
// ===== "NOT CONFIRM TO" RIBBON (if needed) =====
|
||||
// if (inputData.confirmStatus === "NOT CONFIRM TO") {
|
||||
// doc.save()
|
||||
// doc.fontSize(10).fillColor('white').font(loadFont('calibri-bold')
|
||||
// const ribbonText = 'NOT CONFIRM TO'
|
||||
// const ribbonWidth = doc.widthOfString(ribbonText) + 20
|
||||
// doc.rotate(45, { origin: [pageWidth + leftMargin - 60, 60] })
|
||||
// doc.rect(pageWidth + leftMargin - 80, 50, ribbonWidth, 20)
|
||||
// .fillAndStroke('#d80000', '#a00000')
|
||||
// doc.fillColor('white')
|
||||
// .text(ribbonText, pageWidth + leftMargin - 70, 55)
|
||||
// doc.restore()
|
||||
// }
|
||||
|
||||
// ===== TITLE =====
|
||||
doc.fontSize(25).font(loadFont('calibri-bold')).fillColor('#396190')
|
||||
.text('PACKING SLIP', leftMargin, doc.y, { width: pageWidth, align: 'center' })
|
||||
doc.fillColor('black')
|
||||
doc.moveDown(0.5)
|
||||
|
||||
// ===== SHIP TO & PO (TWO COLUMNS) =====
|
||||
const detailsY = doc.y
|
||||
|
||||
// Left column - Ship To
|
||||
doc.fontSize(13).font(loadFont('calibri-bold'))
|
||||
.text('Ship To', leftMargin, detailsY)
|
||||
|
||||
doc.fontSize(11).font(loadFont('calibri-regular'))
|
||||
if (inputData.shipTo.name) {
|
||||
doc.text(inputData.shipTo.name, leftMargin, doc.y, { width: 280 })
|
||||
}
|
||||
if (inputData.shipTo.address) {
|
||||
doc.text(inputData.shipTo.address, leftMargin, doc.y, { width: 280 })
|
||||
}
|
||||
|
||||
if (inputData.shipTo.attn) {
|
||||
doc.text(`Attn: ${inputData.shipTo.attn}`, leftMargin, doc.y, { width: 280 })
|
||||
}
|
||||
|
||||
if (inputData.shipTo.phone) {
|
||||
doc.text(`Phone: ${inputData.shipTo.phone}`, leftMargin, doc.y, { width: 280 })
|
||||
}
|
||||
|
||||
// Right column - PO
|
||||
doc.font(loadFont('calibri-bold')).fontSize(11)
|
||||
.text('PO: ', rightColumnX, detailsY, { continued: true })
|
||||
doc.font(loadFont('calibri-regular'))
|
||||
.text(inputData.po || '', { width: 195 })
|
||||
|
||||
|
||||
// Nối tất cả value thành một chuỗi, ngăn cách bằng xuống dòng
|
||||
const joined = Object.values(inputData.shipTo).join('\n');
|
||||
|
||||
// Tách theo \n và đếm số dòng (bỏ qua dòng rỗng)
|
||||
const lines = joined.split('\n').filter(line => line.trim() !== '');
|
||||
const lineCount = lines.length;
|
||||
|
||||
doc.moveDown(lineCount + 1)
|
||||
|
||||
// ===== TABLE HEADER =====
|
||||
const tableY = doc.y
|
||||
const qtyColX = leftMargin
|
||||
const descColX = leftMargin + 50
|
||||
|
||||
// Header background
|
||||
doc.rect(leftMargin, tableY, pageWidth, 20)
|
||||
.fillAndStroke('#396290', '#396290')
|
||||
|
||||
// Header text
|
||||
doc.fillColor('white').font(loadFont('calibri-bold')).fontSize(11)
|
||||
doc.text('Qty', qtyColX + 10, tableY + 5, { width: 40, align: 'center' })
|
||||
doc.text('Description', descColX + 5, tableY + 5, { width: pageWidth - 60 })
|
||||
|
||||
doc.fillColor('black')
|
||||
// doc.moveDown(0.5)
|
||||
|
||||
// ===== TABLE ROWS =====
|
||||
inputData.items.forEach((item) => {
|
||||
const rowStartY = doc.y
|
||||
|
||||
// Calculate description height
|
||||
let descText = ''
|
||||
// if (item.name) descText += item.name + ' '
|
||||
if (item.sku) descText += item.sku
|
||||
if (item.SN && item.SN.join(', ') !== "") {
|
||||
descText += `\nSN: ${item.SN.join(', ')}`
|
||||
}
|
||||
|
||||
// Measure text height
|
||||
const textHeight = doc.heightOfString(descText.trim(), {
|
||||
width: pageWidth - 60,
|
||||
lineBreak: true
|
||||
})
|
||||
|
||||
const rowHeight = Math.max(25, textHeight + 10)
|
||||
|
||||
// Draw cell borders
|
||||
doc.strokeColor('#396290').lineWidth(0.5)
|
||||
|
||||
// Qty cell
|
||||
doc.rect(qtyColX, rowStartY, 50, rowHeight).stroke()
|
||||
doc.fontSize(11).font(loadFont('calibri-regular'))
|
||||
.text(item.qty.toString(), qtyColX, rowStartY + 8, { width: 50, align: 'center' })
|
||||
|
||||
// Description cell
|
||||
doc.rect(descColX, rowStartY, pageWidth - 50, rowHeight).stroke()
|
||||
|
||||
doc.text(descText.trim(), descColX + 5, rowStartY + 5, {
|
||||
width: pageWidth - 60,
|
||||
lineBreak: true
|
||||
})
|
||||
|
||||
doc.y = rowStartY + rowHeight
|
||||
})
|
||||
|
||||
// ===== FOOTER =====
|
||||
doc.moveDown(1)
|
||||
doc.fontSize(10).font(loadFont('calibri-bold'))
|
||||
.text('Thank you for your purchase.', leftMargin, doc.y, { width: pageWidth })
|
||||
|
||||
doc.end()
|
||||
return stream
|
||||
}
|
||||
|
||||
const pdfStream = generatePackingSlip(data)
|
||||
|
||||
await new Promise(resolve => pdfStream.on('finish', resolve))
|
||||
const buffer = pdfStream.getContents()
|
||||
|
||||
const fileName = `${data.po || 'PackingSlip'}_PackingSlip.pdf`
|
||||
const filePath = `/tmp/${fileName}`
|
||||
fs.writeFileSync(filePath, buffer)
|
||||
|
||||
response.header('Content-Type', 'application/pdf')
|
||||
response.header('Content-Disposition', `attachment; filename="${fileName}"`)
|
||||
return response.download(filePath)
|
||||
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
return response.status(500).json({
|
||||
status: 'error',
|
||||
message: err.message,
|
||||
})
|
||||
}
|
||||
})
|
||||
Loading…
Reference in New Issue