@freema/drobek-modules 0.3.3

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 (33) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +53 -0
  3. package/dist/chunk-WHKPW5MP.js +6611 -0
  4. package/dist/index.d.ts +1604 -0
  5. package/dist/index.js +373 -0
  6. package/dist/mail-guard.d-BKJhsVA2.d.ts +2097 -0
  7. package/dist/migrations/core/0000_dusty_scarecrow.sql +84 -0
  8. package/dist/migrations/core/0001_busy_orphan.sql +69 -0
  9. package/dist/migrations/core/0002_odd_alex_power.sql +17 -0
  10. package/dist/migrations/core/0003_nosy_shatterstar.sql +26 -0
  11. package/dist/migrations/core/0004_nice_ben_parker.sql +27 -0
  12. package/dist/migrations/core/0005_panoramic_bill_hollister.sql +4 -0
  13. package/dist/migrations/core/0006_outgoing_ricochet.sql +29 -0
  14. package/dist/migrations/core/0007_app_versions.sql +95 -0
  15. package/dist/migrations/core/0008_user_bound_tokens.sql +42 -0
  16. package/dist/migrations/core/0009_app_name.sql +1 -0
  17. package/dist/migrations/core/0010_apps_origin.sql +12 -0
  18. package/dist/migrations/core/0011_modules.sql +32 -0
  19. package/dist/migrations/core/0012_data_module_tables.sql +9 -0
  20. package/dist/migrations/core/0014_get_logs.sql +26 -0
  21. package/dist/migrations/core/0016_apps_slug_release.sql +8 -0
  22. package/dist/migrations/core/0018_custom_domains.sql +22 -0
  23. package/dist/migrations/core/0021_abuse_reports.sql +23 -0
  24. package/dist/migrations/core/0022_gallery.sql +20 -0
  25. package/dist/migrations/core/0023_workspace_modules.sql +13 -0
  26. package/dist/migrations/core/0024_app_assets.sql +18 -0
  27. package/dist/migrations/core/0025_app_asset_snapshots.sql +28 -0
  28. package/dist/migrations/core/0026_publish_approval.sql +13 -0
  29. package/dist/migrations/core/0027_publish_block.sql +6 -0
  30. package/dist/migrations/core/meta/_journal.json +167 -0
  31. package/dist/testing.d.ts +269 -0
  32. package/dist/testing.js +1569 -0
  33. package/package.json +63 -0
package/dist/index.js ADDED
@@ -0,0 +1,373 @@
1
+ // @freema/drobek-modules (@drobek/modules) — AGPL-3.0-only — https://github.com/freema/drobek
2
+ import {
3
+ BACKEND_IMPORT_SKILLS,
4
+ BEACON_SCRIPT_PATH,
5
+ CORE_ERROR_CODES,
6
+ CORE_LIMITS,
7
+ DEFAULT_MAX_BODY_BYTES,
8
+ DEFAULT_MODULES_DIR,
9
+ EMAIL_RE,
10
+ END_USER_COOKIE,
11
+ END_USER_COOKIE_INSECURE,
12
+ END_USER_SESSION_TTL_SEC,
13
+ END_USER_TOKEN_RE,
14
+ LIMITS_CACHE_TTL_SEC,
15
+ LIMITS_SIGNATURE_HEADER,
16
+ LIMITS_TIMESTAMP_HEADER,
17
+ Lru,
18
+ MAIL_COUNTER_KEYS,
19
+ MAIL_PAUSE_KEYS,
20
+ MAX_EMAIL_TEXT,
21
+ MAX_FILE_HEAD_BYTES,
22
+ MODULE_CONTRACT_VERSION,
23
+ MODULE_ERROR_CODES,
24
+ MODULE_ERROR_CODE_RE,
25
+ MODULE_NAME_RE,
26
+ ModuleError,
27
+ ModuleLoadError,
28
+ ModuleRuntime,
29
+ PENDING_MAIL_WINDOW_MS,
30
+ PLATFORM_SKILL_NAME,
31
+ RECORDS_IMPORT_MAX_ROWS,
32
+ RESERVED_MODULE_NAMES,
33
+ RULE_TOKENS,
34
+ SDK_HEADER,
35
+ SDK_PATH,
36
+ SDK_TYPES_PATH,
37
+ SECRET_MAX_BYTES,
38
+ SECRET_NAME_RE,
39
+ SLOT_NAME_RE,
40
+ SecretStoreError,
41
+ activeModules,
42
+ appOwnerEmails,
43
+ buildBeaconScript,
44
+ buildSdk,
45
+ capEmailText,
46
+ checkErrorCodes,
47
+ checkModuleSet,
48
+ checkRequires,
49
+ collectContributions,
50
+ composeModule,
51
+ confirmUrl,
52
+ cookiePrincipalResolver,
53
+ createEndUserSession,
54
+ createLimitsProvider,
55
+ decideAccess,
56
+ defineModule,
57
+ deleteModuleSecret,
58
+ destroyEndUserSession,
59
+ effectiveConfigDefaults,
60
+ emailKind,
61
+ endUserAuthorityOf,
62
+ endUserCookieHeader,
63
+ endUserCookieName,
64
+ endUserCookiesSecure,
65
+ endUserEpochKey,
66
+ endUserSessionKey,
67
+ filesAuthorityOf,
68
+ generalSkillsDir,
69
+ getModuleSecret,
70
+ hasControlBytes,
71
+ inlineSpecifier,
72
+ isDefinedModule,
73
+ isModuleError,
74
+ isReadable,
75
+ isValidRule,
76
+ issuePaths,
77
+ jsonEqual,
78
+ jsonKey,
79
+ limitsProviderConfigError,
80
+ loadEndUserSession,
81
+ loadGeneralSkills,
82
+ loadModuleRuntime,
83
+ loadModuleSet,
84
+ loadModules,
85
+ looksLikeSvg,
86
+ mailAppCounterKey,
87
+ mailAuthorityOf,
88
+ mailBudgets,
89
+ mailGuardConfigFromEnv,
90
+ memoryMailGuard,
91
+ memoryMailGuardRedis,
92
+ memoryRateLimiter,
93
+ mergePatch,
94
+ moduleDefaultsEnvName,
95
+ moduleEnabledLimitName,
96
+ moduleJournalTable,
97
+ moduleNotEnabled,
98
+ moduleRuntime,
99
+ multipartBoundary,
100
+ normalizeConfirmItems,
101
+ packageNameFor,
102
+ parseEndUserSession,
103
+ parseModuleList,
104
+ parseMultipart,
105
+ parseRule,
106
+ parseSkillMarkdown,
107
+ pendingMail,
108
+ pendingMailKey,
109
+ perIpLimitKey,
110
+ readConfigRow,
111
+ readEndUserToken,
112
+ recipientRefs,
113
+ recordsAuthorityOf,
114
+ redisMailGuard,
115
+ redisRateLimiter,
116
+ renewEndUserSession,
117
+ resolveRecipients,
118
+ respond,
119
+ revokeEndUserSessions,
120
+ ruleIsPublic,
121
+ sanitizeSubject,
122
+ sdkDeclarations,
123
+ secretsSet,
124
+ secretsStatus,
125
+ setModuleRuntimeForTests,
126
+ setModuleSecret,
127
+ signLimitsRequest,
128
+ skillForImport,
129
+ skillHint,
130
+ smtpEmailTransport,
131
+ sniffSignature,
132
+ stableJson,
133
+ streamMultipartFile,
134
+ submissionsAuthorityOf
135
+ } from "./chunk-WHKPW5MP.js";
136
+
137
+ // packages/modules/dist/index.js
138
+ import { z as z2 } from "zod";
139
+
140
+ // packages/modules/dist/auth-provider.js
141
+ import { z } from "zod";
142
+ var AUTH_PROVIDER_ID_RE = /^[a-z][a-z0-9]{1,15}$/;
143
+ var EMAIL_PROVIDER_ID = "email";
144
+ var AUTH_RESERVED_CONFIG_KEYS = ["enabled", "relinkByEmail"];
145
+ function defineAuthProvider(provider) {
146
+ return provider;
147
+ }
148
+ function defineSignInObserver(observer) {
149
+ return observer;
150
+ }
151
+ var fn = (what) => z.custom((v) => typeof v === "function", `${what} must be a function`);
152
+ function isObjectSchema(v) {
153
+ const s = v;
154
+ return typeof s === "object" && s !== null && typeof s.safeParse === "function" && typeof s.partial === "function" && typeof s.extend === "function" && typeof s.shape === "object" && s.shape !== null;
155
+ }
156
+ var SECRET_NAME = /^[A-Z][A-Z0-9_]{1,63}$/;
157
+ var CONTROL = /[\u0000-\u001f\u007f\u2028\u2029]/;
158
+ var authProviderSchema = z.looseObject({
159
+ id: z.string().regex(AUTH_PROVIDER_ID_RE, "id must be 2\u201316 lowercase letters and digits, starting with a letter").refine((id) => id !== EMAIL_PROVIDER_ID, 'id "email" is the e-mail code \u2014 pick another'),
160
+ label: z.string().min(1).max(40).refine((l) => !CONTROL.test(l) && l.trim() === l, "label must be one trimmed line"),
161
+ configSchema: z.custom(isObjectSchema, "configSchema must be a zod object schema (z.object / z.strictObject)"),
162
+ configDefaults: z.record(z.string(), z.unknown()).optional(),
163
+ identityFields: z.array(z.string().min(1)).max(20).optional(),
164
+ secrets: z.array(z.object({
165
+ name: z.string(),
166
+ description: z.string().min(1),
167
+ required: z.boolean().optional(),
168
+ env: z.string().optional()
169
+ })).max(20).optional(),
170
+ begin: fn("begin"),
171
+ callback: fn("callback")
172
+ }).superRefine((p, ctx) => {
173
+ if (!AUTH_PROVIDER_ID_RE.test(p.id) || !isObjectSchema(p.configSchema))
174
+ return;
175
+ const shape = p.configSchema.shape;
176
+ for (const key of AUTH_RESERVED_CONFIG_KEYS) {
177
+ if (key in shape)
178
+ ctx.addIssue({ code: "custom", path: ["configSchema"], message: `configSchema may not declare \`${key}\` (auth adds it)` });
179
+ }
180
+ for (const f of p.identityFields ?? []) {
181
+ if (!(f in shape))
182
+ ctx.addIssue({ code: "custom", path: ["identityFields"], message: `identityFields names "${f}", which configSchema does not declare` });
183
+ }
184
+ const upper = p.id.toUpperCase();
185
+ const names = /* @__PURE__ */ new Set();
186
+ for (const s of p.secrets ?? []) {
187
+ if (!SECRET_NAME.test(s.name) || !s.name.startsWith(`${upper}_`)) {
188
+ ctx.addIssue({ code: "custom", path: ["secrets"], message: `secret "${s.name}" must be UPPER_SNAKE and start with "${upper}_"` });
189
+ }
190
+ if (names.has(s.name))
191
+ ctx.addIssue({ code: "custom", path: ["secrets"], message: `secret "${s.name}" is declared twice` });
192
+ names.add(s.name);
193
+ if (s.env !== void 0 && !(SECRET_NAME.test(s.env) && s.env.startsWith(`AUTH_${upper}_`))) {
194
+ ctx.addIssue({ code: "custom", path: ["secrets"], message: `secret "${s.name}": env must be an AUTH_${upper}_\u2026 variable` });
195
+ }
196
+ }
197
+ if (p.configDefaults !== void 0) {
198
+ const r = p.configSchema.partial().safeParse(p.configDefaults);
199
+ if (!r.success)
200
+ ctx.addIssue({ code: "custom", path: ["configDefaults"], message: "configDefaults do not pass configSchema.partial()" });
201
+ }
202
+ });
203
+ var authSignedInObserverSchema = z.looseObject({
204
+ id: z.string().regex(/^[a-z][a-z0-9-]{1,39}$/, "id must be 2\u201340 lowercase letters, digits or dashes"),
205
+ onSignIn: fn("onSignIn")
206
+ });
207
+ var authIdentitySchema = z.object({
208
+ issuer: z.string().min(1).max(2048).refine((s) => !CONTROL.test(s) && s.trim() === s, "issuer must be one trimmed line"),
209
+ subject: z.string().min(1).max(255).refine((s) => !CONTROL.test(s), "subject may not contain control characters"),
210
+ email: z.string().trim().toLowerCase().max(254).pipe(z.email({ message: "must be an e-mail address" })),
211
+ emailVerified: z.boolean(),
212
+ name: z.string().max(200).optional()
213
+ });
214
+
215
+ // packages/modules/dist/csv-stream.js
216
+ var CSV_CHUNK_CHARS = 64 * 1024;
217
+ async function* csvChunks(lines, chunkChars = CSV_CHUNK_CHARS) {
218
+ let chunk = "";
219
+ for await (const line of lines) {
220
+ chunk += `${line}\r
221
+ `;
222
+ if (chunk.length >= chunkChars) {
223
+ yield chunk;
224
+ chunk = "";
225
+ }
226
+ }
227
+ if (chunk)
228
+ yield chunk;
229
+ }
230
+ export {
231
+ AUTH_PROVIDER_ID_RE,
232
+ AUTH_RESERVED_CONFIG_KEYS,
233
+ BACKEND_IMPORT_SKILLS,
234
+ BEACON_SCRIPT_PATH,
235
+ CORE_ERROR_CODES,
236
+ CORE_LIMITS,
237
+ DEFAULT_MAX_BODY_BYTES,
238
+ DEFAULT_MODULES_DIR,
239
+ EMAIL_PROVIDER_ID,
240
+ EMAIL_RE,
241
+ END_USER_COOKIE,
242
+ END_USER_COOKIE_INSECURE,
243
+ END_USER_SESSION_TTL_SEC,
244
+ END_USER_TOKEN_RE,
245
+ LIMITS_CACHE_TTL_SEC,
246
+ LIMITS_SIGNATURE_HEADER,
247
+ LIMITS_TIMESTAMP_HEADER,
248
+ Lru,
249
+ MAIL_COUNTER_KEYS,
250
+ MAIL_PAUSE_KEYS,
251
+ MAX_EMAIL_TEXT,
252
+ MAX_FILE_HEAD_BYTES,
253
+ MODULE_CONTRACT_VERSION,
254
+ MODULE_ERROR_CODES,
255
+ MODULE_ERROR_CODE_RE,
256
+ MODULE_NAME_RE,
257
+ ModuleError,
258
+ ModuleLoadError,
259
+ ModuleRuntime,
260
+ PENDING_MAIL_WINDOW_MS,
261
+ PLATFORM_SKILL_NAME,
262
+ RECORDS_IMPORT_MAX_ROWS,
263
+ RESERVED_MODULE_NAMES,
264
+ RULE_TOKENS,
265
+ SDK_HEADER,
266
+ SDK_PATH,
267
+ SDK_TYPES_PATH,
268
+ SECRET_MAX_BYTES,
269
+ SECRET_NAME_RE,
270
+ SLOT_NAME_RE,
271
+ SecretStoreError,
272
+ activeModules,
273
+ appOwnerEmails,
274
+ authIdentitySchema,
275
+ authProviderSchema,
276
+ authSignedInObserverSchema,
277
+ buildBeaconScript,
278
+ buildSdk,
279
+ capEmailText,
280
+ checkErrorCodes,
281
+ checkModuleSet,
282
+ checkRequires,
283
+ collectContributions,
284
+ composeModule,
285
+ confirmUrl,
286
+ cookiePrincipalResolver,
287
+ createEndUserSession,
288
+ createLimitsProvider,
289
+ csvChunks,
290
+ decideAccess,
291
+ defineAuthProvider,
292
+ defineModule,
293
+ defineSignInObserver,
294
+ deleteModuleSecret,
295
+ destroyEndUserSession,
296
+ effectiveConfigDefaults,
297
+ emailKind,
298
+ endUserAuthorityOf,
299
+ endUserCookieHeader,
300
+ endUserCookieName,
301
+ endUserCookiesSecure,
302
+ endUserEpochKey,
303
+ endUserSessionKey,
304
+ filesAuthorityOf,
305
+ generalSkillsDir,
306
+ getModuleSecret,
307
+ hasControlBytes,
308
+ inlineSpecifier,
309
+ isDefinedModule,
310
+ isModuleError,
311
+ isReadable,
312
+ isValidRule,
313
+ issuePaths,
314
+ jsonEqual,
315
+ jsonKey,
316
+ limitsProviderConfigError,
317
+ loadEndUserSession,
318
+ loadGeneralSkills,
319
+ loadModuleRuntime,
320
+ loadModuleSet,
321
+ loadModules,
322
+ looksLikeSvg,
323
+ mailAppCounterKey,
324
+ mailAuthorityOf,
325
+ mailBudgets,
326
+ mailGuardConfigFromEnv,
327
+ memoryMailGuard,
328
+ memoryMailGuardRedis,
329
+ memoryRateLimiter,
330
+ mergePatch,
331
+ moduleDefaultsEnvName,
332
+ moduleEnabledLimitName,
333
+ moduleJournalTable,
334
+ moduleNotEnabled,
335
+ moduleRuntime,
336
+ multipartBoundary,
337
+ normalizeConfirmItems,
338
+ packageNameFor,
339
+ parseEndUserSession,
340
+ parseModuleList,
341
+ parseMultipart,
342
+ parseRule,
343
+ parseSkillMarkdown,
344
+ pendingMail,
345
+ pendingMailKey,
346
+ perIpLimitKey,
347
+ readConfigRow,
348
+ readEndUserToken,
349
+ recipientRefs,
350
+ recordsAuthorityOf,
351
+ redisMailGuard,
352
+ redisRateLimiter,
353
+ renewEndUserSession,
354
+ resolveRecipients,
355
+ respond,
356
+ revokeEndUserSessions,
357
+ ruleIsPublic,
358
+ sanitizeSubject,
359
+ sdkDeclarations,
360
+ secretsSet,
361
+ secretsStatus,
362
+ setModuleRuntimeForTests,
363
+ setModuleSecret,
364
+ signLimitsRequest,
365
+ skillForImport,
366
+ skillHint,
367
+ smtpEmailTransport,
368
+ sniffSignature,
369
+ stableJson,
370
+ streamMultipartFile,
371
+ submissionsAuthorityOf,
372
+ z2 as z
373
+ };