LPDoctor commited on
Commit
c0dd699
1 Parent(s): 8cae60a

Add cloudflare worker

Browse files
worker/.dev.vars.example ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ACCOUNT_ID=
2
+ API_TOKEN=
3
+ R2_ACCESS_KEY_ID=
4
+ R2_SECRET_ACCESS_KEY=
5
+
6
+ AWS_ACCESS_KEY_ID=
7
+ AWS_SECRET_ACCESS_KEY=
8
+ AWS_REGION=
9
+ AWS_SQS_QUEUE_URL=
10
+
11
+ ADMIN_TOKEN=
12
+ CANVA_APP_IDS=
worker/.editorconfig ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # http://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = tab
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.yml]
12
+ indent_style = space
worker/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ node_modules
2
+ .wrangler
3
+ .dev.vars
worker/.prettierrc ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "printWidth": 140,
3
+ "singleQuote": true,
4
+ "semi": true,
5
+ "useTabs": true
6
+ }
worker/package-lock.json ADDED
@@ -0,0 +1,2244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "worker",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "worker",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "@aws-sdk/client-sqs": "^3.609.0",
12
+ "aws4fetch": "^1.0.18",
13
+ "chanfana": "^2.0.2",
14
+ "hono": "^4.4.11",
15
+ "jose": "^5.6.3",
16
+ "lodash": "^4.17.21",
17
+ "nanoid": "^5.0.7",
18
+ "zod": "^3.23.8"
19
+ },
20
+ "devDependencies": {
21
+ "@cloudflare/workers-types": "^4.20240620.0",
22
+ "@types/lodash": "^4.17.7",
23
+ "@types/node": "20.8.3",
24
+ "@types/service-worker-mock": "^2.0.1",
25
+ "typescript": "^5.4.5",
26
+ "wrangler": "^3.60.3"
27
+ }
28
+ },
29
+ "node_modules/@aws-crypto/sha256-browser": {
30
+ "version": "5.2.0",
31
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
32
+ "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
33
+ "dependencies": {
34
+ "@aws-crypto/sha256-js": "^5.2.0",
35
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
36
+ "@aws-crypto/util": "^5.2.0",
37
+ "@aws-sdk/types": "^3.222.0",
38
+ "@aws-sdk/util-locate-window": "^3.0.0",
39
+ "@smithy/util-utf8": "^2.0.0",
40
+ "tslib": "^2.6.2"
41
+ }
42
+ },
43
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
44
+ "version": "2.2.0",
45
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
46
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
47
+ "dependencies": {
48
+ "tslib": "^2.6.2"
49
+ },
50
+ "engines": {
51
+ "node": ">=14.0.0"
52
+ }
53
+ },
54
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
55
+ "version": "2.2.0",
56
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
57
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
58
+ "dependencies": {
59
+ "@smithy/is-array-buffer": "^2.2.0",
60
+ "tslib": "^2.6.2"
61
+ },
62
+ "engines": {
63
+ "node": ">=14.0.0"
64
+ }
65
+ },
66
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
67
+ "version": "2.3.0",
68
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
69
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
70
+ "dependencies": {
71
+ "@smithy/util-buffer-from": "^2.2.0",
72
+ "tslib": "^2.6.2"
73
+ },
74
+ "engines": {
75
+ "node": ">=14.0.0"
76
+ }
77
+ },
78
+ "node_modules/@aws-crypto/sha256-js": {
79
+ "version": "5.2.0",
80
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
81
+ "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
82
+ "dependencies": {
83
+ "@aws-crypto/util": "^5.2.0",
84
+ "@aws-sdk/types": "^3.222.0",
85
+ "tslib": "^2.6.2"
86
+ },
87
+ "engines": {
88
+ "node": ">=16.0.0"
89
+ }
90
+ },
91
+ "node_modules/@aws-crypto/supports-web-crypto": {
92
+ "version": "5.2.0",
93
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
94
+ "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
95
+ "dependencies": {
96
+ "tslib": "^2.6.2"
97
+ }
98
+ },
99
+ "node_modules/@aws-crypto/util": {
100
+ "version": "5.2.0",
101
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
102
+ "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
103
+ "dependencies": {
104
+ "@aws-sdk/types": "^3.222.0",
105
+ "@smithy/util-utf8": "^2.0.0",
106
+ "tslib": "^2.6.2"
107
+ }
108
+ },
109
+ "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {
110
+ "version": "2.2.0",
111
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
112
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
113
+ "dependencies": {
114
+ "tslib": "^2.6.2"
115
+ },
116
+ "engines": {
117
+ "node": ">=14.0.0"
118
+ }
119
+ },
120
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
121
+ "version": "2.2.0",
122
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
123
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
124
+ "dependencies": {
125
+ "@smithy/is-array-buffer": "^2.2.0",
126
+ "tslib": "^2.6.2"
127
+ },
128
+ "engines": {
129
+ "node": ">=14.0.0"
130
+ }
131
+ },
132
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
133
+ "version": "2.3.0",
134
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
135
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
136
+ "dependencies": {
137
+ "@smithy/util-buffer-from": "^2.2.0",
138
+ "tslib": "^2.6.2"
139
+ },
140
+ "engines": {
141
+ "node": ">=14.0.0"
142
+ }
143
+ },
144
+ "node_modules/@aws-sdk/client-sqs": {
145
+ "version": "3.609.0",
146
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.609.0.tgz",
147
+ "integrity": "sha512-0cJsOWp1AOt7MYNdpq8k0nDY5g2twXdnTcryljubIXJJMrORSd4p9YtH3X8auJaqb9vd2t/D8XhoJTNbTC/4lQ==",
148
+ "dependencies": {
149
+ "@aws-crypto/sha256-browser": "5.2.0",
150
+ "@aws-crypto/sha256-js": "5.2.0",
151
+ "@aws-sdk/client-sso-oidc": "3.609.0",
152
+ "@aws-sdk/client-sts": "3.609.0",
153
+ "@aws-sdk/core": "3.609.0",
154
+ "@aws-sdk/credential-provider-node": "3.609.0",
155
+ "@aws-sdk/middleware-host-header": "3.609.0",
156
+ "@aws-sdk/middleware-logger": "3.609.0",
157
+ "@aws-sdk/middleware-recursion-detection": "3.609.0",
158
+ "@aws-sdk/middleware-sdk-sqs": "3.609.0",
159
+ "@aws-sdk/middleware-user-agent": "3.609.0",
160
+ "@aws-sdk/region-config-resolver": "3.609.0",
161
+ "@aws-sdk/types": "3.609.0",
162
+ "@aws-sdk/util-endpoints": "3.609.0",
163
+ "@aws-sdk/util-user-agent-browser": "3.609.0",
164
+ "@aws-sdk/util-user-agent-node": "3.609.0",
165
+ "@smithy/config-resolver": "^3.0.4",
166
+ "@smithy/core": "^2.2.4",
167
+ "@smithy/fetch-http-handler": "^3.2.0",
168
+ "@smithy/hash-node": "^3.0.3",
169
+ "@smithy/invalid-dependency": "^3.0.3",
170
+ "@smithy/md5-js": "^3.0.3",
171
+ "@smithy/middleware-content-length": "^3.0.3",
172
+ "@smithy/middleware-endpoint": "^3.0.4",
173
+ "@smithy/middleware-retry": "^3.0.7",
174
+ "@smithy/middleware-serde": "^3.0.3",
175
+ "@smithy/middleware-stack": "^3.0.3",
176
+ "@smithy/node-config-provider": "^3.1.3",
177
+ "@smithy/node-http-handler": "^3.1.1",
178
+ "@smithy/protocol-http": "^4.0.3",
179
+ "@smithy/smithy-client": "^3.1.5",
180
+ "@smithy/types": "^3.3.0",
181
+ "@smithy/url-parser": "^3.0.3",
182
+ "@smithy/util-base64": "^3.0.0",
183
+ "@smithy/util-body-length-browser": "^3.0.0",
184
+ "@smithy/util-body-length-node": "^3.0.0",
185
+ "@smithy/util-defaults-mode-browser": "^3.0.7",
186
+ "@smithy/util-defaults-mode-node": "^3.0.7",
187
+ "@smithy/util-endpoints": "^2.0.4",
188
+ "@smithy/util-middleware": "^3.0.3",
189
+ "@smithy/util-retry": "^3.0.3",
190
+ "@smithy/util-utf8": "^3.0.0",
191
+ "tslib": "^2.6.2"
192
+ },
193
+ "engines": {
194
+ "node": ">=16.0.0"
195
+ }
196
+ },
197
+ "node_modules/@aws-sdk/client-sso": {
198
+ "version": "3.609.0",
199
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.609.0.tgz",
200
+ "integrity": "sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==",
201
+ "dependencies": {
202
+ "@aws-crypto/sha256-browser": "5.2.0",
203
+ "@aws-crypto/sha256-js": "5.2.0",
204
+ "@aws-sdk/core": "3.609.0",
205
+ "@aws-sdk/middleware-host-header": "3.609.0",
206
+ "@aws-sdk/middleware-logger": "3.609.0",
207
+ "@aws-sdk/middleware-recursion-detection": "3.609.0",
208
+ "@aws-sdk/middleware-user-agent": "3.609.0",
209
+ "@aws-sdk/region-config-resolver": "3.609.0",
210
+ "@aws-sdk/types": "3.609.0",
211
+ "@aws-sdk/util-endpoints": "3.609.0",
212
+ "@aws-sdk/util-user-agent-browser": "3.609.0",
213
+ "@aws-sdk/util-user-agent-node": "3.609.0",
214
+ "@smithy/config-resolver": "^3.0.4",
215
+ "@smithy/core": "^2.2.4",
216
+ "@smithy/fetch-http-handler": "^3.2.0",
217
+ "@smithy/hash-node": "^3.0.3",
218
+ "@smithy/invalid-dependency": "^3.0.3",
219
+ "@smithy/middleware-content-length": "^3.0.3",
220
+ "@smithy/middleware-endpoint": "^3.0.4",
221
+ "@smithy/middleware-retry": "^3.0.7",
222
+ "@smithy/middleware-serde": "^3.0.3",
223
+ "@smithy/middleware-stack": "^3.0.3",
224
+ "@smithy/node-config-provider": "^3.1.3",
225
+ "@smithy/node-http-handler": "^3.1.1",
226
+ "@smithy/protocol-http": "^4.0.3",
227
+ "@smithy/smithy-client": "^3.1.5",
228
+ "@smithy/types": "^3.3.0",
229
+ "@smithy/url-parser": "^3.0.3",
230
+ "@smithy/util-base64": "^3.0.0",
231
+ "@smithy/util-body-length-browser": "^3.0.0",
232
+ "@smithy/util-body-length-node": "^3.0.0",
233
+ "@smithy/util-defaults-mode-browser": "^3.0.7",
234
+ "@smithy/util-defaults-mode-node": "^3.0.7",
235
+ "@smithy/util-endpoints": "^2.0.4",
236
+ "@smithy/util-middleware": "^3.0.3",
237
+ "@smithy/util-retry": "^3.0.3",
238
+ "@smithy/util-utf8": "^3.0.0",
239
+ "tslib": "^2.6.2"
240
+ },
241
+ "engines": {
242
+ "node": ">=16.0.0"
243
+ }
244
+ },
245
+ "node_modules/@aws-sdk/client-sso-oidc": {
246
+ "version": "3.609.0",
247
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.609.0.tgz",
248
+ "integrity": "sha512-0bNPAyPdkWkS9EGB2A9BZDkBNrnVCBzk5lYRezoT4K3/gi9w1DTYH5tuRdwaTZdxW19U1mq7CV0YJJARKO1L9Q==",
249
+ "dependencies": {
250
+ "@aws-crypto/sha256-browser": "5.2.0",
251
+ "@aws-crypto/sha256-js": "5.2.0",
252
+ "@aws-sdk/core": "3.609.0",
253
+ "@aws-sdk/credential-provider-node": "3.609.0",
254
+ "@aws-sdk/middleware-host-header": "3.609.0",
255
+ "@aws-sdk/middleware-logger": "3.609.0",
256
+ "@aws-sdk/middleware-recursion-detection": "3.609.0",
257
+ "@aws-sdk/middleware-user-agent": "3.609.0",
258
+ "@aws-sdk/region-config-resolver": "3.609.0",
259
+ "@aws-sdk/types": "3.609.0",
260
+ "@aws-sdk/util-endpoints": "3.609.0",
261
+ "@aws-sdk/util-user-agent-browser": "3.609.0",
262
+ "@aws-sdk/util-user-agent-node": "3.609.0",
263
+ "@smithy/config-resolver": "^3.0.4",
264
+ "@smithy/core": "^2.2.4",
265
+ "@smithy/fetch-http-handler": "^3.2.0",
266
+ "@smithy/hash-node": "^3.0.3",
267
+ "@smithy/invalid-dependency": "^3.0.3",
268
+ "@smithy/middleware-content-length": "^3.0.3",
269
+ "@smithy/middleware-endpoint": "^3.0.4",
270
+ "@smithy/middleware-retry": "^3.0.7",
271
+ "@smithy/middleware-serde": "^3.0.3",
272
+ "@smithy/middleware-stack": "^3.0.3",
273
+ "@smithy/node-config-provider": "^3.1.3",
274
+ "@smithy/node-http-handler": "^3.1.1",
275
+ "@smithy/protocol-http": "^4.0.3",
276
+ "@smithy/smithy-client": "^3.1.5",
277
+ "@smithy/types": "^3.3.0",
278
+ "@smithy/url-parser": "^3.0.3",
279
+ "@smithy/util-base64": "^3.0.0",
280
+ "@smithy/util-body-length-browser": "^3.0.0",
281
+ "@smithy/util-body-length-node": "^3.0.0",
282
+ "@smithy/util-defaults-mode-browser": "^3.0.7",
283
+ "@smithy/util-defaults-mode-node": "^3.0.7",
284
+ "@smithy/util-endpoints": "^2.0.4",
285
+ "@smithy/util-middleware": "^3.0.3",
286
+ "@smithy/util-retry": "^3.0.3",
287
+ "@smithy/util-utf8": "^3.0.0",
288
+ "tslib": "^2.6.2"
289
+ },
290
+ "engines": {
291
+ "node": ">=16.0.0"
292
+ },
293
+ "peerDependencies": {
294
+ "@aws-sdk/client-sts": "^3.609.0"
295
+ }
296
+ },
297
+ "node_modules/@aws-sdk/client-sts": {
298
+ "version": "3.609.0",
299
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.609.0.tgz",
300
+ "integrity": "sha512-A0B3sDKFoFlGo8RYRjDBWHXpbgirer2bZBkCIzhSPHc1vOFHt/m2NcUoE2xnBKXJFrptL1xDkvo1P+XYp/BfcQ==",
301
+ "dependencies": {
302
+ "@aws-crypto/sha256-browser": "5.2.0",
303
+ "@aws-crypto/sha256-js": "5.2.0",
304
+ "@aws-sdk/client-sso-oidc": "3.609.0",
305
+ "@aws-sdk/core": "3.609.0",
306
+ "@aws-sdk/credential-provider-node": "3.609.0",
307
+ "@aws-sdk/middleware-host-header": "3.609.0",
308
+ "@aws-sdk/middleware-logger": "3.609.0",
309
+ "@aws-sdk/middleware-recursion-detection": "3.609.0",
310
+ "@aws-sdk/middleware-user-agent": "3.609.0",
311
+ "@aws-sdk/region-config-resolver": "3.609.0",
312
+ "@aws-sdk/types": "3.609.0",
313
+ "@aws-sdk/util-endpoints": "3.609.0",
314
+ "@aws-sdk/util-user-agent-browser": "3.609.0",
315
+ "@aws-sdk/util-user-agent-node": "3.609.0",
316
+ "@smithy/config-resolver": "^3.0.4",
317
+ "@smithy/core": "^2.2.4",
318
+ "@smithy/fetch-http-handler": "^3.2.0",
319
+ "@smithy/hash-node": "^3.0.3",
320
+ "@smithy/invalid-dependency": "^3.0.3",
321
+ "@smithy/middleware-content-length": "^3.0.3",
322
+ "@smithy/middleware-endpoint": "^3.0.4",
323
+ "@smithy/middleware-retry": "^3.0.7",
324
+ "@smithy/middleware-serde": "^3.0.3",
325
+ "@smithy/middleware-stack": "^3.0.3",
326
+ "@smithy/node-config-provider": "^3.1.3",
327
+ "@smithy/node-http-handler": "^3.1.1",
328
+ "@smithy/protocol-http": "^4.0.3",
329
+ "@smithy/smithy-client": "^3.1.5",
330
+ "@smithy/types": "^3.3.0",
331
+ "@smithy/url-parser": "^3.0.3",
332
+ "@smithy/util-base64": "^3.0.0",
333
+ "@smithy/util-body-length-browser": "^3.0.0",
334
+ "@smithy/util-body-length-node": "^3.0.0",
335
+ "@smithy/util-defaults-mode-browser": "^3.0.7",
336
+ "@smithy/util-defaults-mode-node": "^3.0.7",
337
+ "@smithy/util-endpoints": "^2.0.4",
338
+ "@smithy/util-middleware": "^3.0.3",
339
+ "@smithy/util-retry": "^3.0.3",
340
+ "@smithy/util-utf8": "^3.0.0",
341
+ "tslib": "^2.6.2"
342
+ },
343
+ "engines": {
344
+ "node": ">=16.0.0"
345
+ }
346
+ },
347
+ "node_modules/@aws-sdk/core": {
348
+ "version": "3.609.0",
349
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.609.0.tgz",
350
+ "integrity": "sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==",
351
+ "dependencies": {
352
+ "@smithy/core": "^2.2.4",
353
+ "@smithy/protocol-http": "^4.0.3",
354
+ "@smithy/signature-v4": "^3.1.2",
355
+ "@smithy/smithy-client": "^3.1.5",
356
+ "@smithy/types": "^3.3.0",
357
+ "fast-xml-parser": "4.2.5",
358
+ "tslib": "^2.6.2"
359
+ },
360
+ "engines": {
361
+ "node": ">=16.0.0"
362
+ }
363
+ },
364
+ "node_modules/@aws-sdk/credential-provider-env": {
365
+ "version": "3.609.0",
366
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.609.0.tgz",
367
+ "integrity": "sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==",
368
+ "dependencies": {
369
+ "@aws-sdk/types": "3.609.0",
370
+ "@smithy/property-provider": "^3.1.3",
371
+ "@smithy/types": "^3.3.0",
372
+ "tslib": "^2.6.2"
373
+ },
374
+ "engines": {
375
+ "node": ">=16.0.0"
376
+ }
377
+ },
378
+ "node_modules/@aws-sdk/credential-provider-http": {
379
+ "version": "3.609.0",
380
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.609.0.tgz",
381
+ "integrity": "sha512-GQQfB9Mk4XUZwaPsk4V3w8MqleS6ApkZKVQn3vTLAKa8Y7B2Imcpe5zWbKYjDd8MPpMWjHcBGFTVlDRFP4zwSQ==",
382
+ "dependencies": {
383
+ "@aws-sdk/types": "3.609.0",
384
+ "@smithy/fetch-http-handler": "^3.2.0",
385
+ "@smithy/node-http-handler": "^3.1.1",
386
+ "@smithy/property-provider": "^3.1.3",
387
+ "@smithy/protocol-http": "^4.0.3",
388
+ "@smithy/smithy-client": "^3.1.5",
389
+ "@smithy/types": "^3.3.0",
390
+ "@smithy/util-stream": "^3.0.5",
391
+ "tslib": "^2.6.2"
392
+ },
393
+ "engines": {
394
+ "node": ">=16.0.0"
395
+ }
396
+ },
397
+ "node_modules/@aws-sdk/credential-provider-ini": {
398
+ "version": "3.609.0",
399
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.609.0.tgz",
400
+ "integrity": "sha512-hwaBfXuBTv6/eAdEsDfGcteYUW6Km7lvvubbxEdxIuJNF3vswR7RMGIXaEC37hhPkTTgd3H0TONammhwZIfkog==",
401
+ "dependencies": {
402
+ "@aws-sdk/credential-provider-env": "3.609.0",
403
+ "@aws-sdk/credential-provider-http": "3.609.0",
404
+ "@aws-sdk/credential-provider-process": "3.609.0",
405
+ "@aws-sdk/credential-provider-sso": "3.609.0",
406
+ "@aws-sdk/credential-provider-web-identity": "3.609.0",
407
+ "@aws-sdk/types": "3.609.0",
408
+ "@smithy/credential-provider-imds": "^3.1.3",
409
+ "@smithy/property-provider": "^3.1.3",
410
+ "@smithy/shared-ini-file-loader": "^3.1.3",
411
+ "@smithy/types": "^3.3.0",
412
+ "tslib": "^2.6.2"
413
+ },
414
+ "engines": {
415
+ "node": ">=16.0.0"
416
+ },
417
+ "peerDependencies": {
418
+ "@aws-sdk/client-sts": "^3.609.0"
419
+ }
420
+ },
421
+ "node_modules/@aws-sdk/credential-provider-node": {
422
+ "version": "3.609.0",
423
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.609.0.tgz",
424
+ "integrity": "sha512-4J8/JRuqfxJDGD9jTHVCBxCvYt7/Vgj2Stlhj930mrjFPO/yRw8ilAAZxBWe0JHPX3QwepCmh4ErZe53F5ysxQ==",
425
+ "dependencies": {
426
+ "@aws-sdk/credential-provider-env": "3.609.0",
427
+ "@aws-sdk/credential-provider-http": "3.609.0",
428
+ "@aws-sdk/credential-provider-ini": "3.609.0",
429
+ "@aws-sdk/credential-provider-process": "3.609.0",
430
+ "@aws-sdk/credential-provider-sso": "3.609.0",
431
+ "@aws-sdk/credential-provider-web-identity": "3.609.0",
432
+ "@aws-sdk/types": "3.609.0",
433
+ "@smithy/credential-provider-imds": "^3.1.3",
434
+ "@smithy/property-provider": "^3.1.3",
435
+ "@smithy/shared-ini-file-loader": "^3.1.3",
436
+ "@smithy/types": "^3.3.0",
437
+ "tslib": "^2.6.2"
438
+ },
439
+ "engines": {
440
+ "node": ">=16.0.0"
441
+ }
442
+ },
443
+ "node_modules/@aws-sdk/credential-provider-process": {
444
+ "version": "3.609.0",
445
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.609.0.tgz",
446
+ "integrity": "sha512-Ux35nGOSJKZWUIM3Ny0ROZ8cqPRUEkh+tR3X2o9ydEbFiLq3eMMyEnHJqx4EeUjLRchidlm4CCid9GxMe5/gdw==",
447
+ "dependencies": {
448
+ "@aws-sdk/types": "3.609.0",
449
+ "@smithy/property-provider": "^3.1.3",
450
+ "@smithy/shared-ini-file-loader": "^3.1.3",
451
+ "@smithy/types": "^3.3.0",
452
+ "tslib": "^2.6.2"
453
+ },
454
+ "engines": {
455
+ "node": ">=16.0.0"
456
+ }
457
+ },
458
+ "node_modules/@aws-sdk/credential-provider-sso": {
459
+ "version": "3.609.0",
460
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.609.0.tgz",
461
+ "integrity": "sha512-oQPGDKMMIxjvTcm86g07RPYeC7mCNk+29dPpY15ZAPRpAF7F0tircsC3wT9fHzNaKShEyK5LuI5Kg/uxsdy+Iw==",
462
+ "dependencies": {
463
+ "@aws-sdk/client-sso": "3.609.0",
464
+ "@aws-sdk/token-providers": "3.609.0",
465
+ "@aws-sdk/types": "3.609.0",
466
+ "@smithy/property-provider": "^3.1.3",
467
+ "@smithy/shared-ini-file-loader": "^3.1.3",
468
+ "@smithy/types": "^3.3.0",
469
+ "tslib": "^2.6.2"
470
+ },
471
+ "engines": {
472
+ "node": ">=16.0.0"
473
+ }
474
+ },
475
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
476
+ "version": "3.609.0",
477
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.609.0.tgz",
478
+ "integrity": "sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==",
479
+ "dependencies": {
480
+ "@aws-sdk/types": "3.609.0",
481
+ "@smithy/property-provider": "^3.1.3",
482
+ "@smithy/types": "^3.3.0",
483
+ "tslib": "^2.6.2"
484
+ },
485
+ "engines": {
486
+ "node": ">=16.0.0"
487
+ },
488
+ "peerDependencies": {
489
+ "@aws-sdk/client-sts": "^3.609.0"
490
+ }
491
+ },
492
+ "node_modules/@aws-sdk/middleware-host-header": {
493
+ "version": "3.609.0",
494
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.609.0.tgz",
495
+ "integrity": "sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==",
496
+ "dependencies": {
497
+ "@aws-sdk/types": "3.609.0",
498
+ "@smithy/protocol-http": "^4.0.3",
499
+ "@smithy/types": "^3.3.0",
500
+ "tslib": "^2.6.2"
501
+ },
502
+ "engines": {
503
+ "node": ">=16.0.0"
504
+ }
505
+ },
506
+ "node_modules/@aws-sdk/middleware-logger": {
507
+ "version": "3.609.0",
508
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz",
509
+ "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==",
510
+ "dependencies": {
511
+ "@aws-sdk/types": "3.609.0",
512
+ "@smithy/types": "^3.3.0",
513
+ "tslib": "^2.6.2"
514
+ },
515
+ "engines": {
516
+ "node": ">=16.0.0"
517
+ }
518
+ },
519
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
520
+ "version": "3.609.0",
521
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.609.0.tgz",
522
+ "integrity": "sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==",
523
+ "dependencies": {
524
+ "@aws-sdk/types": "3.609.0",
525
+ "@smithy/protocol-http": "^4.0.3",
526
+ "@smithy/types": "^3.3.0",
527
+ "tslib": "^2.6.2"
528
+ },
529
+ "engines": {
530
+ "node": ">=16.0.0"
531
+ }
532
+ },
533
+ "node_modules/@aws-sdk/middleware-sdk-sqs": {
534
+ "version": "3.609.0",
535
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.609.0.tgz",
536
+ "integrity": "sha512-0rbOiErKuKIc9fLyjiqtjgAcUt6yBBcXVwta/q+W7WLxJbNtkTfGKfKhxPtp0+5S8EyljMpg2rITBCJzNRXjiA==",
537
+ "dependencies": {
538
+ "@aws-sdk/types": "3.609.0",
539
+ "@smithy/smithy-client": "^3.1.5",
540
+ "@smithy/types": "^3.3.0",
541
+ "@smithy/util-hex-encoding": "^3.0.0",
542
+ "@smithy/util-utf8": "^3.0.0",
543
+ "tslib": "^2.6.2"
544
+ },
545
+ "engines": {
546
+ "node": ">=16.0.0"
547
+ }
548
+ },
549
+ "node_modules/@aws-sdk/middleware-user-agent": {
550
+ "version": "3.609.0",
551
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.609.0.tgz",
552
+ "integrity": "sha512-nbq7MXRmeXm4IDqh+sJRAxGPAq0OfGmGIwKvJcw66hLoG8CmhhVMZmIAEBDFr57S+YajGwnLLRt+eMI05MMeVA==",
553
+ "dependencies": {
554
+ "@aws-sdk/types": "3.609.0",
555
+ "@aws-sdk/util-endpoints": "3.609.0",
556
+ "@smithy/protocol-http": "^4.0.3",
557
+ "@smithy/types": "^3.3.0",
558
+ "tslib": "^2.6.2"
559
+ },
560
+ "engines": {
561
+ "node": ">=16.0.0"
562
+ }
563
+ },
564
+ "node_modules/@aws-sdk/region-config-resolver": {
565
+ "version": "3.609.0",
566
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.609.0.tgz",
567
+ "integrity": "sha512-lMHBG8zg9GWYBc9/XVPKyuAUd7iKqfPP7z04zGta2kGNOKbUTeqmAdc1gJGku75p4kglIPlGBorOxti8DhRmKw==",
568
+ "dependencies": {
569
+ "@aws-sdk/types": "3.609.0",
570
+ "@smithy/node-config-provider": "^3.1.3",
571
+ "@smithy/types": "^3.3.0",
572
+ "@smithy/util-config-provider": "^3.0.0",
573
+ "@smithy/util-middleware": "^3.0.3",
574
+ "tslib": "^2.6.2"
575
+ },
576
+ "engines": {
577
+ "node": ">=16.0.0"
578
+ }
579
+ },
580
+ "node_modules/@aws-sdk/token-providers": {
581
+ "version": "3.609.0",
582
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.609.0.tgz",
583
+ "integrity": "sha512-WvhW/7XSf+H7YmtiIigQxfDVZVZI7mbKikQ09YpzN7FeN3TmYib1+0tB+EE9TbICkwssjiFc71FEBEh4K9grKQ==",
584
+ "dependencies": {
585
+ "@aws-sdk/types": "3.609.0",
586
+ "@smithy/property-provider": "^3.1.3",
587
+ "@smithy/shared-ini-file-loader": "^3.1.3",
588
+ "@smithy/types": "^3.3.0",
589
+ "tslib": "^2.6.2"
590
+ },
591
+ "engines": {
592
+ "node": ">=16.0.0"
593
+ },
594
+ "peerDependencies": {
595
+ "@aws-sdk/client-sso-oidc": "^3.609.0"
596
+ }
597
+ },
598
+ "node_modules/@aws-sdk/types": {
599
+ "version": "3.609.0",
600
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz",
601
+ "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==",
602
+ "dependencies": {
603
+ "@smithy/types": "^3.3.0",
604
+ "tslib": "^2.6.2"
605
+ },
606
+ "engines": {
607
+ "node": ">=16.0.0"
608
+ }
609
+ },
610
+ "node_modules/@aws-sdk/util-endpoints": {
611
+ "version": "3.609.0",
612
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.609.0.tgz",
613
+ "integrity": "sha512-Rh+3V8dOvEeE1aQmUy904DYWtLUEJ7Vf5XBPlQ6At3pBhp+zpXbsnpZzVL33c8lW1xfj6YPwtO6gOeEsl1juCQ==",
614
+ "dependencies": {
615
+ "@aws-sdk/types": "3.609.0",
616
+ "@smithy/types": "^3.3.0",
617
+ "@smithy/util-endpoints": "^2.0.4",
618
+ "tslib": "^2.6.2"
619
+ },
620
+ "engines": {
621
+ "node": ">=16.0.0"
622
+ }
623
+ },
624
+ "node_modules/@aws-sdk/util-locate-window": {
625
+ "version": "3.568.0",
626
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz",
627
+ "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==",
628
+ "dependencies": {
629
+ "tslib": "^2.6.2"
630
+ },
631
+ "engines": {
632
+ "node": ">=16.0.0"
633
+ }
634
+ },
635
+ "node_modules/@aws-sdk/util-user-agent-browser": {
636
+ "version": "3.609.0",
637
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz",
638
+ "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==",
639
+ "dependencies": {
640
+ "@aws-sdk/types": "3.609.0",
641
+ "@smithy/types": "^3.3.0",
642
+ "bowser": "^2.11.0",
643
+ "tslib": "^2.6.2"
644
+ }
645
+ },
646
+ "node_modules/@aws-sdk/util-user-agent-node": {
647
+ "version": "3.609.0",
648
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.609.0.tgz",
649
+ "integrity": "sha512-DlZBwQ/HkZyf3pOWc7+wjJRk5R7x9YxHhs2szHwtv1IW30KMabjjjX0GMlGJ9LLkBHkbaaEY/w9Tkj12XRLhRg==",
650
+ "dependencies": {
651
+ "@aws-sdk/types": "3.609.0",
652
+ "@smithy/node-config-provider": "^3.1.3",
653
+ "@smithy/types": "^3.3.0",
654
+ "tslib": "^2.6.2"
655
+ },
656
+ "engines": {
657
+ "node": ">=16.0.0"
658
+ },
659
+ "peerDependencies": {
660
+ "aws-crt": ">=1.0.0"
661
+ },
662
+ "peerDependenciesMeta": {
663
+ "aws-crt": {
664
+ "optional": true
665
+ }
666
+ }
667
+ },
668
+ "node_modules/@cloudflare/kv-asset-handler": {
669
+ "version": "0.3.4",
670
+ "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz",
671
+ "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==",
672
+ "dev": true,
673
+ "dependencies": {
674
+ "mime": "^3.0.0"
675
+ },
676
+ "engines": {
677
+ "node": ">=16.13"
678
+ }
679
+ },
680
+ "node_modules/@cloudflare/workers-types": {
681
+ "version": "4.20240620.0",
682
+ "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240620.0.tgz",
683
+ "integrity": "sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==",
684
+ "dev": true
685
+ },
686
+ "node_modules/@cspotcode/source-map-support": {
687
+ "version": "0.8.1",
688
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
689
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
690
+ "dev": true,
691
+ "dependencies": {
692
+ "@jridgewell/trace-mapping": "0.3.9"
693
+ },
694
+ "engines": {
695
+ "node": ">=12"
696
+ }
697
+ },
698
+ "node_modules/@esbuild-plugins/node-globals-polyfill": {
699
+ "version": "0.2.3",
700
+ "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz",
701
+ "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==",
702
+ "dev": true,
703
+ "peerDependencies": {
704
+ "esbuild": "*"
705
+ }
706
+ },
707
+ "node_modules/@esbuild-plugins/node-modules-polyfill": {
708
+ "version": "0.2.2",
709
+ "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz",
710
+ "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==",
711
+ "dev": true,
712
+ "dependencies": {
713
+ "escape-string-regexp": "^4.0.0",
714
+ "rollup-plugin-node-polyfills": "^0.2.1"
715
+ },
716
+ "peerDependencies": {
717
+ "esbuild": "*"
718
+ }
719
+ },
720
+ "node_modules/@fastify/busboy": {
721
+ "version": "2.1.1",
722
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
723
+ "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
724
+ "dev": true,
725
+ "engines": {
726
+ "node": ">=14"
727
+ }
728
+ },
729
+ "node_modules/@jridgewell/resolve-uri": {
730
+ "version": "3.1.2",
731
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
732
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
733
+ "dev": true,
734
+ "engines": {
735
+ "node": ">=6.0.0"
736
+ }
737
+ },
738
+ "node_modules/@jridgewell/sourcemap-codec": {
739
+ "version": "1.4.15",
740
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
741
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
742
+ "dev": true
743
+ },
744
+ "node_modules/@jridgewell/trace-mapping": {
745
+ "version": "0.3.9",
746
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
747
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
748
+ "dev": true,
749
+ "dependencies": {
750
+ "@jridgewell/resolve-uri": "^3.0.3",
751
+ "@jridgewell/sourcemap-codec": "^1.4.10"
752
+ }
753
+ },
754
+ "node_modules/@smithy/abort-controller": {
755
+ "version": "3.1.1",
756
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz",
757
+ "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==",
758
+ "dependencies": {
759
+ "@smithy/types": "^3.3.0",
760
+ "tslib": "^2.6.2"
761
+ },
762
+ "engines": {
763
+ "node": ">=16.0.0"
764
+ }
765
+ },
766
+ "node_modules/@smithy/config-resolver": {
767
+ "version": "3.0.4",
768
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.4.tgz",
769
+ "integrity": "sha512-VwiOk7TwXoE7NlNguV/aPq1hFH72tqkHCw8eWXbr2xHspRyyv9DLpLXhq+Ieje+NwoqXrY0xyQjPXdOE6cGcHA==",
770
+ "dependencies": {
771
+ "@smithy/node-config-provider": "^3.1.3",
772
+ "@smithy/types": "^3.3.0",
773
+ "@smithy/util-config-provider": "^3.0.0",
774
+ "@smithy/util-middleware": "^3.0.3",
775
+ "tslib": "^2.6.2"
776
+ },
777
+ "engines": {
778
+ "node": ">=16.0.0"
779
+ }
780
+ },
781
+ "node_modules/@smithy/core": {
782
+ "version": "2.2.4",
783
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.4.tgz",
784
+ "integrity": "sha512-qdY3LpMOUyLM/gfjjMQZui+UTNS7kBRDWlvyIhVOql5dn2J3isk9qUTBtQ1CbDH8MTugHis1zu3h4rH+Qmmh4g==",
785
+ "dependencies": {
786
+ "@smithy/middleware-endpoint": "^3.0.4",
787
+ "@smithy/middleware-retry": "^3.0.7",
788
+ "@smithy/middleware-serde": "^3.0.3",
789
+ "@smithy/protocol-http": "^4.0.3",
790
+ "@smithy/smithy-client": "^3.1.5",
791
+ "@smithy/types": "^3.3.0",
792
+ "@smithy/util-middleware": "^3.0.3",
793
+ "tslib": "^2.6.2"
794
+ },
795
+ "engines": {
796
+ "node": ">=16.0.0"
797
+ }
798
+ },
799
+ "node_modules/@smithy/credential-provider-imds": {
800
+ "version": "3.1.3",
801
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.3.tgz",
802
+ "integrity": "sha512-U1Yrv6hx/mRK6k8AncuI6jLUx9rn0VVSd9NPEX6pyYFBfkSkChOc/n4zUb8alHUVg83TbI4OdZVo1X0Zfj3ijA==",
803
+ "dependencies": {
804
+ "@smithy/node-config-provider": "^3.1.3",
805
+ "@smithy/property-provider": "^3.1.3",
806
+ "@smithy/types": "^3.3.0",
807
+ "@smithy/url-parser": "^3.0.3",
808
+ "tslib": "^2.6.2"
809
+ },
810
+ "engines": {
811
+ "node": ">=16.0.0"
812
+ }
813
+ },
814
+ "node_modules/@smithy/fetch-http-handler": {
815
+ "version": "3.2.0",
816
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.0.tgz",
817
+ "integrity": "sha512-vFvDxMrc6sO5Atec8PaISckMcAwsCrRhYxwUylg97bRT2KZoumOF7qk5+6EVUtuM1IG9AJV5aqXnHln9ZdXHpg==",
818
+ "dependencies": {
819
+ "@smithy/protocol-http": "^4.0.3",
820
+ "@smithy/querystring-builder": "^3.0.3",
821
+ "@smithy/types": "^3.3.0",
822
+ "@smithy/util-base64": "^3.0.0",
823
+ "tslib": "^2.6.2"
824
+ }
825
+ },
826
+ "node_modules/@smithy/hash-node": {
827
+ "version": "3.0.3",
828
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz",
829
+ "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==",
830
+ "dependencies": {
831
+ "@smithy/types": "^3.3.0",
832
+ "@smithy/util-buffer-from": "^3.0.0",
833
+ "@smithy/util-utf8": "^3.0.0",
834
+ "tslib": "^2.6.2"
835
+ },
836
+ "engines": {
837
+ "node": ">=16.0.0"
838
+ }
839
+ },
840
+ "node_modules/@smithy/invalid-dependency": {
841
+ "version": "3.0.3",
842
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz",
843
+ "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==",
844
+ "dependencies": {
845
+ "@smithy/types": "^3.3.0",
846
+ "tslib": "^2.6.2"
847
+ }
848
+ },
849
+ "node_modules/@smithy/is-array-buffer": {
850
+ "version": "3.0.0",
851
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
852
+ "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==",
853
+ "dependencies": {
854
+ "tslib": "^2.6.2"
855
+ },
856
+ "engines": {
857
+ "node": ">=16.0.0"
858
+ }
859
+ },
860
+ "node_modules/@smithy/md5-js": {
861
+ "version": "3.0.3",
862
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz",
863
+ "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==",
864
+ "dependencies": {
865
+ "@smithy/types": "^3.3.0",
866
+ "@smithy/util-utf8": "^3.0.0",
867
+ "tslib": "^2.6.2"
868
+ }
869
+ },
870
+ "node_modules/@smithy/middleware-content-length": {
871
+ "version": "3.0.3",
872
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.3.tgz",
873
+ "integrity": "sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==",
874
+ "dependencies": {
875
+ "@smithy/protocol-http": "^4.0.3",
876
+ "@smithy/types": "^3.3.0",
877
+ "tslib": "^2.6.2"
878
+ },
879
+ "engines": {
880
+ "node": ">=16.0.0"
881
+ }
882
+ },
883
+ "node_modules/@smithy/middleware-endpoint": {
884
+ "version": "3.0.4",
885
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.4.tgz",
886
+ "integrity": "sha512-whUJMEPwl3ANIbXjBXZVdJNgfV2ZU8ayln7xUM47rXL2txuenI7jQ/VFFwCzy5lCmXScjp6zYtptW5Evud8e9g==",
887
+ "dependencies": {
888
+ "@smithy/middleware-serde": "^3.0.3",
889
+ "@smithy/node-config-provider": "^3.1.3",
890
+ "@smithy/shared-ini-file-loader": "^3.1.3",
891
+ "@smithy/types": "^3.3.0",
892
+ "@smithy/url-parser": "^3.0.3",
893
+ "@smithy/util-middleware": "^3.0.3",
894
+ "tslib": "^2.6.2"
895
+ },
896
+ "engines": {
897
+ "node": ">=16.0.0"
898
+ }
899
+ },
900
+ "node_modules/@smithy/middleware-retry": {
901
+ "version": "3.0.7",
902
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.7.tgz",
903
+ "integrity": "sha512-f5q7Y09G+2h5ivkSx5CHvlAT4qRR3jBFEsfXyQ9nFNiWQlr8c48blnu5cmbTQ+p1xmIO14UXzKoF8d7Tm0Gsjw==",
904
+ "dependencies": {
905
+ "@smithy/node-config-provider": "^3.1.3",
906
+ "@smithy/protocol-http": "^4.0.3",
907
+ "@smithy/service-error-classification": "^3.0.3",
908
+ "@smithy/smithy-client": "^3.1.5",
909
+ "@smithy/types": "^3.3.0",
910
+ "@smithy/util-middleware": "^3.0.3",
911
+ "@smithy/util-retry": "^3.0.3",
912
+ "tslib": "^2.6.2",
913
+ "uuid": "^9.0.1"
914
+ },
915
+ "engines": {
916
+ "node": ">=16.0.0"
917
+ }
918
+ },
919
+ "node_modules/@smithy/middleware-serde": {
920
+ "version": "3.0.3",
921
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz",
922
+ "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==",
923
+ "dependencies": {
924
+ "@smithy/types": "^3.3.0",
925
+ "tslib": "^2.6.2"
926
+ },
927
+ "engines": {
928
+ "node": ">=16.0.0"
929
+ }
930
+ },
931
+ "node_modules/@smithy/middleware-stack": {
932
+ "version": "3.0.3",
933
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz",
934
+ "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==",
935
+ "dependencies": {
936
+ "@smithy/types": "^3.3.0",
937
+ "tslib": "^2.6.2"
938
+ },
939
+ "engines": {
940
+ "node": ">=16.0.0"
941
+ }
942
+ },
943
+ "node_modules/@smithy/node-config-provider": {
944
+ "version": "3.1.3",
945
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.3.tgz",
946
+ "integrity": "sha512-rxdpAZczzholz6CYZxtqDu/aKTxATD5DAUDVj7HoEulq+pDSQVWzbg0btZDlxeFfa6bb2b5tUvgdX5+k8jUqcg==",
947
+ "dependencies": {
948
+ "@smithy/property-provider": "^3.1.3",
949
+ "@smithy/shared-ini-file-loader": "^3.1.3",
950
+ "@smithy/types": "^3.3.0",
951
+ "tslib": "^2.6.2"
952
+ },
953
+ "engines": {
954
+ "node": ">=16.0.0"
955
+ }
956
+ },
957
+ "node_modules/@smithy/node-http-handler": {
958
+ "version": "3.1.1",
959
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.1.tgz",
960
+ "integrity": "sha512-L71NLyPeP450r2J/mfu1jMc//Z1YnqJt2eSNw7uhiItaONnBLDA68J5jgxq8+MBDsYnFwNAIc7dBG1ImiWBiwg==",
961
+ "dependencies": {
962
+ "@smithy/abort-controller": "^3.1.1",
963
+ "@smithy/protocol-http": "^4.0.3",
964
+ "@smithy/querystring-builder": "^3.0.3",
965
+ "@smithy/types": "^3.3.0",
966
+ "tslib": "^2.6.2"
967
+ },
968
+ "engines": {
969
+ "node": ">=16.0.0"
970
+ }
971
+ },
972
+ "node_modules/@smithy/property-provider": {
973
+ "version": "3.1.3",
974
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz",
975
+ "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==",
976
+ "dependencies": {
977
+ "@smithy/types": "^3.3.0",
978
+ "tslib": "^2.6.2"
979
+ },
980
+ "engines": {
981
+ "node": ">=16.0.0"
982
+ }
983
+ },
984
+ "node_modules/@smithy/protocol-http": {
985
+ "version": "4.0.3",
986
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.3.tgz",
987
+ "integrity": "sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==",
988
+ "dependencies": {
989
+ "@smithy/types": "^3.3.0",
990
+ "tslib": "^2.6.2"
991
+ },
992
+ "engines": {
993
+ "node": ">=16.0.0"
994
+ }
995
+ },
996
+ "node_modules/@smithy/querystring-builder": {
997
+ "version": "3.0.3",
998
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz",
999
+ "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==",
1000
+ "dependencies": {
1001
+ "@smithy/types": "^3.3.0",
1002
+ "@smithy/util-uri-escape": "^3.0.0",
1003
+ "tslib": "^2.6.2"
1004
+ },
1005
+ "engines": {
1006
+ "node": ">=16.0.0"
1007
+ }
1008
+ },
1009
+ "node_modules/@smithy/querystring-parser": {
1010
+ "version": "3.0.3",
1011
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz",
1012
+ "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==",
1013
+ "dependencies": {
1014
+ "@smithy/types": "^3.3.0",
1015
+ "tslib": "^2.6.2"
1016
+ },
1017
+ "engines": {
1018
+ "node": ">=16.0.0"
1019
+ }
1020
+ },
1021
+ "node_modules/@smithy/service-error-classification": {
1022
+ "version": "3.0.3",
1023
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz",
1024
+ "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==",
1025
+ "dependencies": {
1026
+ "@smithy/types": "^3.3.0"
1027
+ },
1028
+ "engines": {
1029
+ "node": ">=16.0.0"
1030
+ }
1031
+ },
1032
+ "node_modules/@smithy/shared-ini-file-loader": {
1033
+ "version": "3.1.3",
1034
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.3.tgz",
1035
+ "integrity": "sha512-Z8Y3+08vgoDgl4HENqNnnzSISAaGrF2RoKupoC47u2wiMp+Z8P/8mDh1CL8+8ujfi2U5naNvopSBmP/BUj8b5w==",
1036
+ "dependencies": {
1037
+ "@smithy/types": "^3.3.0",
1038
+ "tslib": "^2.6.2"
1039
+ },
1040
+ "engines": {
1041
+ "node": ">=16.0.0"
1042
+ }
1043
+ },
1044
+ "node_modules/@smithy/signature-v4": {
1045
+ "version": "3.1.2",
1046
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.2.tgz",
1047
+ "integrity": "sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==",
1048
+ "dependencies": {
1049
+ "@smithy/is-array-buffer": "^3.0.0",
1050
+ "@smithy/types": "^3.3.0",
1051
+ "@smithy/util-hex-encoding": "^3.0.0",
1052
+ "@smithy/util-middleware": "^3.0.3",
1053
+ "@smithy/util-uri-escape": "^3.0.0",
1054
+ "@smithy/util-utf8": "^3.0.0",
1055
+ "tslib": "^2.6.2"
1056
+ },
1057
+ "engines": {
1058
+ "node": ">=16.0.0"
1059
+ }
1060
+ },
1061
+ "node_modules/@smithy/smithy-client": {
1062
+ "version": "3.1.5",
1063
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.5.tgz",
1064
+ "integrity": "sha512-x9bL9Mx2CT2P1OiUlHM+ZNpbVU6TgT32f9CmTRzqIHA7M4vYrROCWEoC3o4xHNJASoGd4Opos3cXYPgh+/m4Ww==",
1065
+ "dependencies": {
1066
+ "@smithy/middleware-endpoint": "^3.0.4",
1067
+ "@smithy/middleware-stack": "^3.0.3",
1068
+ "@smithy/protocol-http": "^4.0.3",
1069
+ "@smithy/types": "^3.3.0",
1070
+ "@smithy/util-stream": "^3.0.5",
1071
+ "tslib": "^2.6.2"
1072
+ },
1073
+ "engines": {
1074
+ "node": ">=16.0.0"
1075
+ }
1076
+ },
1077
+ "node_modules/@smithy/types": {
1078
+ "version": "3.3.0",
1079
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz",
1080
+ "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==",
1081
+ "dependencies": {
1082
+ "tslib": "^2.6.2"
1083
+ },
1084
+ "engines": {
1085
+ "node": ">=16.0.0"
1086
+ }
1087
+ },
1088
+ "node_modules/@smithy/url-parser": {
1089
+ "version": "3.0.3",
1090
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz",
1091
+ "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==",
1092
+ "dependencies": {
1093
+ "@smithy/querystring-parser": "^3.0.3",
1094
+ "@smithy/types": "^3.3.0",
1095
+ "tslib": "^2.6.2"
1096
+ }
1097
+ },
1098
+ "node_modules/@smithy/util-base64": {
1099
+ "version": "3.0.0",
1100
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz",
1101
+ "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==",
1102
+ "dependencies": {
1103
+ "@smithy/util-buffer-from": "^3.0.0",
1104
+ "@smithy/util-utf8": "^3.0.0",
1105
+ "tslib": "^2.6.2"
1106
+ },
1107
+ "engines": {
1108
+ "node": ">=16.0.0"
1109
+ }
1110
+ },
1111
+ "node_modules/@smithy/util-body-length-browser": {
1112
+ "version": "3.0.0",
1113
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz",
1114
+ "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==",
1115
+ "dependencies": {
1116
+ "tslib": "^2.6.2"
1117
+ }
1118
+ },
1119
+ "node_modules/@smithy/util-body-length-node": {
1120
+ "version": "3.0.0",
1121
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz",
1122
+ "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==",
1123
+ "dependencies": {
1124
+ "tslib": "^2.6.2"
1125
+ },
1126
+ "engines": {
1127
+ "node": ">=16.0.0"
1128
+ }
1129
+ },
1130
+ "node_modules/@smithy/util-buffer-from": {
1131
+ "version": "3.0.0",
1132
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz",
1133
+ "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==",
1134
+ "dependencies": {
1135
+ "@smithy/is-array-buffer": "^3.0.0",
1136
+ "tslib": "^2.6.2"
1137
+ },
1138
+ "engines": {
1139
+ "node": ">=16.0.0"
1140
+ }
1141
+ },
1142
+ "node_modules/@smithy/util-config-provider": {
1143
+ "version": "3.0.0",
1144
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz",
1145
+ "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==",
1146
+ "dependencies": {
1147
+ "tslib": "^2.6.2"
1148
+ },
1149
+ "engines": {
1150
+ "node": ">=16.0.0"
1151
+ }
1152
+ },
1153
+ "node_modules/@smithy/util-defaults-mode-browser": {
1154
+ "version": "3.0.7",
1155
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.7.tgz",
1156
+ "integrity": "sha512-Q2txLyvQyGfmjsaDbVV7Sg8psefpFcrnlGapDzXGFRPFKRBeEg6OvFK8FljqjeHSaCZ6/UuzQExUPqBR/2qlDA==",
1157
+ "dependencies": {
1158
+ "@smithy/property-provider": "^3.1.3",
1159
+ "@smithy/smithy-client": "^3.1.5",
1160
+ "@smithy/types": "^3.3.0",
1161
+ "bowser": "^2.11.0",
1162
+ "tslib": "^2.6.2"
1163
+ },
1164
+ "engines": {
1165
+ "node": ">= 10.0.0"
1166
+ }
1167
+ },
1168
+ "node_modules/@smithy/util-defaults-mode-node": {
1169
+ "version": "3.0.7",
1170
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.7.tgz",
1171
+ "integrity": "sha512-F4Qcj1fG6MGi2BSWCslfsMSwllws/WzYONBGtLybyY+halAcXdWhcew+mej8M5SKd5hqPYp4f7b+ABQEaeytgg==",
1172
+ "dependencies": {
1173
+ "@smithy/config-resolver": "^3.0.4",
1174
+ "@smithy/credential-provider-imds": "^3.1.3",
1175
+ "@smithy/node-config-provider": "^3.1.3",
1176
+ "@smithy/property-provider": "^3.1.3",
1177
+ "@smithy/smithy-client": "^3.1.5",
1178
+ "@smithy/types": "^3.3.0",
1179
+ "tslib": "^2.6.2"
1180
+ },
1181
+ "engines": {
1182
+ "node": ">= 10.0.0"
1183
+ }
1184
+ },
1185
+ "node_modules/@smithy/util-endpoints": {
1186
+ "version": "2.0.4",
1187
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.4.tgz",
1188
+ "integrity": "sha512-ZAtNf+vXAsgzgRutDDiklU09ZzZiiV/nATyqde4Um4priTmasDH+eLpp3tspL0hS2dEootyFMhu1Y6Y+tzpWBQ==",
1189
+ "dependencies": {
1190
+ "@smithy/node-config-provider": "^3.1.3",
1191
+ "@smithy/types": "^3.3.0",
1192
+ "tslib": "^2.6.2"
1193
+ },
1194
+ "engines": {
1195
+ "node": ">=16.0.0"
1196
+ }
1197
+ },
1198
+ "node_modules/@smithy/util-hex-encoding": {
1199
+ "version": "3.0.0",
1200
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz",
1201
+ "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==",
1202
+ "dependencies": {
1203
+ "tslib": "^2.6.2"
1204
+ },
1205
+ "engines": {
1206
+ "node": ">=16.0.0"
1207
+ }
1208
+ },
1209
+ "node_modules/@smithy/util-middleware": {
1210
+ "version": "3.0.3",
1211
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz",
1212
+ "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==",
1213
+ "dependencies": {
1214
+ "@smithy/types": "^3.3.0",
1215
+ "tslib": "^2.6.2"
1216
+ },
1217
+ "engines": {
1218
+ "node": ">=16.0.0"
1219
+ }
1220
+ },
1221
+ "node_modules/@smithy/util-retry": {
1222
+ "version": "3.0.3",
1223
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz",
1224
+ "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==",
1225
+ "dependencies": {
1226
+ "@smithy/service-error-classification": "^3.0.3",
1227
+ "@smithy/types": "^3.3.0",
1228
+ "tslib": "^2.6.2"
1229
+ },
1230
+ "engines": {
1231
+ "node": ">=16.0.0"
1232
+ }
1233
+ },
1234
+ "node_modules/@smithy/util-stream": {
1235
+ "version": "3.0.5",
1236
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.5.tgz",
1237
+ "integrity": "sha512-xC3L5PKMAT/Bh8fmHNXP9sdQ4+4aKVUU3EEJ2CF/lLk7R+wtMJM+v/1B4en7jO++Wa5spGzFDBCl0QxgbUc5Ug==",
1238
+ "dependencies": {
1239
+ "@smithy/fetch-http-handler": "^3.2.0",
1240
+ "@smithy/node-http-handler": "^3.1.1",
1241
+ "@smithy/types": "^3.3.0",
1242
+ "@smithy/util-base64": "^3.0.0",
1243
+ "@smithy/util-buffer-from": "^3.0.0",
1244
+ "@smithy/util-hex-encoding": "^3.0.0",
1245
+ "@smithy/util-utf8": "^3.0.0",
1246
+ "tslib": "^2.6.2"
1247
+ },
1248
+ "engines": {
1249
+ "node": ">=16.0.0"
1250
+ }
1251
+ },
1252
+ "node_modules/@smithy/util-uri-escape": {
1253
+ "version": "3.0.0",
1254
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz",
1255
+ "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==",
1256
+ "dependencies": {
1257
+ "tslib": "^2.6.2"
1258
+ },
1259
+ "engines": {
1260
+ "node": ">=16.0.0"
1261
+ }
1262
+ },
1263
+ "node_modules/@smithy/util-utf8": {
1264
+ "version": "3.0.0",
1265
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz",
1266
+ "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==",
1267
+ "dependencies": {
1268
+ "@smithy/util-buffer-from": "^3.0.0",
1269
+ "tslib": "^2.6.2"
1270
+ },
1271
+ "engines": {
1272
+ "node": ">=16.0.0"
1273
+ }
1274
+ },
1275
+ "node_modules/@types/lodash": {
1276
+ "version": "4.17.7",
1277
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz",
1278
+ "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==",
1279
+ "dev": true
1280
+ },
1281
+ "node_modules/@types/node": {
1282
+ "version": "20.8.3",
1283
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz",
1284
+ "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==",
1285
+ "dev": true
1286
+ },
1287
+ "node_modules/@types/node-forge": {
1288
+ "version": "1.3.11",
1289
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
1290
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
1291
+ "dev": true,
1292
+ "dependencies": {
1293
+ "@types/node": "*"
1294
+ }
1295
+ },
1296
+ "node_modules/@types/service-worker-mock": {
1297
+ "version": "2.0.4",
1298
+ "resolved": "https://registry.npmjs.org/@types/service-worker-mock/-/service-worker-mock-2.0.4.tgz",
1299
+ "integrity": "sha512-MEBT2eiqYfhxjqYm/oAf2AvKLbPTPwJJAYrMdheKnGyz1yG9XBRfxCzi93h27qpSvI7jOYfXqFLVMLBXFDqo4A==",
1300
+ "dev": true
1301
+ },
1302
+ "node_modules/acorn": {
1303
+ "version": "8.12.1",
1304
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
1305
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
1306
+ "dev": true,
1307
+ "bin": {
1308
+ "acorn": "bin/acorn"
1309
+ },
1310
+ "engines": {
1311
+ "node": ">=0.4.0"
1312
+ }
1313
+ },
1314
+ "node_modules/acorn-walk": {
1315
+ "version": "8.3.3",
1316
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
1317
+ "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
1318
+ "dev": true,
1319
+ "dependencies": {
1320
+ "acorn": "^8.11.0"
1321
+ },
1322
+ "engines": {
1323
+ "node": ">=0.4.0"
1324
+ }
1325
+ },
1326
+ "node_modules/anymatch": {
1327
+ "version": "3.1.3",
1328
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1329
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1330
+ "dev": true,
1331
+ "dependencies": {
1332
+ "normalize-path": "^3.0.0",
1333
+ "picomatch": "^2.0.4"
1334
+ },
1335
+ "engines": {
1336
+ "node": ">= 8"
1337
+ }
1338
+ },
1339
+ "node_modules/argparse": {
1340
+ "version": "2.0.1",
1341
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1342
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
1343
+ },
1344
+ "node_modules/as-table": {
1345
+ "version": "1.0.55",
1346
+ "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz",
1347
+ "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==",
1348
+ "dev": true,
1349
+ "dependencies": {
1350
+ "printable-characters": "^1.0.42"
1351
+ }
1352
+ },
1353
+ "node_modules/aws4fetch": {
1354
+ "version": "1.0.18",
1355
+ "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.18.tgz",
1356
+ "integrity": "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="
1357
+ },
1358
+ "node_modules/binary-extensions": {
1359
+ "version": "2.3.0",
1360
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1361
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1362
+ "dev": true,
1363
+ "engines": {
1364
+ "node": ">=8"
1365
+ },
1366
+ "funding": {
1367
+ "url": "https://github.com/sponsors/sindresorhus"
1368
+ }
1369
+ },
1370
+ "node_modules/blake3-wasm": {
1371
+ "version": "2.1.5",
1372
+ "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz",
1373
+ "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==",
1374
+ "dev": true
1375
+ },
1376
+ "node_modules/bowser": {
1377
+ "version": "2.11.0",
1378
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
1379
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
1380
+ },
1381
+ "node_modules/braces": {
1382
+ "version": "3.0.3",
1383
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1384
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1385
+ "dev": true,
1386
+ "dependencies": {
1387
+ "fill-range": "^7.1.1"
1388
+ },
1389
+ "engines": {
1390
+ "node": ">=8"
1391
+ }
1392
+ },
1393
+ "node_modules/capnp-ts": {
1394
+ "version": "0.7.0",
1395
+ "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz",
1396
+ "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==",
1397
+ "dev": true,
1398
+ "dependencies": {
1399
+ "debug": "^4.3.1",
1400
+ "tslib": "^2.2.0"
1401
+ }
1402
+ },
1403
+ "node_modules/chanfana": {
1404
+ "version": "2.0.2",
1405
+ "resolved": "https://registry.npmjs.org/chanfana/-/chanfana-2.0.2.tgz",
1406
+ "integrity": "sha512-HuYjj+tIXHvKJ8FobeWOcshg35kYK15uqNQdZy22pF2DMyySW5DlnYK8jcAyoLQiCwPplQdKZonFLfP/sCFMBg==",
1407
+ "dependencies": {
1408
+ "@asteasolutions/zod-to-openapi": "^7.1.1",
1409
+ "js-yaml": "^4.1.0",
1410
+ "openapi3-ts": "^4.3.2",
1411
+ "zod": "^3.23.8"
1412
+ }
1413
+ },
1414
+ "node_modules/chanfana/node_modules/@asteasolutions/zod-to-openapi": {
1415
+ "version": "7.1.1",
1416
+ "resolved": "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-7.1.1.tgz",
1417
+ "integrity": "sha512-lF0d1gAc0lYLO9/BAGivwTwE2Sh9h6CHuDcbk5KnGBfIuAsAkDC+Fdat4dkQY3CS/zUWKHRmFEma0B7X132Ymw==",
1418
+ "dependencies": {
1419
+ "openapi3-ts": "^4.1.2"
1420
+ },
1421
+ "peerDependencies": {
1422
+ "zod": "^3.20.2"
1423
+ }
1424
+ },
1425
+ "node_modules/chokidar": {
1426
+ "version": "3.6.0",
1427
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1428
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1429
+ "dev": true,
1430
+ "dependencies": {
1431
+ "anymatch": "~3.1.2",
1432
+ "braces": "~3.0.2",
1433
+ "glob-parent": "~5.1.2",
1434
+ "is-binary-path": "~2.1.0",
1435
+ "is-glob": "~4.0.1",
1436
+ "normalize-path": "~3.0.0",
1437
+ "readdirp": "~3.6.0"
1438
+ },
1439
+ "engines": {
1440
+ "node": ">= 8.10.0"
1441
+ },
1442
+ "funding": {
1443
+ "url": "https://paulmillr.com/funding/"
1444
+ },
1445
+ "optionalDependencies": {
1446
+ "fsevents": "~2.3.2"
1447
+ }
1448
+ },
1449
+ "node_modules/consola": {
1450
+ "version": "3.2.3",
1451
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
1452
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
1453
+ "dev": true,
1454
+ "engines": {
1455
+ "node": "^14.18.0 || >=16.10.0"
1456
+ }
1457
+ },
1458
+ "node_modules/cookie": {
1459
+ "version": "0.5.0",
1460
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1461
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
1462
+ "dev": true,
1463
+ "engines": {
1464
+ "node": ">= 0.6"
1465
+ }
1466
+ },
1467
+ "node_modules/data-uri-to-buffer": {
1468
+ "version": "2.0.2",
1469
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz",
1470
+ "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==",
1471
+ "dev": true
1472
+ },
1473
+ "node_modules/date-fns": {
1474
+ "version": "3.6.0",
1475
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
1476
+ "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
1477
+ "dev": true,
1478
+ "funding": {
1479
+ "type": "github",
1480
+ "url": "https://github.com/sponsors/kossnocorp"
1481
+ }
1482
+ },
1483
+ "node_modules/debug": {
1484
+ "version": "4.3.5",
1485
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
1486
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
1487
+ "dev": true,
1488
+ "dependencies": {
1489
+ "ms": "2.1.2"
1490
+ },
1491
+ "engines": {
1492
+ "node": ">=6.0"
1493
+ },
1494
+ "peerDependenciesMeta": {
1495
+ "supports-color": {
1496
+ "optional": true
1497
+ }
1498
+ }
1499
+ },
1500
+ "node_modules/defu": {
1501
+ "version": "6.1.4",
1502
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
1503
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
1504
+ "dev": true
1505
+ },
1506
+ "node_modules/esbuild": {
1507
+ "version": "0.17.19",
1508
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
1509
+ "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
1510
+ "dev": true,
1511
+ "hasInstallScript": true,
1512
+ "bin": {
1513
+ "esbuild": "bin/esbuild"
1514
+ },
1515
+ "engines": {
1516
+ "node": ">=12"
1517
+ },
1518
+ "optionalDependencies": {
1519
+ "@esbuild/android-arm": "0.17.19",
1520
+ "@esbuild/android-arm64": "0.17.19",
1521
+ "@esbuild/android-x64": "0.17.19",
1522
+ "@esbuild/darwin-arm64": "0.17.19",
1523
+ "@esbuild/darwin-x64": "0.17.19",
1524
+ "@esbuild/freebsd-arm64": "0.17.19",
1525
+ "@esbuild/freebsd-x64": "0.17.19",
1526
+ "@esbuild/linux-arm": "0.17.19",
1527
+ "@esbuild/linux-arm64": "0.17.19",
1528
+ "@esbuild/linux-ia32": "0.17.19",
1529
+ "@esbuild/linux-loong64": "0.17.19",
1530
+ "@esbuild/linux-mips64el": "0.17.19",
1531
+ "@esbuild/linux-ppc64": "0.17.19",
1532
+ "@esbuild/linux-riscv64": "0.17.19",
1533
+ "@esbuild/linux-s390x": "0.17.19",
1534
+ "@esbuild/linux-x64": "0.17.19",
1535
+ "@esbuild/netbsd-x64": "0.17.19",
1536
+ "@esbuild/openbsd-x64": "0.17.19",
1537
+ "@esbuild/sunos-x64": "0.17.19",
1538
+ "@esbuild/win32-arm64": "0.17.19",
1539
+ "@esbuild/win32-ia32": "0.17.19",
1540
+ "@esbuild/win32-x64": "0.17.19"
1541
+ }
1542
+ },
1543
+ "node_modules/escape-string-regexp": {
1544
+ "version": "4.0.0",
1545
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1546
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1547
+ "dev": true,
1548
+ "engines": {
1549
+ "node": ">=10"
1550
+ },
1551
+ "funding": {
1552
+ "url": "https://github.com/sponsors/sindresorhus"
1553
+ }
1554
+ },
1555
+ "node_modules/exit-hook": {
1556
+ "version": "2.2.1",
1557
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz",
1558
+ "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==",
1559
+ "dev": true,
1560
+ "engines": {
1561
+ "node": ">=6"
1562
+ },
1563
+ "funding": {
1564
+ "url": "https://github.com/sponsors/sindresorhus"
1565
+ }
1566
+ },
1567
+ "node_modules/fast-xml-parser": {
1568
+ "version": "4.2.5",
1569
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
1570
+ "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
1571
+ "funding": [
1572
+ {
1573
+ "type": "paypal",
1574
+ "url": "https://paypal.me/naturalintelligence"
1575
+ },
1576
+ {
1577
+ "type": "github",
1578
+ "url": "https://github.com/sponsors/NaturalIntelligence"
1579
+ }
1580
+ ],
1581
+ "dependencies": {
1582
+ "strnum": "^1.0.5"
1583
+ },
1584
+ "bin": {
1585
+ "fxparser": "src/cli/cli.js"
1586
+ }
1587
+ },
1588
+ "node_modules/fill-range": {
1589
+ "version": "7.1.1",
1590
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1591
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1592
+ "dev": true,
1593
+ "dependencies": {
1594
+ "to-regex-range": "^5.0.1"
1595
+ },
1596
+ "engines": {
1597
+ "node": ">=8"
1598
+ }
1599
+ },
1600
+ "node_modules/function-bind": {
1601
+ "version": "1.1.2",
1602
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1603
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1604
+ "dev": true,
1605
+ "funding": {
1606
+ "url": "https://github.com/sponsors/ljharb"
1607
+ }
1608
+ },
1609
+ "node_modules/get-source": {
1610
+ "version": "2.0.12",
1611
+ "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz",
1612
+ "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==",
1613
+ "dev": true,
1614
+ "dependencies": {
1615
+ "data-uri-to-buffer": "^2.0.0",
1616
+ "source-map": "^0.6.1"
1617
+ }
1618
+ },
1619
+ "node_modules/glob-parent": {
1620
+ "version": "5.1.2",
1621
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1622
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1623
+ "dev": true,
1624
+ "dependencies": {
1625
+ "is-glob": "^4.0.1"
1626
+ },
1627
+ "engines": {
1628
+ "node": ">= 6"
1629
+ }
1630
+ },
1631
+ "node_modules/glob-to-regexp": {
1632
+ "version": "0.4.1",
1633
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
1634
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
1635
+ "dev": true
1636
+ },
1637
+ "node_modules/hasown": {
1638
+ "version": "2.0.2",
1639
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1640
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1641
+ "dev": true,
1642
+ "dependencies": {
1643
+ "function-bind": "^1.1.2"
1644
+ },
1645
+ "engines": {
1646
+ "node": ">= 0.4"
1647
+ }
1648
+ },
1649
+ "node_modules/hono": {
1650
+ "version": "4.4.11",
1651
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.4.11.tgz",
1652
+ "integrity": "sha512-R5RADpjoRsR3/VsnFovpsYNLPnC1f+FgdfsePk3qIgjb4D41Sg7uW5QCj41kzEOwXCjBg0sVvOZMvUNZ0DKB7g==",
1653
+ "engines": {
1654
+ "node": ">=16.0.0"
1655
+ }
1656
+ },
1657
+ "node_modules/is-binary-path": {
1658
+ "version": "2.1.0",
1659
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1660
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1661
+ "dev": true,
1662
+ "dependencies": {
1663
+ "binary-extensions": "^2.0.0"
1664
+ },
1665
+ "engines": {
1666
+ "node": ">=8"
1667
+ }
1668
+ },
1669
+ "node_modules/is-core-module": {
1670
+ "version": "2.14.0",
1671
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
1672
+ "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
1673
+ "dev": true,
1674
+ "dependencies": {
1675
+ "hasown": "^2.0.2"
1676
+ },
1677
+ "engines": {
1678
+ "node": ">= 0.4"
1679
+ },
1680
+ "funding": {
1681
+ "url": "https://github.com/sponsors/ljharb"
1682
+ }
1683
+ },
1684
+ "node_modules/is-extglob": {
1685
+ "version": "2.1.1",
1686
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1687
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1688
+ "dev": true,
1689
+ "engines": {
1690
+ "node": ">=0.10.0"
1691
+ }
1692
+ },
1693
+ "node_modules/is-glob": {
1694
+ "version": "4.0.3",
1695
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1696
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1697
+ "dev": true,
1698
+ "dependencies": {
1699
+ "is-extglob": "^2.1.1"
1700
+ },
1701
+ "engines": {
1702
+ "node": ">=0.10.0"
1703
+ }
1704
+ },
1705
+ "node_modules/is-number": {
1706
+ "version": "7.0.0",
1707
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1708
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1709
+ "dev": true,
1710
+ "engines": {
1711
+ "node": ">=0.12.0"
1712
+ }
1713
+ },
1714
+ "node_modules/jose": {
1715
+ "version": "5.6.3",
1716
+ "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz",
1717
+ "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==",
1718
+ "funding": {
1719
+ "url": "https://github.com/sponsors/panva"
1720
+ }
1721
+ },
1722
+ "node_modules/js-yaml": {
1723
+ "version": "4.1.0",
1724
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1725
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1726
+ "dependencies": {
1727
+ "argparse": "^2.0.1"
1728
+ },
1729
+ "bin": {
1730
+ "js-yaml": "bin/js-yaml.js"
1731
+ }
1732
+ },
1733
+ "node_modules/lodash": {
1734
+ "version": "4.17.21",
1735
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1736
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1737
+ },
1738
+ "node_modules/mime": {
1739
+ "version": "3.0.0",
1740
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
1741
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
1742
+ "dev": true,
1743
+ "bin": {
1744
+ "mime": "cli.js"
1745
+ },
1746
+ "engines": {
1747
+ "node": ">=10.0.0"
1748
+ }
1749
+ },
1750
+ "node_modules/miniflare": {
1751
+ "version": "3.20240701.0",
1752
+ "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240701.0.tgz",
1753
+ "integrity": "sha512-m9+I+7JNyqDGftCMKp9cK9pCZkK72hAL2mM9IWwhct+ZmucLBA8Uu6+rHQqA5iod86cpwOkrB2PrPA3wx9YNgw==",
1754
+ "dev": true,
1755
+ "dependencies": {
1756
+ "@cspotcode/source-map-support": "0.8.1",
1757
+ "acorn": "^8.8.0",
1758
+ "acorn-walk": "^8.2.0",
1759
+ "capnp-ts": "^0.7.0",
1760
+ "exit-hook": "^2.2.1",
1761
+ "glob-to-regexp": "^0.4.1",
1762
+ "stoppable": "^1.1.0",
1763
+ "undici": "^5.28.4",
1764
+ "workerd": "1.20240701.0",
1765
+ "ws": "^8.17.1",
1766
+ "youch": "^3.2.2",
1767
+ "zod": "^3.22.3"
1768
+ },
1769
+ "bin": {
1770
+ "miniflare": "bootstrap.js"
1771
+ },
1772
+ "engines": {
1773
+ "node": ">=16.13"
1774
+ }
1775
+ },
1776
+ "node_modules/ms": {
1777
+ "version": "2.1.2",
1778
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1779
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1780
+ "dev": true
1781
+ },
1782
+ "node_modules/mustache": {
1783
+ "version": "4.2.0",
1784
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
1785
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
1786
+ "dev": true,
1787
+ "bin": {
1788
+ "mustache": "bin/mustache"
1789
+ }
1790
+ },
1791
+ "node_modules/nanoid": {
1792
+ "version": "5.0.7",
1793
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
1794
+ "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==",
1795
+ "funding": [
1796
+ {
1797
+ "type": "github",
1798
+ "url": "https://github.com/sponsors/ai"
1799
+ }
1800
+ ],
1801
+ "bin": {
1802
+ "nanoid": "bin/nanoid.js"
1803
+ },
1804
+ "engines": {
1805
+ "node": "^18 || >=20"
1806
+ }
1807
+ },
1808
+ "node_modules/node-fetch-native": {
1809
+ "version": "1.6.4",
1810
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
1811
+ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
1812
+ "dev": true
1813
+ },
1814
+ "node_modules/node-forge": {
1815
+ "version": "1.3.1",
1816
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
1817
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
1818
+ "dev": true,
1819
+ "engines": {
1820
+ "node": ">= 6.13.0"
1821
+ }
1822
+ },
1823
+ "node_modules/normalize-path": {
1824
+ "version": "3.0.0",
1825
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1826
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1827
+ "dev": true,
1828
+ "engines": {
1829
+ "node": ">=0.10.0"
1830
+ }
1831
+ },
1832
+ "node_modules/openapi3-ts": {
1833
+ "version": "4.3.3",
1834
+ "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.3.3.tgz",
1835
+ "integrity": "sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==",
1836
+ "dependencies": {
1837
+ "yaml": "^2.4.5"
1838
+ }
1839
+ },
1840
+ "node_modules/path-parse": {
1841
+ "version": "1.0.7",
1842
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1843
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1844
+ "dev": true
1845
+ },
1846
+ "node_modules/path-to-regexp": {
1847
+ "version": "6.2.2",
1848
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz",
1849
+ "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==",
1850
+ "dev": true
1851
+ },
1852
+ "node_modules/pathe": {
1853
+ "version": "1.1.2",
1854
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
1855
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
1856
+ "dev": true
1857
+ },
1858
+ "node_modules/picomatch": {
1859
+ "version": "2.3.1",
1860
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1861
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1862
+ "dev": true,
1863
+ "engines": {
1864
+ "node": ">=8.6"
1865
+ },
1866
+ "funding": {
1867
+ "url": "https://github.com/sponsors/jonschlinkert"
1868
+ }
1869
+ },
1870
+ "node_modules/printable-characters": {
1871
+ "version": "1.0.42",
1872
+ "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz",
1873
+ "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==",
1874
+ "dev": true
1875
+ },
1876
+ "node_modules/readdirp": {
1877
+ "version": "3.6.0",
1878
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1879
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1880
+ "dev": true,
1881
+ "dependencies": {
1882
+ "picomatch": "^2.2.1"
1883
+ },
1884
+ "engines": {
1885
+ "node": ">=8.10.0"
1886
+ }
1887
+ },
1888
+ "node_modules/resolve": {
1889
+ "version": "1.22.8",
1890
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
1891
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
1892
+ "dev": true,
1893
+ "dependencies": {
1894
+ "is-core-module": "^2.13.0",
1895
+ "path-parse": "^1.0.7",
1896
+ "supports-preserve-symlinks-flag": "^1.0.0"
1897
+ },
1898
+ "bin": {
1899
+ "resolve": "bin/resolve"
1900
+ },
1901
+ "funding": {
1902
+ "url": "https://github.com/sponsors/ljharb"
1903
+ }
1904
+ },
1905
+ "node_modules/resolve.exports": {
1906
+ "version": "2.0.2",
1907
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
1908
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
1909
+ "dev": true,
1910
+ "engines": {
1911
+ "node": ">=10"
1912
+ }
1913
+ },
1914
+ "node_modules/rollup-plugin-inject": {
1915
+ "version": "3.0.2",
1916
+ "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz",
1917
+ "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==",
1918
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.",
1919
+ "dev": true,
1920
+ "dependencies": {
1921
+ "estree-walker": "^0.6.1",
1922
+ "magic-string": "^0.25.3",
1923
+ "rollup-pluginutils": "^2.8.1"
1924
+ }
1925
+ },
1926
+ "node_modules/rollup-plugin-inject/node_modules/estree-walker": {
1927
+ "version": "0.6.1",
1928
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
1929
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
1930
+ "dev": true
1931
+ },
1932
+ "node_modules/rollup-plugin-inject/node_modules/magic-string": {
1933
+ "version": "0.25.9",
1934
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
1935
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
1936
+ "dev": true,
1937
+ "dependencies": {
1938
+ "sourcemap-codec": "^1.4.8"
1939
+ }
1940
+ },
1941
+ "node_modules/rollup-plugin-node-polyfills": {
1942
+ "version": "0.2.1",
1943
+ "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz",
1944
+ "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==",
1945
+ "dev": true,
1946
+ "dependencies": {
1947
+ "rollup-plugin-inject": "^3.0.0"
1948
+ }
1949
+ },
1950
+ "node_modules/rollup-pluginutils": {
1951
+ "version": "2.8.2",
1952
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
1953
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
1954
+ "dev": true,
1955
+ "dependencies": {
1956
+ "estree-walker": "^0.6.1"
1957
+ }
1958
+ },
1959
+ "node_modules/rollup-pluginutils/node_modules/estree-walker": {
1960
+ "version": "0.6.1",
1961
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
1962
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
1963
+ "dev": true
1964
+ },
1965
+ "node_modules/selfsigned": {
1966
+ "version": "2.4.1",
1967
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
1968
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
1969
+ "dev": true,
1970
+ "dependencies": {
1971
+ "@types/node-forge": "^1.3.0",
1972
+ "node-forge": "^1"
1973
+ },
1974
+ "engines": {
1975
+ "node": ">=10"
1976
+ }
1977
+ },
1978
+ "node_modules/source-map": {
1979
+ "version": "0.6.1",
1980
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1981
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1982
+ "dev": true,
1983
+ "engines": {
1984
+ "node": ">=0.10.0"
1985
+ }
1986
+ },
1987
+ "node_modules/sourcemap-codec": {
1988
+ "version": "1.4.8",
1989
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
1990
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
1991
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
1992
+ "dev": true
1993
+ },
1994
+ "node_modules/stacktracey": {
1995
+ "version": "2.1.8",
1996
+ "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz",
1997
+ "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==",
1998
+ "dev": true,
1999
+ "dependencies": {
2000
+ "as-table": "^1.0.36",
2001
+ "get-source": "^2.0.12"
2002
+ }
2003
+ },
2004
+ "node_modules/stoppable": {
2005
+ "version": "1.1.0",
2006
+ "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
2007
+ "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
2008
+ "dev": true,
2009
+ "engines": {
2010
+ "node": ">=4",
2011
+ "npm": ">=6"
2012
+ }
2013
+ },
2014
+ "node_modules/strnum": {
2015
+ "version": "1.0.5",
2016
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
2017
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
2018
+ },
2019
+ "node_modules/supports-preserve-symlinks-flag": {
2020
+ "version": "1.0.0",
2021
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2022
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2023
+ "dev": true,
2024
+ "engines": {
2025
+ "node": ">= 0.4"
2026
+ },
2027
+ "funding": {
2028
+ "url": "https://github.com/sponsors/ljharb"
2029
+ }
2030
+ },
2031
+ "node_modules/to-regex-range": {
2032
+ "version": "5.0.1",
2033
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2034
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2035
+ "dev": true,
2036
+ "dependencies": {
2037
+ "is-number": "^7.0.0"
2038
+ },
2039
+ "engines": {
2040
+ "node": ">=8.0"
2041
+ }
2042
+ },
2043
+ "node_modules/tslib": {
2044
+ "version": "2.6.3",
2045
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
2046
+ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
2047
+ },
2048
+ "node_modules/typescript": {
2049
+ "version": "5.5.3",
2050
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
2051
+ "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
2052
+ "dev": true,
2053
+ "bin": {
2054
+ "tsc": "bin/tsc",
2055
+ "tsserver": "bin/tsserver"
2056
+ },
2057
+ "engines": {
2058
+ "node": ">=14.17"
2059
+ }
2060
+ },
2061
+ "node_modules/ufo": {
2062
+ "version": "1.5.3",
2063
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
2064
+ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
2065
+ "dev": true
2066
+ },
2067
+ "node_modules/undici": {
2068
+ "version": "5.28.4",
2069
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
2070
+ "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
2071
+ "dev": true,
2072
+ "dependencies": {
2073
+ "@fastify/busboy": "^2.0.0"
2074
+ },
2075
+ "engines": {
2076
+ "node": ">=14.0"
2077
+ }
2078
+ },
2079
+ "node_modules/unenv": {
2080
+ "name": "unenv-nightly",
2081
+ "version": "1.10.0-1717606461.a117952",
2082
+ "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-1.10.0-1717606461.a117952.tgz",
2083
+ "integrity": "sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==",
2084
+ "dev": true,
2085
+ "dependencies": {
2086
+ "consola": "^3.2.3",
2087
+ "defu": "^6.1.4",
2088
+ "mime": "^3.0.0",
2089
+ "node-fetch-native": "^1.6.4",
2090
+ "pathe": "^1.1.2",
2091
+ "ufo": "^1.5.3"
2092
+ }
2093
+ },
2094
+ "node_modules/uuid": {
2095
+ "version": "9.0.1",
2096
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
2097
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
2098
+ "funding": [
2099
+ "https://github.com/sponsors/broofa",
2100
+ "https://github.com/sponsors/ctavan"
2101
+ ],
2102
+ "bin": {
2103
+ "uuid": "dist/bin/uuid"
2104
+ }
2105
+ },
2106
+ "node_modules/workerd": {
2107
+ "version": "1.20240701.0",
2108
+ "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240701.0.tgz",
2109
+ "integrity": "sha512-qSgNVqauqzNCij9MaJLF2c2ko3AnFioVSIxMSryGbRK+LvtGr9BKBt6JOxCb24DoJASoJDx3pe3DJHBVydUiBg==",
2110
+ "dev": true,
2111
+ "hasInstallScript": true,
2112
+ "bin": {
2113
+ "workerd": "bin/workerd"
2114
+ },
2115
+ "engines": {
2116
+ "node": ">=16"
2117
+ },
2118
+ "optionalDependencies": {
2119
+ "@cloudflare/workerd-darwin-64": "1.20240701.0",
2120
+ "@cloudflare/workerd-darwin-arm64": "1.20240701.0",
2121
+ "@cloudflare/workerd-linux-64": "1.20240701.0",
2122
+ "@cloudflare/workerd-linux-arm64": "1.20240701.0",
2123
+ "@cloudflare/workerd-windows-64": "1.20240701.0"
2124
+ }
2125
+ },
2126
+ "node_modules/wrangler": {
2127
+ "version": "3.63.0",
2128
+ "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.63.0.tgz",
2129
+ "integrity": "sha512-FMIGorXhYN161S1qotoIlg9EqpfRsPqtB/fd9J+qXTJ5xpctq4meaQAmRKfLI87cQDdkjUXpQBJyNgBXw4i81Q==",
2130
+ "dev": true,
2131
+ "dependencies": {
2132
+ "@cloudflare/kv-asset-handler": "0.3.4",
2133
+ "@esbuild-plugins/node-globals-polyfill": "^0.2.3",
2134
+ "@esbuild-plugins/node-modules-polyfill": "^0.2.2",
2135
+ "blake3-wasm": "^2.1.5",
2136
+ "chokidar": "^3.5.3",
2137
+ "date-fns": "^3.6.0",
2138
+ "esbuild": "0.17.19",
2139
+ "miniflare": "3.20240701.0",
2140
+ "nanoid": "^3.3.3",
2141
+ "path-to-regexp": "^6.2.0",
2142
+ "resolve": "^1.22.8",
2143
+ "resolve.exports": "^2.0.2",
2144
+ "selfsigned": "^2.0.1",
2145
+ "source-map": "^0.6.1",
2146
+ "unenv": "npm:unenv-nightly@1.10.0-1717606461.a117952",
2147
+ "xxhash-wasm": "^1.0.1"
2148
+ },
2149
+ "bin": {
2150
+ "wrangler": "bin/wrangler.js",
2151
+ "wrangler2": "bin/wrangler.js"
2152
+ },
2153
+ "engines": {
2154
+ "node": ">=16.17.0"
2155
+ },
2156
+ "optionalDependencies": {
2157
+ "fsevents": "~2.3.2"
2158
+ },
2159
+ "peerDependencies": {
2160
+ "@cloudflare/workers-types": "^4.20240620.0"
2161
+ },
2162
+ "peerDependenciesMeta": {
2163
+ "@cloudflare/workers-types": {
2164
+ "optional": true
2165
+ }
2166
+ }
2167
+ },
2168
+ "node_modules/wrangler/node_modules/nanoid": {
2169
+ "version": "3.3.7",
2170
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
2171
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
2172
+ "dev": true,
2173
+ "funding": [
2174
+ {
2175
+ "type": "github",
2176
+ "url": "https://github.com/sponsors/ai"
2177
+ }
2178
+ ],
2179
+ "bin": {
2180
+ "nanoid": "bin/nanoid.cjs"
2181
+ },
2182
+ "engines": {
2183
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2184
+ }
2185
+ },
2186
+ "node_modules/ws": {
2187
+ "version": "8.17.1",
2188
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
2189
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
2190
+ "dev": true,
2191
+ "engines": {
2192
+ "node": ">=10.0.0"
2193
+ },
2194
+ "peerDependencies": {
2195
+ "bufferutil": "^4.0.1",
2196
+ "utf-8-validate": ">=5.0.2"
2197
+ },
2198
+ "peerDependenciesMeta": {
2199
+ "bufferutil": {
2200
+ "optional": true
2201
+ },
2202
+ "utf-8-validate": {
2203
+ "optional": true
2204
+ }
2205
+ }
2206
+ },
2207
+ "node_modules/xxhash-wasm": {
2208
+ "version": "1.0.2",
2209
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz",
2210
+ "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==",
2211
+ "dev": true
2212
+ },
2213
+ "node_modules/yaml": {
2214
+ "version": "2.4.5",
2215
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
2216
+ "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
2217
+ "bin": {
2218
+ "yaml": "bin.mjs"
2219
+ },
2220
+ "engines": {
2221
+ "node": ">= 14"
2222
+ }
2223
+ },
2224
+ "node_modules/youch": {
2225
+ "version": "3.3.3",
2226
+ "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz",
2227
+ "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==",
2228
+ "dev": true,
2229
+ "dependencies": {
2230
+ "cookie": "^0.5.0",
2231
+ "mustache": "^4.2.0",
2232
+ "stacktracey": "^2.1.8"
2233
+ }
2234
+ },
2235
+ "node_modules/zod": {
2236
+ "version": "3.23.8",
2237
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
2238
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
2239
+ "funding": {
2240
+ "url": "https://github.com/sponsors/colinhacks"
2241
+ }
2242
+ }
2243
+ }
2244
+ }
worker/package.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "worker",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "deploy": "wrangler deploy",
7
+ "dev": "wrangler dev",
8
+ "start": "wrangler dev",
9
+ "cf-typegen": "wrangler types"
10
+ },
11
+ "dependencies": {
12
+ "@aws-sdk/client-sqs": "^3.609.0",
13
+ "aws4fetch": "^1.0.18",
14
+ "chanfana": "^2.0.2",
15
+ "hono": "^4.4.11",
16
+ "jose": "^5.6.3",
17
+ "lodash": "^4.17.21",
18
+ "nanoid": "^5.0.7",
19
+ "zod": "^3.23.8"
20
+ },
21
+ "devDependencies": {
22
+ "@cloudflare/workers-types": "^4.20240620.0",
23
+ "@types/lodash": "^4.17.7",
24
+ "@types/node": "20.8.3",
25
+ "@types/service-worker-mock": "^2.0.1",
26
+ "typescript": "^5.4.5",
27
+ "wrangler": "^3.60.3"
28
+ }
29
+ }
worker/src/durableObjects.ts ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { DurableObject } from 'cloudflare:workers';
2
+ import { TaskStatusResult } from './types';
3
+
4
+ const CACHE_EXPIRATION_TIME = 5 * 60 * 1000; // 5 minutes in milliseconds
5
+
6
+ export class TaskStatusDurableObject extends DurableObject {
7
+ private value: Record<string, TaskStatusResult>;
8
+ constructor(state: DurableObjectState, env: unknown) {
9
+ super(state, env);
10
+ this.value = {};
11
+ }
12
+
13
+ getStatus(id: string) {
14
+ return this.value[id] || {};
15
+ }
16
+
17
+ setStatus(id: string, status: TaskStatusResult) {
18
+ const newValue = Object.assign(this.getStatus(id), status) as TaskStatusResult;
19
+ this.value[id] = newValue;
20
+ this.ctx.storage.getAlarm().then((currentAlarm) => {
21
+ if (currentAlarm == null) {
22
+ return this.ctx.storage.setAlarm(Date.now() + CACHE_EXPIRATION_TIME);
23
+ }
24
+ });
25
+ return newValue;
26
+ }
27
+
28
+ // TaskStatusResult has a timestamp, so we can use it to clean up old data
29
+ cleanUpOldData() {
30
+ const now = Date.now();
31
+ const ids = Object.keys(this.value);
32
+ for (const id of ids) {
33
+ if (now - this.value[id].timestamp > CACHE_EXPIRATION_TIME) {
34
+ delete this.value[id];
35
+ }
36
+ }
37
+ }
38
+
39
+ async alarm() {
40
+ this.cleanUpOldData();
41
+ await this.ctx.storage.setAlarm(Date.now() + CACHE_EXPIRATION_TIME);
42
+ }
43
+ }
worker/src/endpoints/billFetch.ts ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+ import { Bindings } from '../types';
5
+
6
+ export class FetchBill extends OpenAPIRoute {
7
+ schema = {
8
+ summary: '实时获取账单',
9
+ description: `实时获取账单数据,时间范围为 start 到 end`,
10
+ request: {
11
+ query: z.object({
12
+ start: z.number().int().optional(),
13
+ end: z.number().int().optional(),
14
+ }),
15
+ },
16
+ };
17
+
18
+ async handle(c: Context<{ Bindings: Bindings }>) {
19
+ const data = await this.getValidatedData<typeof this.schema>();
20
+ const start = new Date(data.query.start || 0);
21
+ const end = new Date(data.query.end || Date.now());
22
+ const query = `SELECT * FROM A1D_RB_BILLING`;
23
+ const API = `https://api.cloudflare.com/client/v4/accounts/${c.env.ACCOUNT_ID}/analytics_engine/sql`;
24
+ const response = await fetch(API, {
25
+ method: 'POST',
26
+ headers: {
27
+ Authorization: `Bearer ${c.env.API_TOKEN}`,
28
+ },
29
+ body: query,
30
+ });
31
+
32
+ const result = await response.text();
33
+ return c.text(result);
34
+ }
35
+ }
worker/src/endpoints/fileDownload.ts ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { legacyTypeIntoZod, OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+
5
+ import { Bindings, FileBody } from '../types';
6
+
7
+ export class DownloadFile extends OpenAPIRoute {
8
+ schema = {
9
+ summary: '下载R2上的图片',
10
+ description: '',
11
+ request: {
12
+ params: z.object({
13
+ file_name: z.string(),
14
+ }),
15
+ },
16
+ response: {
17
+ 200: {
18
+ description: '下载链接',
19
+ content: {
20
+ 'image/*': {
21
+ schema: legacyTypeIntoZod({ file: FileBody({ format: 'binary' }) }),
22
+ },
23
+ },
24
+ },
25
+ },
26
+ };
27
+
28
+ async handle(c: Context<{ Bindings: Bindings }>) {
29
+ const data = await this.getValidatedData<typeof this.schema>();
30
+ const prefix = 'origin';
31
+ const pathname = `${prefix}/${data.params.file_name}`;
32
+
33
+ const object = await c.env.MY_BUCKET.get(pathname);
34
+
35
+ if (object === null) {
36
+ c.status(404);
37
+ return c.json({ error: 'not found' });
38
+ }
39
+
40
+ const headers = new Headers();
41
+ object.writeHttpMetadata(headers);
42
+ headers.forEach((value, key) => {
43
+ c.header(key, value);
44
+ });
45
+ c.header('etag', object.httpEtag);
46
+
47
+ return c.body(object.body);
48
+ }
49
+ }
worker/src/endpoints/fileUpload.ts ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { contentJson, legacyTypeIntoZod, OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+ import { nanoid } from 'nanoid';
5
+
6
+ import { Bindings, FileBody } from '../types';
7
+ import { getPreSignedR2Url } from '../utils';
8
+
9
+ export class UploadFile extends OpenAPIRoute {
10
+ schema = {
11
+ summary: '将图片上传R2',
12
+ description:
13
+ '上传文件到R2,并获得临时链接,可以通过 ```\ncurl -X POST http://localhost:8787/uploads/:file_name \
14
+ -H "Content-Type: multipart/form-data" \
15
+ -F "file=@example.txt" \
16
+ -F "name=example" \\n``` 测试',
17
+ request: {
18
+ params: z.object({
19
+ file_name: z.string().regex(/\.(jpg|jpeg|png|gif|bmp|webp)$/i),
20
+ }),
21
+ body: {
22
+ content: {
23
+ 'multipart/form-data': {
24
+ schema: legacyTypeIntoZod({ file: FileBody({ format: 'binary' }) }),
25
+ },
26
+ },
27
+ },
28
+ },
29
+ response: {
30
+ '200': {
31
+ description: '下载链接',
32
+ ...contentJson({
33
+ url: z.string().url(),
34
+ }),
35
+ },
36
+ },
37
+ };
38
+
39
+ async handle(c: Context<{ Bindings: Bindings }>) {
40
+ const prefix = 'origin';
41
+ const filename = `${Date.now()}_${nanoid()}`;
42
+ const pathname = `${prefix}/${filename}`;
43
+
44
+ try {
45
+ const body = await c.req.parseBody();
46
+ if (!body) {
47
+ return c.json({ error: 'no body' }, 400);
48
+ }
49
+ const file = body['file'] as File;
50
+ const headers = new Headers();
51
+ headers.set('content-type', file.type);
52
+
53
+ await c.env.MY_BUCKET.put(pathname, file, { httpMetadata: headers });
54
+ } catch (e: any) {
55
+ return c.json({ error: e.message }, 400);
56
+ }
57
+
58
+ const url = new URL(c.req.url);
59
+ return c.json({
60
+ url: url.origin + '/api/uploads/' + filename,
61
+ thumb_url: url.origin + '/cdn-cgi/image/width=200,quality=75/api/uploads/' + filename,
62
+ });
63
+ }
64
+ }
65
+
66
+ export class UploadFilePut extends OpenAPIRoute {
67
+ schema = {
68
+ summary: '将图片上传R2(PUT)',
69
+ description:
70
+ '上传文件到R2,并获得临时链接<br>可以通过 ```\ncurl --upload-file test.png -v -H "Authorization: Bearer 1234" https://a1d-iu.xiongty.workers.dev/api/uploads/test.png``` 测试',
71
+ request: {
72
+ params: z.object({
73
+ file_name: z.string().regex(/\.(jpg|jpeg|png|gif|bmp|webp)$/i),
74
+ }),
75
+ body: {
76
+ content: {
77
+ 'application/octet-stream': {
78
+ schema: z.string(),
79
+ },
80
+ },
81
+ },
82
+ },
83
+ response: {
84
+ '200': {
85
+ description: '下载链接',
86
+ ...contentJson({
87
+ url: z.string().url(),
88
+ }),
89
+ },
90
+ },
91
+ };
92
+
93
+ async handle(c: Context<{ Bindings: Bindings }>) {
94
+ const prefix = 'origin';
95
+ const filename = `${Date.now()}_${nanoid()}`;
96
+ const pathname = `${prefix}/${filename}`;
97
+
98
+ try {
99
+ const body = c.req.raw.body;
100
+ await c.env.MY_BUCKET.put(pathname, body);
101
+ } catch (e: any) {
102
+ return c.json({ error: e.message }, 400);
103
+ }
104
+ const url = new URL(c.req.url);
105
+ return c.json({
106
+ url: url.origin + '/api/uploads/' + filename,
107
+ thumb_url: url.origin + '/cdn-cgi/image/width=200,quality=75/api/uploads/' + filename,
108
+ });
109
+ }
110
+ }
worker/src/endpoints/getR2PutUrl.ts ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+ import { nanoid } from 'nanoid';
5
+
6
+ import { Bindings } from '../types';
7
+ import { getPreSignedR2Url } from '../utils';
8
+
9
+ export class GetR2PutUrl extends OpenAPIRoute {
10
+ schema = {
11
+ summary: '获得R2上传下载的临时链接',
12
+ description: '获得R2文件的临时链接,可以通过 `curl -T filename.ext response.data.url` 测试',
13
+ request: {
14
+ params: z.object({
15
+ file_name: z.string().regex(/\.(jpg|jpeg|png|gif|bmp|webp)$/i),
16
+ }),
17
+ },
18
+ response: {
19
+ 200: z.object({
20
+ put_url: z.string().url(),
21
+ get_url: z.string().url(),
22
+ }),
23
+ },
24
+ };
25
+
26
+ async handle(c: Context<{ Bindings: Bindings }>) {
27
+ const data = await this.getValidatedData<typeof this.schema>();
28
+
29
+ const prefix = 'origin'; // 建议在 Object lifecycle rules 中增加一条规则,将 prefix 为 'origin/' 的文件设置过期时间
30
+ const pathname = `${prefix}/${Date.now()}_${nanoid()}_${data.params.file_name}`; // 上传的文件名
31
+
32
+ const [putUrl, getUrl] = await Promise.all([
33
+ getPreSignedR2Url(
34
+ c.env.ACCOUNT_ID,
35
+ c.env.BUCKET_NAME,
36
+ c.env.R2_ACCESS_KEY_ID,
37
+ c.env.R2_SECRET_ACCESS_KEY,
38
+ pathname,
39
+ 3600, // 预先签名链接有效时间 1 小时
40
+ 'PUT'
41
+ ),
42
+ getPreSignedR2Url(c.env.ACCOUNT_ID, c.env.BUCKET_NAME, c.env.R2_ACCESS_KEY_ID, c.env.R2_SECRET_ACCESS_KEY, pathname, 3600, 'GET'),
43
+ ]);
44
+
45
+ return c.json({ put_url: putUrl, get_url: getUrl });
46
+ }
47
+ }
worker/src/endpoints/taskCreate.ts ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute, contentJson } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+ import { nanoid } from 'nanoid';
5
+ import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs';
6
+
7
+ import { Bindings, TaskStatus } from '../types';
8
+
9
+ const PREMIUM_SCALE = 8;
10
+
11
+ const isPremium = (jwtPayload: any) => {
12
+ return !!jwtPayload.experimentalPremiumAccess; // TODO...
13
+ };
14
+ const isNeedPremiun = () => {
15
+ return false; // TODO...
16
+ };
17
+
18
+ export class CreateTask extends OpenAPIRoute {
19
+ schema = {
20
+ summary: '新建任务',
21
+ description:
22
+ '新建一个任务,把任务发送到 Queue 中等待处理。<br> id为可选项,需要上传nanoid,如果不上传则后端自动生成。',
23
+
24
+ request: {
25
+ body: contentJson({
26
+ id: z.string().nanoid().optional(),
27
+ prompt: z.string(),
28
+ lora_name: z.string(),
29
+ cover_size: z.string(),
30
+ // image_url: z.string().url(),
31
+ }),
32
+ },
33
+ };
34
+
35
+ async handle(c: Context<{ Bindings: Bindings }>) {
36
+ const data = await this.getValidatedData<typeof this.schema>();
37
+ const jwtPayload = c.get('jwtPayload');
38
+ if (isPremium(jwtPayload) === false && isNeedPremiun()) {
39
+ return c.json({ error: 'Premium Access Required' }, { status: 403 });
40
+ }
41
+
42
+ const task_id = data.body.id || nanoid();
43
+
44
+ const doId = c.env.TASK_STATUS_DURABLE_OBJECT.idFromName('a1d-flux-task-status');
45
+ const stub = c.env.TASK_STATUS_DURABLE_OBJECT.get(doId);
46
+ const status = await stub.getStatus(data.body.id);
47
+ if (status?.id) {
48
+ return c.json({ error: 'Task already exist' }, { status: 409 });
49
+ }
50
+
51
+ const client = new SQSClient({
52
+ region: c.env.AWS_REGION,
53
+ credentials: {
54
+ // use wrangler secrets to provide these global variables
55
+ accessKeyId: c.env.AWS_ACCESS_KEY_ID,
56
+ secretAccessKey: c.env.AWS_SECRET_ACCESS_KEY,
57
+ },
58
+ });
59
+
60
+ const prompt = data.body.prompt;
61
+ const lora_name = data.body.lora_name;
62
+ const cover_size = data.body.cover_size;
63
+ const msg = {
64
+ prompt,
65
+ lora_name,
66
+ cover_size,
67
+ task_id,
68
+ authorization: c.req.header('Authorization'),
69
+ };
70
+ const send = new SendMessageCommand({
71
+ QueueUrl: c.env.AWS_SQS_QUEUE_URL,
72
+ MessageBody: JSON.stringify(msg),
73
+ });
74
+
75
+ await client.send(send);
76
+
77
+ c.env.BILLING?.writeDataPoint({
78
+ blobs: [jwtPayload.experimentalPremiumAccess, prompt, lora_name, cover_size],
79
+ doubles: [],
80
+ indexes: [jwtPayload.userId],
81
+ });
82
+
83
+ const result = await stub.setStatus(task_id, {
84
+ id: task_id,
85
+ status: TaskStatus.WAITING,
86
+ timestamp: Date.now(),
87
+ });
88
+
89
+ return c.json(result);
90
+ }
91
+ }
worker/src/endpoints/taskFetch.ts ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+
5
+ import { Bindings, TaskStatus, Variables } from '../types';
6
+
7
+ export class FetchTask extends OpenAPIRoute {
8
+ schema = {
9
+ summary: '获取任务状态',
10
+ description: `获取任务状态,如果成功同时返回图片地址.同时支持 WebSocket 连接,通过 WebSocket 连接可以实时获取任务状态.
11
+
12
+ \`\`\`javascript
13
+ socket = new WebSocket('ws://localhost:8787/task/:id/ws')
14
+ socket.onmessage = console.log
15
+ socket.send('start')
16
+ \`\`\`
17
+ `,
18
+ request: {
19
+ params: z.object({
20
+ id: z.string().nanoid(),
21
+ }),
22
+ },
23
+ response: {
24
+ 200: z.object({
25
+ id: z.string(),
26
+ status: z.union([
27
+ z.literal(TaskStatus.WAITING),
28
+ z.literal(TaskStatus.PROCESSING),
29
+ z.literal(TaskStatus.FINISHED),
30
+ z.literal(TaskStatus.UNKNOWN),
31
+ ]),
32
+ image_url: z.string().optional(),
33
+ thumb_url: z.string().optional(),
34
+ }),
35
+ },
36
+ };
37
+
38
+ async handle(c: Context<{ Bindings: Bindings; Variables: Variables }>) {
39
+ const data = await this.getValidatedData<typeof this.schema>();
40
+ const result = await c.var.stub.getStatus(data.params.id);
41
+ return c.json(result);
42
+ }
43
+ }
worker/src/endpoints/taskFetchSSE.ts ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+
5
+ import { Bindings, TaskStatus, Variables } from '../types';
6
+
7
+ export class FetchTaskSSE extends OpenAPIRoute {
8
+ schema = {
9
+ summary: '获取任务状态 SSE',
10
+ description: `获取任务状态,如果成功同时返回图片地址.`,
11
+ request: {
12
+ params: z.object({
13
+ id: z.string().nanoid(),
14
+ }),
15
+ },
16
+ };
17
+
18
+ async handle(c: Context<{ Bindings: Bindings; Variables: Variables }>) {
19
+ const data = await this.getValidatedData<typeof this.schema>();
20
+ const headers: Record<string, string> = {
21
+ 'Content-Type': 'text/event-stream',
22
+ 'Cache-Control': 'no-cache',
23
+ Connection: 'keep-alive',
24
+ };
25
+ Object.keys(headers).forEach((key) => {
26
+ c.header(key, headers[key]);
27
+ });
28
+
29
+ const { readable, writable } = new TransformStream();
30
+
31
+ const enc = new TextEncoder();
32
+
33
+ const writer = writable.getWriter();
34
+ const fetchData = async (writer: WritableStreamDefaultWriter) => {
35
+ let interval = 1000; // 初始间隔时间
36
+ const increment = 0; // 每次增加的时间间隔
37
+ const maxInterval = 1000; // 最大间隔时间
38
+ while (true) {
39
+ await new Promise((resolve) => setTimeout(resolve, interval));
40
+ interval = Math.min(interval + increment, maxInterval);
41
+ try {
42
+ const result = await c.var.stub.getStatus(data.params.id);
43
+ if (!result.id) {
44
+ console.log('Task not found');
45
+ writer.write(enc.encode('data: {"error": "Task not found"}\n\n'));
46
+ return writer.close();
47
+ }
48
+ console.log('result:', result);
49
+ writer.write(enc.encode('data: ' + JSON.stringify(result) + '\n\n'));
50
+ if (result.status === TaskStatus.FINISHED || result.status === TaskStatus.FAILED || result.status === TaskStatus.UNKNOWN) {
51
+ console.log('Task status: ', result.status);
52
+ return writer.close();
53
+ } else {
54
+ console.log('Task not finished');
55
+ }
56
+ } catch (error) {
57
+ console.error('Error fetching data:', error);
58
+ }
59
+ }
60
+ };
61
+ fetchData(writer);
62
+
63
+ return c.body(readable);
64
+ }
65
+ }
worker/src/endpoints/taskUpdate.ts ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute, contentJson } from 'chanfana';
2
+ import { Context } from 'hono';
3
+ import { z } from 'zod';
4
+
5
+ import { Bindings, TaskStatus, Variables } from '../types';
6
+
7
+ export class UpdateTask extends OpenAPIRoute {
8
+ schema = {
9
+ summary: '更新任务',
10
+ description: '服务器 Webhook,更新任务状态\n 支持的 status 有 PROCESSING, FINISHED, FAILED\n',
11
+
12
+ request: {
13
+ params: z.object({
14
+ id: z.string().nanoid(),
15
+ }),
16
+ body: contentJson({
17
+ status: z.union([z.literal(TaskStatus.FINISHED), z.literal(TaskStatus.FAILED), z.literal(TaskStatus.PROCESSING)]),
18
+ progress: z.number().int().min(0).max(100).optional(),
19
+ image_url: z.string().url().optional(),
20
+ thumb_url: z.string().url().optional(),
21
+ }),
22
+ },
23
+ };
24
+
25
+ async handle(c: Context<{ Bindings: Bindings; Variables: Variables }>) {
26
+ const data = await this.getValidatedData<typeof this.schema>();
27
+ const task_id = data.params.id;
28
+
29
+ const url = new URL(c.req.url);
30
+ const img_url = new URL(data.body.image_url);
31
+
32
+ await c.var.stub.setStatus(task_id, {
33
+ id: task_id,
34
+ status: data.body.status,
35
+ progress: data.body.progress,
36
+ image_url: data.body.image_url,
37
+ thumb_url: data.body.image_url && url.origin + '/cdn-cgi/image/width=200,quality=75/api/uploads/' + img_url.pathname.split('/').pop(),
38
+ timestamp: Date.now(),
39
+ });
40
+ const result = await c.var.stub.getStatus(task_id);
41
+
42
+ return c.json(result);
43
+ }
44
+ }
worker/src/endpoints/userInfo.ts ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { OpenAPIRoute } from 'chanfana';
2
+ import { Context } from 'hono';
3
+
4
+
5
+ import { Bindings } from '../types';
6
+
7
+ export class UserInfo extends OpenAPIRoute {
8
+ schema = {
9
+ summary: '获取用户信息',
10
+ description: '',
11
+ response: {
12
+ 200: {
13
+ description: 'userId',
14
+ content: {
15
+ },
16
+ },
17
+ },
18
+ };
19
+
20
+ async handle(c: Context<{ Bindings: Bindings }>) {
21
+ // const data = await this.getValidatedData<typeof this.schema>();
22
+ const jwtPayload = c.get('jwtPayload');
23
+ if (!jwtPayload) {
24
+ return c.json({ error: 'jwtPayload not found' }, 401);
25
+ }
26
+
27
+ let result = {
28
+ userId: jwtPayload.userId
29
+ }
30
+
31
+ return c.json(result);
32
+ }
33
+ }
worker/src/index.ts ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Run `npm run dev` in your terminal to start a development server
3
+ * Open a browser tab at http://localhost:8787/ to see your worker in action
4
+ * Run `npm run deploy` to publish your worker
5
+ *
6
+ * Bind resources to your worker in `wrangler.toml`.
7
+ *
8
+ * Learn more at https://developers.cloudflare.com/workers/
9
+ */
10
+
11
+ import { fromHono } from 'chanfana';
12
+ import { Hono } from 'hono';
13
+ import { cors } from 'hono/cors';
14
+
15
+ import { authMiddleware, durableObjectMiddleware } from './middlewares';
16
+
17
+ import { TaskStatusDurableObject } from './durableObjects';
18
+
19
+ import { GetR2PutUrl } from './endpoints/getR2PutUrl';
20
+ import { CreateTask } from './endpoints/taskCreate';
21
+ import { FetchTask } from './endpoints/taskFetch';
22
+ import { UpdateTask } from './endpoints/taskUpdate';
23
+ import { UploadFile, UploadFilePut } from './endpoints/fileUpload';
24
+ import { DownloadFile } from './endpoints/fileDownload';
25
+ import { UserInfo } from './endpoints/userInfo';
26
+ import { FetchBill } from './endpoints/billFetch';
27
+ import { FetchTaskSSE } from './endpoints/taskFetchSSE';
28
+
29
+ // Star a Hono app
30
+ const app = new Hono();
31
+
32
+ app.use(
33
+ '/api/*',
34
+ cors({
35
+ credentials: true,
36
+ origin: '*',
37
+ })
38
+ );
39
+
40
+ // Setup OpenAPI registry
41
+ const options = {
42
+ docs_url: '/',
43
+ schema: {
44
+ info: {
45
+ title: 'Remove background Worker API',
46
+ version: '1.0',
47
+ },
48
+ servers: [
49
+ {
50
+ url: '/',
51
+ description: 'Development server',
52
+ },
53
+ {
54
+ url: 'https://a1d-rb.k-xshar.workers.dev/',
55
+ description: 'Production server',
56
+ },
57
+ ],
58
+ security: [
59
+ {
60
+ BearerAuth: [],
61
+ },
62
+ ],
63
+ },
64
+ };
65
+ const openapi = fromHono(app, options);
66
+
67
+ openapi.registry.registerComponent('securitySchemes', 'BearerAuth', {
68
+ type: 'http',
69
+ scheme: 'bearer',
70
+ bearerFormat: 'JWT',
71
+ });
72
+
73
+ // Register OpenAPI endpoints
74
+ openapi.get('/api/uploads/:file_name/url', authMiddleware, GetR2PutUrl);
75
+ openapi.post('/api/uploads/:file_name', authMiddleware, UploadFile);
76
+ openapi.put('/api/uploads/:file_name', authMiddleware, UploadFilePut);
77
+ openapi.get('/api/uploads/:file_name', DownloadFile);
78
+
79
+ openapi.get('/api/user', authMiddleware, UserInfo);
80
+
81
+ openapi.post('/api/task', authMiddleware, CreateTask);
82
+ openapi.get('/api/task/:id', durableObjectMiddleware, FetchTask);
83
+ openapi.get('/api/task/:id/sse', durableObjectMiddleware, FetchTaskSSE);
84
+ openapi.patch('/api/task/:id', authMiddleware, durableObjectMiddleware, UpdateTask);
85
+
86
+ openapi.get('/admin/bill', FetchBill);
87
+
88
+ export { TaskStatusDurableObject };
89
+
90
+ // Export the Hono app
91
+ export default app;
worker/src/middlewares/index.ts ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { createMiddleware } from 'hono/factory';
2
+ import { Context } from 'hono';
3
+ import { HTTPException } from 'hono/http-exception';
4
+
5
+ import { verifyToken } from './jwt';
6
+ import { Bindings, Variables } from '../types';
7
+
8
+
9
+ export const authMiddleware = createMiddleware(async (c: Context, next) => {
10
+ const TOKEN_STRINGS = '[A-Za-z0-9._~+/-]+=*';
11
+ const PREFIX = 'Bearer';
12
+ const HEADER = 'Authorization';
13
+
14
+ const headerToken = c.req.header(HEADER);
15
+ if (!headerToken) {
16
+ // No Authorization header
17
+ const res = new Response('Unauthorized', {
18
+ status: 401,
19
+ headers: {
20
+ 'WWW-Authenticate': `${PREFIX} realm="` + '"',
21
+ },
22
+ });
23
+ throw new HTTPException(401, { res });
24
+ } else {
25
+ const regexp = new RegExp('^' + PREFIX + ' +(' + TOKEN_STRINGS + ') *$');
26
+ const match = regexp.exec(headerToken);
27
+ if (!match) {
28
+ // Invalid Request
29
+ const res = new Response('Bad Request', {
30
+ status: 400,
31
+ headers: {
32
+ 'WWW-Authenticate': `${PREFIX} error="invalid_request"`,
33
+ },
34
+ });
35
+ throw new HTTPException(400, { res });
36
+ } else {
37
+ let equal = await verifyToken(match[1], c);
38
+ if (!equal) {
39
+ // Invalid Token
40
+ const res = new Response('Unauthorized', {
41
+ status: 401,
42
+ headers: {
43
+ 'WWW-Authenticate': `${PREFIX} error="invalid_token"`,
44
+ },
45
+ });
46
+ throw new HTTPException(401, { res });
47
+ }
48
+ }
49
+ }
50
+ await next();
51
+ });
52
+
53
+ export const durableObjectMiddleware = createMiddleware(async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next) => {
54
+ const id = c.env.TASK_STATUS_DURABLE_OBJECT.idFromName('a1d-rb-task-status');
55
+ const stub = c.env.TASK_STATUS_DURABLE_OBJECT.get(id);
56
+ c.set('stub', stub);
57
+ await next();
58
+ });
worker/src/middlewares/jwt/JwksClient.ts ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { CacheHandler } from '../../types';
2
+ import { JwksError, SigningKeyNotFoundError } from './errors';
3
+ import { retrieveSigningKeys } from './utils';
4
+
5
+ const logger = console.log;
6
+
7
+ export class JwksClient {
8
+ options: any;
9
+ constructor(options: { jwksUri: string; cacheHandler: CacheHandler }) {
10
+ this.options = {
11
+ ...options,
12
+ };
13
+ }
14
+
15
+ async getKeys() {
16
+ try {
17
+ const cachedKeys = await this.options.cacheHandler.get(this.options.jwksUri);
18
+ let keys;
19
+ if (cachedKeys) {
20
+ logger('Keys retrieved from cache: ');
21
+ keys = JSON.parse(cachedKeys);
22
+ } else {
23
+ logger(`Fetching keys from '${this.options.jwksUri}': `);
24
+ const res = (await fetch(this.options.jwksUri, {}).then((res) => res.json())) as { keys: [] };
25
+ this.options.cacheHandler.set(this.options.jwksUri, JSON.stringify(res.keys));
26
+ keys = res.keys;
27
+ }
28
+ logger(keys);
29
+ return keys;
30
+ } catch (err: any) {
31
+ const { errorMsg } = err;
32
+ logger('Failure:', errorMsg || err);
33
+ throw errorMsg ? new JwksError(errorMsg) : err;
34
+ }
35
+ }
36
+
37
+ async getSigningKeys() {
38
+ const keys = await this.getKeys();
39
+ if (!keys || !keys.length) {
40
+ throw new JwksError('The JWKS endpoint did not contain any keys');
41
+ }
42
+
43
+ const signingKeys = await retrieveSigningKeys(keys);
44
+
45
+ if (!signingKeys.length) {
46
+ throw new JwksError('The JWKS endpoint did not contain any signing keys');
47
+ }
48
+
49
+ logger('Signing Keys:', signingKeys);
50
+ return signingKeys;
51
+ }
52
+
53
+ async getSigningKey(kid: string) {
54
+ logger(`Fetching signing key for '${kid}'`);
55
+ const keys = await this.getSigningKeys();
56
+
57
+ const kidDefined = kid !== undefined && kid !== null;
58
+ if (!kidDefined && keys.length > 1) {
59
+ logger('No KID specified and JWKS endpoint returned more than 1 key');
60
+ throw new SigningKeyNotFoundError('No KID specified and JWKS endpoint returned more than 1 key');
61
+ }
62
+
63
+ const key = keys.find((k: { kid?: string }) => !kidDefined || k.kid === kid);
64
+ if (key) {
65
+ return key;
66
+ } else {
67
+ logger(`Unable to find a signing key that matches '${kid}'`);
68
+ throw new SigningKeyNotFoundError(`Unable to find a signing key that matches '${kid}'`);
69
+ }
70
+ }
71
+ }
worker/src/middlewares/jwt/errors/index.ts ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export class SigningKeyNotFoundError extends Error {
2
+ constructor(message: string) {
3
+ super(message);
4
+ this.name = 'SigningKeyNotFoundError';
5
+ }
6
+ }
7
+
8
+ export class ArgumentError extends Error {
9
+ constructor(message: string) {
10
+ super(message);
11
+ this.name = 'ArgumentError';
12
+ }
13
+ }
14
+ export class JwksError extends Error {
15
+ constructor(message: string) {
16
+ super(message);
17
+ this.name = 'JwksError';
18
+ }
19
+ }
20
+ export class JwksRateLimitError extends Error {
21
+ constructor(message: string) {
22
+ super(message);
23
+ this.name = 'JwksRateLimitError';
24
+ }
25
+ }
worker/src/middlewares/jwt/index.ts ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Context } from 'hono';
2
+ import { Bindings, CacheHandler } from '../../types';
3
+ import { JwksClient } from './JwksClient';
4
+ import { decode, verify } from 'hono/jwt';
5
+
6
+ const CACHE_EXPIRY_MS = 60 * 60 * 3; // 3 minutes
7
+
8
+ async function getActivePublicKey({ token, cacheHandler }: { token: string; cacheHandler: CacheHandler }) {
9
+ const decoded = decode(token);
10
+ if (!decoded) {
11
+ throw new Error('Invalid token');
12
+ }
13
+
14
+ const { kid } = decoded.header as any;
15
+ const appid = decoded.payload.aud as string;
16
+
17
+ const jwks = new JwksClient({
18
+ jwksUri: `https://api.canva.com/rest/v1/apps/${appid}/jwks`,
19
+ cacheHandler,
20
+ });
21
+
22
+ const key = await jwks.getSigningKey(kid);
23
+ return { appid, kid, pubkey: key.getPublicKey() };
24
+ }
25
+
26
+ export async function verifyToken(token: string, c: Context<{ Bindings: Bindings }>) {
27
+ if (!token) {
28
+ return false;
29
+ }
30
+ if (token === c.env.ADMIN_TOKEN) {
31
+ c.set('jwtPayload', { aud: 0, brandId: 0, userId: 0 });
32
+ return true;
33
+ }
34
+
35
+ function cacheFactory(c: Context<{ Bindings: Bindings }>) {
36
+ const prefix = 'PUB_KEY_';
37
+ return {
38
+ get(key: string) {
39
+ return c.env.MY_KV_NAMESPACE.get(prefix + key);
40
+ },
41
+ set(key: string, value: string, ttl = CACHE_EXPIRY_MS) {
42
+ return c.env.MY_KV_NAMESPACE.put(prefix + key, value, { expirationTtl: ttl });
43
+ },
44
+ del(key: string) {
45
+ return c.env.MY_KV_NAMESPACE.delete(prefix + key);
46
+ },
47
+ };
48
+ }
49
+ try {
50
+ const {appid, pubkey} = await getActivePublicKey({
51
+ token,
52
+ cacheHandler: cacheFactory(c),
53
+ });
54
+ const app_ids = c.env.CANVA_APP_IDS.split(',');
55
+ if (!app_ids.includes(appid)) {
56
+ return false;
57
+ }
58
+
59
+ const verified = await verify(token, pubkey, 'RS256');
60
+ if (!verified.aud || !verified.brandId || !verified.userId) {
61
+ return false;
62
+ } else {
63
+ c.set('jwtPayload', verified);
64
+ return true;
65
+ }
66
+ } catch (error) {
67
+ return false;
68
+ }
69
+
70
+
71
+ }
worker/src/middlewares/jwt/utils.ts ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as jose from 'jose';
2
+ import { JwksError } from './errors';
3
+
4
+ function resolveAlg(jwk: { alg?: string; kty: string; crv?: string }) {
5
+ if (jwk.alg) {
6
+ return jwk.alg;
7
+ }
8
+
9
+ if (jwk.kty === 'RSA') {
10
+ return 'RS256';
11
+ }
12
+
13
+ if (jwk.kty === 'EC') {
14
+ switch (jwk.crv) {
15
+ case 'P-256':
16
+ return 'ES256';
17
+ case 'secp256k1':
18
+ return 'ES256K';
19
+ case 'P-384':
20
+ return 'ES384';
21
+ case 'P-521':
22
+ return 'ES512';
23
+ }
24
+ }
25
+
26
+ if (jwk.kty === 'OKP') {
27
+ switch (jwk.crv) {
28
+ case 'Ed25519':
29
+ case 'Ed448':
30
+ return 'EdDSA';
31
+ }
32
+ }
33
+
34
+ throw new JwksError('Unsupported JWK');
35
+ }
36
+
37
+ export async function retrieveSigningKeys(jwks: any[]) {
38
+ const results = [];
39
+
40
+ jwks = jwks.filter(({ use }) => use === 'sig' || use === undefined).filter(({ kty }) => kty === 'RSA' || kty === 'EC' || kty === 'OKP');
41
+
42
+ for (const jwk of jwks) {
43
+ try {
44
+ const key = await jose.importJWK({ ...jwk, ext: true }, resolveAlg(jwk));
45
+ if ((key as jose.KeyLike).type !== 'public') {
46
+ continue;
47
+ }
48
+ results.push({
49
+ get publicKey() {
50
+ return key;
51
+ },
52
+ get rsaPublicKey() {
53
+ return key;
54
+ },
55
+ getPublicKey() {
56
+ return key;
57
+ },
58
+ ...(typeof jwk.kid === 'string' && jwk.kid ? { kid: jwk.kid } : undefined),
59
+ ...(typeof jwk.alg === 'string' && jwk.alg ? { alg: jwk.alg } : undefined),
60
+ });
61
+ } catch (err: any) {
62
+ console.error('Error importing JWK:', err);
63
+ continue;
64
+ }
65
+ }
66
+ return results;
67
+ }
worker/src/types.ts ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { convertParams } from 'chanfana';
2
+ import { z } from 'zod';
3
+ import { TaskStatusDurableObject } from './durableObjects';
4
+
5
+ // FileBody
6
+ interface ParameterType {
7
+ default?: string | number | boolean;
8
+ description?: string;
9
+ example?: string | number | boolean;
10
+ required?: boolean;
11
+ deprecated?: boolean;
12
+ }
13
+ interface StringParameterType extends ParameterType {
14
+ format?: string;
15
+ }
16
+ export function FileBody(params?: StringParameterType): z.ZodString {
17
+ return convertParams<z.ZodString>(z.string(), params);
18
+ }
19
+
20
+ // 导入自动生成的 worker-configuration.d.ts
21
+ type NewEnv = Omit<Env, 'TASK_STATUS_DURABLE_OBJECT'> & {
22
+ TASK_STATUS_DURABLE_OBJECT: DurableObjectNamespace<TaskStatusDurableObject>;
23
+ };
24
+ export type Bindings = Pick<NewEnv, keyof NewEnv>;
25
+
26
+ export type Variables = {
27
+ stub: DurableObjectStub<TaskStatusDurableObject>;
28
+ };
29
+
30
+ // Task
31
+ export enum TaskStatus {
32
+ FAILED = 'FAILED',
33
+ WAITING = 'WAITING',
34
+ PROCESSING = 'PROCESSING',
35
+ FINISHED = 'FINISHED',
36
+ UNKNOWN = 'UNKNOWN',
37
+ }
38
+
39
+ export type TaskStatusResult = {
40
+ id: string;
41
+ status: TaskStatus;
42
+ image_url?: string;
43
+ thumb_url?: string;
44
+ progress?: string;
45
+ timestamp: number;
46
+ };
47
+
48
+ // Cache
49
+ export type CacheHandler = {
50
+ get: (key: string) => Promise<string | null>;
51
+ set: (key: string, value: string, ttl?: number) => Promise<void>;
52
+ del: (key: string) => Promise<void>;
53
+ };
worker/src/utils.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { AwsClient } from 'aws4fetch';
2
+
3
+ export const getPreSignedR2Url = async (
4
+ accountID: string,
5
+ bucketName: string,
6
+ accessKeyId: string,
7
+ secretAccessKey: string,
8
+ pathname: string,
9
+ expires: number,
10
+ method: 'GET' | 'PUT'
11
+ ) => {
12
+ const r2 = new AwsClient({
13
+ accessKeyId,
14
+ secretAccessKey,
15
+ });
16
+
17
+ const url = new URL(`https://${bucketName}.${accountID}.r2.cloudflarestorage.com`);
18
+ url.pathname = pathname;
19
+ url.searchParams.set('X-Amz-Expires', expires.toString());
20
+
21
+ const signed = await r2.sign(new Request(url, { method }), { aws: { signQuery: true } });
22
+ return signed.url;
23
+ };
worker/tsconfig.json ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
4
+
5
+ /* Projects */
6
+ // "incremental": true, /* Enable incremental compilation */
7
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
8
+ // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
9
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
10
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
11
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12
+
13
+ /* Language and Environment */
14
+ "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
15
+ "lib": ["es2021"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
16
+ "jsx": "react-jsx" /* Specify what JSX code is generated. */,
17
+ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
18
+ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
19
+ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
20
+ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
21
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
22
+ // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
23
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
24
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
25
+
26
+ /* Modules */
27
+ "module": "es2022" /* Specify what module code is generated. */,
28
+ // "rootDir": "./", /* Specify the root folder within your source files. */
29
+ "moduleResolution": "Bundler" /* Specify how TypeScript looks up a file from a given module specifier. */,
30
+ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
31
+ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
32
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
33
+ // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
34
+ "types": [
35
+ "@cloudflare/workers-types/2023-07-01"
36
+ ] /* Specify type package names to be included without being referenced in a source file. */,
37
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
38
+ "resolveJsonModule": true /* Enable importing .json files */,
39
+ // "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
40
+
41
+ /* JavaScript Support */
42
+ "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */,
43
+ "checkJs": false /* Enable error reporting in type-checked JavaScript files. */,
44
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
45
+
46
+ /* Emit */
47
+ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
48
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
49
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
50
+ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
51
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
52
+ // "outDir": "./", /* Specify an output folder for all emitted files. */
53
+ // "removeComments": true, /* Disable emitting comments. */
54
+ "noEmit": true /* Disable emitting files from a compilation. */,
55
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
56
+ // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
57
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
58
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
59
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
60
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
61
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
62
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
63
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
64
+ // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
65
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
66
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
67
+ // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
68
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
69
+ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
70
+
71
+ /* Interop Constraints */
72
+ "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */,
73
+ "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */,
74
+ // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
75
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
76
+ "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
77
+
78
+ /* Type Checking */
79
+ "strict": true /* Enable all strict type-checking options. */,
80
+ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
81
+ // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
82
+ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
83
+ // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
84
+ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
85
+ // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
86
+ // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
87
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
88
+ // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
89
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
90
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
91
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
92
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
93
+ // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
94
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
95
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
96
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
97
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
98
+
99
+ /* Completeness */
100
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
101
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
102
+ },
103
+ "exclude": ["test"]
104
+ }
worker/worker-configuration.d.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by Wrangler on Mon Aug 12 2024 01:25:06 GMT+0800 (China Standard Time)
2
+ // by running `wrangler types`
3
+
4
+ interface Env {
5
+ MY_KV_NAMESPACE: KVNamespace;
6
+ BUCKET_NAME: "a1d-rb";
7
+ EXPIRATION_TTL: 3600;
8
+ ACCOUNT_ID: string;
9
+ API_TOKEN: string;
10
+ R2_ACCESS_KEY_ID: string;
11
+ R2_SECRET_ACCESS_KEY: string;
12
+ AWS_ACCESS_KEY_ID: string;
13
+ AWS_SECRET_ACCESS_KEY: string;
14
+ AWS_REGION: string;
15
+ AWS_SQS_QUEUE_URL: string;
16
+ JWT_SECRET: string;
17
+ ADMIN_TOKEN: string;
18
+ CANVA_APP_IDS: string;
19
+ TASK_STATUS_DURABLE_OBJECT: DurableObjectNamespace;
20
+ MY_BUCKET: R2Bucket;
21
+ BILLING: AnalyticsEngineDataset;
22
+ AI: Ai;
23
+ }
worker/wrangler.toml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #:schema node_modules/wrangler/config-schema.json
2
+ name = "flux-gallery-cf"
3
+ main = "src/index.ts"
4
+ compatibility_date = "2024-07-01"
5
+ compatibility_flags = ["nodejs_compat"]
6
+ # tail_consumers = [{ service = "a1d-rb-tail" }]
7
+
8
+ # Automatically place your workloads in an optimal location to minimize latency.
9
+ # If you are running back-end logic in a Worker, running it closer to your back-end infrastructure
10
+ # rather than the end user may result in better performance.
11
+ # Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
12
+ # [placement]
13
+ # mode = "smart"
14
+
15
+ # Variable bindings. These are arbitrary, plaintext strings (similar to environment variables)
16
+ # Docs:
17
+ # - https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables
18
+ # Note: Use secrets to store sensitive data.
19
+ # - https://developers.cloudflare.com/workers/configuration/secrets/
20
+ [vars]
21
+ BUCKET_NAME = "a1d-flux"
22
+ EXPIRATION_TTL = 3600
23
+ API_NAME= "run_local"
24
+
25
+ # Bind the Workers AI model catalog. Run machine learning models, powered by serverless GPUs, on Cloudflare’s global network
26
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#workers-ai
27
+ # [ai]
28
+ # binding = "AI"
29
+
30
+ # Bind an Analytics Engine dataset. Use Analytics Engine to write analytics within your Pages Function.
31
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#analytics-engine-datasets
32
+ # [[analytics_engine_datasets]]
33
+ # binding = "BILLING"
34
+ # dataset = "A1D_RB_BILLING"
35
+
36
+ # Bind a headless browser instance running on Cloudflare's global network.
37
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#browser-rendering
38
+ # [browser]
39
+ # binding = "MY_BROWSER"
40
+
41
+ # Bind a D1 database. D1 is Cloudflare’s native serverless SQL database.
42
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#d1-databases
43
+ # [[d1_databases]]
44
+ # binding = "MY_DB"
45
+ # database_name = "my-database"
46
+ # database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
47
+
48
+ # Bind a dispatch namespace. Use Workers for Platforms to deploy serverless functions programmatically on behalf of your customers.
49
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#dispatch-namespace-bindings-workers-for-platforms
50
+ # [[dispatch_namespaces]]
51
+ # binding = "MY_DISPATCHER"
52
+ # namespace = "my-namespace"
53
+
54
+ # Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model.
55
+ # Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps.
56
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects
57
+ [[durable_objects.bindings]]
58
+ name = "TASK_STATUS_DURABLE_OBJECT"
59
+ class_name = "TaskStatusDurableObject"
60
+
61
+ # Durable Object migrations.
62
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations
63
+ [[migrations]]
64
+ tag = "v1"
65
+ new_classes = ["TaskStatusDurableObject"]
66
+
67
+ # Bind a Hyperdrive configuration. Use to accelerate access to your existing databases from Cloudflare Workers.
68
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#hyperdrive
69
+ # [[hyperdrive]]
70
+ # binding = "MY_HYPERDRIVE"
71
+ # id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
72
+
73
+ # Bind a KV Namespace. Use KV as persistent storage for small key-value pairs.
74
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#kv-namespaces
75
+ [[kv_namespaces]]
76
+ binding = "MY_KV_NAMESPACE"
77
+ id = "039142b30068443298c8024a2f7b3b4a"
78
+
79
+ # Bind an mTLS certificate. Use to present a client certificate when communicating with another service.
80
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#mtls-certificates
81
+ # [[mtls_certificates]]
82
+ # binding = "MY_CERTIFICATE"
83
+ # certificate_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
84
+
85
+ # Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer.
86
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues
87
+ # [[queues.producers]]
88
+ # binding = "MY_QUEUE"
89
+ # queue = "a1d-iu"
90
+
91
+ # Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them.
92
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues
93
+ # !!! WARNING !!! 1200 requests / 5 mins
94
+ # [[queues.consumers]]
95
+ # queue = "a1d-iu"
96
+ # type = "http_pull"
97
+ # # Optional
98
+ # visibility_timeout_ms = 600000
99
+ # max_retries = 2
100
+ # dead_letter_queue = "a1d-iu-dead"
101
+
102
+ # Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files.
103
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#r2-buckets
104
+ [[r2_buckets]]
105
+ binding = "MY_BUCKET"
106
+ bucket_name = "a1d-flux-gallery"
107
+
108
+ # Bind another Worker service. Use this binding to call another Worker without network overhead.
109
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings
110
+ # [[services]]
111
+ # binding = "MY_SERVICE"
112
+ # service = "my-service"
113
+
114
+ # Bind a Vectorize index. Use to store and query vector embeddings for semantic search, classification and other vector search use-cases.
115
+ # Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#vectorize-indexes
116
+ # [[vectorize]]
117
+ # binding = "MY_INDEX"
118
+ # index_name = "my-index"