@geekapps/post-fastify 0.1.4 → 0.1.5

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/bun.lock ADDED
@@ -0,0 +1,318 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "configVersion": 0,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "@geekapps/post-fastify",
7
+ "devDependencies": {
8
+ "@types/node": "^25.9.1",
9
+ "fastify": "^5.8.5",
10
+ "fastify-plugin": "^5.1.0",
11
+ "tsup": "^8.5.1",
12
+ "typescript": "^5.9.3",
13
+ },
14
+ "peerDependencies": {
15
+ "fastify": ">=4.0.0",
16
+ },
17
+ },
18
+ },
19
+ "packages": {
20
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
21
+
22
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
23
+
24
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
25
+
26
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
27
+
28
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
29
+
30
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
31
+
32
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
33
+
34
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
35
+
36
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
37
+
38
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
39
+
40
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
41
+
42
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
43
+
44
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
45
+
46
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
47
+
48
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
49
+
50
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
51
+
52
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
53
+
54
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
55
+
56
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
57
+
58
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
59
+
60
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
61
+
62
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
63
+
64
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
65
+
66
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
67
+
68
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
69
+
70
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
71
+
72
+ "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="],
73
+
74
+ "@fastify/error": ["@fastify/error@4.2.0", "", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="],
75
+
76
+ "@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@5.0.3", "", { "dependencies": { "fast-json-stringify": "^6.0.0" } }, "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ=="],
77
+
78
+ "@fastify/forwarded": ["@fastify/forwarded@3.0.1", "", {}, "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw=="],
79
+
80
+ "@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.2.1", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A=="],
81
+
82
+ "@fastify/proxy-addr": ["@fastify/proxy-addr@5.1.0", "", { "dependencies": { "@fastify/forwarded": "^3.0.0", "ipaddr.js": "^2.1.0" } }, "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw=="],
83
+
84
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
85
+
86
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
87
+
88
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
89
+
90
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
91
+
92
+ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="],
93
+
94
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.1", "", { "os": "android", "cpu": "arm" }, "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA=="],
95
+
96
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.1", "", { "os": "android", "cpu": "arm64" }, "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw=="],
97
+
98
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA=="],
99
+
100
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ=="],
101
+
102
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw=="],
103
+
104
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw=="],
105
+
106
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA=="],
107
+
108
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.1", "", { "os": "linux", "cpu": "arm" }, "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ=="],
109
+
110
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg=="],
111
+
112
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w=="],
113
+
114
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ=="],
115
+
116
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ=="],
117
+
118
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g=="],
119
+
120
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw=="],
121
+
122
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g=="],
123
+
124
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ=="],
125
+
126
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g=="],
127
+
128
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q=="],
129
+
130
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw=="],
131
+
132
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg=="],
133
+
134
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.1", "", { "os": "none", "cpu": "arm64" }, "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA=="],
135
+
136
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g=="],
137
+
138
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ=="],
139
+
140
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ=="],
141
+
142
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.1", "", { "os": "win32", "cpu": "x64" }, "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw=="],
143
+
144
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
145
+
146
+ "@types/node": ["@types/node@25.9.2", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw=="],
147
+
148
+ "abstract-logging": ["abstract-logging@2.0.1", "", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="],
149
+
150
+ "acorn": ["acorn@8.16.0", "", { "bin": "bin/acorn" }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
151
+
152
+ "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
153
+
154
+ "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" }, "peerDependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
155
+
156
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
157
+
158
+ "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
159
+
160
+ "avvio": ["avvio@9.2.0", "", { "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ=="],
161
+
162
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
163
+
164
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
165
+
166
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
167
+
168
+ "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
169
+
170
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
171
+
172
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
173
+
174
+ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
175
+
176
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
177
+
178
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
179
+
180
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": "bin/esbuild" }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
181
+
182
+ "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
183
+
184
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
185
+
186
+ "fast-json-stringify": ["fast-json-stringify@6.4.0", "", { "dependencies": { "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0", "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ=="],
187
+
188
+ "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="],
189
+
190
+ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
191
+
192
+ "fastify": ["fastify@5.8.5", "", { "dependencies": { "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } }, "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q=="],
193
+
194
+ "fastify-plugin": ["fastify-plugin@5.1.0", "", {}, "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw=="],
195
+
196
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
197
+
198
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
199
+
200
+ "find-my-way": ["find-my-way@9.6.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ=="],
201
+
202
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
203
+
204
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
205
+
206
+ "ipaddr.js": ["ipaddr.js@2.4.0", "", {}, "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ=="],
207
+
208
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
209
+
210
+ "json-schema-ref-resolver": ["json-schema-ref-resolver@3.0.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A=="],
211
+
212
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
213
+
214
+ "light-my-request": ["light-my-request@6.6.0", "", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A=="],
215
+
216
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
217
+
218
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
219
+
220
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
221
+
222
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
223
+
224
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
225
+
226
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
227
+
228
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
229
+
230
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
231
+
232
+ "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="],
233
+
234
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
235
+
236
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
237
+
238
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
239
+
240
+ "pino": ["pino@10.3.1", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^4.0.0" }, "bin": "bin.js" }, "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg=="],
241
+
242
+ "pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="],
243
+
244
+ "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="],
245
+
246
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
247
+
248
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
249
+
250
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
251
+
252
+ "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="],
253
+
254
+ "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="],
255
+
256
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
257
+
258
+ "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="],
259
+
260
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
261
+
262
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
263
+
264
+ "ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="],
265
+
266
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
267
+
268
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
269
+
270
+ "rollup": ["rollup@4.61.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.1", "@rollup/rollup-android-arm64": "4.61.1", "@rollup/rollup-darwin-arm64": "4.61.1", "@rollup/rollup-darwin-x64": "4.61.1", "@rollup/rollup-freebsd-arm64": "4.61.1", "@rollup/rollup-freebsd-x64": "4.61.1", "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", "@rollup/rollup-linux-arm-musleabihf": "4.61.1", "@rollup/rollup-linux-arm64-gnu": "4.61.1", "@rollup/rollup-linux-arm64-musl": "4.61.1", "@rollup/rollup-linux-loong64-gnu": "4.61.1", "@rollup/rollup-linux-loong64-musl": "4.61.1", "@rollup/rollup-linux-ppc64-gnu": "4.61.1", "@rollup/rollup-linux-ppc64-musl": "4.61.1", "@rollup/rollup-linux-riscv64-gnu": "4.61.1", "@rollup/rollup-linux-riscv64-musl": "4.61.1", "@rollup/rollup-linux-s390x-gnu": "4.61.1", "@rollup/rollup-linux-x64-gnu": "4.61.1", "@rollup/rollup-linux-x64-musl": "4.61.1", "@rollup/rollup-openbsd-x64": "4.61.1", "@rollup/rollup-openharmony-arm64": "4.61.1", "@rollup/rollup-win32-arm64-msvc": "4.61.1", "@rollup/rollup-win32-ia32-msvc": "4.61.1", "@rollup/rollup-win32-x64-gnu": "4.61.1", "@rollup/rollup-win32-x64-msvc": "4.61.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA=="],
271
+
272
+ "safe-regex2": ["safe-regex2@5.1.1", "", { "dependencies": { "ret": "~0.5.0" }, "bin": "bin/safe-regex2.js" }, "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA=="],
273
+
274
+ "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
275
+
276
+ "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
277
+
278
+ "semver": ["semver@7.8.1", "", { "bin": "bin/semver.js" }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
279
+
280
+ "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="],
281
+
282
+ "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="],
283
+
284
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
285
+
286
+ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
287
+
288
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
289
+
290
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
291
+
292
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
293
+
294
+ "thread-stream": ["thread-stream@4.2.0", "", { "dependencies": { "real-require": "^1.0.0" } }, "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ=="],
295
+
296
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
297
+
298
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
299
+
300
+ "toad-cache": ["toad-cache@3.7.1", "", {}, "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ=="],
301
+
302
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": "cli.js" }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
303
+
304
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
305
+
306
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
307
+
308
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
309
+
310
+ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
311
+
312
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
313
+
314
+ "light-my-request/process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="],
315
+
316
+ "thread-stream/real-require": ["real-require@1.0.0", "", {}, "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g=="],
317
+ }
318
+ }
package/dist/index.d.ts CHANGED
@@ -526,18 +526,22 @@ declare class PostApiError extends Error {
526
526
  }
527
527
 
528
528
  interface ServiceAccountOptions {
529
+ issuerUrl: string;
529
530
  clientId: string;
530
531
  clientSecret: string;
531
532
  }
532
533
  interface PostPluginOptions {
533
- issuer: string;
534
534
  serviceAccount: ServiceAccountOptions;
535
535
  baseUrl?: string;
536
+ logLevel?: "trace" | "debug" | "info" | "warn" | "error" | "silent";
536
537
  }
537
538
  declare module "fastify" {
538
539
  interface FastifyInstance {
539
540
  postClient: PostClient;
540
541
  }
542
+ interface FastifyRequest {
543
+ postClient: PostClient;
544
+ }
541
545
  }
542
546
  declare const _default: FastifyPluginAsync<PostPluginOptions>;
543
547
 
package/dist/index.js CHANGED
@@ -374,12 +374,13 @@ function decodeJwtPayload(token) {
374
374
  }
375
375
  }
376
376
  var TokenProvider = class {
377
- constructor(options) {
377
+ constructor(options, log) {
378
378
  this.cached = null;
379
379
  this.inflight = null;
380
- this.issuerUrl = options.issuer.replace(/\/$/, "");
380
+ this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\/$/, "");
381
381
  this.clientId = options.serviceAccount.clientId;
382
382
  this.clientSecret = options.serviceAccount.clientSecret;
383
+ this.log = log;
383
384
  }
384
385
  async ensureFresh() {
385
386
  const now = Date.now();
@@ -397,6 +398,7 @@ var TokenProvider = class {
397
398
  return this.ensureFresh().then((c) => c.organizationId);
398
399
  }
399
400
  async fetchToken() {
401
+ this.log.debug("[@geekapps/post-fastify] fetching service account token");
400
402
  const credentials = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString("base64");
401
403
  const res = await fetch(`${this.issuerUrl}/auth/token`, {
402
404
  method: "POST",
@@ -408,7 +410,7 @@ var TokenProvider = class {
408
410
  });
409
411
  if (!res.ok) {
410
412
  const err = await res.json().catch(() => ({}));
411
- throw new Error(`GeekappsPost auth failed (${res.status}): ${err.error ?? "unknown error"}`);
413
+ throw new Error(`[@geekapps/post-fastify] auth failed (${res.status}): ${err.error ?? "unknown error"}`);
412
414
  }
413
415
  const data = await res.json();
414
416
  const claims = decodeJwtPayload(data.access_token);
@@ -418,18 +420,23 @@ var TokenProvider = class {
418
420
  expiresAt: Date.now() + (data.expires_in ?? 420) * 1e3,
419
421
  organizationId
420
422
  };
423
+ this.log.debug({ organizationId, expiresIn: data.expires_in }, "[@geekapps/post-fastify] token acquired");
421
424
  return this.cached;
422
425
  }
423
426
  };
424
427
  var postPlugin = async (fastify, options) => {
428
+ const log = options.logLevel ? fastify.log.child({ level: options.logLevel }) : fastify.log;
425
429
  const baseUrl = options.baseUrl ?? "https://post-api.geekapps.com.br";
426
- const provider = new TokenProvider(options);
430
+ const provider = new TokenProvider(options, log);
427
431
  const client = new PostClient({
428
432
  baseUrl,
429
433
  token: () => provider.getToken(),
430
434
  organizationId: () => provider.getOrganizationId()
431
435
  });
432
436
  fastify.decorate("postClient", client);
437
+ fastify.addHook("onRequest", async (request) => {
438
+ request.postClient = client;
439
+ });
433
440
  };
434
441
  var plugin_default = fp(postPlugin, {
435
442
  fastify: ">=4.0.0",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/domains.ts","../src/resources/history.ts","../src/resources/managed-numbers.ts","../src/resources/messages.ts","../src/resources/plans.ts","../src/resources/smtp.ts","../src/resources/statistics.ts","../src/resources/templates.ts","../src/resources/webhooks.ts","../src/resources/whatsapp-numbers.ts","../src/resources/whatsapp-templates.ts","../src/client.ts","../src/plugin.ts"],"sourcesContent":["export class PostApiError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly detail?: string,\n ) {\n super(detail ? `${message}: ${detail}` : message);\n this.name = \"PostApiError\";\n }\n\n get isNotFound() {\n return this.status === 404;\n }\n\n get isUnauthorized() {\n return this.status === 401;\n }\n\n get isForbidden() {\n return this.status === 403;\n }\n\n get isRateLimited() {\n return this.status === 429;\n }\n\n get isValidationError() {\n return this.status === 400;\n }\n}\n","import { PostApiError } from \"./errors.js\";\r\n\r\nexport type TokenResolver = string | (() => string | Promise<string>);\r\n\r\nexport interface HttpClientOptions {\r\n baseUrl: string;\r\n token: TokenResolver;\r\n organizationId?: string | (() => string | Promise<string>);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly token: TokenResolver;\r\n private readonly organizationId?: string | (() => string | Promise<string>);\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\r\n this.token = options.token;\r\n this.organizationId = options.organizationId;\r\n }\r\n\r\n private async resolveToken(): Promise<string> {\r\n return typeof this.token === \"function\" ? await this.token() : this.token;\r\n }\r\n\r\n private async resolveOrgId(): Promise<string | undefined> {\r\n if (!this.organizationId) return undefined;\r\n return typeof this.organizationId === \"function\"\r\n ? await this.organizationId()\r\n : this.organizationId;\r\n }\r\n\r\n async request<T = unknown>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n ): Promise<T> {\r\n const token = await this.resolveToken();\r\n const orgId = await this.resolveOrgId();\r\n\r\n const res = await fetch(`${this.baseUrl}/v1${path}`, {\r\n method,\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\r\n ...(orgId ? { \"X-Organization-Id\": orgId } : {}),\r\n },\r\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cache: \"no-store\" as any,\r\n });\r\n\r\n if (!res.ok) {\r\n const err = await res.json().catch(() => ({})) as {\r\n error?: string;\r\n detail?: string;\r\n };\r\n throw new PostApiError(\r\n res.status,\r\n err.error ?? `HTTP ${res.status}`,\r\n err.detail,\r\n );\r\n }\r\n\r\n if (res.status === 204) return undefined as T;\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n get<T>(path: string) {\r\n return this.request<T>(\"GET\", path);\r\n }\r\n\r\n post<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"POST\", path, body);\r\n }\r\n\r\n put<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"PUT\", path, body);\r\n }\r\n\r\n patch<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"PATCH\", path, body);\r\n }\r\n\r\n delete<T = void>(path: string) {\r\n return this.request<T>(\"DELETE\", path);\r\n }\r\n}\r\n","import type { HttpClient } from \"../http.js\";\nimport type { CreateDomainInput, CreateDomainResult, OrgDomain } from \"../types.js\";\n\nexport class DomainsResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<OrgDomain[]> {\n return this.http.get<OrgDomain[]>(\"/domains\");\n }\n\n get(id: string): Promise<OrgDomain> {\n return this.http.get<OrgDomain>(`/domains/${id}`);\n }\n\n create(input: CreateDomainInput): Promise<CreateDomainResult> {\n return this.http.post<CreateDomainResult>(\"/domains\", input);\n }\n\n verify(id: string): Promise<{ status: \"verified\" | \"failed\" }> {\n return this.http.post<{ status: \"verified\" | \"failed\" }>(`/domains/${id}/verify`);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/domains/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { ListHistoryParams, MessageLog, MessageLogDetail, PaginatedResult } from \"../types.js\";\n\nexport class HistoryResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: ListHistoryParams): Promise<PaginatedResult<MessageLog>> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.status) qs.set(\"status\", params.status);\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.page !== undefined) qs.set(\"page\", String(params.page));\n if (params?.limit !== undefined) qs.set(\"limit\", String(params.limit));\n const query = qs.toString();\n return this.http.get<PaginatedResult<MessageLog>>(`/history${query ? `?${query}` : \"\"}`);\n }\n\n get(id: string): Promise<MessageLogDetail> {\n return this.http.get<MessageLogDetail>(`/history/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { AreaCode, ManagedNumber } from \"../types.js\";\n\nexport interface ProvisionManagedNumberInput {\n areaCode: number;\n name?: string;\n displayName: string;\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n pin?: string;\n orgWabaId?: string;\n wabaId?: string;\n accessToken?: string;\n}\n\nexport interface RetryVerificationInput {\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n}\n\nexport class ManagedNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listAreaCodes(): Promise<AreaCode[]> {\n return this.http.get<AreaCode[]>(\"/managed-numbers/area-codes\");\n }\n\n list(): Promise<ManagedNumber[]> {\n return this.http.get<ManagedNumber[]>(\"/managed-numbers\");\n }\n\n get(id: string): Promise<ManagedNumber> {\n return this.http.get<ManagedNumber>(`/managed-numbers/${id}`);\n }\n\n provision(input: ProvisionManagedNumberInput): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(\"/managed-numbers\", input);\n }\n\n retryVerification(id: string, input?: RetryVerificationInput): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/retry-verification`, input);\n }\n\n cancel(id: string): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/cancel`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { SendMessageInput, SendMessageResult } from \"../types.js\";\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClient) {}\n\n send(input: SendMessageInput): Promise<SendMessageResult> {\n return this.http.post<SendMessageResult>(\"/messages\", input);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { AvailablePlan, OrgPlan, PlansResult, UpdatePlanInput } from \"../types.js\";\n\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n get(): Promise<PlansResult> {\n return this.http.get<PlansResult>(\"/plans\");\n }\n\n update(input: UpdatePlanInput): Promise<OrgPlan> {\n return this.http.put<OrgPlan>(\"/plans\", input);\n }\n\n listAvailable(): Promise<AvailablePlan[]> {\n return this.http.get<AvailablePlan[]>(\"/plans/available\");\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { SmtpConfig, UpsertSmtpConfigInput } from \"../types.js\";\n\nexport class SmtpResource {\n constructor(private readonly http: HttpClient) {}\n\n get(): Promise<SmtpConfig> {\n return this.http.get<SmtpConfig>(\"/smtp-config\");\n }\n\n upsert(input: UpsertSmtpConfigInput): Promise<SmtpConfig> {\n return this.http.put<SmtpConfig>(\"/smtp-config\", input);\n }\n\n delete(): Promise<void> {\n return this.http.delete(\"/smtp-config\");\n }\n\n test(to: string): Promise<{ success: boolean; error?: string }> {\n return this.http.post<{ success: boolean; error?: string }>(\"/smtp-config/test\", { to });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { StatisticsParams, StatisticsResult } from \"../types.js\";\n\nexport class StatisticsResource {\n constructor(private readonly http: HttpClient) {}\n\n get(params?: StatisticsParams): Promise<StatisticsResult> {\n const qs = new URLSearchParams();\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.groupBy) qs.set(\"groupBy\", params.groupBy);\n const query = qs.toString();\n return this.http.get<StatisticsResult>(`/statistics${query ? `?${query}` : \"\"}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateTemplateInput,\n MessageTemplate,\n MessageType,\n SaveDraftInput,\n UpdateTemplateInput,\n} from \"../types.js\";\n\nexport class TemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: { type?: MessageType; isActive?: boolean }): Promise<MessageTemplate[]> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.isActive !== undefined) qs.set(\"isActive\", String(params.isActive));\n const query = qs.toString();\n return this.http.get<MessageTemplate[]>(`/templates${query ? `?${query}` : \"\"}`);\n }\n\n get(id: string): Promise<MessageTemplate> {\n return this.http.get<MessageTemplate>(`/templates/${id}`);\n }\n\n create(input: CreateTemplateInput): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(\"/templates\", input);\n }\n\n update(id: string, input: UpdateTemplateInput): Promise<MessageTemplate> {\n return this.http.put<MessageTemplate>(`/templates/${id}`, input);\n }\n\n saveDraft(id: string, input: SaveDraftInput): Promise<MessageTemplate> {\n return this.http.patch<MessageTemplate>(`/templates/${id}/draft`, input);\n }\n\n publish(id: string): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(`/templates/${id}/publish`);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/templates/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateWebhookInput,\n OrgWebhook,\n OrgWebhookWithSecret,\n RotateSecretResult,\n UpdateWebhookInput,\n WebhookDelivery,\n} from \"../types.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<OrgWebhook[]> {\n return this.http.get<OrgWebhook[]>(\"/webhooks\");\n }\n\n create(input: CreateWebhookInput): Promise<OrgWebhookWithSecret> {\n return this.http.post<OrgWebhookWithSecret>(\"/webhooks\", input);\n }\n\n update(id: string, input: UpdateWebhookInput): Promise<OrgWebhook> {\n return this.http.put<OrgWebhook>(`/webhooks/${id}`, input);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/webhooks/${id}`);\n }\n\n listDeliveries(id: string): Promise<WebhookDelivery[]> {\n return this.http.get<WebhookDelivery[]>(`/webhooks/${id}/deliveries`);\n }\n\n rotateSecret(id: string): Promise<RotateSecretResult> {\n return this.http.post<RotateSecretResult>(`/webhooks/${id}/rotate-secret`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ConnectWabaInput,\n ConnectWhatsappNumberInput,\n OrgWaba,\n PhoneNumberStatusResult,\n RegisterWhatsappNumberInput,\n UpdateWhatsappProfileInput,\n WabaHealthResult,\n WhatsappNumber,\n WhatsappNumberProfile,\n} from \"../types.js\";\n\nexport class WhatsappNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n // ── WABAs ────────────────────────────────────────────────────────────────\n\n listWabas(): Promise<OrgWaba[]> {\n return this.http.get<OrgWaba[]>(\"/whatsapp/wabas\");\n }\n\n connectWaba(input: ConnectWabaInput): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(\"/whatsapp/wabas/connect\", input);\n }\n\n reconnectWaba(id: string): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(`/whatsapp/wabas/${id}/reconnect`);\n }\n\n disconnectWaba(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/wabas/${id}`);\n }\n\n getWabaHealth(id: string): Promise<WabaHealthResult> {\n return this.http.get<WabaHealthResult>(`/whatsapp/wabas/${id}/health`);\n }\n\n // ── Numbers ──────────────────────────────────────────────────────────────\n\n listNumbers(): Promise<WhatsappNumber[]> {\n return this.http.get<WhatsappNumber[]>(\"/whatsapp/numbers\");\n }\n\n connectNumber(input: ConnectWhatsappNumberInput): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers/connect\", input);\n }\n\n registerNumber(input: RegisterWhatsappNumberInput): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers\", input);\n }\n\n verifyCode(id: string, code: string): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(`/whatsapp/numbers/${id}/verify-code`, { code });\n }\n\n resendCode(id: string): Promise<void> {\n return this.http.post(`/whatsapp/numbers/${id}/resend-code`);\n }\n\n getProfile(id: string): Promise<WhatsappNumberProfile> {\n return this.http.get<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`);\n }\n\n updateProfile(id: string, input: UpdateWhatsappProfileInput): Promise<WhatsappNumberProfile> {\n return this.http.patch<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, input);\n }\n\n updateDisplayName(id: string, displayName: string): Promise<WhatsappNumber> {\n return this.http.patch<WhatsappNumber>(`/whatsapp/numbers/${id}`, { displayName });\n }\n\n getStatus(id: string): Promise<PhoneNumberStatusResult> {\n return this.http.get<PhoneNumberStatusResult>(`/whatsapp/numbers/${id}/status`);\n }\n\n refreshNumbers(): Promise<WhatsappNumber[]> {\n return this.http.post<WhatsappNumber[]>(\"/whatsapp/numbers/refresh\");\n }\n\n deleteNumber(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/numbers/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateWhatsappTemplateInput,\n SyncWhatsappTemplatesResult,\n UpdateWhatsappTemplateInput,\n WhatsappTemplate,\n} from \"../types.js\";\n\nexport class WhatsappTemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<WhatsappTemplate[]> {\n return this.http.get<WhatsappTemplate[]>(\"/whatsapp/templates\");\n }\n\n create(input: CreateWhatsappTemplateInput): Promise<WhatsappTemplate> {\n return this.http.post<WhatsappTemplate>(\"/whatsapp/templates\", input);\n }\n\n update(id: string, input: UpdateWhatsappTemplateInput): Promise<WhatsappTemplate> {\n return this.http.put<WhatsappTemplate>(`/whatsapp/templates/${id}`, input);\n }\n\n sync(): Promise<SyncWhatsappTemplatesResult> {\n return this.http.post<SyncWhatsappTemplatesResult>(\"/whatsapp/templates/sync\");\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/templates/${id}`);\n }\n}\n","import { HttpClient, type HttpClientOptions } from \"./http.js\";\nimport { DomainsResource } from \"./resources/domains.js\";\nimport { HistoryResource } from \"./resources/history.js\";\nimport { ManagedNumbersResource } from \"./resources/managed-numbers.js\";\nimport { MessagesResource } from \"./resources/messages.js\";\nimport { PlansResource } from \"./resources/plans.js\";\nimport { SmtpResource } from \"./resources/smtp.js\";\nimport { StatisticsResource } from \"./resources/statistics.js\";\nimport { TemplatesResource } from \"./resources/templates.js\";\nimport { WebhooksResource } from \"./resources/webhooks.js\";\nimport { WhatsappNumbersResource } from \"./resources/whatsapp-numbers.js\";\nimport { WhatsappTemplatesResource } from \"./resources/whatsapp-templates.js\";\n\nexport interface PostClientOptions\n extends Omit<HttpClientOptions, \"baseUrl\"> {\n baseUrl?: string;\n}\n\nexport class PostClient {\n private readonly http: HttpClient;\n\n readonly messages: MessagesResource;\n readonly templates: TemplatesResource;\n readonly whatsappTemplates: WhatsappTemplatesResource;\n readonly whatsappNumbers: WhatsappNumbersResource;\n readonly domains: DomainsResource;\n readonly webhooks: WebhooksResource;\n readonly smtp: SmtpResource;\n readonly plans: PlansResource;\n readonly history: HistoryResource;\n readonly statistics: StatisticsResource;\n readonly managedNumbers: ManagedNumbersResource;\n\n constructor(options: HttpClientOptions) {\n this.http = new HttpClient(options);\n\n this.messages = new MessagesResource(this.http);\n this.templates = new TemplatesResource(this.http);\n this.whatsappTemplates = new WhatsappTemplatesResource(this.http);\n this.whatsappNumbers = new WhatsappNumbersResource(this.http);\n this.domains = new DomainsResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.smtp = new SmtpResource(this.http);\n this.plans = new PlansResource(this.http);\n this.history = new HistoryResource(this.http);\n this.statistics = new StatisticsResource(this.http);\n this.managedNumbers = new ManagedNumbersResource(this.http);\n }\n}\n","import type { FastifyInstance, FastifyPluginAsync } from \"fastify\";\nimport fp from \"fastify-plugin\";\nimport { PostClient } from \"./client.js\";\n\nexport interface ServiceAccountOptions {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface PostPluginOptions {\n issuer: string;\n serviceAccount: ServiceAccountOptions;\n baseUrl?: string;\n}\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n organizationId: string | undefined;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n try {\n const [, payload] = token.split(\".\");\n if (!payload) return {};\n const json = Buffer.from(payload, \"base64url\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nclass TokenProvider {\n private readonly issuerUrl: string;\n private readonly clientId: string;\n private readonly clientSecret: string;\n private cached: CachedToken | null = null;\n private inflight: Promise<CachedToken> | null = null;\n\n constructor(options: PostPluginOptions) {\n this.issuerUrl = options.issuer.replace(/\\/$/, \"\");\n this.clientId = options.serviceAccount.clientId;\n this.clientSecret = options.serviceAccount.clientSecret;\n }\n\n private async ensureFresh(): Promise<CachedToken> {\n const now = Date.now();\n if (this.cached && this.cached.expiresAt - now > 30_000) return this.cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.fetchToken().finally(() => { this.inflight = null; });\n return this.inflight;\n }\n\n getToken(): Promise<string> {\n return this.ensureFresh().then((c) => c.value);\n }\n\n getOrganizationId(): Promise<string | undefined> {\n return this.ensureFresh().then((c) => c.organizationId);\n }\n\n private async fetchToken(): Promise<CachedToken> {\n const credentials = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString(\"base64\");\n const res = await fetch(`${this.issuerUrl}/auth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify({ grant_type: \"service_account\" }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new Error(`GeekappsPost auth failed (${res.status}): ${err.error ?? \"unknown error\"}`);\n }\n\n const data = await res.json() as { access_token: string; expires_in?: number };\n const claims = decodeJwtPayload(data.access_token);\n const organizationId =\n typeof claims.organizationId === \"string\" ? claims.organizationId :\n typeof claims.organization_id === \"string\" ? claims.organization_id :\n undefined;\n\n this.cached = {\n value: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 420) * 1000,\n organizationId,\n };\n return this.cached;\n }\n}\n\ndeclare module \"fastify\" {\n interface FastifyInstance {\n postClient: PostClient;\n }\n}\n\nconst postPlugin: FastifyPluginAsync<PostPluginOptions> = async (\n fastify: FastifyInstance,\n options: PostPluginOptions,\n) => {\n const baseUrl = options.baseUrl ?? \"https://post-api.geekapps.com.br\";\n const provider = new TokenProvider(options);\n\n const client = new PostClient({\n baseUrl,\n token: () => provider.getToken(),\n organizationId: () => provider.getOrganizationId() as Promise<string>,\n });\n\n fastify.decorate(\"postClient\", client);\n};\n\nexport default fp(postPlugin, {\n fastify: \">=4.0.0\",\n name: \"@geekapps/post-fastify\",\n});\n"],"mappings":";AAAO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,QAChB,SACgB,QAChB;AACA,UAAM,SAAS,GAAG,OAAO,KAAK,MAAM,KAAK,OAAO;AAJhC;AAEA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;;;ACnBO,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAY,SAA4B;AACtC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,QAAQ,QAAQ;AACrB,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAc,eAAgC;AAC5C,WAAO,OAAO,KAAK,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI,KAAK;AAAA,EACtE;AAAA,EAEA,MAAc,eAA4C;AACxD,QAAI,CAAC,KAAK,eAAgB,QAAO;AACjC,WAAO,OAAO,KAAK,mBAAmB,aAClC,MAAM,KAAK,eAAe,IAC1B,KAAK;AAAA,EACX;AAAA,EAEA,MAAM,QACJ,QACA,MACA,MACY;AACZ,UAAM,QAAQ,MAAM,KAAK,aAAa;AACtC,UAAM,QAAQ,MAAM,KAAK,aAAa;AAEtC,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,MAAM,IAAI,IAAI;AAAA,MACnD;AAAA,MACA,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,GAAI,SAAS,SAAY,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,QACnE,GAAI,QAAQ,EAAE,qBAAqB,MAAM,IAAI,CAAC;AAAA,MAChD;AAAA,MACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA;AAAA,MAE3D,OAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAI7C,YAAM,IAAI;AAAA,QACR,IAAI;AAAA,QACJ,IAAI,SAAS,QAAQ,IAAI,MAAM;AAAA,QAC/B,IAAI;AAAA,MACN;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,IAAK,QAAO;AAC/B,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,IAAO,MAAc;AACnB,WAAO,KAAK,QAAW,OAAO,IAAI;AAAA,EACpC;AAAA,EAEA,KAAQ,MAAc,MAAgB;AACpC,WAAO,KAAK,QAAW,QAAQ,MAAM,IAAI;AAAA,EAC3C;AAAA,EAEA,IAAO,MAAc,MAAgB;AACnC,WAAO,KAAK,QAAW,OAAO,MAAM,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAS,MAAc,MAAgB;AACrC,WAAO,KAAK,QAAW,SAAS,MAAM,IAAI;AAAA,EAC5C;AAAA,EAEA,OAAiB,MAAc;AAC7B,WAAO,KAAK,QAAW,UAAU,IAAI;AAAA,EACvC;AACF;;;ACpFO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,OAA6B;AAC3B,WAAO,KAAK,KAAK,IAAiB,UAAU;AAAA,EAC9C;AAAA,EAEA,IAAI,IAAgC;AAClC,WAAO,KAAK,KAAK,IAAe,YAAY,EAAE,EAAE;AAAA,EAClD;AAAA,EAEA,OAAO,OAAuD;AAC5D,WAAO,KAAK,KAAK,KAAyB,YAAY,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,IAAwD;AAC7D,WAAO,KAAK,KAAK,KAAwC,YAAY,EAAE,SAAS;AAAA,EAClF;AAAA,EAEA,OAAO,IAA2B;AAChC,WAAO,KAAK,KAAK,OAAO,YAAY,EAAE,EAAE;AAAA,EAC1C;AACF;;;ACtBO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,KAAK,QAAkE;AACrE,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,QAAQ,KAAM,IAAG,IAAI,QAAQ,OAAO,IAAI;AAC5C,QAAI,QAAQ,OAAQ,IAAG,IAAI,UAAU,OAAO,MAAM;AAClD,QAAI,QAAQ,KAAM,IAAG,IAAI,QAAQ,OAAO,IAAI;AAC5C,QAAI,QAAQ,GAAI,IAAG,IAAI,MAAM,OAAO,EAAE;AACtC,QAAI,QAAQ,SAAS,OAAW,IAAG,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AAClE,QAAI,QAAQ,UAAU,OAAW,IAAG,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACrE,UAAM,QAAQ,GAAG,SAAS;AAC1B,WAAO,KAAK,KAAK,IAAiC,WAAW,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EACzF;AAAA,EAEA,IAAI,IAAuC;AACzC,WAAO,KAAK,KAAK,IAAsB,YAAY,EAAE,EAAE;AAAA,EACzD;AACF;;;ACDO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,gBAAqC;AACnC,WAAO,KAAK,KAAK,IAAgB,6BAA6B;AAAA,EAChE;AAAA,EAEA,OAAiC;AAC/B,WAAO,KAAK,KAAK,IAAqB,kBAAkB;AAAA,EAC1D;AAAA,EAEA,IAAI,IAAoC;AACtC,WAAO,KAAK,KAAK,IAAmB,oBAAoB,EAAE,EAAE;AAAA,EAC9D;AAAA,EAEA,UAAU,OAA4D;AACpE,WAAO,KAAK,KAAK,KAAoB,oBAAoB,KAAK;AAAA,EAChE;AAAA,EAEA,kBAAkB,IAAY,OAAwD;AACpF,WAAO,KAAK,KAAK,KAAoB,oBAAoB,EAAE,uBAAuB,KAAK;AAAA,EACzF;AAAA,EAEA,OAAO,IAAoC;AACzC,WAAO,KAAK,KAAK,KAAoB,oBAAoB,EAAE,SAAS;AAAA,EACtE;AACF;;;AC3CO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,KAAK,OAAqD;AACxD,WAAO,KAAK,KAAK,KAAwB,aAAa,KAAK;AAAA,EAC7D;AACF;;;ACNO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAA4B;AAC1B,WAAO,KAAK,KAAK,IAAiB,QAAQ;AAAA,EAC5C;AAAA,EAEA,OAAO,OAA0C;AAC/C,WAAO,KAAK,KAAK,IAAa,UAAU,KAAK;AAAA,EAC/C;AAAA,EAEA,gBAA0C;AACxC,WAAO,KAAK,KAAK,IAAqB,kBAAkB;AAAA,EAC1D;AACF;;;ACdO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAA2B;AACzB,WAAO,KAAK,KAAK,IAAgB,cAAc;AAAA,EACjD;AAAA,EAEA,OAAO,OAAmD;AACxD,WAAO,KAAK,KAAK,IAAgB,gBAAgB,KAAK;AAAA,EACxD;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK,KAAK,OAAO,cAAc;AAAA,EACxC;AAAA,EAEA,KAAK,IAA2D;AAC9D,WAAO,KAAK,KAAK,KAA2C,qBAAqB,EAAE,GAAG,CAAC;AAAA,EACzF;AACF;;;AClBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,IAAI,QAAsD;AACxD,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,QAAQ,KAAM,IAAG,IAAI,QAAQ,OAAO,IAAI;AAC5C,QAAI,QAAQ,GAAI,IAAG,IAAI,MAAM,OAAO,EAAE;AACtC,QAAI,QAAQ,QAAS,IAAG,IAAI,WAAW,OAAO,OAAO;AACrD,UAAM,QAAQ,GAAG,SAAS;AAC1B,WAAO,KAAK,KAAK,IAAsB,cAAc,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EACjF;AACF;;;ACLO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,KAAK,QAAiF;AACpF,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,QAAQ,KAAM,IAAG,IAAI,QAAQ,OAAO,IAAI;AAC5C,QAAI,QAAQ,aAAa,OAAW,IAAG,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC9E,UAAM,QAAQ,GAAG,SAAS;AAC1B,WAAO,KAAK,KAAK,IAAuB,aAAa,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EACjF;AAAA,EAEA,IAAI,IAAsC;AACxC,WAAO,KAAK,KAAK,IAAqB,cAAc,EAAE,EAAE;AAAA,EAC1D;AAAA,EAEA,OAAO,OAAsD;AAC3D,WAAO,KAAK,KAAK,KAAsB,cAAc,KAAK;AAAA,EAC5D;AAAA,EAEA,OAAO,IAAY,OAAsD;AACvE,WAAO,KAAK,KAAK,IAAqB,cAAc,EAAE,IAAI,KAAK;AAAA,EACjE;AAAA,EAEA,UAAU,IAAY,OAAiD;AACrE,WAAO,KAAK,KAAK,MAAuB,cAAc,EAAE,UAAU,KAAK;AAAA,EACzE;AAAA,EAEA,QAAQ,IAAsC;AAC5C,WAAO,KAAK,KAAK,KAAsB,cAAc,EAAE,UAAU;AAAA,EACnE;AAAA,EAEA,OAAO,IAA2B;AAChC,WAAO,KAAK,KAAK,OAAO,cAAc,EAAE,EAAE;AAAA,EAC5C;AACF;;;ACjCO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,OAA8B;AAC5B,WAAO,KAAK,KAAK,IAAkB,WAAW;AAAA,EAChD;AAAA,EAEA,OAAO,OAA0D;AAC/D,WAAO,KAAK,KAAK,KAA2B,aAAa,KAAK;AAAA,EAChE;AAAA,EAEA,OAAO,IAAY,OAAgD;AACjE,WAAO,KAAK,KAAK,IAAgB,aAAa,EAAE,IAAI,KAAK;AAAA,EAC3D;AAAA,EAEA,OAAO,IAA2B;AAChC,WAAO,KAAK,KAAK,OAAO,aAAa,EAAE,EAAE;AAAA,EAC3C;AAAA,EAEA,eAAe,IAAwC;AACrD,WAAO,KAAK,KAAK,IAAuB,aAAa,EAAE,aAAa;AAAA,EACtE;AAAA,EAEA,aAAa,IAAyC;AACpD,WAAO,KAAK,KAAK,KAAyB,aAAa,EAAE,gBAAgB;AAAA,EAC3E;AACF;;;ACvBO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA,EAIhD,YAAgC;AAC9B,WAAO,KAAK,KAAK,IAAe,iBAAiB;AAAA,EACnD;AAAA,EAEA,YAAY,OAA2C;AACrD,WAAO,KAAK,KAAK,KAAc,2BAA2B,KAAK;AAAA,EACjE;AAAA,EAEA,cAAc,IAA8B;AAC1C,WAAO,KAAK,KAAK,KAAc,mBAAmB,EAAE,YAAY;AAAA,EAClE;AAAA,EAEA,eAAe,IAA2B;AACxC,WAAO,KAAK,KAAK,OAAO,mBAAmB,EAAE,EAAE;AAAA,EACjD;AAAA,EAEA,cAAc,IAAuC;AACnD,WAAO,KAAK,KAAK,IAAsB,mBAAmB,EAAE,SAAS;AAAA,EACvE;AAAA;AAAA,EAIA,cAAyC;AACvC,WAAO,KAAK,KAAK,IAAsB,mBAAmB;AAAA,EAC5D;AAAA,EAEA,cAAc,OAA4D;AACxE,WAAO,KAAK,KAAK,KAAqB,6BAA6B,KAAK;AAAA,EAC1E;AAAA,EAEA,eAAe,OAA6D;AAC1E,WAAO,KAAK,KAAK,KAAqB,qBAAqB,KAAK;AAAA,EAClE;AAAA,EAEA,WAAW,IAAY,MAAuC;AAC5D,WAAO,KAAK,KAAK,KAAqB,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,CAAC;AAAA,EACvF;AAAA,EAEA,WAAW,IAA2B;AACpC,WAAO,KAAK,KAAK,KAAK,qBAAqB,EAAE,cAAc;AAAA,EAC7D;AAAA,EAEA,WAAW,IAA4C;AACrD,WAAO,KAAK,KAAK,IAA2B,qBAAqB,EAAE,UAAU;AAAA,EAC/E;AAAA,EAEA,cAAc,IAAY,OAAmE;AAC3F,WAAO,KAAK,KAAK,MAA6B,qBAAqB,EAAE,YAAY,KAAK;AAAA,EACxF;AAAA,EAEA,kBAAkB,IAAY,aAA8C;AAC1E,WAAO,KAAK,KAAK,MAAsB,qBAAqB,EAAE,IAAI,EAAE,YAAY,CAAC;AAAA,EACnF;AAAA,EAEA,UAAU,IAA8C;AACtD,WAAO,KAAK,KAAK,IAA6B,qBAAqB,EAAE,SAAS;AAAA,EAChF;AAAA,EAEA,iBAA4C;AAC1C,WAAO,KAAK,KAAK,KAAuB,2BAA2B;AAAA,EACrE;AAAA,EAEA,aAAa,IAA2B;AACtC,WAAO,KAAK,KAAK,OAAO,qBAAqB,EAAE,EAAE;AAAA,EACnD;AACF;;;AC3EO,IAAM,4BAAN,MAAgC;AAAA,EACrC,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,OAAoC;AAClC,WAAO,KAAK,KAAK,IAAwB,qBAAqB;AAAA,EAChE;AAAA,EAEA,OAAO,OAA+D;AACpE,WAAO,KAAK,KAAK,KAAuB,uBAAuB,KAAK;AAAA,EACtE;AAAA,EAEA,OAAO,IAAY,OAA+D;AAChF,WAAO,KAAK,KAAK,IAAsB,uBAAuB,EAAE,IAAI,KAAK;AAAA,EAC3E;AAAA,EAEA,OAA6C;AAC3C,WAAO,KAAK,KAAK,KAAkC,0BAA0B;AAAA,EAC/E;AAAA,EAEA,OAAO,IAA2B;AAChC,WAAO,KAAK,KAAK,OAAO,uBAAuB,EAAE,EAAE;AAAA,EACrD;AACF;;;ACZO,IAAM,aAAN,MAAiB;AAAA,EAetB,YAAY,SAA4B;AACtC,SAAK,OAAO,IAAI,WAAW,OAAO;AAElC,SAAK,WAAW,IAAI,iBAAiB,KAAK,IAAI;AAC9C,SAAK,YAAY,IAAI,kBAAkB,KAAK,IAAI;AAChD,SAAK,oBAAoB,IAAI,0BAA0B,KAAK,IAAI;AAChE,SAAK,kBAAkB,IAAI,wBAAwB,KAAK,IAAI;AAC5D,SAAK,UAAU,IAAI,gBAAgB,KAAK,IAAI;AAC5C,SAAK,WAAW,IAAI,iBAAiB,KAAK,IAAI;AAC9C,SAAK,OAAO,IAAI,aAAa,KAAK,IAAI;AACtC,SAAK,QAAQ,IAAI,cAAc,KAAK,IAAI;AACxC,SAAK,UAAU,IAAI,gBAAgB,KAAK,IAAI;AAC5C,SAAK,aAAa,IAAI,mBAAmB,KAAK,IAAI;AAClD,SAAK,iBAAiB,IAAI,uBAAuB,KAAK,IAAI;AAAA,EAC5D;AACF;;;AC/CA,OAAO,QAAQ;AAoBf,SAAS,iBAAiB,OAAwC;AAChE,MAAI;AACF,UAAM,CAAC,EAAE,OAAO,IAAI,MAAM,MAAM,GAAG;AACnC,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,UAAM,OAAO,OAAO,KAAK,SAAS,WAAW,EAAE,SAAS,OAAO;AAC/D,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAOlB,YAAY,SAA4B;AAHxC,SAAQ,SAA6B;AACrC,SAAQ,WAAwC;AAG9C,SAAK,YAAY,QAAQ,OAAO,QAAQ,OAAO,EAAE;AACjD,SAAK,WAAW,QAAQ,eAAe;AACvC,SAAK,eAAe,QAAQ,eAAe;AAAA,EAC7C;AAAA,EAEA,MAAc,cAAoC;AAChD,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,KAAK,UAAU,KAAK,OAAO,YAAY,MAAM,IAAQ,QAAO,KAAK;AACrE,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,SAAK,WAAW,KAAK,WAAW,EAAE,QAAQ,MAAM;AAAE,WAAK,WAAW;AAAA,IAAM,CAAC;AACzE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAA4B;AAC1B,WAAO,KAAK,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,EAC/C;AAAA,EAEA,oBAAiD;AAC/C,WAAO,KAAK,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc;AAAA,EACxD;AAAA,EAEA,MAAc,aAAmC;AAC/C,UAAM,cAAc,OAAO,KAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,YAAY,EAAE,EAAE,SAAS,QAAQ;AAC1F,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,SAAS,eAAe;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,SAAS,WAAW;AAAA,MACrC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,YAAY,kBAAkB,CAAC;AAAA,IACxD,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,YAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,MAAM,IAAI,SAAS,eAAe,EAAE;AAAA,IAC7F;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,SAAS,iBAAiB,KAAK,YAAY;AACjD,UAAM,iBACJ,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBACnD,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBACpD;AAEF,SAAK,SAAS;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,IAAI,KAAK,KAAK,cAAc,OAAO;AAAA,MACnD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAQA,IAAM,aAAoD,OACxD,SACA,YACG;AACH,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,IAAI,cAAc,OAAO;AAE1C,QAAM,SAAS,IAAI,WAAW;AAAA,IAC5B;AAAA,IACA,OAAO,MAAM,SAAS,SAAS;AAAA,IAC/B,gBAAgB,MAAM,SAAS,kBAAkB;AAAA,EACnD,CAAC;AAED,UAAQ,SAAS,cAAc,MAAM;AACvC;AAEA,IAAO,iBAAQ,GAAG,YAAY;AAAA,EAC5B,SAAS;AAAA,EACT,MAAM;AACR,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/domains.ts","../src/resources/history.ts","../src/resources/managed-numbers.ts","../src/resources/messages.ts","../src/resources/plans.ts","../src/resources/smtp.ts","../src/resources/statistics.ts","../src/resources/templates.ts","../src/resources/webhooks.ts","../src/resources/whatsapp-numbers.ts","../src/resources/whatsapp-templates.ts","../src/client.ts","../src/plugin.ts"],"sourcesContent":["export class PostApiError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly detail?: string,\n ) {\n super(detail ? `${message}: ${detail}` : message);\n this.name = \"PostApiError\";\n }\n\n get isNotFound() {\n return this.status === 404;\n }\n\n get isUnauthorized() {\n return this.status === 401;\n }\n\n get isForbidden() {\n return this.status === 403;\n }\n\n get isRateLimited() {\n return this.status === 429;\n }\n\n get isValidationError() {\n return this.status === 400;\n }\n}\n","import { PostApiError } from \"./errors.js\";\r\n\r\nexport type TokenResolver = string | (() => string | Promise<string>);\r\n\r\nexport interface HttpClientOptions {\r\n baseUrl: string;\r\n token: TokenResolver;\r\n organizationId?: string | (() => string | Promise<string>);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly token: TokenResolver;\r\n private readonly organizationId?: string | (() => string | Promise<string>);\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\r\n this.token = options.token;\r\n this.organizationId = options.organizationId;\r\n }\r\n\r\n private async resolveToken(): Promise<string> {\r\n return typeof this.token === \"function\" ? await this.token() : this.token;\r\n }\r\n\r\n private async resolveOrgId(): Promise<string | undefined> {\r\n if (!this.organizationId) return undefined;\r\n return typeof this.organizationId === \"function\"\r\n ? await this.organizationId()\r\n : this.organizationId;\r\n }\r\n\r\n async request<T = unknown>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n ): Promise<T> {\r\n const token = await this.resolveToken();\r\n const orgId = await this.resolveOrgId();\r\n\r\n const res = await fetch(`${this.baseUrl}/v1${path}`, {\r\n method,\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n ...(body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\r\n ...(orgId ? { \"X-Organization-Id\": orgId } : {}),\r\n },\r\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cache: \"no-store\" as any,\r\n });\r\n\r\n if (!res.ok) {\r\n const err = await res.json().catch(() => ({})) as {\r\n error?: string;\r\n detail?: string;\r\n };\r\n throw new PostApiError(\r\n res.status,\r\n err.error ?? `HTTP ${res.status}`,\r\n err.detail,\r\n );\r\n }\r\n\r\n if (res.status === 204) return undefined as T;\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n get<T>(path: string) {\r\n return this.request<T>(\"GET\", path);\r\n }\r\n\r\n post<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"POST\", path, body);\r\n }\r\n\r\n put<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"PUT\", path, body);\r\n }\r\n\r\n patch<T>(path: string, body?: unknown) {\r\n return this.request<T>(\"PATCH\", path, body);\r\n }\r\n\r\n delete<T = void>(path: string) {\r\n return this.request<T>(\"DELETE\", path);\r\n }\r\n}\r\n","import type { HttpClient } from \"../http.js\";\nimport type { CreateDomainInput, CreateDomainResult, OrgDomain } from \"../types.js\";\n\nexport class DomainsResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<OrgDomain[]> {\n return this.http.get<OrgDomain[]>(\"/domains\");\n }\n\n get(id: string): Promise<OrgDomain> {\n return this.http.get<OrgDomain>(`/domains/${id}`);\n }\n\n create(input: CreateDomainInput): Promise<CreateDomainResult> {\n return this.http.post<CreateDomainResult>(\"/domains\", input);\n }\n\n verify(id: string): Promise<{ status: \"verified\" | \"failed\" }> {\n return this.http.post<{ status: \"verified\" | \"failed\" }>(`/domains/${id}/verify`);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/domains/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { ListHistoryParams, MessageLog, MessageLogDetail, PaginatedResult } from \"../types.js\";\n\nexport class HistoryResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: ListHistoryParams): Promise<PaginatedResult<MessageLog>> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.status) qs.set(\"status\", params.status);\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.page !== undefined) qs.set(\"page\", String(params.page));\n if (params?.limit !== undefined) qs.set(\"limit\", String(params.limit));\n const query = qs.toString();\n return this.http.get<PaginatedResult<MessageLog>>(`/history${query ? `?${query}` : \"\"}`);\n }\n\n get(id: string): Promise<MessageLogDetail> {\n return this.http.get<MessageLogDetail>(`/history/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { AreaCode, ManagedNumber } from \"../types.js\";\n\nexport interface ProvisionManagedNumberInput {\n areaCode: number;\n name?: string;\n displayName: string;\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n pin?: string;\n orgWabaId?: string;\n wabaId?: string;\n accessToken?: string;\n}\n\nexport interface RetryVerificationInput {\n otpMethod?: \"SMS\" | \"VOICE\";\n otpLanguage?: string;\n}\n\nexport class ManagedNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n listAreaCodes(): Promise<AreaCode[]> {\n return this.http.get<AreaCode[]>(\"/managed-numbers/area-codes\");\n }\n\n list(): Promise<ManagedNumber[]> {\n return this.http.get<ManagedNumber[]>(\"/managed-numbers\");\n }\n\n get(id: string): Promise<ManagedNumber> {\n return this.http.get<ManagedNumber>(`/managed-numbers/${id}`);\n }\n\n provision(input: ProvisionManagedNumberInput): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(\"/managed-numbers\", input);\n }\n\n retryVerification(id: string, input?: RetryVerificationInput): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/retry-verification`, input);\n }\n\n cancel(id: string): Promise<ManagedNumber> {\n return this.http.post<ManagedNumber>(`/managed-numbers/${id}/cancel`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { SendMessageInput, SendMessageResult } from \"../types.js\";\n\nexport class MessagesResource {\n constructor(private readonly http: HttpClient) {}\n\n send(input: SendMessageInput): Promise<SendMessageResult> {\n return this.http.post<SendMessageResult>(\"/messages\", input);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { AvailablePlan, OrgPlan, PlansResult, UpdatePlanInput } from \"../types.js\";\n\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n get(): Promise<PlansResult> {\n return this.http.get<PlansResult>(\"/plans\");\n }\n\n update(input: UpdatePlanInput): Promise<OrgPlan> {\n return this.http.put<OrgPlan>(\"/plans\", input);\n }\n\n listAvailable(): Promise<AvailablePlan[]> {\n return this.http.get<AvailablePlan[]>(\"/plans/available\");\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { SmtpConfig, UpsertSmtpConfigInput } from \"../types.js\";\n\nexport class SmtpResource {\n constructor(private readonly http: HttpClient) {}\n\n get(): Promise<SmtpConfig> {\n return this.http.get<SmtpConfig>(\"/smtp-config\");\n }\n\n upsert(input: UpsertSmtpConfigInput): Promise<SmtpConfig> {\n return this.http.put<SmtpConfig>(\"/smtp-config\", input);\n }\n\n delete(): Promise<void> {\n return this.http.delete(\"/smtp-config\");\n }\n\n test(to: string): Promise<{ success: boolean; error?: string }> {\n return this.http.post<{ success: boolean; error?: string }>(\"/smtp-config/test\", { to });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type { StatisticsParams, StatisticsResult } from \"../types.js\";\n\nexport class StatisticsResource {\n constructor(private readonly http: HttpClient) {}\n\n get(params?: StatisticsParams): Promise<StatisticsResult> {\n const qs = new URLSearchParams();\n if (params?.from) qs.set(\"from\", params.from);\n if (params?.to) qs.set(\"to\", params.to);\n if (params?.groupBy) qs.set(\"groupBy\", params.groupBy);\n const query = qs.toString();\n return this.http.get<StatisticsResult>(`/statistics${query ? `?${query}` : \"\"}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateTemplateInput,\n MessageTemplate,\n MessageType,\n SaveDraftInput,\n UpdateTemplateInput,\n} from \"../types.js\";\n\nexport class TemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(params?: { type?: MessageType; isActive?: boolean }): Promise<MessageTemplate[]> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set(\"type\", params.type);\n if (params?.isActive !== undefined) qs.set(\"isActive\", String(params.isActive));\n const query = qs.toString();\n return this.http.get<MessageTemplate[]>(`/templates${query ? `?${query}` : \"\"}`);\n }\n\n get(id: string): Promise<MessageTemplate> {\n return this.http.get<MessageTemplate>(`/templates/${id}`);\n }\n\n create(input: CreateTemplateInput): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(\"/templates\", input);\n }\n\n update(id: string, input: UpdateTemplateInput): Promise<MessageTemplate> {\n return this.http.put<MessageTemplate>(`/templates/${id}`, input);\n }\n\n saveDraft(id: string, input: SaveDraftInput): Promise<MessageTemplate> {\n return this.http.patch<MessageTemplate>(`/templates/${id}/draft`, input);\n }\n\n publish(id: string): Promise<MessageTemplate> {\n return this.http.post<MessageTemplate>(`/templates/${id}/publish`);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/templates/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateWebhookInput,\n OrgWebhook,\n OrgWebhookWithSecret,\n RotateSecretResult,\n UpdateWebhookInput,\n WebhookDelivery,\n} from \"../types.js\";\n\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<OrgWebhook[]> {\n return this.http.get<OrgWebhook[]>(\"/webhooks\");\n }\n\n create(input: CreateWebhookInput): Promise<OrgWebhookWithSecret> {\n return this.http.post<OrgWebhookWithSecret>(\"/webhooks\", input);\n }\n\n update(id: string, input: UpdateWebhookInput): Promise<OrgWebhook> {\n return this.http.put<OrgWebhook>(`/webhooks/${id}`, input);\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/webhooks/${id}`);\n }\n\n listDeliveries(id: string): Promise<WebhookDelivery[]> {\n return this.http.get<WebhookDelivery[]>(`/webhooks/${id}/deliveries`);\n }\n\n rotateSecret(id: string): Promise<RotateSecretResult> {\n return this.http.post<RotateSecretResult>(`/webhooks/${id}/rotate-secret`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ConnectWabaInput,\n ConnectWhatsappNumberInput,\n OrgWaba,\n PhoneNumberStatusResult,\n RegisterWhatsappNumberInput,\n UpdateWhatsappProfileInput,\n WabaHealthResult,\n WhatsappNumber,\n WhatsappNumberProfile,\n} from \"../types.js\";\n\nexport class WhatsappNumbersResource {\n constructor(private readonly http: HttpClient) {}\n\n // ── WABAs ────────────────────────────────────────────────────────────────\n\n listWabas(): Promise<OrgWaba[]> {\n return this.http.get<OrgWaba[]>(\"/whatsapp/wabas\");\n }\n\n connectWaba(input: ConnectWabaInput): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(\"/whatsapp/wabas/connect\", input);\n }\n\n reconnectWaba(id: string): Promise<OrgWaba> {\n return this.http.post<OrgWaba>(`/whatsapp/wabas/${id}/reconnect`);\n }\n\n disconnectWaba(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/wabas/${id}`);\n }\n\n getWabaHealth(id: string): Promise<WabaHealthResult> {\n return this.http.get<WabaHealthResult>(`/whatsapp/wabas/${id}/health`);\n }\n\n // ── Numbers ──────────────────────────────────────────────────────────────\n\n listNumbers(): Promise<WhatsappNumber[]> {\n return this.http.get<WhatsappNumber[]>(\"/whatsapp/numbers\");\n }\n\n connectNumber(input: ConnectWhatsappNumberInput): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers/connect\", input);\n }\n\n registerNumber(input: RegisterWhatsappNumberInput): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(\"/whatsapp/numbers\", input);\n }\n\n verifyCode(id: string, code: string): Promise<WhatsappNumber> {\n return this.http.post<WhatsappNumber>(`/whatsapp/numbers/${id}/verify-code`, { code });\n }\n\n resendCode(id: string): Promise<void> {\n return this.http.post(`/whatsapp/numbers/${id}/resend-code`);\n }\n\n getProfile(id: string): Promise<WhatsappNumberProfile> {\n return this.http.get<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`);\n }\n\n updateProfile(id: string, input: UpdateWhatsappProfileInput): Promise<WhatsappNumberProfile> {\n return this.http.patch<WhatsappNumberProfile>(`/whatsapp/numbers/${id}/profile`, input);\n }\n\n updateDisplayName(id: string, displayName: string): Promise<WhatsappNumber> {\n return this.http.patch<WhatsappNumber>(`/whatsapp/numbers/${id}`, { displayName });\n }\n\n getStatus(id: string): Promise<PhoneNumberStatusResult> {\n return this.http.get<PhoneNumberStatusResult>(`/whatsapp/numbers/${id}/status`);\n }\n\n refreshNumbers(): Promise<WhatsappNumber[]> {\n return this.http.post<WhatsappNumber[]>(\"/whatsapp/numbers/refresh\");\n }\n\n deleteNumber(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/numbers/${id}`);\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n CreateWhatsappTemplateInput,\n SyncWhatsappTemplatesResult,\n UpdateWhatsappTemplateInput,\n WhatsappTemplate,\n} from \"../types.js\";\n\nexport class WhatsappTemplatesResource {\n constructor(private readonly http: HttpClient) {}\n\n list(): Promise<WhatsappTemplate[]> {\n return this.http.get<WhatsappTemplate[]>(\"/whatsapp/templates\");\n }\n\n create(input: CreateWhatsappTemplateInput): Promise<WhatsappTemplate> {\n return this.http.post<WhatsappTemplate>(\"/whatsapp/templates\", input);\n }\n\n update(id: string, input: UpdateWhatsappTemplateInput): Promise<WhatsappTemplate> {\n return this.http.put<WhatsappTemplate>(`/whatsapp/templates/${id}`, input);\n }\n\n sync(): Promise<SyncWhatsappTemplatesResult> {\n return this.http.post<SyncWhatsappTemplatesResult>(\"/whatsapp/templates/sync\");\n }\n\n delete(id: string): Promise<void> {\n return this.http.delete(`/whatsapp/templates/${id}`);\n }\n}\n","import { HttpClient, type HttpClientOptions } from \"./http.js\";\nimport { DomainsResource } from \"./resources/domains.js\";\nimport { HistoryResource } from \"./resources/history.js\";\nimport { ManagedNumbersResource } from \"./resources/managed-numbers.js\";\nimport { MessagesResource } from \"./resources/messages.js\";\nimport { PlansResource } from \"./resources/plans.js\";\nimport { SmtpResource } from \"./resources/smtp.js\";\nimport { StatisticsResource } from \"./resources/statistics.js\";\nimport { TemplatesResource } from \"./resources/templates.js\";\nimport { WebhooksResource } from \"./resources/webhooks.js\";\nimport { WhatsappNumbersResource } from \"./resources/whatsapp-numbers.js\";\nimport { WhatsappTemplatesResource } from \"./resources/whatsapp-templates.js\";\n\nexport interface PostClientOptions\n extends Omit<HttpClientOptions, \"baseUrl\"> {\n baseUrl?: string;\n}\n\nexport class PostClient {\n private readonly http: HttpClient;\n\n readonly messages: MessagesResource;\n readonly templates: TemplatesResource;\n readonly whatsappTemplates: WhatsappTemplatesResource;\n readonly whatsappNumbers: WhatsappNumbersResource;\n readonly domains: DomainsResource;\n readonly webhooks: WebhooksResource;\n readonly smtp: SmtpResource;\n readonly plans: PlansResource;\n readonly history: HistoryResource;\n readonly statistics: StatisticsResource;\n readonly managedNumbers: ManagedNumbersResource;\n\n constructor(options: HttpClientOptions) {\n this.http = new HttpClient(options);\n\n this.messages = new MessagesResource(this.http);\n this.templates = new TemplatesResource(this.http);\n this.whatsappTemplates = new WhatsappTemplatesResource(this.http);\n this.whatsappNumbers = new WhatsappNumbersResource(this.http);\n this.domains = new DomainsResource(this.http);\n this.webhooks = new WebhooksResource(this.http);\n this.smtp = new SmtpResource(this.http);\n this.plans = new PlansResource(this.http);\n this.history = new HistoryResource(this.http);\n this.statistics = new StatisticsResource(this.http);\n this.managedNumbers = new ManagedNumbersResource(this.http);\n }\n}\n","import type { FastifyBaseLogger, FastifyInstance, FastifyPluginAsync, FastifyRequest } from \"fastify\";\nimport fp from \"fastify-plugin\";\nimport { PostClient } from \"./client.js\";\n\nexport interface ServiceAccountOptions {\n issuerUrl: string;\n clientId: string;\n clientSecret: string;\n}\n\nexport interface PostPluginOptions {\n serviceAccount: ServiceAccountOptions;\n baseUrl?: string;\n logLevel?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n}\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n organizationId: string | undefined;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n try {\n const [, payload] = token.split(\".\");\n if (!payload) return {};\n const json = Buffer.from(payload, \"base64url\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nclass TokenProvider {\n private readonly issuerUrl: string;\n private readonly clientId: string;\n private readonly clientSecret: string;\n private readonly log: FastifyBaseLogger;\n private cached: CachedToken | null = null;\n private inflight: Promise<CachedToken> | null = null;\n\n constructor(options: PostPluginOptions, log: FastifyBaseLogger) {\n this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\\/$/, \"\");\n this.clientId = options.serviceAccount.clientId;\n this.clientSecret = options.serviceAccount.clientSecret;\n this.log = log;\n }\n\n private async ensureFresh(): Promise<CachedToken> {\n const now = Date.now();\n if (this.cached && this.cached.expiresAt - now > 30_000) return this.cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.fetchToken().finally(() => { this.inflight = null; });\n return this.inflight;\n }\n\n getToken(): Promise<string> {\n return this.ensureFresh().then((c) => c.value);\n }\n\n getOrganizationId(): Promise<string | undefined> {\n return this.ensureFresh().then((c) => c.organizationId);\n }\n\n private async fetchToken(): Promise<CachedToken> {\n this.log.debug(\"[@geekapps/post-fastify] fetching service account token\");\n\n const credentials = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString(\"base64\");\n const res = await fetch(`${this.issuerUrl}/auth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify({ grant_type: \"service_account\" }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new Error(`[@geekapps/post-fastify] auth failed (${res.status}): ${err.error ?? \"unknown error\"}`);\n }\n\n const data = await res.json() as { access_token: string; expires_in?: number };\n const claims = decodeJwtPayload(data.access_token);\n const organizationId =\n typeof claims.organizationId === \"string\" ? claims.organizationId :\n typeof claims.organization_id === \"string\" ? claims.organization_id :\n undefined;\n\n this.cached = {\n value: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 420) * 1000,\n organizationId,\n };\n\n this.log.debug({ organizationId, expiresIn: data.expires_in }, \"[@geekapps/post-fastify] token acquired\");\n return this.cached;\n }\n}\n\ndeclare module \"fastify\" {\n interface FastifyInstance {\n postClient: PostClient;\n }\n interface FastifyRequest {\n postClient: PostClient;\n }\n}\n\nconst postPlugin: FastifyPluginAsync<PostPluginOptions> = async (\n fastify: FastifyInstance,\n options: PostPluginOptions,\n) => {\n const log = options.logLevel\n ? fastify.log.child({ level: options.logLevel })\n : fastify.log;\n\n const baseUrl = options.baseUrl ?? \"https://post-api.geekapps.com.br\";\n const provider = new TokenProvider(options, log);\n\n const client = new PostClient({\n baseUrl,\n token: () => provider.getToken(),\n organizationId: () => provider.getOrganizationId() as Promise<string>,\n });\n\n fastify.decorate(\"postClient\", client);\n\n fastify.addHook(\"onRequest\", async (request: FastifyRequest) => {\n request.postClient = client;\n });\n};\n\nexport default fp(postPlugin, {\n fastify: \">=4.0.0\",\n name: \"@geekapps/post-fastify\",\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekapps/post-fastify",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Geekapps Post SDK for Fastify",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -17,7 +17,7 @@
17
17
  "dev": "tsup --watch"
18
18
  },
19
19
  "devDependencies": {
20
- "@types/node": "^25.9.1",
20
+ "@types/node": "^25.9.2",
21
21
  "fastify": "^5.8.5",
22
22
  "fastify-plugin": "^5.1.0",
23
23
  "tsup": "^8.5.1",
package/src/plugin.ts CHANGED
@@ -1,16 +1,17 @@
1
- import type { FastifyInstance, FastifyPluginAsync } from "fastify";
1
+ import type { FastifyBaseLogger, FastifyInstance, FastifyPluginAsync, FastifyRequest } from "fastify";
2
2
  import fp from "fastify-plugin";
3
3
  import { PostClient } from "./client.js";
4
4
 
5
5
  export interface ServiceAccountOptions {
6
+ issuerUrl: string;
6
7
  clientId: string;
7
8
  clientSecret: string;
8
9
  }
9
10
 
10
11
  export interface PostPluginOptions {
11
- issuer: string;
12
12
  serviceAccount: ServiceAccountOptions;
13
13
  baseUrl?: string;
14
+ logLevel?: "trace" | "debug" | "info" | "warn" | "error" | "silent";
14
15
  }
15
16
 
16
17
  interface CachedToken {
@@ -34,13 +35,15 @@ class TokenProvider {
34
35
  private readonly issuerUrl: string;
35
36
  private readonly clientId: string;
36
37
  private readonly clientSecret: string;
38
+ private readonly log: FastifyBaseLogger;
37
39
  private cached: CachedToken | null = null;
38
40
  private inflight: Promise<CachedToken> | null = null;
39
41
 
40
- constructor(options: PostPluginOptions) {
41
- this.issuerUrl = options.issuer.replace(/\/$/, "");
42
+ constructor(options: PostPluginOptions, log: FastifyBaseLogger) {
43
+ this.issuerUrl = options.serviceAccount.issuerUrl.replace(/\/$/, "");
42
44
  this.clientId = options.serviceAccount.clientId;
43
45
  this.clientSecret = options.serviceAccount.clientSecret;
46
+ this.log = log;
44
47
  }
45
48
 
46
49
  private async ensureFresh(): Promise<CachedToken> {
@@ -60,6 +63,8 @@ class TokenProvider {
60
63
  }
61
64
 
62
65
  private async fetchToken(): Promise<CachedToken> {
66
+ this.log.debug("[@geekapps/post-fastify] fetching service account token");
67
+
63
68
  const credentials = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString("base64");
64
69
  const res = await fetch(`${this.issuerUrl}/auth/token`, {
65
70
  method: "POST",
@@ -72,7 +77,7 @@ class TokenProvider {
72
77
 
73
78
  if (!res.ok) {
74
79
  const err = await res.json().catch(() => ({})) as { error?: string };
75
- throw new Error(`GeekappsPost auth failed (${res.status}): ${err.error ?? "unknown error"}`);
80
+ throw new Error(`[@geekapps/post-fastify] auth failed (${res.status}): ${err.error ?? "unknown error"}`);
76
81
  }
77
82
 
78
83
  const data = await res.json() as { access_token: string; expires_in?: number };
@@ -87,6 +92,8 @@ class TokenProvider {
87
92
  expiresAt: Date.now() + (data.expires_in ?? 420) * 1000,
88
93
  organizationId,
89
94
  };
95
+
96
+ this.log.debug({ organizationId, expiresIn: data.expires_in }, "[@geekapps/post-fastify] token acquired");
90
97
  return this.cached;
91
98
  }
92
99
  }
@@ -95,14 +102,21 @@ declare module "fastify" {
95
102
  interface FastifyInstance {
96
103
  postClient: PostClient;
97
104
  }
105
+ interface FastifyRequest {
106
+ postClient: PostClient;
107
+ }
98
108
  }
99
109
 
100
110
  const postPlugin: FastifyPluginAsync<PostPluginOptions> = async (
101
111
  fastify: FastifyInstance,
102
112
  options: PostPluginOptions,
103
113
  ) => {
114
+ const log = options.logLevel
115
+ ? fastify.log.child({ level: options.logLevel })
116
+ : fastify.log;
117
+
104
118
  const baseUrl = options.baseUrl ?? "https://post-api.geekapps.com.br";
105
- const provider = new TokenProvider(options);
119
+ const provider = new TokenProvider(options, log);
106
120
 
107
121
  const client = new PostClient({
108
122
  baseUrl,
@@ -111,6 +125,10 @@ const postPlugin: FastifyPluginAsync<PostPluginOptions> = async (
111
125
  });
112
126
 
113
127
  fastify.decorate("postClient", client);
128
+
129
+ fastify.addHook("onRequest", async (request: FastifyRequest) => {
130
+ request.postClient = client;
131
+ });
114
132
  };
115
133
 
116
134
  export default fp(postPlugin, {