@nexpress/core 0.2.0 → 0.2.2
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/{audit-54XLVCWD.js → audit-43OLHR3U.js} +4 -4
- package/dist/auth.d.ts +2 -2
- package/dist/auth.js +6 -6
- package/dist/{can-YLUHRJAB.js → can-FKIEV54H.js} +5 -5
- package/dist/{chunk-TFJ4MKPH.js → chunk-26RYBFTF.js} +2 -2
- package/dist/{chunk-PPAS4SZR.js → chunk-2KNG5KMM.js} +2 -2
- package/dist/{chunk-5L2FVFUX.js → chunk-5LCLS6VE.js} +18 -18
- package/dist/{chunk-PPBWRKO2.js → chunk-74CGJJDY.js} +3 -3
- package/dist/{chunk-HKAYX4B4.js → chunk-7GNVXRLG.js} +6 -6
- package/dist/{chunk-2YDGE7YX.js → chunk-B7DTNT4O.js} +2 -2
- package/dist/{chunk-CTSQ7BRI.js → chunk-CAS4Z6IN.js} +2 -2
- package/dist/{chunk-BHK3AD3Q.js → chunk-CHQJG4BB.js} +3 -3
- package/dist/{chunk-NUCGHWCF.js → chunk-CKT4QZDC.js} +7 -7
- package/dist/{chunk-4IEBNUYU.js → chunk-CTUHJHLH.js} +4 -4
- package/dist/{chunk-473S4TER.js → chunk-DWG3RZH2.js} +4 -4
- package/dist/{chunk-QVJ2HCAX.js → chunk-ELK6AVW5.js} +4 -4
- package/dist/{chunk-UGQSQO5B.js → chunk-HM46WM45.js} +9 -9
- package/dist/{chunk-YFJK2YEJ.js → chunk-KSUS4UNN.js} +3 -3
- package/dist/{chunk-FNLBIPKV.js → chunk-L4F5RAQ5.js} +11 -11
- package/dist/{chunk-THX3SHYA.js → chunk-L6VG7IK6.js} +3 -3
- package/dist/{chunk-VNIHXQ7W.js → chunk-LN6NTH6E.js} +5 -5
- package/dist/{chunk-RIPHIRPP.js → chunk-ML2E3P3X.js} +3 -3
- package/dist/{chunk-JJL74ZPK.js → chunk-NFHS7CFV.js} +2 -2
- package/dist/{chunk-55FU6WED.js → chunk-PQBJWZ7D.js} +6 -6
- package/dist/{chunk-DK2JBJH7.js → chunk-QBIJZZ5V.js} +3 -3
- package/dist/{chunk-OK5HOCQI.js → chunk-QYP6E5FP.js} +4 -4
- package/dist/{chunk-GFXXRMH4.js → chunk-S37WWNBB.js} +29 -29
- package/dist/{chunk-S27S42QY.js → chunk-TETTWT56.js} +2 -2
- package/dist/{chunk-FZ7O6DWI.js → chunk-U4QCCLAW.js} +2 -2
- package/dist/{chunk-M43PGOQY.js → chunk-X7K5F2UI.js} +474 -474
- package/dist/chunk-X7K5F2UI.js.map +1 -0
- package/dist/community.d.ts +1 -1
- package/dist/community.js +17 -17
- package/dist/{config-XIWZFOFI.js → config-65OBL4YH.js} +10 -10
- package/dist/db-schema.d.ts +2 -2
- package/dist/db-schema.js +2 -2
- package/dist/db.d.ts +3 -3
- package/dist/db.js +3 -3
- package/dist/{digest-SY42GQSU.js → digest-ZODDTXA2.js} +6 -6
- package/dist/{host-SOCAJIUE.js → host-55D6RX3U.js} +7 -7
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +5 -5
- package/dist/{index-XwP1ET8b.d.ts → index-BWsQUGRZ.d.ts} +2 -2
- package/dist/{index-B6-_vr_m.d.ts → index-BpW3PGhP.d.ts} +1 -1
- package/dist/{index-CY55LC0u.d.ts → index-Ccw0AkXh.d.ts} +3 -3
- package/dist/{index-CeiTvwbp.d.ts → index-D6Q7DOl7.d.ts} +1 -1
- package/dist/index.d.ts +34 -8
- package/dist/index.js +225 -33
- package/dist/index.js.map +1 -1
- package/dist/{job-log-VZXWQUDK.js → job-log-N3IGI4NA.js} +4 -4
- package/dist/jobs.d.ts +2 -2
- package/dist/jobs.js +4 -4
- package/dist/{logger-S7REWDNE.js → logger-2WUTTELV.js} +2 -2
- package/dist/media.d.ts +2 -2
- package/dist/media.js +5 -5
- package/dist/{mentions-2IHFVSHW.js → mentions-NCQR4B72.js} +5 -5
- package/dist/{mutes-EWAE5FZR.js → mutes-FJSSU2JP.js} +5 -5
- package/dist/{notification-prefs-VPJDU7I6.js → notification-prefs-H4HFVCL7.js} +3 -3
- package/dist/observability.js +2 -2
- package/dist/{registry-XIXDEPVI.js → registry-WZVL5HH6.js} +3 -3
- package/dist/reputation-ICIXDGPM.js +11 -0
- package/dist/{scheduled-W5PR7C6H.js → scheduled-UC7O2HBQ.js} +8 -8
- package/dist/seo.js +7 -7
- package/dist/{settings-FOBIESPB.js → settings-JODDWMDB.js} +3 -3
- package/dist/{strings-VAE47B2C.js → strings-4EWJYDOG.js} +6 -6
- package/dist/{types-TlsbXS0T.d.ts → types-C-r01wmU.d.ts} +25 -16
- package/package.json +1 -1
- package/dist/chunk-M43PGOQY.js.map +0 -1
- package/dist/reputation-JRL2YQHM.js +0 -11
- /package/dist/{audit-54XLVCWD.js.map → audit-43OLHR3U.js.map} +0 -0
- /package/dist/{can-YLUHRJAB.js.map → can-FKIEV54H.js.map} +0 -0
- /package/dist/{chunk-TFJ4MKPH.js.map → chunk-26RYBFTF.js.map} +0 -0
- /package/dist/{chunk-PPAS4SZR.js.map → chunk-2KNG5KMM.js.map} +0 -0
- /package/dist/{chunk-5L2FVFUX.js.map → chunk-5LCLS6VE.js.map} +0 -0
- /package/dist/{chunk-PPBWRKO2.js.map → chunk-74CGJJDY.js.map} +0 -0
- /package/dist/{chunk-HKAYX4B4.js.map → chunk-7GNVXRLG.js.map} +0 -0
- /package/dist/{chunk-2YDGE7YX.js.map → chunk-B7DTNT4O.js.map} +0 -0
- /package/dist/{chunk-CTSQ7BRI.js.map → chunk-CAS4Z6IN.js.map} +0 -0
- /package/dist/{chunk-BHK3AD3Q.js.map → chunk-CHQJG4BB.js.map} +0 -0
- /package/dist/{chunk-NUCGHWCF.js.map → chunk-CKT4QZDC.js.map} +0 -0
- /package/dist/{chunk-4IEBNUYU.js.map → chunk-CTUHJHLH.js.map} +0 -0
- /package/dist/{chunk-473S4TER.js.map → chunk-DWG3RZH2.js.map} +0 -0
- /package/dist/{chunk-QVJ2HCAX.js.map → chunk-ELK6AVW5.js.map} +0 -0
- /package/dist/{chunk-UGQSQO5B.js.map → chunk-HM46WM45.js.map} +0 -0
- /package/dist/{chunk-YFJK2YEJ.js.map → chunk-KSUS4UNN.js.map} +0 -0
- /package/dist/{chunk-FNLBIPKV.js.map → chunk-L4F5RAQ5.js.map} +0 -0
- /package/dist/{chunk-THX3SHYA.js.map → chunk-L6VG7IK6.js.map} +0 -0
- /package/dist/{chunk-VNIHXQ7W.js.map → chunk-LN6NTH6E.js.map} +0 -0
- /package/dist/{chunk-RIPHIRPP.js.map → chunk-ML2E3P3X.js.map} +0 -0
- /package/dist/{chunk-JJL74ZPK.js.map → chunk-NFHS7CFV.js.map} +0 -0
- /package/dist/{chunk-55FU6WED.js.map → chunk-PQBJWZ7D.js.map} +0 -0
- /package/dist/{chunk-DK2JBJH7.js.map → chunk-QBIJZZ5V.js.map} +0 -0
- /package/dist/{chunk-OK5HOCQI.js.map → chunk-QYP6E5FP.js.map} +0 -0
- /package/dist/{chunk-GFXXRMH4.js.map → chunk-S37WWNBB.js.map} +0 -0
- /package/dist/{chunk-S27S42QY.js.map → chunk-TETTWT56.js.map} +0 -0
- /package/dist/{chunk-FZ7O6DWI.js.map → chunk-U4QCCLAW.js.map} +0 -0
- /package/dist/{config-XIWZFOFI.js.map → config-65OBL4YH.js.map} +0 -0
- /package/dist/{digest-SY42GQSU.js.map → digest-ZODDTXA2.js.map} +0 -0
- /package/dist/{host-SOCAJIUE.js.map → host-55D6RX3U.js.map} +0 -0
- /package/dist/{job-log-VZXWQUDK.js.map → job-log-N3IGI4NA.js.map} +0 -0
- /package/dist/{logger-S7REWDNE.js.map → logger-2WUTTELV.js.map} +0 -0
- /package/dist/{mentions-2IHFVSHW.js.map → mentions-NCQR4B72.js.map} +0 -0
- /package/dist/{mutes-EWAE5FZR.js.map → mutes-FJSSU2JP.js.map} +0 -0
- /package/dist/{notification-prefs-VPJDU7I6.js.map → notification-prefs-H4HFVCL7.js.map} +0 -0
- /package/dist/{registry-XIXDEPVI.js.map → registry-WZVL5HH6.js.map} +0 -0
- /package/dist/{reputation-JRL2YQHM.js.map → reputation-ICIXDGPM.js.map} +0 -0
- /package/dist/{scheduled-W5PR7C6H.js.map → scheduled-UC7O2HBQ.js.map} +0 -0
- /package/dist/{settings-FOBIESPB.js.map → settings-JODDWMDB.js.map} +0 -0
- /package/dist/{strings-VAE47B2C.js.map → strings-4EWJYDOG.js.map} +0 -0
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
pruneJobLogsOlderThan,
|
|
7
7
|
recordJobLog,
|
|
8
8
|
runInJobContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QBIJZZ5V.js";
|
|
10
10
|
import "./chunk-OROPGO65.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-NFHS7CFV.js";
|
|
12
12
|
import "./chunk-XANPEOJC.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-X7K5F2UI.js";
|
|
14
14
|
import "./chunk-PZ5AY32C.js";
|
|
15
15
|
export {
|
|
16
16
|
DEFAULT_JOB_LOG_RETENTION_MS,
|
|
@@ -21,4 +21,4 @@ export {
|
|
|
21
21
|
recordJobLog,
|
|
22
22
|
runInJobContext
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=job-log-
|
|
24
|
+
//# sourceMappingURL=job-log-N3IGI4NA.js.map
|
package/dist/jobs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { D as DEFAULT_JOB_LOG_RETENTION_MS, L as ListJobLogsOptions, N as NpJobCountOptions, a as NpJobHandler, b as NpJobListOptions, c as NpJobListResult, d as NpJobLogEntry, e as NpJobQueue, f as NpJobState, g as NpJobStateCounts, h as NpJobSummary, i as NpJobsPauseState, j as NpPluginScheduleStats, k as NpReconcileSchedulesResult, l as NpScheduleSummary, m as NpWorkerHealthSummary, n as NpWorkerHeartbeat, P as PAUSE_SYNC_INTERVAL_MS, o as PgBossAdapter, S as SetJobsPauseStateInput, W as WORKER_HEARTBEAT_INTERVAL_MS, p as WORKER_STALE_THRESHOLD_MS, r as countAliveWorkers, s as countJobLogs, t as enqueueJob, u as getAllJobHandlers, v as getCurrentJobId, w as getJobHandler, x as getJobQueue, y as getJobsPauseState, z as getOptionalJobQueue, A as listJobLogs, B as listWorkerHealth, C as markWorkerStopped, E as pruneJobLogsOlderThan, F as purgeStaleWorkers, G as recordHeartbeat, H as recordJobLog, I as registerBuiltinHandlers, J as registerJobHandler, K as runInJobContext, M as setJobQueue, O as setJobsPauseState, Q as startProducer, R as startWorker, T as stopProducer, U as stopWorker } from './index-
|
|
2
|
-
import './types-
|
|
1
|
+
export { D as DEFAULT_JOB_LOG_RETENTION_MS, L as ListJobLogsOptions, N as NpJobCountOptions, a as NpJobHandler, b as NpJobListOptions, c as NpJobListResult, d as NpJobLogEntry, e as NpJobQueue, f as NpJobState, g as NpJobStateCounts, h as NpJobSummary, i as NpJobsPauseState, j as NpPluginScheduleStats, k as NpReconcileSchedulesResult, l as NpScheduleSummary, m as NpWorkerHealthSummary, n as NpWorkerHeartbeat, P as PAUSE_SYNC_INTERVAL_MS, o as PgBossAdapter, S as SetJobsPauseStateInput, W as WORKER_HEARTBEAT_INTERVAL_MS, p as WORKER_STALE_THRESHOLD_MS, r as countAliveWorkers, s as countJobLogs, t as enqueueJob, u as getAllJobHandlers, v as getCurrentJobId, w as getJobHandler, x as getJobQueue, y as getJobsPauseState, z as getOptionalJobQueue, A as listJobLogs, B as listWorkerHealth, C as markWorkerStopped, E as pruneJobLogsOlderThan, F as purgeStaleWorkers, G as recordHeartbeat, H as recordJobLog, I as registerBuiltinHandlers, J as registerJobHandler, K as runInJobContext, M as setJobQueue, O as setJobsPauseState, Q as startProducer, R as startWorker, T as stopProducer, U as stopWorker } from './index-BpW3PGhP.js';
|
|
2
|
+
import './types-C-r01wmU.js';
|
|
3
3
|
import 'pg-boss';
|
|
4
4
|
import './logger-DqGaOU_j.js';
|
package/dist/jobs.js
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
startWorker,
|
|
19
19
|
stopProducer,
|
|
20
20
|
stopWorker
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-L4F5RAQ5.js";
|
|
22
22
|
import {
|
|
23
23
|
DEFAULT_JOB_LOG_RETENTION_MS,
|
|
24
24
|
countJobLogs,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
pruneJobLogsOlderThan,
|
|
28
28
|
recordJobLog,
|
|
29
29
|
runInJobContext
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-QBIJZZ5V.js";
|
|
31
31
|
import "./chunk-LSHHRDVR.js";
|
|
32
32
|
import "./chunk-WV272MPW.js";
|
|
33
33
|
import {
|
|
@@ -37,9 +37,9 @@ import {
|
|
|
37
37
|
setJobQueue
|
|
38
38
|
} from "./chunk-V2UNHGAP.js";
|
|
39
39
|
import "./chunk-OROPGO65.js";
|
|
40
|
-
import "./chunk-
|
|
40
|
+
import "./chunk-NFHS7CFV.js";
|
|
41
41
|
import "./chunk-XANPEOJC.js";
|
|
42
|
-
import "./chunk-
|
|
42
|
+
import "./chunk-X7K5F2UI.js";
|
|
43
43
|
import "./chunk-PZ5AY32C.js";
|
|
44
44
|
export {
|
|
45
45
|
DEFAULT_JOB_LOG_RETENTION_MS,
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getScopedLogger,
|
|
5
5
|
resetLogger,
|
|
6
6
|
setLogger
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NFHS7CFV.js";
|
|
8
8
|
import "./chunk-PZ5AY32C.js";
|
|
9
9
|
export {
|
|
10
10
|
consoleLogger,
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
resetLogger,
|
|
14
14
|
setLogger
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=logger-
|
|
16
|
+
//# sourceMappingURL=logger-2WUTTELV.js.map
|
package/dist/media.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { D as DEFAULT_IMAGE_SIZES, q as DrizzleTransactionLike, b as NpGetMediaUrlOptions, c as NpMediaUploader, d as NpMediaUploaderKindFilter, e as NpMediaVariantName, f as NpProcessedImageResult, r as NpProcessedImageSourceMetadata, g as NpProcessedImageVariant, h as cleanupDeletedMedia, i as deleteMedia, j as extractMediaIds, k as getMediaById, l as getMediaUrl, m as getStorageAdapter, n as listMedia, p as processImage, o as processMediaImage, s as setStorageAdapter, t as syncMediaRefs, u as uploadMedia } from './index-
|
|
2
|
-
import './types-
|
|
1
|
+
export { D as DEFAULT_IMAGE_SIZES, q as DrizzleTransactionLike, b as NpGetMediaUrlOptions, c as NpMediaUploader, d as NpMediaUploaderKindFilter, e as NpMediaVariantName, f as NpProcessedImageResult, r as NpProcessedImageSourceMetadata, g as NpProcessedImageVariant, h as cleanupDeletedMedia, i as deleteMedia, j as extractMediaIds, k as getMediaById, l as getMediaUrl, m as getStorageAdapter, n as listMedia, p as processImage, o as processMediaImage, s as setStorageAdapter, t as syncMediaRefs, u as uploadMedia } from './index-D6Q7DOl7.js';
|
|
2
|
+
import './types-C-r01wmU.js';
|
|
3
3
|
import 'drizzle-orm';
|
|
4
4
|
import 'drizzle-orm/pg-core';
|
|
5
5
|
import 'node:stream/web';
|
package/dist/media.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
extractMediaIds,
|
|
3
3
|
syncMediaRefs
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TETTWT56.js";
|
|
5
5
|
import {
|
|
6
6
|
getMediaUrl
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CHQJG4BB.js";
|
|
8
8
|
import {
|
|
9
9
|
DEFAULT_IMAGE_SIZES,
|
|
10
10
|
cleanupDeletedMedia,
|
|
@@ -16,12 +16,12 @@ import {
|
|
|
16
16
|
processMediaImage,
|
|
17
17
|
setStorageAdapter,
|
|
18
18
|
uploadMedia
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-DWG3RZH2.js";
|
|
20
20
|
import "./chunk-V2UNHGAP.js";
|
|
21
21
|
import "./chunk-OROPGO65.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-NFHS7CFV.js";
|
|
23
23
|
import "./chunk-XANPEOJC.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-X7K5F2UI.js";
|
|
25
25
|
import "./chunk-PZ5AY32C.js";
|
|
26
26
|
export {
|
|
27
27
|
DEFAULT_IMAGE_SIZES,
|
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
extractMentionHandlesFromRichText,
|
|
6
6
|
fanOutMentionNotifications,
|
|
7
7
|
resolveMentionedMembers
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-SBCVAC2Z.js";
|
|
8
|
+
} from "./chunk-HM46WM45.js";
|
|
9
|
+
import "./chunk-U4QCCLAW.js";
|
|
11
10
|
import "./chunk-ZCINJSS4.js";
|
|
11
|
+
import "./chunk-SBCVAC2Z.js";
|
|
12
12
|
import "./chunk-XANPEOJC.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-X7K5F2UI.js";
|
|
14
14
|
import "./chunk-PZ5AY32C.js";
|
|
15
15
|
export {
|
|
16
16
|
MENTION_HANDLE_RE,
|
|
@@ -20,4 +20,4 @@ export {
|
|
|
20
20
|
fanOutMentionNotifications,
|
|
21
21
|
resolveMentionedMembers
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=mentions-
|
|
23
|
+
//# sourceMappingURL=mentions-NCQR4B72.js.map
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
listMutes,
|
|
5
5
|
muteMember,
|
|
6
6
|
unmuteMember
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-SBCVAC2Z.js";
|
|
7
|
+
} from "./chunk-CKT4QZDC.js";
|
|
8
|
+
import "./chunk-U4QCCLAW.js";
|
|
10
9
|
import "./chunk-ZCINJSS4.js";
|
|
10
|
+
import "./chunk-SBCVAC2Z.js";
|
|
11
11
|
import "./chunk-XANPEOJC.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-X7K5F2UI.js";
|
|
13
13
|
import "./chunk-PZ5AY32C.js";
|
|
14
14
|
export {
|
|
15
15
|
getMutedTargetIds,
|
|
@@ -18,4 +18,4 @@ export {
|
|
|
18
18
|
muteMember,
|
|
19
19
|
unmuteMember
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=mutes-
|
|
21
|
+
//# sourceMappingURL=mutes-FJSSU2JP.js.map
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
recordDigestSent,
|
|
6
6
|
registerNotificationKind,
|
|
7
7
|
setMemberNotificationPrefs
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-CAS4Z6IN.js";
|
|
9
9
|
import "./chunk-ZCINJSS4.js";
|
|
10
10
|
import "./chunk-XANPEOJC.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-X7K5F2UI.js";
|
|
12
12
|
import "./chunk-PZ5AY32C.js";
|
|
13
13
|
export {
|
|
14
14
|
getMemberNotificationPrefs,
|
|
@@ -18,4 +18,4 @@ export {
|
|
|
18
18
|
registerNotificationKind,
|
|
19
19
|
setMemberNotificationPrefs
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=notification-prefs-
|
|
21
|
+
//# sourceMappingURL=notification-prefs-H4HFVCL7.js.map
|
package/dist/observability.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
verifyStartupSafety
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-B7DTNT4O.js";
|
|
4
4
|
import {
|
|
5
5
|
getErrorReporter,
|
|
6
6
|
noopErrorReporter,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
getScopedLogger,
|
|
15
15
|
resetLogger,
|
|
16
16
|
setLogger
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-NFHS7CFV.js";
|
|
18
18
|
import "./chunk-PZ5AY32C.js";
|
|
19
19
|
export {
|
|
20
20
|
consoleLogger,
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
listSites,
|
|
11
11
|
resolveSiteForHostname,
|
|
12
12
|
updateSite
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-U4QCCLAW.js";
|
|
14
14
|
import "./chunk-ZCINJSS4.js";
|
|
15
15
|
import "./chunk-XANPEOJC.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-X7K5F2UI.js";
|
|
17
17
|
import "./chunk-PZ5AY32C.js";
|
|
18
18
|
export {
|
|
19
19
|
NP_DEFAULT_SITE_ID,
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
resolveSiteForHostname,
|
|
29
29
|
updateSite
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=registry-
|
|
31
|
+
//# sourceMappingURL=registry-WZVL5HH6.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyReputation
|
|
3
|
+
} from "./chunk-L6VG7IK6.js";
|
|
4
|
+
import "./chunk-NFHS7CFV.js";
|
|
5
|
+
import "./chunk-XANPEOJC.js";
|
|
6
|
+
import "./chunk-X7K5F2UI.js";
|
|
7
|
+
import "./chunk-PZ5AY32C.js";
|
|
8
|
+
export {
|
|
9
|
+
applyReputation
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=reputation-ICIXDGPM.js.map
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
publishScheduledDocuments
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-KSUS4UNN.js";
|
|
4
|
+
import "./chunk-S37WWNBB.js";
|
|
5
5
|
import "./chunk-4ZLMEKFX.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-SBCVAC2Z.js";
|
|
6
|
+
import "./chunk-U4QCCLAW.js";
|
|
8
7
|
import "./chunk-ZCINJSS4.js";
|
|
8
|
+
import "./chunk-SBCVAC2Z.js";
|
|
9
9
|
import "./chunk-WV272MPW.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-DWG3RZH2.js";
|
|
11
11
|
import "./chunk-V2UNHGAP.js";
|
|
12
12
|
import "./chunk-OROPGO65.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-NFHS7CFV.js";
|
|
14
14
|
import "./chunk-XANPEOJC.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-X7K5F2UI.js";
|
|
16
16
|
import "./chunk-PZ5AY32C.js";
|
|
17
17
|
export {
|
|
18
18
|
publishScheduledDocuments
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=scheduled-
|
|
20
|
+
//# sourceMappingURL=scheduled-UC7O2HBQ.js.map
|
package/dist/seo.js
CHANGED
|
@@ -12,19 +12,19 @@ import {
|
|
|
12
12
|
renderSitemapIndexXml,
|
|
13
13
|
renderSitemapXml,
|
|
14
14
|
validateSeoSettingsPatch
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-CTUHJHLH.js";
|
|
16
|
+
import "./chunk-S37WWNBB.js";
|
|
17
17
|
import "./chunk-4ZLMEKFX.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-SBCVAC2Z.js";
|
|
18
|
+
import "./chunk-U4QCCLAW.js";
|
|
20
19
|
import "./chunk-ZCINJSS4.js";
|
|
20
|
+
import "./chunk-SBCVAC2Z.js";
|
|
21
21
|
import "./chunk-WV272MPW.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-DWG3RZH2.js";
|
|
23
23
|
import "./chunk-V2UNHGAP.js";
|
|
24
24
|
import "./chunk-OROPGO65.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-NFHS7CFV.js";
|
|
26
26
|
import "./chunk-XANPEOJC.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-X7K5F2UI.js";
|
|
28
28
|
import "./chunk-PZ5AY32C.js";
|
|
29
29
|
export {
|
|
30
30
|
DEFAULT_SITE_SEO_SETTINGS,
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
getCommunitySettings,
|
|
4
4
|
updateCommunitySettings,
|
|
5
5
|
validateCommunitySettingsPatch
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-74CGJJDY.js";
|
|
7
7
|
import "./chunk-ZCINJSS4.js";
|
|
8
8
|
import "./chunk-XANPEOJC.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-X7K5F2UI.js";
|
|
10
10
|
import "./chunk-PZ5AY32C.js";
|
|
11
11
|
export {
|
|
12
12
|
DEFAULT_COMMUNITY_SETTINGS,
|
|
@@ -14,4 +14,4 @@ export {
|
|
|
14
14
|
updateCommunitySettings,
|
|
15
15
|
validateCommunitySettingsPatch
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=settings-
|
|
17
|
+
//# sourceMappingURL=settings-JODDWMDB.js.map
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
setStrings,
|
|
8
8
|
t,
|
|
9
9
|
tSync
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ELK6AVW5.js";
|
|
11
11
|
import "./chunk-4ZLMEKFX.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-SBCVAC2Z.js";
|
|
12
|
+
import "./chunk-U4QCCLAW.js";
|
|
14
13
|
import "./chunk-ZCINJSS4.js";
|
|
15
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-SBCVAC2Z.js";
|
|
15
|
+
import "./chunk-NFHS7CFV.js";
|
|
16
16
|
import "./chunk-XANPEOJC.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-X7K5F2UI.js";
|
|
18
18
|
import "./chunk-PZ5AY32C.js";
|
|
19
19
|
export {
|
|
20
20
|
addStrings,
|
|
@@ -26,4 +26,4 @@ export {
|
|
|
26
26
|
t,
|
|
27
27
|
tSync
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=strings-
|
|
29
|
+
//# sourceMappingURL=strings-4EWJYDOG.js.map
|
|
@@ -500,17 +500,22 @@ interface NpThemeManifest {
|
|
|
500
500
|
* (e.g. magazine theme reads `posts.featured`) declare them
|
|
501
501
|
* here. Two consumers read this:
|
|
502
502
|
*
|
|
503
|
-
* 1.
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
508
|
-
*
|
|
509
|
-
*
|
|
510
|
-
* `
|
|
511
|
-
*
|
|
512
|
-
*
|
|
513
|
-
*
|
|
503
|
+
* 1. `defineConfig` calls `mergeThemeRequirements` to UNION
|
|
504
|
+
* declared fields into the operator's `collections` array
|
|
505
|
+
* at config-resolution time. Operator-authored fields with
|
|
506
|
+
* the same name always win, so the merge is non-
|
|
507
|
+
* destructive. The framework's codegen then picks up the
|
|
508
|
+
* union shape; the operator's next `pnpm db:generate &&
|
|
509
|
+
* pnpm db:migrate` materialises the columns. Operators
|
|
510
|
+
* add a theme via `pnpm nexpress theme add <pkg>` — there
|
|
511
|
+
* is no longer a `theme:install` AST-patcher that touches
|
|
512
|
+
* `src/collections/*.ts` (that flow was retired alongside
|
|
513
|
+
* the auto-merge).
|
|
514
|
+
* 2. Admin theme switcher: compares against the resolved
|
|
515
|
+
* collections at activation time and surfaces residual
|
|
516
|
+
* mismatches — chiefly TYPE conflicts where the operator
|
|
517
|
+
* declared a field with the same name but a different
|
|
518
|
+
* `type` and the merge respected the operator's choice.
|
|
514
519
|
*/
|
|
515
520
|
requires?: {
|
|
516
521
|
collections?: Record<string, NpThemeCollectionRequirement>;
|
|
@@ -605,14 +610,18 @@ interface NpThemeManifest {
|
|
|
605
610
|
}
|
|
606
611
|
/**
|
|
607
612
|
* One collection's worth of theme requirements. The collection
|
|
608
|
-
* may exist (
|
|
609
|
-
*
|
|
613
|
+
* may exist (the framework's auto-merge appends fields to the
|
|
614
|
+
* existing array) or not (the merge skips it unless
|
|
615
|
+
* `createIfAbsent` is set, in which case a minimal collection is
|
|
616
|
+
* synthesised on the resolved config).
|
|
610
617
|
*/
|
|
611
618
|
interface NpThemeCollectionRequirement {
|
|
612
619
|
fields?: Record<string, NpThemeFieldRequirement>;
|
|
613
|
-
/** True →
|
|
614
|
-
*
|
|
615
|
-
*
|
|
620
|
+
/** True → the framework's `mergeThemeRequirements` step in
|
|
621
|
+
* `defineConfig` synthesises a minimal collection (slug +
|
|
622
|
+
* labels + the declared fields) when no collection with this
|
|
623
|
+
* slug is registered. Operator-authored collections of the
|
|
624
|
+
* same slug always take precedence. */
|
|
616
625
|
createIfAbsent?: boolean;
|
|
617
626
|
}
|
|
618
627
|
/**
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/db/schema/system.ts","../src/db/schema/media.ts","../src/db/schema/community.ts"],"sourcesContent":["import {\n type AnyPgColumn,\n boolean,\n index,\n integer,\n jsonb,\n pgEnum,\n pgTable,\n primaryKey,\n text,\n timestamp,\n unique,\n uuid,\n} from \"drizzle-orm/pg-core\";\n\nimport { npMedia } from \"./media.js\";\nimport {\n type NpBlockInstance,\n type NpNavItem,\n type NpRichTextContent,\n} from \"../../config/types.js\";\n\nexport const npUserRoleEnum = pgEnum(\"np_user_role\", [\n \"admin\",\n \"editor\",\n // 9.5: community moderator. Sits OUTSIDE the linear content-edit\n // hierarchy — a moderator handles community moderation (hide\n // comments, resolve reports, issue bans) but cannot author or edit\n // collection content. ROLE_HIERARCHY in config/types.ts intentionally\n // does not list this role; community-moderation paths check the role\n // explicitly via `principalCan()`.\n \"moderator\",\n \"author\",\n \"viewer\",\n]);\n\nexport const npRevisionStatusEnum = pgEnum(\"np_revision_status\", [\n \"draft\",\n \"published\",\n \"autosave\",\n]);\n\ntype NpRevisionSnapshot = Record<string, unknown> & {\n blocks?: NpBlockInstance[];\n content?: NpRichTextContent;\n};\n\nexport const npPasswordResetPurposeEnum = pgEnum(\"np_password_reset_purpose\", [\"invite\", \"reset\"]);\n\nexport const npUsers = pgTable(\"np_users\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n email: text(\"email\").notNull().unique(),\n password: text(\"password\").notNull(),\n name: text(\"name\").notNull(),\n role: npUserRoleEnum(\"role\").notNull(),\n /**\n * Phase 15.5 — super-admin flag. Bypasses per-site membership\n * checks; the super-admin can manage every site including\n * creating / deleting tenants. The flag is independent of\n * the per-site `role` enum (a super-admin still needs a\n * `role` field for non-multi-site contexts; multi-site\n * permissions check `is_super_admin OR site_membership`).\n */\n isSuperAdmin: boolean(\"is_super_admin\").default(false).notNull(),\n avatar: uuid(\"avatar\").references((): AnyPgColumn => npMedia.id),\n loginAttempts: integer(\"login_attempts\").default(0).notNull(),\n lockUntil: timestamp(\"lock_until\", { withTimezone: true, mode: \"date\" }),\n tokenVersion: integer(\"token_version\").default(0).notNull(),\n passwordResetTokenHash: text(\"password_reset_token_hash\"),\n passwordResetExpiresAt: timestamp(\"password_reset_expires_at\", {\n withTimezone: true,\n mode: \"date\",\n }),\n passwordResetPurpose: npPasswordResetPurposeEnum(\"password_reset_purpose\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n});\n\n/**\n * Phase 15.5 — per-site role grants. A user can hold a\n * different role on each site they're a member of (admin on\n * `acme`, editor on `partner-blog`, no role on `internal`).\n * Composite PK on (site_id, user_id) so each pair is unique;\n * the role enum reuses the existing `np_user_role` so the\n * concept stays consistent across the framework.\n *\n * `npUsers.role` becomes the \"global default role\" — used in\n * single-tenant contexts and as the fallback when a user has\n * no explicit membership on the current site. Most operators\n * will give cross-site users an explicit membership per\n * site they should access; the `is_super_admin` flag\n * separately bypasses the membership check entirely.\n */\nexport const npSiteMemberships = pgTable(\n \"np_site_memberships\",\n {\n siteId: text(\"site_id\").notNull(),\n userId: uuid(\"user_id\")\n .notNull()\n .references((): AnyPgColumn => npUsers.id, { onDelete: \"cascade\" }),\n role: npUserRoleEnum(\"role\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [primaryKey({ columns: [table.siteId, table.userId] })],\n);\n\n/**\n * Per-user OAuth identity links. A user can have one identity per provider\n * (composite unique on `(provider, providerUserId)` AND on `(userId,\n * provider)`). The first identity is created either when the OAuth\n * callback finds an existing user with the same email, or when a brand-\n * new user is auto-created from the OAuth profile (default role\n * `viewer`).\n */\nexport const npUserOAuthIdentities = pgTable(\n \"np_user_oauth_identities\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => npUsers.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n providerUserId: text(\"provider_user_id\").notNull(),\n /** Free-form per-provider metadata (avatar URL, scopes granted, etc.). */\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>().default({}).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => ({\n providerSubjectUnique: unique(\"np_user_oauth_identities_provider_subject_unique\").on(\n table.provider,\n table.providerUserId,\n ),\n userProviderUnique: unique(\"np_user_oauth_identities_user_provider_unique\").on(\n table.userId,\n table.provider,\n ),\n userIdx: index(\"np_user_oauth_identities_user_idx\").on(table.userId),\n }),\n);\n\nexport const npSessions = pgTable(\"np_sessions\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => npUsers.id, { onDelete: \"cascade\" }),\n tokenHash: text(\"token_hash\").notNull(),\n userAgent: text(\"user_agent\"),\n ip: text(\"ip\"),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: \"date\" }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n});\n\nexport const npRevisions = pgTable(\n \"np_revisions\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n collection: text(\"collection\").notNull(),\n documentId: text(\"document_id\").notNull(),\n version: integer(\"version\").notNull(),\n status: npRevisionStatusEnum(\"status\").notNull(),\n snapshot: jsonb(\"snapshot\").$type<NpRevisionSnapshot>().notNull(),\n changedFields: text(\"changed_fields\").array().notNull(),\n authorId: uuid(\"author_id\").references(() => npUsers.id),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => ({\n documentVersionUnique: unique(\"np_revisions_document_id_version_unique\").on(\n table.documentId,\n table.version,\n ),\n collectionIdx: index(\"np_revisions_collection_idx\").on(table.collection),\n documentIdIdx: index(\"np_revisions_document_id_idx\").on(table.documentId),\n }),\n);\n\n/**\n * Phase 15.4 — settings are scoped per site so each tenant\n * has its own active theme, theme tokens, SEO config, etc.\n * Single-tenant deployments leave every row at\n * `site_id = 'default'`, matching the framework's\n * default-site invariant. Composite PK on (site_id, key) so\n * the same key (e.g. `activeTheme`) can take different\n * values per tenant.\n */\nexport const npSettings = pgTable(\n \"np_settings\",\n {\n siteId: text(\"site_id\").default(\"default\").notNull(),\n key: text(\"key\").notNull(),\n value: jsonb(\"value\").$type<unknown>().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedBy: uuid(\"updated_by\").references(() => npUsers.id),\n },\n (table) => [primaryKey({ columns: [table.siteId, table.key] })],\n);\n\n/**\n * Slug history for collections that declare `slugField`. Every\n * slug change writes a row mapping the previous slug to the\n * current one; the public-site catch-all reads it on 404 and\n * 301-redirects so old URLs (search-engine indices, external\n * links, bookmarks) keep working after a rename.\n *\n * Indexed by `(site_id, collection, old_slug)` because the read\n * path is \"I just got a 404 for this slug, where did it go?\" —\n * point lookups on that triple. Multiple rows can share the same\n * `(site_id, collection, document_id)` over time as a doc gets\n * renamed repeatedly; the catch-all walks the chain `oldSlug →\n * newSlug` to resolve to the current target.\n */\nexport const npSlugHistory = pgTable(\n \"np_slug_history\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n siteId: text(\"site_id\").default(\"default\").notNull(),\n collection: text(\"collection\").notNull(),\n documentId: text(\"document_id\").notNull(),\n oldSlug: text(\"old_slug\").notNull(),\n newSlug: text(\"new_slug\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index(\"np_slug_history_lookup_idx\").on(table.siteId, table.collection, table.oldSlug),\n index(\"np_slug_history_doc_idx\").on(table.siteId, table.collection, table.documentId),\n ],\n);\n\n/**\n * Phase 15.4 — navigation is scoped per site too. Same model\n * as settings: composite uniqueness on (site_id, location)\n * lets each tenant own its own header / footer menus.\n */\nexport const npNavigation = pgTable(\n \"np_navigation\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n siteId: text(\"site_id\").default(\"default\").notNull(),\n location: text(\"location\").notNull(),\n items: jsonb(\"items\").$type<NpNavItem[]>().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedBy: uuid(\"updated_by\").references(() => npUsers.id),\n },\n (table) => [unique(\"np_navigation_site_location_idx\").on(table.siteId, table.location)],\n);\n\n/**\n * Phase D — UI string admin overrides. Plugins and themes\n * register translation bundles via `addStrings()` (Phase 12.5);\n * admins layer overrides on top via this table without\n * touching plugin/theme code. Composite PK on\n * (site_id, locale, key) makes per-tenant overrides natural —\n * \"acme\" and \"default\" can each override the same plugin's\n * \"Read more\" string differently.\n *\n * `value` is nullable so an admin can explicitly mark a key\n * as \"fall back to bundle\" without deleting the row (useful\n * for audit-trail UIs that want to show \"this WAS overridden\n * but the operator reverted it\"). The runtime treats null\n * the same as no row for resolution purposes.\n */\nexport const npStringOverrides = pgTable(\n \"np_string_overrides\",\n {\n siteId: text(\"site_id\").default(\"default\").notNull(),\n locale: text(\"locale\").notNull(),\n key: text(\"key\").notNull(),\n value: text(\"value\"),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedBy: uuid(\"updated_by\").references(() => npUsers.id),\n },\n (table) => [primaryKey({ columns: [table.siteId, table.locale, table.key] })],\n);\n\n/**\n * Phase 15.1 — multi-site model. One row per tenant. The\n * framework auto-creates a `default` site at boot when the\n * table is empty so single-tenant installs keep working\n * without operator intervention. Subsequent sites are added\n * via the super-admin UI (15.3) — the framework treats\n * additional sites as additive: they share users, plugins,\n * and theme code at install time, but each site has its own\n * collection content, navigation, and settings.\n *\n * `hostname` is nullable so the default site can match\n * \"anything that doesn't have an explicit host route\". When\n * a request's `Host` header matches a non-default site's\n * hostname, that site wins; otherwise the default site is\n * used. Multi-domain sites (apex + www) need separate rows\n * pointing at the same `id` — that's a 15.x follow-up;\n * v15.1 is one-hostname-per-site.\n */\nexport const npSites = pgTable(\n \"np_sites\",\n {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n hostname: text(\"hostname\"),\n description: text(\"description\"),\n settings: jsonb(\"settings\").$type<Record<string, unknown>>().default({}).notNull(),\n isDefault: boolean(\"is_default\").default(false).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [unique(\"np_sites_hostname_idx\").on(table.hostname)],\n);\n\n/**\n * G.1 — lean meta row. Plugin config moved to `np_settings` rows\n * keyed by `plugin.config:<id>` (see decision E in\n * `docs/design/plugin-config-auto-form.md`); the legacy `config`\n * jsonb column was dropped. Reads / writes go through\n * `getPluginConfig` / `setPluginConfig` in the config module.\n */\nexport const npPlugins = pgTable(\"np_plugins\", {\n id: text(\"id\").primaryKey(),\n enabled: boolean(\"enabled\").default(true).notNull(),\n installedAt: timestamp(\"installed_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n});\n\n/**\n * Phase 17 — plugin K/V storage with multi-tenant scope.\n *\n * The PK is `(plugin_id, site_id, key)`; `site_id` defaults to\n * `_global_` so single-site deploys (and pre-Phase-17 callers\n * that don't pass a site) keep their non-tenant behavior.\n * Plugin context auto-scopes reads/writes to the current site,\n * so plugin authors don't have to think about it — every plugin\n * operating inside a request automatically gets a per-site\n * keyspace, while background workers / scripts (no resolved\n * site) share the `_global_` space.\n */\nexport const NP_GLOBAL_PLUGIN_SITE_ID = \"_global_\";\n\nexport const npPluginStorage = pgTable(\n \"np_plugin_storage\",\n {\n pluginId: text(\"plugin_id\").notNull(),\n siteId: text(\"site_id\").default(NP_GLOBAL_PLUGIN_SITE_ID).notNull(),\n key: text(\"key\").notNull(),\n value: jsonb(\"value\").$type<unknown>().notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: \"date\" }),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.pluginId, table.siteId, table.key] }),\n pluginIdx: index(\"np_plugin_storage_plugin_id_idx\").on(table.pluginId),\n siteIdx: index(\"np_plugin_storage_site_idx\").on(table.siteId),\n }),\n);\n\n/**\n * Phase 19 — worker liveness heartbeat. Each worker process\n * upserts a row keyed on its self-generated id (hostname + pid)\n * every `WORKER_HEARTBEAT_INTERVAL_MS` (30s). Admin reads this\n * to tell whether the queue actually has a process draining\n * jobs — without it the only signal was \"Pending stays high\n * while Completed doesn't grow,\" which a stuck DB or a stopped\n * worker look identical from outside.\n *\n * Stale rows (no heartbeat for > 90s) are reported as\n * `unhealthy`; they survive in the table for forensic review\n * until an operator GCs them or a fresh worker reuses the id.\n */\nexport const npWorkerHeartbeats = pgTable(\"np_worker_heartbeats\", {\n id: text(\"id\").primaryKey(),\n status: text(\"status\").default(\"running\").notNull(),\n startedAt: timestamp(\"started_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n lastSeenAt: timestamp(\"last_seen_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n /** Free-form metadata (worker version, hostname, env). */\n meta: jsonb(\"meta\").$type<Record<string, unknown>>().default({}).notNull(),\n});\n\n/**\n * Phase 20.3 — per-job log capture. Each row is one structured\n * log entry recorded during a handler invocation. The framework\n * wraps every `boss.work()` callback in an AsyncLocalStorage\n * context so handlers calling `recordJobLog()` (or going through\n * the framework `getLogger()`) get their entries automatically\n * stamped with the running job's id.\n *\n * The `job_id` column is `text` (not `uuid`) because pg-boss job\n * ids are returned as strings and we want the relationship to\n * mirror what's surfaced to the admin without translation.\n *\n * Indexes target the two queries the admin will run:\n * - \"logs for this job\" → (job_id, created_at)\n * - \"prune logs older than X\" → (created_at)\n */\nexport const npJobLogs = pgTable(\n \"np_job_logs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n jobId: text(\"job_id\").notNull(),\n level: text(\"level\").notNull(),\n message: text(\"message\").notNull(),\n context: jsonb(\"context\").$type<Record<string, unknown> | null>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_job_logs_job_idx\").on(table.jobId, table.createdAt),\n index(\"np_job_logs_created_idx\").on(table.createdAt),\n ],\n);\n","import {\n type AnyPgColumn,\n bigint,\n index,\n integer,\n jsonb,\n pgEnum,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\n\nimport { npMembers } from \"./community.js\";\nimport { npUsers } from \"./system.js\";\nimport { type NpRichTextContent } from \"../../config/types.js\";\n\nexport const npMediaStatusEnum = pgEnum(\"np_media_status\", [\n \"processing\",\n \"ready\",\n \"error\",\n]);\n\ntype NpMediaFocalPoint = {\n x: number;\n y: number;\n};\n\ntype NpMediaSizes = Record<string, Record<string, unknown>>;\n\nexport const npMediaFolders = pgTable(\"np_media_folders\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n name: text(\"name\").notNull(),\n parentId: uuid(\"parent_id\").references((): AnyPgColumn => npMediaFolders.id),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n});\n\nexport const npMedia = pgTable(\n \"np_media\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n filename: text(\"filename\").notNull(),\n originalFilename: text(\"original_filename\").notNull(),\n mimeType: text(\"mime_type\").notNull(),\n filesize: bigint(\"filesize\", { mode: \"number\" }).notNull(),\n width: integer(\"width\"),\n height: integer(\"height\"),\n alt: text(\"alt\"),\n caption: jsonb(\"caption\").$type<NpRichTextContent>(),\n focalPoint: jsonb(\"focal_point\").$type<NpMediaFocalPoint>(),\n sizes: jsonb(\"sizes\").$type<NpMediaSizes>(),\n storageKey: text(\"storage_key\").notNull(),\n hash: text(\"hash\").notNull(),\n status: npMediaStatusEnum(\"status\").notNull(),\n folderId: uuid(\"folder_id\").references(() => npMediaFolders.id),\n uploadedBy: uuid(\"uploaded_by\").references((): AnyPgColumn => npUsers.id),\n /**\n * Set when a member uploaded the row instead of a staff user\n * (Phase 9.7j). Mutually exclusive with `uploadedBy`: a row\n * has exactly one uploader. Member-side moderation tools key\n * off this column to filter \"uploads I should review.\"\n * `ON DELETE SET NULL` so a member account deletion doesn't\n * cascade-delete their uploads — staff still need them for\n * the audit trail (just like `member_author_id` on\n * collection tables).\n */\n uploadedByMemberId: uuid(\"uploaded_by_member_id\").references(\n (): AnyPgColumn => npMembers.id,\n { onDelete: \"set null\" },\n ),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true, mode: \"date\" }),\n },\n (table) => ({\n hashIdx: index(\"np_media_hash_idx\").on(table.hash),\n statusIdx: index(\"np_media_status_idx\").on(table.status),\n uploadedByMemberIdx: index(\"np_media_uploaded_by_member_idx\").on(\n table.uploadedByMemberId,\n ),\n }),\n);\n\nexport const npMediaRefs = pgTable(\n \"np_media_refs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n mediaId: uuid(\"media_id\")\n .notNull()\n .references(() => npMedia.id, { onDelete: \"cascade\" }),\n collection: text(\"collection\").notNull(),\n documentId: text(\"document_id\").notNull(),\n field: text(\"field\").notNull(),\n },\n (table) => ({\n mediaIdIdx: index(\"np_media_refs_media_id_idx\").on(table.mediaId),\n documentIdIdx: index(\"np_media_refs_document_id_idx\").on(table.documentId),\n }),\n);\n","import {\n type AnyPgColumn,\n boolean,\n index,\n integer,\n jsonb,\n pgEnum,\n pgTable,\n primaryKey,\n text,\n timestamp,\n unique,\n uuid,\n} from \"drizzle-orm/pg-core\";\n\nimport { npMedia } from \"./media.js\";\nimport { npUsers } from \"./system.js\";\n\n/**\n * Member-side schema: public site visitors who can register, log in,\n * comment, react, follow, etc. Deliberately separate from `np_users`\n * (CMS staff) — separate cookie family, separate JWT audience, no\n * `role` column on the member table itself. Scoped moderator authority\n * is granted via `np_member_roles` instead. See `docs/design/community-design.md` (frozen design rationale) or `docs/community.md` (live behavior).\n */\n\n/**\n * Phase 21.7 — `imported` is a member created by the WordPress\n * importer to attribute archived guest comments. Imported members\n * cannot log in (no usable password set) and don't fire community\n * notifications when content tags them. Default themes render the\n * member's handle with an `(imported)` suffix so visitors can tell\n * archived discussion apart from live activity.\n */\nexport const npMemberStatusEnum = pgEnum(\"np_member_status\", [\n \"active\",\n \"pending\",\n \"suspended\",\n \"deleted\",\n \"imported\",\n]);\n\nexport const npBanScopeEnum = pgEnum(\"np_ban_scope\", [\"site\", \"category\", \"collection\"]);\nexport const npBanKindEnum = pgEnum(\"np_ban_kind\", [\"temporary\", \"permanent\"]);\n\n/**\n * Comment lifecycle status.\n * - `visible` — public.\n * - `pending` — awaiting moderation. Used by the spam / profanity\n * adapters when a verdict comes back as `flag` (9.7n).\n * - `hidden` — taken down by a mod; row stays for restore + audit.\n * - `deleted` — soft-delete by the author or post-cascade.\n */\nexport const npCommentStatusEnum = pgEnum(\"np_comment_status\", [\n \"visible\",\n \"pending\",\n \"hidden\",\n \"deleted\",\n]);\n\n/**\n * Type column for `np_member_roles.scope_type`. Polymorphic across the\n * community surface so the same grants table covers site-wide,\n * per-category, per-collection, and per-thread roles.\n */\nexport const npMemberRoleScopeEnum = pgEnum(\"np_member_role_scope\", [\n \"site\",\n \"category\",\n \"collection\",\n \"thread\",\n]);\n\nexport const npMembers = pgTable(\n \"np_members\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n handle: text(\"handle\").notNull().unique(),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"email_verified\").default(false).notNull(),\n /** Argon2 hash. Nullable so SSO-only members can exist without a password. */\n password: text(\"password\"),\n displayName: text(\"display_name\").notNull(),\n avatar: uuid(\"avatar\").references((): AnyPgColumn => npMedia.id),\n bio: text(\"bio\"),\n status: npMemberStatusEnum(\"status\").default(\"pending\").notNull(),\n reputation: integer(\"reputation\").default(0).notNull(),\n loginAttempts: integer(\"login_attempts\").default(0).notNull(),\n lockUntil: timestamp(\"lock_until\", { withTimezone: true, mode: \"date\" }),\n /** Bumped to invalidate every issued JWT (logout-everywhere, password reset). */\n tokenVersion: integer(\"token_version\").default(0).notNull(),\n passwordResetTokenHash: text(\"password_reset_token_hash\"),\n passwordResetExpiresAt: timestamp(\"password_reset_expires_at\", {\n withTimezone: true,\n mode: \"date\",\n }),\n emailVerifyTokenHash: text(\"email_verify_token_hash\"),\n emailVerifyExpiresAt: timestamp(\"email_verify_expires_at\", {\n withTimezone: true,\n mode: \"date\",\n }),\n /** Plugin-extensible bag — preferences, custom profile fields, etc. */\n meta: jsonb(\"meta\").$type<Record<string, unknown>>().default({}).notNull(),\n /**\n * Phase 16.3 — per-member notification preferences. Shape:\n * { disabled?: string[] } — kinds the member opted out of\n * { digest?: \"off\"|\"daily\"|\"weekly\" } — email digest cadence (16.4)\n * Empty default = every kind enabled, no email digest.\n */\n notificationPrefs: jsonb(\"notification_prefs\")\n .$type<Record<string, unknown>>()\n .default({})\n .notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [index(\"np_members_status_idx\").on(table.status)],\n);\n\nexport const npMemberSessions = pgTable(\"np_member_sessions\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n tokenHash: text(\"token_hash\").notNull(),\n userAgent: text(\"user_agent\"),\n ip: text(\"ip\"),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: \"date\" }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n});\n\n/**\n * Per-member OAuth identity links. Mirrors `np_user_oauth_identities`\n * for the staff side (Phase 9.6a) but resolves to `np_members`\n * instead of `np_users`. The first row is created either when an\n * OAuth callback finds an existing member with the same email, or\n * when a brand-new member is auto-provisioned from the profile\n * (status=`active`, no password).\n *\n * `subject` is the provider's stable user id (GitHub `id`, Google\n * `sub`, etc.) — naming kept from the 9.1 placeholder schema for\n * backward compat. The staff equivalent calls the same column\n * `provider_user_id`; both serve the same role.\n */\nexport const npMemberIdentities = pgTable(\n \"np_member_identities\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n subject: text(\"subject\").notNull(),\n email: text(\"email\"),\n /** Free-form per-provider metadata (avatar URL, scopes granted, etc.). */\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>().default({}).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n unique(\"np_member_identities_provider_subject_uq\").on(table.provider, table.subject),\n unique(\"np_member_identities_member_provider_uq\").on(table.memberId, table.provider),\n index(\"np_member_identities_member_idx\").on(table.memberId),\n ],\n);\n\n/**\n * Polymorphic role grants. A member with a row here can act as that\n * role within the indicated scope. `scope_id` is null when\n * `scope_type='site'`. The `(member, role, scope_type, scope_id)`\n * uniqueness keeps grants idempotent; `expires_at` is honored by\n * `memberCan()` so time-boxed promotions are possible.\n */\nexport const npMemberRoles = pgTable(\n \"np_member_roles\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n role: text(\"role\").notNull(),\n scopeType: npMemberRoleScopeEnum(\"scope_type\").notNull(),\n /** Nullable for `scope_type='site'`. Otherwise an opaque string id. */\n scopeId: text(\"scope_id\"),\n /**\n * Phase 18 — the tenant the grant applies on. For\n * `scope_type='site'` this column IS the site identifier\n * (`scope_id` stays null because site is the root scope).\n * For category / collection / thread grants, `site_id` says\n * which tenant's category/collection/thread this row\n * targets — the same slug exists on every site.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n grantedBy: uuid(\"granted_by\").references(() => npUsers.id),\n grantedAt: timestamp(\"granted_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: \"date\" }),\n },\n (table) => [\n // Two indexes mirror the two access patterns: \"what can this member\n // do?\" (memberId scan) and \"who mods this scope?\" (scope scan).\n index(\"np_member_roles_member_idx\").on(table.memberId),\n index(\"np_member_roles_scope_idx\").on(table.scopeType, table.scopeId),\n index(\"np_member_roles_site_idx\").on(table.siteId, table.memberId),\n // `scope_id` is null for site-wide grants. NULLS NOT\n // DISTINCT makes two null `scope_id`s collide so the\n // unique constraint enforces \"one grant per (member, role,\n // scope, site).\" `site_id` widens the key so the same\n // member can hold the same role on different tenants.\n unique(\"np_member_roles_grant_uq\")\n .on(table.memberId, table.role, table.scopeType, table.scopeId, table.siteId)\n .nullsNotDistinct(),\n ],\n);\n\n/**\n * Member bans. Scoped: a category-mod can ban a member from their\n * category only; a `community-mod` or staff `moderator` can issue\n * site-wide bans. `memberCan()` short-circuits to deny when an active\n * (unexpired) ban matches the action's target scope chain.\n *\n * `byUserId` records the staff issuer; `byMemberId` records when a\n * member-mod (e.g. category-mod) issued the ban. Exactly one is set.\n */\n/**\n * Polymorphic comment table — `target_type` is the collection slug\n * (e.g. `\"posts\"`), `target_id` the document id within that\n * collection. One row per comment regardless of which collection it\n * lives under, indexed for the typical \"list comments under doc X\"\n * read.\n *\n * Bodies are stored twice: `body_md` is the canonical user input,\n * `body_html` is the rendered + sanitised HTML the renderer ships\n * to browsers. We re-render on edit; we never trust the html column\n * to be HTML-safe based on incoming requests — see\n * `community/markdown.ts` for the renderer.\n */\nexport const npComments = pgTable(\n \"np_comments\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n targetType: text(\"target_type\").notNull(),\n targetId: uuid(\"target_id\").notNull(),\n parentId: uuid(\"parent_id\").references((): AnyPgColumn => npComments.id, {\n onDelete: \"cascade\",\n }),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n bodyMd: text(\"body_md\").notNull(),\n bodyHtml: text(\"body_html\").notNull(),\n status: npCommentStatusEnum(\"status\").default(\"visible\").notNull(),\n hiddenByUserId: uuid(\"hidden_by_user_id\").references(() => npUsers.id),\n hiddenByMemberId: uuid(\"hidden_by_member_id\").references((): AnyPgColumn => npMembers.id),\n hiddenReason: text(\"hidden_reason\"),\n editedAt: timestamp(\"edited_at\", { withTimezone: true, mode: \"date\" }),\n /**\n * Phase 18 — site this comment belongs to. Filled at insert\n * time from the target document's site (canonical) so a\n * forged request resolver can't smuggle a comment into the\n * wrong site. Defaults to `'default'` for legacy single-\n * tenant rows so the migration backfill is a no-op.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_comments_target_idx\").on(table.targetType, table.targetId, table.createdAt),\n index(\"np_comments_member_idx\").on(table.memberId, table.createdAt),\n index(\"np_comments_site_idx\").on(table.siteId, table.createdAt),\n ],\n);\n\n/**\n * Polymorphic reactions. `target_type` is the surface — only\n * `'comment'` is wired today; `'thread'` / `'reply'` are reserved\n * for a future threads schema (the forum plugin shipped without\n * one, reusing `np_comments` under the `discussions` collection).\n * `kind` is configurable per site — default vocabulary in v1 is\n * just `'like'`. The unique constraint enforces \"one reaction-of-\n * kind per member per target,\" so toggling a like is an upsert /\n * delete.\n */\nexport const npReactions = pgTable(\n \"np_reactions\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n targetType: text(\"target_type\").notNull(),\n targetId: uuid(\"target_id\").notNull(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n kind: text(\"kind\").notNull(),\n /** Phase 18 — site this reaction belongs to (derived from target). */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_reactions_target_idx\").on(table.targetType, table.targetId),\n index(\"np_reactions_site_idx\").on(table.siteId),\n unique(\"np_reactions_unique\").on(table.targetType, table.targetId, table.memberId, table.kind),\n ],\n);\n\n/**\n * Follow graph. Polymorphic over what's being followed:\n * - `member` — target_id is `np_members.id` as a string\n * - `thread` — reserved; no thread schema today (forum plugin\n * reuses `np_comments` so there's nothing to follow per-thread)\n * - `tag` — target_id is the tag slug (no FK; tags are strings)\n *\n * `target_id` is `text` rather than `uuid` so all three kinds share\n * one column. Cascading on a polymorphic id isn't possible in plain\n * SQL; the soft-delete pattern on `np_members` keeps follows pointing\n * at a still-valid (if anonymised) row.\n */\nexport const npFollows = pgTable(\n \"np_follows\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n followerId: uuid(\"follower_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n targetType: text(\"target_type\").notNull(),\n targetId: text(\"target_id\").notNull(),\n /**\n * Phase 18 — site the follow happened on. The same global\n * member can follow on multiple sites and each row scopes\n * to where the click happened (so site-scoped notifications\n * + activity feeds don't leak cross-tenant). The unique\n * key is widened to include site_id so the same follower\n * can have parallel follow rows under different tenants.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_follows_target_idx\").on(table.targetType, table.targetId),\n index(\"np_follows_site_idx\").on(table.siteId),\n unique(\"np_follows_unique\").on(\n table.followerId,\n table.targetType,\n table.targetId,\n table.siteId,\n ),\n ],\n);\n\n/**\n * Phase 16.1 — member-to-member mute. One-directional: A muting\n * B means A doesn't see B's comments and doesn't get\n * notifications about B's actions (replies, reactions, follows\n * targeted at A's content). B isn't told and can keep posting\n * normally — Twitter-style soft-block.\n *\n * Self-mute is rejected at the API layer. The composite PK on\n * `(memberId, targetId)` enforces idempotence: muting the same\n * person twice is a no-op rather than two rows.\n *\n * Distinct from `np_bans` — bans are staff-issued and global\n * (block writes). Mutes are member-issued and personal (hide\n * reads).\n */\nexport const npMemberMutes = pgTable(\n \"np_member_mutes\",\n {\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n targetId: uuid(\"target_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n /**\n * Phase 18 — site the mute applies to. A muter can choose\n * to silence someone on one tenant without affecting their\n * other tenants. PK is widened to include site_id so the\n * same `(member, target)` pair can hold parallel rows per\n * site.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n primaryKey({ columns: [table.memberId, table.targetId, table.siteId] }),\n index(\"np_member_mutes_target_idx\").on(table.targetId),\n ],\n);\n\n/**\n * Per-member notification inbox. `kind` is a free-form discriminator\n * (e.g. `'comment.reply'`, `'reaction.received'`, `'follow.received'`)\n * paired with a `payload` whose shape depends on the kind — the\n * recipient's UI renders based on those.\n *\n * Indexed on `(member_id, read_at, created_at)` to cover both the\n * unread-count probe and the recent-list paging that an inbox UI uses.\n */\nexport const npNotifications = pgTable(\n \"np_notifications\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n kind: text(\"kind\").notNull(),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().default({}).notNull(),\n readAt: timestamp(\"read_at\", { withTimezone: true, mode: \"date\" }),\n /**\n * Phase 18 — site this notification belongs to. A member\n * who's active on multiple tenants gets one inbox per site\n * (the inbox API filters by current site) so cross-tenant\n * activity doesn't bleed into the wrong site's UI.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_notifications_inbox_idx\").on(table.memberId, table.readAt, table.createdAt),\n index(\"np_notifications_site_inbox_idx\").on(table.siteId, table.memberId, table.readAt),\n ],\n);\n\n/**\n * Member-filed reports against community content. `target_type` is\n * `'comment' | 'thread' | 'reply' | 'member'` — anything a member can\n * report. `resolved_at` flags closed cases; the unresolved index\n * powers the moderation queue's \"unread first\" view.\n *\n * `resolved_by_user_id` and `resolved_by_member_id` are mutually\n * exclusive — staff resolutions populate the user, member-mod\n * resolutions populate the member.\n */\nexport const npReports = pgTable(\n \"np_reports\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n reporterId: uuid(\"reporter_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n targetType: text(\"target_type\").notNull(),\n targetId: text(\"target_id\").notNull(),\n reason: text(\"reason\").notNull(),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true, mode: \"date\" }),\n resolvedByUserId: uuid(\"resolved_by_user_id\").references(() => npUsers.id),\n resolvedByMemberId: uuid(\"resolved_by_member_id\").references((): AnyPgColumn => npMembers.id),\n resolution: text(\"resolution\"),\n /**\n * Phase 18 — site this report belongs to. The mod queue\n * is per-site so a category-mod on tenant A doesn't see\n * tenant B's reports.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_reports_queue_idx\").on(table.resolvedAt, table.createdAt),\n index(\"np_reports_target_idx\").on(table.targetType, table.targetId),\n index(\"np_reports_site_queue_idx\").on(table.siteId, table.resolvedAt),\n ],\n);\n\n/**\n * Append-only moderation audit log. Every hide / restore / ban / role\n * grant write should append a row so an admin can answer \"who took\n * this action and when?\" without diffing logs.\n *\n * `actor_kind` distinguishes staff / member-mod / system writes\n * (e.g. an automated revocation when a member soft-deletes their\n * account). `target_id` is `text` because some actions target string\n * ids — like `\"posts\"` for a `collection-mod` grant scope.\n */\nexport const npAuditEvents = pgTable(\n \"np_audit_events\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n actorKind: text(\"actor_kind\").notNull(),\n actorUserId: uuid(\"actor_user_id\").references(() => npUsers.id),\n actorMemberId: uuid(\"actor_member_id\").references((): AnyPgColumn => npMembers.id),\n action: text(\"action\").notNull(),\n targetType: text(\"target_type\"),\n targetId: text(\"target_id\"),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().default({}).notNull(),\n /**\n * Phase 17 — site-scoped audit. Filled by `recordAuditEvent`\n * from the current request's site (the multi-site resolver).\n * Nullable for events that don't belong to a single site\n * (super-admin actions, background jobs, scripts).\n */\n siteId: text(\"site_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_audit_target_idx\").on(table.targetType, table.targetId, table.createdAt),\n index(\"np_audit_actor_user_idx\").on(table.actorUserId, table.createdAt),\n index(\"np_audit_actor_member_idx\").on(table.actorMemberId, table.createdAt),\n index(\"np_audit_site_idx\").on(table.siteId, table.createdAt),\n ],\n);\n\nexport const npBans = pgTable(\n \"np_bans\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n memberId: uuid(\"member_id\")\n .notNull()\n .references(() => npMembers.id, { onDelete: \"cascade\" }),\n scopeType: npBanScopeEnum(\"scope_type\").notNull(),\n scopeId: text(\"scope_id\"),\n kind: npBanKindEnum(\"kind\").notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: \"date\" }),\n reason: text(\"reason\"),\n byUserId: uuid(\"by_user_id\").references(() => npUsers.id),\n byMemberId: uuid(\"by_member_id\").references((): AnyPgColumn => npMembers.id),\n /**\n * Phase 18 — the tenant this ban applies to. Pre-Phase 18\n * `scope_type='site'` rows had `scope_id=null` because\n * \"site\" was the singular root scope; with multi-tenancy\n * the column tells `assertNotBanned` WHICH site the ban\n * blocks writes on. Category / collection scopes resolve\n * per-site too — the same `posts` collection slug exists\n * on every tenant.\n */\n siteId: text(\"site_id\").default(\"default\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true, mode: \"date\" }).defaultNow().notNull(),\n },\n (table) => [\n index(\"np_bans_member_scope_idx\").on(table.memberId, table.scopeType, table.scopeId),\n index(\"np_bans_active_idx\").on(table.memberId, table.expiresAt),\n index(\"np_bans_site_idx\").on(table.siteId, table.memberId),\n ],\n);\n"],"mappings":"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","names":["boolean","index","integer","jsonb","pgEnum","pgTable","primaryKey","text","timestamp","unique","uuid","index","integer","jsonb","pgEnum","pgTable","text","timestamp","uuid","pgEnum","pgTable","uuid","text","timestamp","integer","jsonb","index","pgEnum","pgTable","uuid","text","boolean","integer","timestamp","primaryKey","jsonb","unique","index"]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
applyReputation
|
|
3
|
-
} from "./chunk-THX3SHYA.js";
|
|
4
|
-
import "./chunk-JJL74ZPK.js";
|
|
5
|
-
import "./chunk-XANPEOJC.js";
|
|
6
|
-
import "./chunk-M43PGOQY.js";
|
|
7
|
-
import "./chunk-PZ5AY32C.js";
|
|
8
|
-
export {
|
|
9
|
-
applyReputation
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=reputation-JRL2YQHM.js.map
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|