ntfy-reverse-proxy 0.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +48 -0
  2. package/build/src/cli/commands/config-io.d.ts +5 -0
  3. package/build/src/cli/commands/config-io.d.ts.map +1 -0
  4. package/build/src/cli/commands/config-io.js +19 -0
  5. package/build/src/cli/commands/config-io.js.map +1 -0
  6. package/build/src/cli/commands/context.d.ts +9 -0
  7. package/build/src/cli/commands/context.d.ts.map +1 -0
  8. package/build/src/cli/commands/context.js +108 -0
  9. package/build/src/cli/commands/context.js.map +1 -0
  10. package/build/src/cli/commands/deploy.d.ts +4 -0
  11. package/build/src/cli/commands/deploy.d.ts.map +1 -0
  12. package/build/src/cli/commands/deploy.js +496 -0
  13. package/build/src/cli/commands/deploy.js.map +1 -0
  14. package/build/src/cli/commands/generate.d.ts +4 -0
  15. package/build/src/cli/commands/generate.d.ts.map +1 -0
  16. package/build/src/cli/commands/generate.js +68 -0
  17. package/build/src/cli/commands/generate.js.map +1 -0
  18. package/build/src/cli/commands/server.d.ts +7 -0
  19. package/build/src/cli/commands/server.d.ts.map +1 -0
  20. package/build/src/cli/commands/server.js +43 -0
  21. package/build/src/cli/commands/server.js.map +1 -0
  22. package/build/src/cli/commands/settings.d.ts +5 -0
  23. package/build/src/cli/commands/settings.d.ts.map +1 -0
  24. package/build/src/cli/commands/settings.js +16 -0
  25. package/build/src/cli/commands/settings.js.map +1 -0
  26. package/build/src/cli/commands/validate.d.ts +4 -0
  27. package/build/src/cli/commands/validate.d.ts.map +1 -0
  28. package/build/src/cli/commands/validate.js +45 -0
  29. package/build/src/cli/commands/validate.js.map +1 -0
  30. package/build/src/cli/index.d.ts +5 -0
  31. package/build/src/cli/index.d.ts.map +1 -0
  32. package/build/src/cli/index.js +118 -0
  33. package/build/src/cli/index.js.map +1 -0
  34. package/build/src/cli/menu/interactive.d.ts +4 -0
  35. package/build/src/cli/menu/interactive.d.ts.map +1 -0
  36. package/build/src/cli/menu/interactive.js +902 -0
  37. package/build/src/cli/menu/interactive.js.map +1 -0
  38. package/build/src/lib/item.d.ts +3 -0
  39. package/build/src/lib/item.d.ts.map +1 -0
  40. package/build/src/lib/item.js +3 -0
  41. package/build/src/lib/item.js.map +1 -0
  42. package/build/src/lib/regex.d.ts +30 -0
  43. package/build/src/lib/regex.d.ts.map +1 -0
  44. package/build/src/lib/regex.js +30 -0
  45. package/build/src/lib/regex.js.map +1 -0
  46. package/build/src/lib/schema.d.ts +167 -0
  47. package/build/src/lib/schema.d.ts.map +1 -0
  48. package/build/src/lib/schema.js +70 -0
  49. package/build/src/lib/schema.js.map +1 -0
  50. package/build/src/lib/utility.d.ts +4 -0
  51. package/build/src/lib/utility.d.ts.map +1 -0
  52. package/build/src/lib/utility.js +14 -0
  53. package/build/src/lib/utility.js.map +1 -0
  54. package/build/src/types/cli/commands/config-io.d.ts +38 -0
  55. package/build/src/types/cli/commands/context.d.ts +131 -0
  56. package/build/src/types/cli/commands/deploy.d.ts +622 -0
  57. package/build/src/types/cli/commands/generate.d.ts +51 -0
  58. package/build/src/types/cli/commands/server.d.ts +65 -0
  59. package/build/src/types/cli/commands/settings.d.ts +25 -0
  60. package/build/src/types/cli/commands/validate.d.ts +37 -0
  61. package/build/src/types/cli/index.d.ts +55 -0
  62. package/build/src/types/cli/menu/interactive.d.ts +381 -0
  63. package/build/src/types/fetch-response.d.ts +11 -0
  64. package/build/src/types/lib/schema.d.ts +134 -0
  65. package/build/src/types/lib/utility.d.ts +8 -0
  66. package/build/src/types/tests/cli/commands/context.test.d.ts +57 -0
  67. package/build/src/types/tests/cli/commands/generate.test.d.ts +12 -0
  68. package/build/src/types/tests/cli/commands/server.test.d.ts +45 -0
  69. package/build/src/types/tests/cli/commands/settings.test.d.ts +40 -0
  70. package/build/src/types/tests/cli/commands/validate.test.d.ts +19 -0
  71. package/build/src/types/tests/cli/menu/interactive.test.d.ts +6 -0
  72. package/build/src/types/tests/lib/schema.test.d.ts +10 -0
  73. package/build/src/types/tests/type-declarations.test.d.ts +173 -0
  74. package/build/src/types/tests/worker/index.test.d.ts +20 -0
  75. package/build/src/types/tests/worker/interpreters/ntfy-json.test.d.ts +19 -0
  76. package/build/src/types/tests/worker/interpreters/pfsense.test.d.ts +10 -0
  77. package/build/src/types/tests/worker/interpreters/plain-text.test.d.ts +10 -0
  78. package/build/src/types/tests/worker/interpreters/seerr.test.d.ts +8 -0
  79. package/build/src/types/tests/worker/interpreters/statuspage.test.d.ts +58 -0
  80. package/build/src/types/tests/worker/interpreters/synology.test.d.ts +8 -0
  81. package/build/src/types/tests/worker/interpreters/unifi.test.d.ts +8 -0
  82. package/build/src/types/tests/worker/landing/page.test.d.ts +55 -0
  83. package/build/src/types/tests/worker/pipeline/accumulate.test.d.ts +28 -0
  84. package/build/src/types/tests/worker/pipeline/authenticate.test.d.ts +9 -0
  85. package/build/src/types/tests/worker/pipeline/email.test.d.ts +15 -0
  86. package/build/src/types/tests/worker/pipeline/format.test.d.ts +38 -0
  87. package/build/src/types/tests/worker/pipeline/interpret.test.d.ts +43 -0
  88. package/build/src/types/tests/worker/pipeline/parse.test.d.ts +17 -0
  89. package/build/src/types/tests/worker/pipeline/receive.test.d.ts +23 -0
  90. package/build/src/types/tests/worker/pipeline/respond.test.d.ts +20 -0
  91. package/build/src/types/tests/worker/pipeline/route.test.d.ts +80 -0
  92. package/build/src/types/tests/worker/pipeline/send.test.d.ts +37 -0
  93. package/build/src/types/tests/worker/pipeline/split.test.d.ts +17 -0
  94. package/build/src/types/worker/index.d.ts +232 -0
  95. package/build/src/types/worker/interpreters/ntfy-json.d.ts +28 -0
  96. package/build/src/types/worker/interpreters/pfsense.d.ts +97 -0
  97. package/build/src/types/worker/interpreters/plain-text.d.ts +24 -0
  98. package/build/src/types/worker/interpreters/seerr.d.ts +124 -0
  99. package/build/src/types/worker/interpreters/statuspage.d.ts +239 -0
  100. package/build/src/types/worker/interpreters/synology.d.ts +99 -0
  101. package/build/src/types/worker/interpreters/unifi.d.ts +111 -0
  102. package/build/src/types/worker/landing/page.d.ts +44 -0
  103. package/build/src/types/worker/pipeline/accumulate.d.ts +79 -0
  104. package/build/src/types/worker/pipeline/authenticate.d.ts +68 -0
  105. package/build/src/types/worker/pipeline/email.d.ts +108 -0
  106. package/build/src/types/worker/pipeline/format.d.ts +47 -0
  107. package/build/src/types/worker/pipeline/interpret.d.ts +63 -0
  108. package/build/src/types/worker/pipeline/parse.d.ts +39 -0
  109. package/build/src/types/worker/pipeline/receive.d.ts +64 -0
  110. package/build/src/types/worker/pipeline/respond.d.ts +113 -0
  111. package/build/src/types/worker/pipeline/route.d.ts +34 -0
  112. package/build/src/types/worker/pipeline/send.d.ts +143 -0
  113. package/build/src/types/worker/pipeline/shared.d.ts +85 -0
  114. package/build/src/types/worker/pipeline/split.d.ts +35 -0
  115. package/build/src/worker/handlers.d.ts +5 -0
  116. package/build/src/worker/handlers.d.ts.map +1 -0
  117. package/build/src/worker/handlers.js +360 -0
  118. package/build/src/worker/handlers.js.map +1 -0
  119. package/build/src/worker/index.d.ts +4 -0
  120. package/build/src/worker/index.d.ts.map +1 -0
  121. package/build/src/worker/index.js +52 -0
  122. package/build/src/worker/index.js.map +1 -0
  123. package/build/src/worker/interpreters/ntfy-json.d.ts +4 -0
  124. package/build/src/worker/interpreters/ntfy-json.d.ts.map +1 -0
  125. package/build/src/worker/interpreters/ntfy-json.js +49 -0
  126. package/build/src/worker/interpreters/ntfy-json.js.map +1 -0
  127. package/build/src/worker/interpreters/pfsense.d.ts +4 -0
  128. package/build/src/worker/interpreters/pfsense.d.ts.map +1 -0
  129. package/build/src/worker/interpreters/pfsense.js +150 -0
  130. package/build/src/worker/interpreters/pfsense.js.map +1 -0
  131. package/build/src/worker/interpreters/plain-text.d.ts +4 -0
  132. package/build/src/worker/interpreters/plain-text.d.ts.map +1 -0
  133. package/build/src/worker/interpreters/plain-text.js +18 -0
  134. package/build/src/worker/interpreters/plain-text.js.map +1 -0
  135. package/build/src/worker/interpreters/seerr.d.ts +4 -0
  136. package/build/src/worker/interpreters/seerr.d.ts.map +1 -0
  137. package/build/src/worker/interpreters/seerr.js +173 -0
  138. package/build/src/worker/interpreters/seerr.js.map +1 -0
  139. package/build/src/worker/interpreters/statuspage.d.ts +4 -0
  140. package/build/src/worker/interpreters/statuspage.d.ts.map +1 -0
  141. package/build/src/worker/interpreters/statuspage.js +266 -0
  142. package/build/src/worker/interpreters/statuspage.js.map +1 -0
  143. package/build/src/worker/interpreters/synology.d.ts +4 -0
  144. package/build/src/worker/interpreters/synology.d.ts.map +1 -0
  145. package/build/src/worker/interpreters/synology.js +177 -0
  146. package/build/src/worker/interpreters/synology.js.map +1 -0
  147. package/build/src/worker/interpreters/unifi.d.ts +4 -0
  148. package/build/src/worker/interpreters/unifi.d.ts.map +1 -0
  149. package/build/src/worker/interpreters/unifi.js +152 -0
  150. package/build/src/worker/interpreters/unifi.js.map +1 -0
  151. package/build/src/worker/landing/page.d.ts +4 -0
  152. package/build/src/worker/landing/page.d.ts.map +1 -0
  153. package/build/src/worker/landing/page.js +260 -0
  154. package/build/src/worker/landing/page.js.map +1 -0
  155. package/build/src/worker/pipeline/accumulate.d.ts +7 -0
  156. package/build/src/worker/pipeline/accumulate.d.ts.map +1 -0
  157. package/build/src/worker/pipeline/accumulate.js +53 -0
  158. package/build/src/worker/pipeline/accumulate.js.map +1 -0
  159. package/build/src/worker/pipeline/authenticate.d.ts +4 -0
  160. package/build/src/worker/pipeline/authenticate.d.ts.map +1 -0
  161. package/build/src/worker/pipeline/authenticate.js +53 -0
  162. package/build/src/worker/pipeline/authenticate.js.map +1 -0
  163. package/build/src/worker/pipeline/email.d.ts +4 -0
  164. package/build/src/worker/pipeline/email.d.ts.map +1 -0
  165. package/build/src/worker/pipeline/email.js +149 -0
  166. package/build/src/worker/pipeline/email.js.map +1 -0
  167. package/build/src/worker/pipeline/format.d.ts +5 -0
  168. package/build/src/worker/pipeline/format.d.ts.map +1 -0
  169. package/build/src/worker/pipeline/format.js +48 -0
  170. package/build/src/worker/pipeline/format.js.map +1 -0
  171. package/build/src/worker/pipeline/interpret.d.ts +4 -0
  172. package/build/src/worker/pipeline/interpret.d.ts.map +1 -0
  173. package/build/src/worker/pipeline/interpret.js +30 -0
  174. package/build/src/worker/pipeline/interpret.js.map +1 -0
  175. package/build/src/worker/pipeline/parse.d.ts +4 -0
  176. package/build/src/worker/pipeline/parse.d.ts.map +1 -0
  177. package/build/src/worker/pipeline/parse.js +59 -0
  178. package/build/src/worker/pipeline/parse.js.map +1 -0
  179. package/build/src/worker/pipeline/receive.d.ts +4 -0
  180. package/build/src/worker/pipeline/receive.d.ts.map +1 -0
  181. package/build/src/worker/pipeline/receive.js +52 -0
  182. package/build/src/worker/pipeline/receive.js.map +1 -0
  183. package/build/src/worker/pipeline/respond.d.ts +4 -0
  184. package/build/src/worker/pipeline/respond.d.ts.map +1 -0
  185. package/build/src/worker/pipeline/respond.js +48 -0
  186. package/build/src/worker/pipeline/respond.js.map +1 -0
  187. package/build/src/worker/pipeline/route.d.ts +5 -0
  188. package/build/src/worker/pipeline/route.d.ts.map +1 -0
  189. package/build/src/worker/pipeline/route.js +23 -0
  190. package/build/src/worker/pipeline/route.js.map +1 -0
  191. package/build/src/worker/pipeline/send.d.ts +4 -0
  192. package/build/src/worker/pipeline/send.d.ts.map +1 -0
  193. package/build/src/worker/pipeline/send.js +156 -0
  194. package/build/src/worker/pipeline/send.js.map +1 -0
  195. package/build/src/worker/pipeline/split.d.ts +4 -0
  196. package/build/src/worker/pipeline/split.d.ts.map +1 -0
  197. package/build/src/worker/pipeline/split.js +40 -0
  198. package/build/src/worker/pipeline/split.js.map +1 -0
  199. package/package.json +95 -2
@@ -0,0 +1,496 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import { Bootstrap, Logger } from '@cbnventures/nova/toolkit';
5
+ import chalk from 'chalk';
6
+ import prompts from 'prompts';
7
+ import { APP_NAME } from '../../lib/item.js';
8
+ import { LIB_REGEX_SURROUNDING_QUOTES } from '../../lib/regex.js';
9
+ import { listContexts } from './context.js';
10
+ import { generateWranglerToml } from './generate.js';
11
+ import { listServers } from './server.js';
12
+ import { getSettings } from './settings.js';
13
+ import { validateConfig } from './validate.js';
14
+ const CLOUDFLARE_API_BASE = 'https://api.cloudflare.com/client/v4';
15
+ const configDir = Bootstrap.getConfigDir(APP_NAME);
16
+ const envFilePath = resolve(configDir, '.env');
17
+ const ENV_TOKEN_KEY = 'CLOUDFLARE_API_TOKEN';
18
+ async function deploy(configPath, interactive = false) {
19
+ Logger.info('Checking authentication...');
20
+ const token = await resolveApiToken(interactive);
21
+ Reflect.set(process.env, ENV_TOKEN_KEY, token);
22
+ Logger.info('Authenticated.');
23
+ Logger.info('Validating config...');
24
+ const result = validateConfig(configPath);
25
+ if (result['valid'] === false) {
26
+ Logger.error('Config is invalid:');
27
+ for (const error of result['errors']) {
28
+ Logger.error(` - ${error}`);
29
+ }
30
+ return;
31
+ }
32
+ Logger.info('Config is valid.');
33
+ const servers = listServers(configPath);
34
+ if (servers.length === 0) {
35
+ Logger.warn('No ntfy servers are configured. Notifications will not be sent until at least one server is added.');
36
+ }
37
+ const settings = getSettings(configPath);
38
+ const workerName = settings['worker_name'];
39
+ const contexts = listContexts(configPath);
40
+ const hasEmailContexts = contexts.some((context) => context['type'] === 'email');
41
+ Logger.info('Verifying API token permissions...');
42
+ const accountId = await verifyPermissions(token, settings['base_domain'], hasEmailContexts, interactive);
43
+ Logger.info('Permissions verified.');
44
+ Logger.info('Ensuring KV namespace...');
45
+ const kvNamespaceId = await ensureKvNamespace(token, accountId, workerName);
46
+ Logger.info('KV namespace ready.');
47
+ Logger.info('Generating wrangler.toml...');
48
+ const projectRoot = Bootstrap.getProjectRoot() ?? process.cwd();
49
+ const wranglerTomlPath = resolve(projectRoot, 'wrangler.toml');
50
+ generateWranglerToml(configPath, wranglerTomlPath, accountId, kvNamespaceId);
51
+ Logger.info('wrangler.toml generated.');
52
+ Logger.info('Running lint...');
53
+ runLint();
54
+ Logger.info('Lint passed.');
55
+ Logger.info('Deploying worker...');
56
+ deployWorker();
57
+ Logger.info('Worker deployed.');
58
+ if (hasEmailContexts === true) {
59
+ await setupEmailRouting(configPath, token);
60
+ }
61
+ else {
62
+ Logger.info('No email contexts found. Skipping email routing setup.');
63
+ }
64
+ printContextSummary(configPath);
65
+ Logger.info('Deploy complete.');
66
+ return;
67
+ }
68
+ async function resolveApiToken(interactive) {
69
+ const envToken = loadEnvToken();
70
+ if (envToken !== undefined) {
71
+ if (await verifyApiToken(envToken) === true) {
72
+ return envToken;
73
+ }
74
+ if (interactive === false) {
75
+ throw new Error('API token in .env is invalid or expired. Update the CLOUDFLARE_API_TOKEN value in your .env file.');
76
+ }
77
+ Logger.warn('Saved API token in .env is invalid or expired.');
78
+ }
79
+ else {
80
+ if (interactive === false) {
81
+ throw new Error('No API token found. Create a .env file with CLOUDFLARE_API_TOKEN=<your-token> or run "npm run manage" for guided setup.');
82
+ }
83
+ Logger.warn('No API token found. Let\'s set one up.');
84
+ }
85
+ return promptForApiToken();
86
+ }
87
+ async function verifyApiToken(token) {
88
+ try {
89
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/user/tokens/verify`, {
90
+ headers: { Authorization: `Bearer ${token}` },
91
+ });
92
+ const data = await response.json();
93
+ return data['success'];
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ async function verifyPermissions(token, baseDomain, hasEmailContexts, interactive) {
100
+ const zoneInfo = await getZoneInfo(token, baseDomain);
101
+ const zoneId = zoneInfo['zoneId'];
102
+ const accountId = zoneInfo['accountId'];
103
+ let hasWorkersScripts = false;
104
+ try {
105
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/accounts/${accountId}/workers/scripts`, {
106
+ headers: { Authorization: `Bearer ${token}` },
107
+ });
108
+ const data = await response.json();
109
+ hasWorkersScripts = data['success'];
110
+ }
111
+ catch {
112
+ hasWorkersScripts = false;
113
+ }
114
+ let hasWorkersRoutes = false;
115
+ try {
116
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/zones/${zoneId}/workers/routes`, {
117
+ headers: { Authorization: `Bearer ${token}` },
118
+ });
119
+ const data = await response.json();
120
+ hasWorkersRoutes = data['success'];
121
+ }
122
+ catch {
123
+ hasWorkersRoutes = false;
124
+ }
125
+ let hasKvStorage = false;
126
+ try {
127
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/accounts/${accountId}/storage/kv/namespaces?per_page=1`, {
128
+ headers: { Authorization: `Bearer ${token}` },
129
+ });
130
+ const data = await response.json();
131
+ hasKvStorage = data['success'];
132
+ }
133
+ catch {
134
+ hasKvStorage = false;
135
+ }
136
+ let hasEmailRouting = false;
137
+ if (hasEmailContexts === true) {
138
+ try {
139
+ await listEmailRoutingRules(token, zoneId);
140
+ hasEmailRouting = true;
141
+ }
142
+ catch {
143
+ hasEmailRouting = false;
144
+ }
145
+ }
146
+ else {
147
+ hasEmailRouting = true;
148
+ }
149
+ const missing = [];
150
+ if (hasWorkersScripts === false) {
151
+ missing.push('Account > Workers Scripts > Edit');
152
+ }
153
+ if (hasKvStorage === false) {
154
+ missing.push('Account > Workers KV Storage > Edit');
155
+ }
156
+ if (hasWorkersRoutes === false) {
157
+ missing.push('Zone > Workers Routes > Edit');
158
+ }
159
+ if (hasEmailRouting === false) {
160
+ missing.push('Zone > Email Routing Rules > Edit');
161
+ }
162
+ if (missing.length === 0) {
163
+ return accountId;
164
+ }
165
+ if (interactive === false) {
166
+ const missingMessage = [
167
+ 'API token is missing permissions:',
168
+ ...missing.map((p) => ` - ${p}`),
169
+ '',
170
+ 'Update your token at https://dash.cloudflare.com/profile/api-tokens',
171
+ ].join('\n');
172
+ throw new Error(missingMessage);
173
+ }
174
+ Logger.warn('API token is missing the following permissions:');
175
+ Logger.warn('');
176
+ for (const permission of missing) {
177
+ Logger.warn(` - ${permission}`);
178
+ }
179
+ Logger.warn('');
180
+ Logger.info(' 1. Go to https://dash.cloudflare.com/profile/api-tokens');
181
+ Logger.info(' 2. Find your token → ... → Edit');
182
+ Logger.info(' 3. Add the missing permissions listed above');
183
+ Logger.info(' 4. Click "Continue to summary" then "Update Token"');
184
+ Logger.info('');
185
+ const promptResult = await prompts({
186
+ type: 'confirm',
187
+ name: 'ready',
188
+ message: 'Done? Press enter to retry.',
189
+ initial: true,
190
+ });
191
+ if (promptResult['ready'] !== true) {
192
+ throw new Error('Deploy cancelled. Please update your API token permissions and try again.');
193
+ }
194
+ return verifyPermissions(token, baseDomain, hasEmailContexts, interactive);
195
+ }
196
+ async function promptForApiToken() {
197
+ Logger.info('');
198
+ Logger.info('You need a Cloudflare API token to deploy and manage email routing.');
199
+ Logger.info('');
200
+ Logger.info(' 1. Go to https://dash.cloudflare.com/profile/api-tokens');
201
+ Logger.info(' 2. Click "Create Token"');
202
+ Logger.info(' 3. Under "Custom token", click "Get started"');
203
+ Logger.info(' 4. Name the token (e.g. "Reverse Proxy for ntfy")');
204
+ Logger.info(' 5. Under Permissions, add the following (use "+ Add more" for each):');
205
+ Logger.info(' - Account | Workers Scripts | Edit');
206
+ Logger.info(' - Account | Workers KV Storage | Edit');
207
+ Logger.info(' - Zone | Workers Routes | Edit');
208
+ Logger.info(' - Zone | Email Routing Rules | Edit');
209
+ Logger.info(' 6. Under Account Resources, select your account');
210
+ Logger.info(' 7. Under Zone Resources, select Specific zone → your base domain');
211
+ Logger.info(' 8. Click "Continue to summary" then "Create Token"');
212
+ Logger.info(' 9. Copy the generated token');
213
+ Logger.info('');
214
+ const promptResult = await prompts({
215
+ type: 'password',
216
+ name: 'apiToken',
217
+ message: 'Paste your API token:',
218
+ validate: (value) => value.trim().length > 0 || 'Token is required',
219
+ });
220
+ if (promptResult['apiToken'] === undefined) {
221
+ throw new Error('API token is required to deploy.');
222
+ }
223
+ const token = promptResult['apiToken'].trim();
224
+ if (await verifyApiToken(token) === false) {
225
+ throw new Error('API token is invalid. Please check the token and try again.');
226
+ }
227
+ saveEnvToken(token);
228
+ Logger.info('API token saved to .env file.');
229
+ return token;
230
+ }
231
+ function runLint() {
232
+ const lintResult = spawnSync('npx', [
233
+ 'eslint',
234
+ './src',
235
+ ], {
236
+ encoding: 'utf-8',
237
+ stdio: 'inherit',
238
+ });
239
+ if (lintResult['status'] !== 0) {
240
+ throw new Error('Lint failed.');
241
+ }
242
+ return;
243
+ }
244
+ function deployWorker() {
245
+ const projectRoot = Bootstrap.getProjectRoot() ?? process.cwd();
246
+ const wranglerTomlPath = resolve(projectRoot, 'wrangler.toml');
247
+ const deployResult = spawnSync('npx', [
248
+ 'wrangler',
249
+ 'deploy',
250
+ '--config',
251
+ wranglerTomlPath,
252
+ ], {
253
+ encoding: 'utf-8',
254
+ stdio: 'inherit',
255
+ });
256
+ if (deployResult['status'] !== 0) {
257
+ throw new Error('Worker deployment failed.');
258
+ }
259
+ return;
260
+ }
261
+ async function ensureKvNamespace(token, accountId, workerName) {
262
+ const listResponse = await fetch(`${CLOUDFLARE_API_BASE}/accounts/${accountId}/storage/kv/namespaces?per_page=100`, {
263
+ headers: { Authorization: `Bearer ${token}` },
264
+ });
265
+ const listData = await listResponse.json();
266
+ if (listData['success'] === false) {
267
+ const listErrors = listData['errors'];
268
+ let listErrorDetails = 'Unknown error';
269
+ if (listErrors !== undefined) {
270
+ listErrorDetails = listErrors.map((e) => `${String(e['code'])}: ${e['message']}`).join(', ');
271
+ }
272
+ throw new Error(`Failed to list KV namespaces: ${listErrorDetails}`);
273
+ }
274
+ const kvTitle = `${workerName}-kv`;
275
+ const existing = listData['result'].find((ns) => ns['title'] === kvTitle);
276
+ if (existing !== undefined) {
277
+ return existing['id'];
278
+ }
279
+ const createResponse = await fetch(`${CLOUDFLARE_API_BASE}/accounts/${accountId}/storage/kv/namespaces`, {
280
+ method: 'POST',
281
+ headers: {
282
+ 'Authorization': `Bearer ${token}`,
283
+ 'Content-Type': 'application/json',
284
+ },
285
+ body: JSON.stringify({ title: kvTitle }),
286
+ });
287
+ const createData = await createResponse.json();
288
+ if (createData['success'] === false) {
289
+ const createErrors = createData['errors'];
290
+ let createErrorDetails = 'Unknown error';
291
+ if (createErrors !== undefined) {
292
+ createErrorDetails = createErrors.map((e) => `${String(e['code'])}: ${e['message']}`).join(', ');
293
+ }
294
+ throw new Error(`Failed to create KV namespace "${kvTitle}": ${createErrorDetails}`);
295
+ }
296
+ return createData['result']['id'];
297
+ }
298
+ async function getZoneInfo(token, baseDomain) {
299
+ const parts = baseDomain.split('.');
300
+ const candidates = parts.slice(0, parts.length - 1).map((_unused, i) => parts.slice(i).join('.'));
301
+ for (const candidate of candidates) {
302
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/zones?name=${candidate}`, {
303
+ headers: { Authorization: `Bearer ${token}` },
304
+ });
305
+ const data = await response.json();
306
+ const hasResults = data['success'] === true
307
+ && data['result'].length > 0;
308
+ let firstResult = undefined;
309
+ if (hasResults === true) {
310
+ firstResult = data['result'][0];
311
+ }
312
+ if (firstResult !== undefined) {
313
+ return {
314
+ zoneId: firstResult['id'],
315
+ accountId: firstResult['account']['id'],
316
+ zoneName: firstResult['name'],
317
+ };
318
+ }
319
+ }
320
+ throw new Error(`Failed to find Cloudflare zone for "${baseDomain}". Is the domain added to your Cloudflare account?`);
321
+ }
322
+ async function listEmailRoutingRules(token, zoneId) {
323
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/zones/${zoneId}/email/routing/rules`, {
324
+ headers: { Authorization: `Bearer ${token}` },
325
+ });
326
+ const data = await response.json();
327
+ if (data['success'] === false) {
328
+ const dataErrors = data['errors'];
329
+ let errorDetails = 'Unknown error';
330
+ if (dataErrors !== undefined) {
331
+ errorDetails = dataErrors.map((e) => `${String(e['code'])}: ${e['message']}`).join(', ');
332
+ }
333
+ throw new Error(`Failed to list email routing rules: ${errorDetails}`);
334
+ }
335
+ return data['result'];
336
+ }
337
+ async function createEmailRoutingRule(token, zoneId, email, contextId, workerName) {
338
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/zones/${zoneId}/email/routing/rules`, {
339
+ method: 'POST',
340
+ headers: {
341
+ 'Authorization': `Bearer ${token}`,
342
+ 'Content-Type': 'application/json',
343
+ },
344
+ body: JSON.stringify({
345
+ matchers: [{
346
+ type: 'literal',
347
+ field: 'to',
348
+ value: email,
349
+ }],
350
+ actions: [{
351
+ type: 'worker',
352
+ value: [workerName],
353
+ }],
354
+ name: `${workerName}: ${contextId}`,
355
+ enabled: true,
356
+ }),
357
+ });
358
+ const createData = await response.json();
359
+ if (createData['success'] === false) {
360
+ const createErrors = createData['errors'];
361
+ let errorDetails = 'Unknown error';
362
+ if (createErrors !== undefined) {
363
+ errorDetails = createErrors.map((e) => `${String(e['code'])}: ${e['message']}`).join(', ');
364
+ }
365
+ throw new Error(`Failed to create email routing rule for "${email}": ${errorDetails}`);
366
+ }
367
+ return;
368
+ }
369
+ async function deleteEmailRoutingRule(token, zoneId, ruleId) {
370
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/zones/${zoneId}/email/routing/rules/${ruleId}`, {
371
+ method: 'DELETE',
372
+ headers: { Authorization: `Bearer ${token}` },
373
+ });
374
+ const deleteData = await response.json();
375
+ if (deleteData['success'] === false) {
376
+ const deleteErrors = deleteData['errors'];
377
+ let errorDetails = 'Unknown error';
378
+ if (deleteErrors !== undefined) {
379
+ errorDetails = deleteErrors.map((e) => `${String(e['code'])}: ${e['message']}`).join(', ');
380
+ }
381
+ throw new Error(`Failed to delete email routing rule "${ruleId}": ${errorDetails}`);
382
+ }
383
+ return;
384
+ }
385
+ function loadEnvToken() {
386
+ const envValue = process.env[ENV_TOKEN_KEY];
387
+ if (envValue !== undefined && envValue !== '') {
388
+ return envValue;
389
+ }
390
+ if (existsSync(envFilePath) === false) {
391
+ return undefined;
392
+ }
393
+ const content = readFileSync(envFilePath, 'utf-8');
394
+ const match = content.match(new RegExp(`^${ENV_TOKEN_KEY}=(.+)$`, 'm'));
395
+ if (match === null || match[1] === undefined) {
396
+ return undefined;
397
+ }
398
+ const value = match[1].trim().replace(new RegExp(LIB_REGEX_SURROUNDING_QUOTES.source, 'g'), '');
399
+ return (value !== '') ? value : undefined;
400
+ }
401
+ function saveEnvToken(token) {
402
+ if (existsSync(envFilePath) === true) {
403
+ let content = readFileSync(envFilePath, 'utf-8');
404
+ const regex = new RegExp(`^${ENV_TOKEN_KEY}=.*$`, 'm');
405
+ if (regex.test(content) === true) {
406
+ content = content.replace(regex, `${ENV_TOKEN_KEY}=${token}`);
407
+ }
408
+ else {
409
+ content = [
410
+ content.trimEnd(),
411
+ `${ENV_TOKEN_KEY}=${token}`,
412
+ '',
413
+ ].join('\n');
414
+ }
415
+ writeFileSync(envFilePath, content);
416
+ }
417
+ else {
418
+ writeFileSync(envFilePath, `${ENV_TOKEN_KEY}=${token}\n`);
419
+ }
420
+ return;
421
+ }
422
+ async function setupEmailRouting(configPath, token) {
423
+ const contexts = listContexts(configPath);
424
+ const emailContexts = contexts.filter((context) => context['type'] === 'email');
425
+ if (emailContexts.length === 0) {
426
+ return;
427
+ }
428
+ Logger.info('Setting up email routing...');
429
+ const settings = getSettings(configPath);
430
+ const workerName = settings['worker_name'];
431
+ const zoneInfo = await getZoneInfo(token, settings['base_domain']);
432
+ const zoneId = zoneInfo['zoneId'];
433
+ const existingRules = await listEmailRoutingRules(token, zoneId);
434
+ const workerRules = existingRules.filter((rule) => {
435
+ return rule['actions'].some((action) => action['type'] === 'worker' && action['value'].includes(workerName));
436
+ });
437
+ const desiredEmails = new Set(emailContexts.map((context) => `${context['id']}@${settings['base_domain']}`));
438
+ let created = 0;
439
+ let kept = 0;
440
+ let removed = 0;
441
+ for (const context of emailContexts) {
442
+ const email = `${context['id']}@${settings['base_domain']}`;
443
+ const ruleExists = workerRules.some((rule) => {
444
+ return rule['matchers'].some((matcher) => {
445
+ return matcher['type'] === 'literal'
446
+ && matcher['field'] === 'to'
447
+ && matcher['value'] === email;
448
+ });
449
+ });
450
+ if (ruleExists === true) {
451
+ kept += 1;
452
+ }
453
+ else {
454
+ await createEmailRoutingRule(token, zoneId, email, context['id'], workerName);
455
+ created += 1;
456
+ }
457
+ }
458
+ for (const rule of workerRules) {
459
+ const ruleEmail = rule['matchers'].find((matcher) => matcher['type'] === 'literal' && matcher['field'] === 'to');
460
+ if (ruleEmail !== undefined && desiredEmails.has(ruleEmail['value']) === false) {
461
+ await deleteEmailRoutingRule(token, zoneId, rule['tag']);
462
+ removed += 1;
463
+ }
464
+ }
465
+ Logger.info(`Email routing: ${String(created)} created, ${String(kept)} kept, ${String(removed)} removed.`);
466
+ return;
467
+ }
468
+ function printContextSummary(configPath) {
469
+ const contexts = listContexts(configPath);
470
+ const settings = getSettings(configPath);
471
+ if (contexts.length === 0) {
472
+ return;
473
+ }
474
+ process.stdout.write('\n');
475
+ process.stdout.write(`${chalk.bold('Context reference:')}\n`);
476
+ process.stdout.write('\n');
477
+ for (const context of contexts) {
478
+ process.stdout.write(` ${chalk.cyan(context['name'])}\n`);
479
+ if (context['type'] === 'http') {
480
+ process.stdout.write(` URL: ${chalk.green(`https://${context['id']}.${settings['base_domain']}`)}\n`);
481
+ if (context['token'] !== undefined) {
482
+ process.stdout.write(` Token: ${chalk.gray(context['token'])}\n`);
483
+ }
484
+ }
485
+ else {
486
+ process.stdout.write(` Email: ${chalk.green(`${context['id']}@${settings['base_domain']}`)}\n`);
487
+ if (context['allowed_from'] !== undefined) {
488
+ process.stdout.write(` Allow: ${chalk.gray(context['allowed_from'])}\n`);
489
+ }
490
+ }
491
+ process.stdout.write('\n');
492
+ }
493
+ return;
494
+ }
495
+ export { deploy, };
496
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliCommandsGenerateGenerateWranglerTomlAccountId, CliCommandsGenerateGenerateWranglerTomlConfigPath, CliCommandsGenerateGenerateWranglerTomlKvNamespaceId, CliCommandsGenerateGenerateWranglerTomlOutputPath, CliCommandsGenerateGenerateWranglerTomlReturn } from '../../types/cli/commands/generate.d.ts';
2
+ declare function generateWranglerToml(configPath: CliCommandsGenerateGenerateWranglerTomlConfigPath, outputPath?: CliCommandsGenerateGenerateWranglerTomlOutputPath, accountId?: CliCommandsGenerateGenerateWranglerTomlAccountId, kvNamespaceId?: CliCommandsGenerateGenerateWranglerTomlKvNamespaceId): CliCommandsGenerateGenerateWranglerTomlReturn;
3
+ export { generateWranglerToml, };
4
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gDAAgD,EAGhD,iDAAiD,EAMjD,oDAAoD,EAGpD,iDAAiD,EAEjD,6CAA6C,EAM9C,MAAM,wCAAwC,CAAC;AAahD,iBAAS,oBAAoB,CAAC,UAAU,EAAE,iDAAiD,EAAE,UAAU,GAAE,iDAA2E,EAAE,SAAS,CAAC,EAAE,gDAAgD,EAAE,aAAa,CAAC,EAAE,oDAAoD,GAAG,6CAA6C,CA2EvW;AAED,OAAO,EACL,oBAAoB,GACrB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { mkdirSync, writeFileSync } from 'fs';
2
+ import { dirname, resolve } from 'path';
3
+ import { Bootstrap } from '@cbnventures/nova/toolkit';
4
+ import { configSchema } from '../../lib/schema.js';
5
+ import { loadConfig } from './config-io.js';
6
+ const projectRoot = Bootstrap.getProjectRoot() ?? process.cwd();
7
+ const defaultWranglerTomlPath = resolve(projectRoot, 'wrangler.toml');
8
+ function generateWranglerToml(configPath, outputPath = defaultWranglerTomlPath, accountId, kvNamespaceId) {
9
+ const config = configSchema.parse(loadConfig(configPath));
10
+ const settings = config['settings'];
11
+ const servers = config['servers'];
12
+ const contexts = config['contexts'];
13
+ const compatibilityDate = new Date().toISOString().slice(0, 10);
14
+ const httpContexts = contexts.filter((context) => context['type'] === 'http');
15
+ const emailContexts = contexts.filter((context) => context['type'] === 'email');
16
+ const routeLines = httpContexts.map((context) => {
17
+ return ` { pattern = "${context['id']}.${settings['base_domain']}", custom_domain = true },`;
18
+ });
19
+ const lines = [
20
+ `name = "${settings['worker_name']}"`,
21
+ 'main = "packages/ntfy-reverse-proxy/build/src/worker/index.js"',
22
+ `compatibility_date = "${compatibilityDate}"`,
23
+ ...(accountId !== undefined ? [`account_id = "${accountId}"`] : []),
24
+ '',
25
+ '################',
26
+ '#### Routes ####',
27
+ '################',
28
+ 'routes = [',
29
+ ...routeLines,
30
+ ']',
31
+ ];
32
+ if (emailContexts['length'] > 0) {
33
+ lines.push('');
34
+ lines.push('#######################');
35
+ lines.push('#### Email Routing ####');
36
+ lines.push('#######################');
37
+ lines.push('# Configure these email addresses in Cloudflare Email Routing:');
38
+ for (const context of emailContexts) {
39
+ lines.push(`# - ${context['id']}@${settings['base_domain']} -> Worker`);
40
+ }
41
+ }
42
+ lines.push('');
43
+ lines.push('##############');
44
+ lines.push('#### Vars ####');
45
+ lines.push('##############');
46
+ lines.push('[vars]');
47
+ const settingsJson = JSON.stringify(settings);
48
+ lines.push(`SETTINGS = ${JSON.stringify(settingsJson)}`);
49
+ const serversJson = JSON.stringify(servers);
50
+ lines.push(`SERVERS = ${JSON.stringify(serversJson)}`);
51
+ const contextsJson = JSON.stringify(contexts);
52
+ lines.push(`CONTEXTS = ${JSON.stringify(contextsJson)}`);
53
+ if (kvNamespaceId !== undefined) {
54
+ lines.push('');
55
+ lines.push('########################');
56
+ lines.push('#### KV Namespaces ####');
57
+ lines.push('########################');
58
+ lines.push('[[kv_namespaces]]');
59
+ lines.push('binding = "KV"');
60
+ lines.push(`id = "${kvNamespaceId}"`);
61
+ }
62
+ const outputDir = dirname(outputPath);
63
+ mkdirSync(outputDir, { recursive: true });
64
+ writeFileSync(outputPath, `${lines.join('\n')}\n`);
65
+ return;
66
+ }
67
+ export { generateWranglerToml, };
68
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CliCommandsServerAddServerConfigPath, CliCommandsServerAddServerReturn, CliCommandsServerAddServerServer, CliCommandsServerEditServerConfigPath, CliCommandsServerEditServerName, CliCommandsServerEditServerReturn, CliCommandsServerEditServerUpdates, CliCommandsServerListServersConfigPath, CliCommandsServerListServersReturn, CliCommandsServerRemoveServerConfigPath, CliCommandsServerRemoveServerName, CliCommandsServerRemoveServerReturn } from '../../types/cli/commands/server.d.ts';
2
+ declare function addServer(configPath: CliCommandsServerAddServerConfigPath, server: CliCommandsServerAddServerServer): CliCommandsServerAddServerReturn;
3
+ declare function listServers(configPath: CliCommandsServerListServersConfigPath): CliCommandsServerListServersReturn;
4
+ declare function editServer(configPath: CliCommandsServerEditServerConfigPath, name: CliCommandsServerEditServerName, updates: CliCommandsServerEditServerUpdates): CliCommandsServerEditServerReturn;
5
+ declare function removeServer(configPath: CliCommandsServerRemoveServerConfigPath, name: CliCommandsServerRemoveServerName): CliCommandsServerRemoveServerReturn;
6
+ export { addServer, editServer, listServers, removeServer, };
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,oCAAoC,EAEpC,gCAAgC,EAChC,gCAAgC,EAEhC,qCAAqC,EAGrC,+BAA+B,EAC/B,iCAAiC,EACjC,kCAAkC,EAClC,sCAAsC,EACtC,kCAAkC,EAElC,uCAAuC,EAGvC,iCAAiC,EAEjC,mCAAmC,EACpC,MAAM,sCAAsC,CAAC;AAU9C,iBAAS,SAAS,CAAC,UAAU,EAAE,oCAAoC,EAAE,MAAM,EAAE,gCAAgC,GAAG,gCAAgC,CAa/I;AAUD,iBAAS,WAAW,CAAC,UAAU,EAAE,sCAAsC,GAAG,kCAAkC,CAE3G;AAUD,iBAAS,UAAU,CAAC,UAAU,EAAE,qCAAqC,EAAE,IAAI,EAAE,+BAA+B,EAAE,OAAO,EAAE,kCAAkC,GAAG,iCAAiC,CAkB5L;AAUD,iBAAS,YAAY,CAAC,UAAU,EAAE,uCAAuC,EAAE,IAAI,EAAE,iCAAiC,GAAG,mCAAmC,CAmBvJ;AAED,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,GACb,CAAC"}