@lunora/do 1.0.0-alpha.44 → 1.0.0-alpha.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +473 -64
- package/dist/index.d.ts +473 -64
- package/dist/index.mjs +1 -44
- package/dist/packem_shared/ADMIN_FUNCTIONS-PxZ8Lr9e.mjs +1 -0
- package/dist/packem_shared/AGGREGATE_SQL_FUNCTION-QYaiuty4.mjs +1 -0
- package/dist/packem_shared/AUTH_METRICS_BUCKETS_TABLE-D0wNaez7.mjs +22 -0
- package/dist/packem_shared/CDC_LOG_TABLE-E_J5LPoK.mjs +8 -0
- package/dist/packem_shared/ConflictError-C8GtJmjS.mjs +1 -0
- package/dist/packem_shared/CountRlsUnsupportedError-Cl8XpYDL.mjs +1 -0
- package/dist/packem_shared/DATA_MIGRATION_STATE_TABLE-CaO6L0Ee.mjs +31 -0
- package/dist/packem_shared/DEFAULT_MAX_RELATION_KEYS-BRdmX7WW.mjs +1 -0
- package/dist/packem_shared/FUNCTION_METRICS_BUCKETS_TABLE-BPPeqM11.mjs +56 -0
- package/dist/packem_shared/GEO_DEFAULT_PRECISION-CWAm_oYY.mjs +1 -0
- package/dist/packem_shared/LogBuffer-bIvCelI-.mjs +1 -0
- package/dist/packem_shared/MAIL_RETENTION-KmozO2NQ.mjs +18 -0
- package/dist/packem_shared/MAX_SQL_ROWS-Bdu25ASB.mjs +2 -0
- package/dist/packem_shared/MIN_ADMIN_TOKEN_LENGTH-Ch6OW6_3.mjs +1 -0
- package/dist/packem_shared/NotFoundError-J3tjf4Uo.mjs +1 -0
- package/dist/packem_shared/NotUniqueError-BcP6GOem.mjs +1 -0
- package/dist/packem_shared/RANK_TIEBREAK-DtX8zQyc.mjs +1 -0
- package/dist/packem_shared/RLS_UNWRAP_SYMBOL-C6_WX3dG.mjs +1 -0
- package/dist/packem_shared/ROOT_DO_SIZE_WARN_BYTES-n4ds54Xa.mjs +101 -0
- package/dist/packem_shared/ReactiveCache-1_9Rs7J_.mjs +1 -0
- package/dist/packem_shared/SCAN_DEP-D_yR9EeV.mjs +1 -0
- package/dist/packem_shared/SESSION_DO_TTL_DEFAULT-GvBy_DBz.mjs +1 -0
- package/dist/packem_shared/SHARD_REGISTRY_DO_NAME-Caa0fR4N.mjs +1 -0
- package/dist/packem_shared/aggregateTableName-G-eXyjcz.mjs +1 -0
- package/dist/packem_shared/applyOnDelete-BvQN7pDL.mjs +1 -0
- package/dist/packem_shared/applySelect-Bq2KOrkL.mjs +1 -0
- package/dist/packem_shared/armRestore-BNzdvQ_o.mjs +1 -0
- package/dist/packem_shared/backfillAggregateIndexes-BAQ3Fwwh.mjs +1 -0
- package/dist/packem_shared/buildFtsMatch-CV0Z7PWv.mjs +1 -0
- package/dist/packem_shared/compileWhereSql-BLcfs4QW.mjs +1 -0
- package/dist/packem_shared/constant-time-equal-BVG05Guz.mjs +1 -0
- package/dist/packem_shared/context-telemetry-O3OwE5Zu.mjs +1 -0
- package/dist/packem_shared/createMetrics-tV8rYTGJ.mjs +1 -0
- package/dist/packem_shared/createSystemReader-DcDcrtM3.mjs +1 -0
- package/dist/packem_shared/ctx-db-idempotency-wiVoGnpQ.mjs +19 -0
- package/dist/packem_shared/ctx-db-shapes-DzX_H5q8.mjs +1 -0
- package/dist/packem_shared/diffExternalSource-DMpkJta1.mjs +1 -0
- package/dist/packem_shared/do-exec-BLe9lLrN.mjs +1 -0
- package/dist/packem_shared/do-sql-BYIQTG3z.mjs +1 -0
- package/dist/packem_shared/exportShardRows-kt42wijd.mjs +1 -0
- package/dist/packem_shared/hasTrigger-_rexbWMO.mjs +1 -0
- package/dist/packem_shared/isSoftDeleted-BvhQov04.mjs +9 -0
- package/dist/packem_shared/json-response-wrh9TBPw.mjs +1 -0
- package/dist/packem_shared/materializeExternalRows-BFmT9gsw.mjs +1 -0
- package/dist/packem_shared/renderSql-B5lF5Jd9.mjs +1 -0
- package/dist/packem_shared/runShardMigrations-bxOHpfID.mjs +5 -0
- package/dist/packem_shared/security-audit-BKUOgE0x.mjs +1 -0
- package/dist/packem_shared/selectExpiredIds-BGVP3d8-.mjs +1 -0
- package/dist/packem_shared/serialize-sql-DiRzL7A4.mjs +1 -0
- package/dist/packem_shared/serveRelationFanout-Ct5D2Tbk.mjs +1 -0
- package/dist/packem_shared/stableStringify-BjLh4gvA.mjs +1 -0
- package/dist/packem_shared/stableWireKey-YEHLaX6X.mjs +1 -0
- package/dist/packem_shared/subscriptionListDeltas-Bs69JbA8.mjs +1 -0
- package/dist/packem_shared/wire-codec-Ctnni0h6.mjs +1 -0
- package/package.json +1 -1
- package/dist/packem_shared/ADMIN_FUNCTIONS-CnZkbXH_.mjs +0 -374
- package/dist/packem_shared/AGGREGATE_SQL_FUNCTION-CQsu2Xga.mjs +0 -56
- package/dist/packem_shared/AUTH_METRICS_BUCKETS_TABLE-CiHHYeJi.mjs +0 -84
- package/dist/packem_shared/CDC_LOG_TABLE-uwOJxJJZ.mjs +0 -107
- package/dist/packem_shared/ConflictError-CLoq37xH.mjs +0 -12
- package/dist/packem_shared/CountRlsUnsupportedError-BGxj0pgS.mjs +0 -133
- package/dist/packem_shared/DATA_MIGRATION_STATE_TABLE-CYwBpyTr.mjs +0 -245
- package/dist/packem_shared/DEFAULT_MAX_RELATION_KEYS-BEan1CRD.mjs +0 -211
- package/dist/packem_shared/FUNCTION_METRICS_BUCKETS_TABLE-UDNVD7FS.mjs +0 -248
- package/dist/packem_shared/GEO_DEFAULT_PRECISION-BWnsNmpP.mjs +0 -114
- package/dist/packem_shared/LogBuffer-B_Ezju_N.mjs +0 -37
- package/dist/packem_shared/MAIL_RETENTION-CPpgl-dX.mjs +0 -104
- package/dist/packem_shared/MAX_SQL_ROWS-iFAA8FbD.mjs +0 -61
- package/dist/packem_shared/MIN_ADMIN_TOKEN_LENGTH-CCAvoFlr.mjs +0 -1
- package/dist/packem_shared/NotFoundError-C70b9hLw.mjs +0 -9
- package/dist/packem_shared/NotUniqueError-DbtlWwcG.mjs +0 -2031
- package/dist/packem_shared/RANK_TIEBREAK-CXhdcA1o.mjs +0 -91
- package/dist/packem_shared/RLS_UNWRAP_SYMBOL-DTvHvRzY.mjs +0 -141
- package/dist/packem_shared/ROOT_DO_SIZE_WARN_BYTES-B_zt4RQE.mjs +0 -7676
- package/dist/packem_shared/ReactiveCache-DnSvbjil.mjs +0 -233
- package/dist/packem_shared/SCAN_DEP-DLJF8dsj.mjs +0 -19
- package/dist/packem_shared/SESSION_DO_TTL_DEFAULT-BnSKgVO4.mjs +0 -169
- package/dist/packem_shared/SHARD_REGISTRY_DO_NAME-D99roc-r.mjs +0 -144
- package/dist/packem_shared/aggregateTableName-CxNqY1Sl.mjs +0 -64
- package/dist/packem_shared/applyOnDelete-BXSq3S70.mjs +0 -176
- package/dist/packem_shared/applySelect-WQY8m62C.mjs +0 -103
- package/dist/packem_shared/armRestore-4Px61hHS.mjs +0 -49
- package/dist/packem_shared/backfillAggregateIndexes-BGTwynwh.mjs +0 -81
- package/dist/packem_shared/buildFtsMatch-BLEMawrp.mjs +0 -38
- package/dist/packem_shared/compileWhereSql-DE6yfRcQ.mjs +0 -129
- package/dist/packem_shared/constant-time-equal-BVRWZgES.mjs +0 -12
- package/dist/packem_shared/context-telemetry-CDpyil58.mjs +0 -223
- package/dist/packem_shared/createMetrics-C4I2Yanj.mjs +0 -1
- package/dist/packem_shared/createSystemReader-D12eNH13.mjs +0 -82
- package/dist/packem_shared/ctx-db-idempotency-BdcNpvY4.mjs +0 -108
- package/dist/packem_shared/ctx-db-shapes-DTeFiHYS.mjs +0 -53
- package/dist/packem_shared/diffExternalSource-CovHfdyo.mjs +0 -44
- package/dist/packem_shared/do-exec-5eQy5cEi.mjs +0 -12
- package/dist/packem_shared/do-sql-CGAgiQUz.mjs +0 -88
- package/dist/packem_shared/exportShardRows-Dy3oFZ26.mjs +0 -157
- package/dist/packem_shared/hasTrigger-5N6_Fx0A.mjs +0 -20
- package/dist/packem_shared/isSoftDeleted-CFJmhjFP.mjs +0 -217
- package/dist/packem_shared/json-response-BdbtpOhm.mjs +0 -3
- package/dist/packem_shared/materializeExternalRows-BtEGs1Fv.mjs +0 -45
- package/dist/packem_shared/renderSql-D6eUcn2N.mjs +0 -16
- package/dist/packem_shared/runShardMigrations-BVax6rYu.mjs +0 -120
- package/dist/packem_shared/security-audit-CucgBice.mjs +0 -158
- package/dist/packem_shared/selectExpiredIds-C5W29Upb.mjs +0 -18
- package/dist/packem_shared/serialize-sql-BlRUoiQe.mjs +0 -14
- package/dist/packem_shared/serveRelationFanout-k7HTh3CC.mjs +0 -21
- package/dist/packem_shared/stableStringify-mC40mZts.mjs +0 -40
- package/dist/packem_shared/stableWireKey-DKuXO7T5.mjs +0 -6
- package/dist/packem_shared/subscriptionListDeltas-CT76bYny.mjs +0 -126
- package/dist/packem_shared/wire-codec-CzQc1pvf.mjs +0 -225
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
const MAIL_TABLE = "__lunora_mail";
|
|
2
|
-
const MAIL_RETENTION = 500;
|
|
3
|
-
const MAX_BODY_CHARS = 256 * 1024;
|
|
4
|
-
const capBody = (value) => value !== void 0 && value.length > MAX_BODY_CHARS ? `${value.slice(0, MAX_BODY_CHARS)}
|
|
5
|
-
… [truncated by the dev mail catcher]` : value;
|
|
6
|
-
const runSql = (sql, query, ...params) => {
|
|
7
|
-
const runner = sql.exec;
|
|
8
|
-
return runner.call(sql, query, ...params);
|
|
9
|
-
};
|
|
10
|
-
const orNull = (value) => (
|
|
11
|
-
// eslint-disable-next-line unicorn/no-null -- SQL NULL is the correct value for an absent column.
|
|
12
|
-
value ?? null
|
|
13
|
-
);
|
|
14
|
-
const encode = (value) => {
|
|
15
|
-
if (value === void 0) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
return JSON.stringify(value);
|
|
19
|
-
};
|
|
20
|
-
const decode = (value) => {
|
|
21
|
-
if (value === null || value === void 0 || value === "") {
|
|
22
|
-
return void 0;
|
|
23
|
-
}
|
|
24
|
-
try {
|
|
25
|
-
return JSON.parse(value);
|
|
26
|
-
} catch {
|
|
27
|
-
return void 0;
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
const ensureMailTable = (sql) => {
|
|
31
|
-
runSql(
|
|
32
|
-
sql,
|
|
33
|
-
`CREATE TABLE IF NOT EXISTS "${MAIL_TABLE}" (
|
|
34
|
-
id TEXT PRIMARY KEY,
|
|
35
|
-
captured_at INTEGER NOT NULL,
|
|
36
|
-
from_addr TEXT,
|
|
37
|
-
to_addrs TEXT NOT NULL,
|
|
38
|
-
cc_addrs TEXT,
|
|
39
|
-
bcc_addrs TEXT,
|
|
40
|
-
reply_to TEXT,
|
|
41
|
-
subject TEXT NOT NULL,
|
|
42
|
-
html TEXT,
|
|
43
|
-
body_text TEXT,
|
|
44
|
-
headers TEXT
|
|
45
|
-
)`
|
|
46
|
-
);
|
|
47
|
-
};
|
|
48
|
-
const recordCapturedMail = (sql, input, capturedAt) => {
|
|
49
|
-
ensureMailTable(sql);
|
|
50
|
-
const id = crypto.randomUUID();
|
|
51
|
-
runSql(
|
|
52
|
-
sql,
|
|
53
|
-
`INSERT INTO "${MAIL_TABLE}" (id, captured_at, from_addr, to_addrs, cc_addrs, bcc_addrs, reply_to, subject, html, body_text, headers)
|
|
54
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
55
|
-
id,
|
|
56
|
-
capturedAt,
|
|
57
|
-
orNull(input.from),
|
|
58
|
-
JSON.stringify(input.to),
|
|
59
|
-
encode(input.cc),
|
|
60
|
-
encode(input.bcc),
|
|
61
|
-
orNull(input.replyTo),
|
|
62
|
-
input.subject,
|
|
63
|
-
orNull(capBody(input.html)),
|
|
64
|
-
orNull(capBody(input.text)),
|
|
65
|
-
encode(input.headers)
|
|
66
|
-
);
|
|
67
|
-
runSql(
|
|
68
|
-
sql,
|
|
69
|
-
`DELETE FROM "${MAIL_TABLE}"
|
|
70
|
-
WHERE id NOT IN (
|
|
71
|
-
SELECT id FROM "${MAIL_TABLE}" ORDER BY captured_at DESC, id DESC LIMIT ?
|
|
72
|
-
)`,
|
|
73
|
-
MAIL_RETENTION
|
|
74
|
-
);
|
|
75
|
-
return { id };
|
|
76
|
-
};
|
|
77
|
-
const readCapturedMail = (sql, options = {}) => {
|
|
78
|
-
ensureMailTable(sql);
|
|
79
|
-
const limit = Math.min(Math.max(options.limit ?? 50, 1), MAIL_RETENTION);
|
|
80
|
-
const rows = runSql(sql, `SELECT * FROM "${MAIL_TABLE}" ORDER BY captured_at DESC, id DESC LIMIT ?`, limit).toArray();
|
|
81
|
-
const entries = rows.map((row) => {
|
|
82
|
-
return {
|
|
83
|
-
bcc: decode(row.bcc_addrs),
|
|
84
|
-
capturedAt: row.captured_at,
|
|
85
|
-
cc: decode(row.cc_addrs),
|
|
86
|
-
from: row.from_addr ?? void 0,
|
|
87
|
-
headers: decode(row.headers),
|
|
88
|
-
html: row.html ?? void 0,
|
|
89
|
-
id: row.id,
|
|
90
|
-
replyTo: row.reply_to ?? void 0,
|
|
91
|
-
subject: row.subject,
|
|
92
|
-
text: row.body_text ?? void 0,
|
|
93
|
-
to: decode(row.to_addrs) ?? row.to_addrs
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
return { entries };
|
|
97
|
-
};
|
|
98
|
-
const clearCapturedMail = (sql) => {
|
|
99
|
-
ensureMailTable(sql);
|
|
100
|
-
runSql(sql, `DELETE FROM "${MAIL_TABLE}"`);
|
|
101
|
-
return { cleared: true };
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
export { MAIL_RETENTION, MAIL_TABLE, MAX_BODY_CHARS, clearCapturedMail, ensureMailTable, readCapturedMail, recordCapturedMail };
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { LunoraError } from '@lunora/errors';
|
|
2
|
-
|
|
3
|
-
const MAX_SQL_ROWS = 1e3;
|
|
4
|
-
const READONLY_LEAD = /^(?:explain\s+(?:query\s+plan\s+)?)?(?:select|with)\b/iu;
|
|
5
|
-
const FORBIDDEN_KEYWORD = /\b(?:alter|attach|create|delete|detach|drop|insert|pragma|reindex|replace|truncate|update|vacuum)\b/iu;
|
|
6
|
-
const TRAILING_SEMICOLON = /;\s*$/u;
|
|
7
|
-
const WHITESPACE = /\s/u;
|
|
8
|
-
const skipLineComment = (sql, from) => {
|
|
9
|
-
let index = from + 2;
|
|
10
|
-
while (index < sql.length && sql[index] !== "\n") {
|
|
11
|
-
index += 1;
|
|
12
|
-
}
|
|
13
|
-
return index;
|
|
14
|
-
};
|
|
15
|
-
const skipBlockComment = (sql, from) => {
|
|
16
|
-
const close = sql.indexOf("*/", from + 2);
|
|
17
|
-
return close === -1 ? -1 : close + 2;
|
|
18
|
-
};
|
|
19
|
-
const stripLeading = (sql) => {
|
|
20
|
-
let index = 0;
|
|
21
|
-
while (index < sql.length) {
|
|
22
|
-
const char = sql[index];
|
|
23
|
-
if (char !== void 0 && WHITESPACE.test(char)) {
|
|
24
|
-
index += 1;
|
|
25
|
-
} else if (char === "-" && sql[index + 1] === "-") {
|
|
26
|
-
index = skipLineComment(sql, index);
|
|
27
|
-
} else if (char === "/" && sql[index + 1] === "*") {
|
|
28
|
-
const next = skipBlockComment(sql, index);
|
|
29
|
-
if (next === -1) {
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
index = next;
|
|
33
|
-
} else {
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return sql.slice(index);
|
|
38
|
-
};
|
|
39
|
-
const sqlError = (message, code) => new LunoraError(code, message, { status: 400 });
|
|
40
|
-
const assertReadonly = (query) => {
|
|
41
|
-
const trimmed = stripLeading(query).trim();
|
|
42
|
-
if (trimmed === "") {
|
|
43
|
-
throw sqlError("the query is empty", "SQL_EMPTY");
|
|
44
|
-
}
|
|
45
|
-
const single = trimmed.replace(TRAILING_SEMICOLON, "");
|
|
46
|
-
if (single.includes(";")) {
|
|
47
|
-
throw sqlError("only a single statement may be run", "SQL_MULTIPLE_STATEMENTS");
|
|
48
|
-
}
|
|
49
|
-
if (!READONLY_LEAD.test(single) || FORBIDDEN_KEYWORD.test(single)) {
|
|
50
|
-
throw sqlError("the SQL editor is read-only — only SELECT / WITH / EXPLAIN queries are allowed", "SQL_NOT_READONLY");
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
const runReadonlySql = (sql, query) => {
|
|
54
|
-
assertReadonly(query);
|
|
55
|
-
const all = sql.exec(query).toArray();
|
|
56
|
-
const rows = all.length > MAX_SQL_ROWS ? all.slice(0, MAX_SQL_ROWS) : all;
|
|
57
|
-
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
58
|
-
return { columns, rowCount: all.length, rows, truncated: all.length > MAX_SQL_ROWS };
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export { MAX_SQL_ROWS, assertReadonly, runReadonlySql };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { M as MIN_ADMIN_TOKEN_LENGTH, a as MIN_AUTH_SECRET_LENGTH, b as buildSecurityAudit } from './security-audit-CucgBice.mjs';
|