@newcms/database 0.0.2 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/repositories/meta-repository.d.ts +71 -0
- package/dist/repositories/meta-repository.d.ts.map +1 -0
- package/dist/repositories/meta-repository.js +176 -0
- package/dist/repositories/meta-repository.js.map +1 -0
- package/dist/repositories/post-repository.d.ts +121 -0
- package/dist/repositories/post-repository.d.ts.map +1 -0
- package/dist/repositories/post-repository.js +241 -0
- package/dist/repositories/post-repository.js.map +1 -0
- package/dist/repositories/revision-repository.d.ts +50 -0
- package/dist/repositories/revision-repository.d.ts.map +1 -0
- package/dist/repositories/revision-repository.js +149 -0
- package/dist/repositories/revision-repository.js.map +1 -0
- package/dist/repositories/taxonomy-repository.d.ts +63 -0
- package/dist/repositories/taxonomy-repository.d.ts.map +1 -0
- package/dist/repositories/taxonomy-repository.js +268 -0
- package/dist/repositories/taxonomy-repository.js.map +1 -0
- package/dist/schema/terms.d.ts.map +1 -1
- package/dist/schema/terms.js +2 -1
- package/dist/schema/terms.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-repository.js","sourceRoot":"","sources":["../../src/repositories/post-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Database } from '../connection.js';
|
|
2
|
+
import type { PostRow } from './post-repository.js';
|
|
3
|
+
/**
|
|
4
|
+
* Repository for post revisions.
|
|
5
|
+
*
|
|
6
|
+
* Revisions are stored as posts with type='revision' and
|
|
7
|
+
* postParent pointing to the original post.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RevisionRepository {
|
|
10
|
+
private db;
|
|
11
|
+
constructor(db: Database);
|
|
12
|
+
/**
|
|
13
|
+
* Create a revision snapshot of a post.
|
|
14
|
+
* Returns undefined if nothing changed since the last revision.
|
|
15
|
+
*
|
|
16
|
+
* @param post - The current state of the post (before or after update)
|
|
17
|
+
* @param authorId - The user who made the change
|
|
18
|
+
*/
|
|
19
|
+
createRevision(post: PostRow, authorId: number): Promise<PostRow | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* Get all revisions for a post, newest first.
|
|
22
|
+
*/
|
|
23
|
+
getRevisions(postId: number, limit?: number): Promise<PostRow[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the most recent revision for a post.
|
|
26
|
+
*/
|
|
27
|
+
getLatest(postId: number): Promise<PostRow | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a specific revision by ID.
|
|
30
|
+
*/
|
|
31
|
+
getById(revisionId: number): Promise<PostRow | undefined>;
|
|
32
|
+
/**
|
|
33
|
+
* Restore a post to a specific revision.
|
|
34
|
+
* Returns the updated post.
|
|
35
|
+
*/
|
|
36
|
+
restore(postId: number, revisionId: number): Promise<PostRow | undefined>;
|
|
37
|
+
/**
|
|
38
|
+
* Delete old revisions beyond the keep limit.
|
|
39
|
+
*/
|
|
40
|
+
cleanup(postId: number, keepCount: number): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Count revisions for a post.
|
|
43
|
+
*/
|
|
44
|
+
count(postId: number): Promise<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if any tracked field changed between two post states.
|
|
47
|
+
*/
|
|
48
|
+
private hasChanges;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=revision-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/revision-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAYpD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAClB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IA6BnF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAetE;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAK7D;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAS/D;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAoB/E;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBjE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS5C;;OAEG;IACH,OAAO,CAAC,UAAU;CAMlB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { eq, and, desc, sql } from 'drizzle-orm';
|
|
2
|
+
import { posts } from '../schema/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Fields that are tracked for revision diffing.
|
|
5
|
+
* If none of these change, no revision is created.
|
|
6
|
+
*/
|
|
7
|
+
const REVISION_FIELDS = [
|
|
8
|
+
'postTitle',
|
|
9
|
+
'postContent',
|
|
10
|
+
'postExcerpt',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Repository for post revisions.
|
|
14
|
+
*
|
|
15
|
+
* Revisions are stored as posts with type='revision' and
|
|
16
|
+
* postParent pointing to the original post.
|
|
17
|
+
*/
|
|
18
|
+
export class RevisionRepository {
|
|
19
|
+
db;
|
|
20
|
+
constructor(db) {
|
|
21
|
+
this.db = db;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a revision snapshot of a post.
|
|
25
|
+
* Returns undefined if nothing changed since the last revision.
|
|
26
|
+
*
|
|
27
|
+
* @param post - The current state of the post (before or after update)
|
|
28
|
+
* @param authorId - The user who made the change
|
|
29
|
+
*/
|
|
30
|
+
async createRevision(post, authorId) {
|
|
31
|
+
// Check if anything actually changed
|
|
32
|
+
const lastRevision = await this.getLatest(post.id);
|
|
33
|
+
if (lastRevision && !this.hasChanges(post, lastRevision)) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const now = new Date();
|
|
37
|
+
const [revision] = await this.db
|
|
38
|
+
.insert(posts)
|
|
39
|
+
.values({
|
|
40
|
+
postAuthor: authorId,
|
|
41
|
+
postDate: now,
|
|
42
|
+
postDateGmt: now,
|
|
43
|
+
postModified: now,
|
|
44
|
+
postModifiedGmt: now,
|
|
45
|
+
postTitle: post.postTitle,
|
|
46
|
+
postContent: post.postContent,
|
|
47
|
+
postExcerpt: post.postExcerpt,
|
|
48
|
+
postStatus: 'inherit',
|
|
49
|
+
postName: `${post.id}-revision-v1`,
|
|
50
|
+
postType: 'revision',
|
|
51
|
+
postParent: post.id,
|
|
52
|
+
})
|
|
53
|
+
.returning();
|
|
54
|
+
return revision;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get all revisions for a post, newest first.
|
|
58
|
+
*/
|
|
59
|
+
async getRevisions(postId, limit) {
|
|
60
|
+
let query = this.db
|
|
61
|
+
.select()
|
|
62
|
+
.from(posts)
|
|
63
|
+
.where(and(eq(posts.postParent, postId), eq(posts.postType, 'revision')))
|
|
64
|
+
.orderBy(desc(posts.postDate))
|
|
65
|
+
.$dynamic();
|
|
66
|
+
if (limit !== undefined) {
|
|
67
|
+
query = query.limit(limit);
|
|
68
|
+
}
|
|
69
|
+
return (await query);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the most recent revision for a post.
|
|
73
|
+
*/
|
|
74
|
+
async getLatest(postId) {
|
|
75
|
+
const rows = await this.getRevisions(postId, 1);
|
|
76
|
+
return rows[0];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get a specific revision by ID.
|
|
80
|
+
*/
|
|
81
|
+
async getById(revisionId) {
|
|
82
|
+
const rows = await this.db
|
|
83
|
+
.select()
|
|
84
|
+
.from(posts)
|
|
85
|
+
.where(and(eq(posts.id, revisionId), eq(posts.postType, 'revision')))
|
|
86
|
+
.limit(1);
|
|
87
|
+
return rows[0];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Restore a post to a specific revision.
|
|
91
|
+
* Returns the updated post.
|
|
92
|
+
*/
|
|
93
|
+
async restore(postId, revisionId) {
|
|
94
|
+
const revision = await this.getById(revisionId);
|
|
95
|
+
if (!revision || revision.postParent !== postId)
|
|
96
|
+
return undefined;
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const [updated] = await this.db
|
|
99
|
+
.update(posts)
|
|
100
|
+
.set({
|
|
101
|
+
postTitle: revision.postTitle,
|
|
102
|
+
postContent: revision.postContent,
|
|
103
|
+
postExcerpt: revision.postExcerpt,
|
|
104
|
+
postModified: now,
|
|
105
|
+
postModifiedGmt: now,
|
|
106
|
+
})
|
|
107
|
+
.where(eq(posts.id, postId))
|
|
108
|
+
.returning();
|
|
109
|
+
return updated;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Delete old revisions beyond the keep limit.
|
|
113
|
+
*/
|
|
114
|
+
async cleanup(postId, keepCount) {
|
|
115
|
+
const revisions = await this.getRevisions(postId);
|
|
116
|
+
if (revisions.length <= keepCount)
|
|
117
|
+
return 0;
|
|
118
|
+
const toDelete = revisions.slice(keepCount);
|
|
119
|
+
const idsToDelete = toDelete.map((r) => r.id);
|
|
120
|
+
if (idsToDelete.length === 0)
|
|
121
|
+
return 0;
|
|
122
|
+
const result = await this.db
|
|
123
|
+
.delete(posts)
|
|
124
|
+
.where(and(sql `${posts.id} IN (${sql.join(idsToDelete.map((id) => sql `${id}`), sql `, `)})`, eq(posts.postType, 'revision')))
|
|
125
|
+
.returning({ id: posts.id });
|
|
126
|
+
return result.length;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Count revisions for a post.
|
|
130
|
+
*/
|
|
131
|
+
async count(postId) {
|
|
132
|
+
const [result] = await this.db
|
|
133
|
+
.select({ count: sql `count(*)::int` })
|
|
134
|
+
.from(posts)
|
|
135
|
+
.where(and(eq(posts.postParent, postId), eq(posts.postType, 'revision')));
|
|
136
|
+
return result.count;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if any tracked field changed between two post states.
|
|
140
|
+
*/
|
|
141
|
+
hasChanges(current, previous) {
|
|
142
|
+
for (const field of REVISION_FIELDS) {
|
|
143
|
+
if (current[field] !== previous[field])
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=revision-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-repository.js","sourceRoot":"","sources":["../../src/repositories/revision-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C;;;GAGG;AACH,MAAM,eAAe,GAAG;IACvB,WAAW;IACX,aAAa;IACb,aAAa;CACJ,CAAC;AAEX;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACV;IAApB,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAEpC;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,IAAa,EAAE,QAAgB;QACnD,qCAAqC;QACrC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,MAAM,CAAC,KAAK,CAAC;aACb,MAAM,CAAC;YACP,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,GAAG;YACjB,eAAe,EAAE,GAAG;YACpB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,cAAc;YAClC,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,IAAI,CAAC,EAAE;SACnB,CAAC;aACD,SAAS,EAAE,CAAC;QAEd,OAAO,QAAmB,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAc;QAChD,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE;aACjB,MAAM,EAAE;aACR,IAAI,CAAC,KAAK,CAAC;aACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;aACxE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC7B,QAAQ,EAAE,CAAC;QAEb,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,MAAM,KAAK,CAAc,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACxB,MAAM,EAAE;aACR,IAAI,CAAC,KAAK,CAAC;aACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;aACpE,KAAK,CAAC,CAAC,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,CAAC,CAAwB,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,UAAkB;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QAElE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aAC7B,MAAM,CAAC,KAAK,CAAC;aACb,GAAG,CAAC;YACJ,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,YAAY,EAAE,GAAG;YACjB,eAAe,EAAE,GAAG;SACpB,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;aAC3B,SAAS,EAAE,CAAC;QAEd,OAAO,OAAkB,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,SAAiB;QAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS;YAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CACL,GAAG,CACF,GAAG,CAAA,GAAG,KAAK,CAAC,EAAE,QAAQ,GAAG,CAAC,IAAI,CAC7B,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAA,GAAG,EAAE,EAAE,CAAC,EACnC,GAAG,CAAA,IAAI,CACP,GAAG,EACJ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAC9B,CACD;aACA,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAE9B,OAAO,MAAM,CAAC,MAAM,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAc;QACzB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAQ,eAAe,EAAE,CAAC;aAC7C,IAAI,CAAC,KAAK,CAAC;aACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAE3E,OAAO,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAgB,EAAE,QAAiB;QACrD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Database } from '../connection.js';
|
|
2
|
+
import { MetaRepository } from './meta-repository.js';
|
|
3
|
+
export interface CreateTermInput {
|
|
4
|
+
name: string;
|
|
5
|
+
slug?: string;
|
|
6
|
+
taxonomy: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
parent?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface TermRow {
|
|
11
|
+
termId: number;
|
|
12
|
+
name: string;
|
|
13
|
+
slug: string;
|
|
14
|
+
termGroup: number;
|
|
15
|
+
termTaxonomyId: number;
|
|
16
|
+
taxonomy: string;
|
|
17
|
+
description: string;
|
|
18
|
+
parent: number;
|
|
19
|
+
count: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Repository for taxonomy terms (categories, tags, custom taxonomies).
|
|
23
|
+
*/
|
|
24
|
+
export declare class TaxonomyRepository {
|
|
25
|
+
private db;
|
|
26
|
+
readonly meta: MetaRepository;
|
|
27
|
+
constructor(db: Database);
|
|
28
|
+
/**
|
|
29
|
+
* Create a new term in a taxonomy.
|
|
30
|
+
*/
|
|
31
|
+
createTerm(input: CreateTermInput): Promise<TermRow>;
|
|
32
|
+
/**
|
|
33
|
+
* Get a term by ID and taxonomy.
|
|
34
|
+
*/
|
|
35
|
+
getTermById(termId: number, taxonomy: string): Promise<TermRow | undefined>;
|
|
36
|
+
/**
|
|
37
|
+
* Get a term by slug and taxonomy.
|
|
38
|
+
*/
|
|
39
|
+
getTermBySlug(slug: string, taxonomy: string): Promise<TermRow | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Get all terms in a taxonomy.
|
|
42
|
+
*/
|
|
43
|
+
getTerms(taxonomy: string, parentId?: number): Promise<TermRow[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Assign terms to an object (post).
|
|
46
|
+
*/
|
|
47
|
+
setObjectTerms(objectId: number, termTaxonomyIds: number[]): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get terms assigned to an object.
|
|
50
|
+
*/
|
|
51
|
+
getObjectTerms(objectId: number, taxonomy?: string): Promise<TermRow[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete a term and all its relationships.
|
|
54
|
+
*/
|
|
55
|
+
deleteTerm(termId: number, taxonomy: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Recount the number of objects assigned to terms.
|
|
58
|
+
*/
|
|
59
|
+
recountTerms(termTaxonomyIds: number[]): Promise<void>;
|
|
60
|
+
private generateSlug;
|
|
61
|
+
private ensureUniqueSlug;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=taxonomy-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/taxonomy-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOjD,OAAO,EAAE,cAAc,EAA+C,MAAM,sBAAsB,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAGlB,OAAO,CAAC,EAAE;IAFtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;gBAEV,EAAE,EAAE,QAAQ;IAgBhC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC1D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAqBjF;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAqBjF;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA0BvE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+ChF;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8B7E;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpE;;OAEG;IACG,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,OAAO,CAAC,YAAY;YAYN,gBAAgB;CAqB9B"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { eq, and, sql, inArray } from 'drizzle-orm';
|
|
2
|
+
import { terms, termTaxonomy, termRelationships, termmeta, } from '../schema/index.js';
|
|
3
|
+
import { MetaRepository } from './meta-repository.js';
|
|
4
|
+
/**
|
|
5
|
+
* Repository for taxonomy terms (categories, tags, custom taxonomies).
|
|
6
|
+
*/
|
|
7
|
+
export class TaxonomyRepository {
|
|
8
|
+
db;
|
|
9
|
+
meta;
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
const metaCols = {
|
|
13
|
+
metaId: termmeta.metaId,
|
|
14
|
+
objectId: termmeta.termId,
|
|
15
|
+
metaKey: termmeta.metaKey,
|
|
16
|
+
metaValue: termmeta.metaValue,
|
|
17
|
+
metaValueJson: termmeta.metaValueJson,
|
|
18
|
+
};
|
|
19
|
+
const colNames = {
|
|
20
|
+
table: 'termmeta',
|
|
21
|
+
sql: { metaId: 'meta_id', objectId: 'term_id', metaKey: 'meta_key', metaValue: 'meta_value', metaValueJson: 'meta_value_json' },
|
|
22
|
+
ts: { metaId: 'metaId', objectId: 'termId', metaKey: 'metaKey', metaValue: 'metaValue', metaValueJson: 'metaValueJson' },
|
|
23
|
+
};
|
|
24
|
+
this.meta = new MetaRepository(db, termmeta, metaCols, colNames);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a new term in a taxonomy.
|
|
28
|
+
*/
|
|
29
|
+
async createTerm(input) {
|
|
30
|
+
const slug = input.slug || this.generateSlug(input.name);
|
|
31
|
+
const uniqueSlug = await this.ensureUniqueSlug(slug);
|
|
32
|
+
const [term] = await this.db
|
|
33
|
+
.insert(terms)
|
|
34
|
+
.values({
|
|
35
|
+
name: input.name,
|
|
36
|
+
slug: uniqueSlug,
|
|
37
|
+
})
|
|
38
|
+
.returning();
|
|
39
|
+
const [tt] = await this.db
|
|
40
|
+
.insert(termTaxonomy)
|
|
41
|
+
.values({
|
|
42
|
+
termId: term.termId,
|
|
43
|
+
taxonomy: input.taxonomy,
|
|
44
|
+
description: input.description ?? '',
|
|
45
|
+
parent: input.parent ?? 0,
|
|
46
|
+
count: 0,
|
|
47
|
+
})
|
|
48
|
+
.returning();
|
|
49
|
+
return {
|
|
50
|
+
termId: term.termId,
|
|
51
|
+
name: term.name,
|
|
52
|
+
slug: term.slug,
|
|
53
|
+
termGroup: term.termGroup,
|
|
54
|
+
termTaxonomyId: tt.termTaxonomyId,
|
|
55
|
+
taxonomy: tt.taxonomy,
|
|
56
|
+
description: tt.description,
|
|
57
|
+
parent: tt.parent,
|
|
58
|
+
count: tt.count,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get a term by ID and taxonomy.
|
|
63
|
+
*/
|
|
64
|
+
async getTermById(termId, taxonomy) {
|
|
65
|
+
const rows = await this.db
|
|
66
|
+
.select({
|
|
67
|
+
termId: terms.termId,
|
|
68
|
+
name: terms.name,
|
|
69
|
+
slug: terms.slug,
|
|
70
|
+
termGroup: terms.termGroup,
|
|
71
|
+
termTaxonomyId: termTaxonomy.termTaxonomyId,
|
|
72
|
+
taxonomy: termTaxonomy.taxonomy,
|
|
73
|
+
description: termTaxonomy.description,
|
|
74
|
+
parent: termTaxonomy.parent,
|
|
75
|
+
count: termTaxonomy.count,
|
|
76
|
+
})
|
|
77
|
+
.from(terms)
|
|
78
|
+
.innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
|
|
79
|
+
.where(and(eq(terms.termId, termId), eq(termTaxonomy.taxonomy, taxonomy)))
|
|
80
|
+
.limit(1);
|
|
81
|
+
return rows[0];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get a term by slug and taxonomy.
|
|
85
|
+
*/
|
|
86
|
+
async getTermBySlug(slug, taxonomy) {
|
|
87
|
+
const rows = await this.db
|
|
88
|
+
.select({
|
|
89
|
+
termId: terms.termId,
|
|
90
|
+
name: terms.name,
|
|
91
|
+
slug: terms.slug,
|
|
92
|
+
termGroup: terms.termGroup,
|
|
93
|
+
termTaxonomyId: termTaxonomy.termTaxonomyId,
|
|
94
|
+
taxonomy: termTaxonomy.taxonomy,
|
|
95
|
+
description: termTaxonomy.description,
|
|
96
|
+
parent: termTaxonomy.parent,
|
|
97
|
+
count: termTaxonomy.count,
|
|
98
|
+
})
|
|
99
|
+
.from(terms)
|
|
100
|
+
.innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
|
|
101
|
+
.where(and(eq(terms.slug, slug), eq(termTaxonomy.taxonomy, taxonomy)))
|
|
102
|
+
.limit(1);
|
|
103
|
+
return rows[0];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get all terms in a taxonomy.
|
|
107
|
+
*/
|
|
108
|
+
async getTerms(taxonomy, parentId) {
|
|
109
|
+
const conditions = [eq(termTaxonomy.taxonomy, taxonomy)];
|
|
110
|
+
if (parentId !== undefined) {
|
|
111
|
+
conditions.push(eq(termTaxonomy.parent, parentId));
|
|
112
|
+
}
|
|
113
|
+
const rows = await this.db
|
|
114
|
+
.select({
|
|
115
|
+
termId: terms.termId,
|
|
116
|
+
name: terms.name,
|
|
117
|
+
slug: terms.slug,
|
|
118
|
+
termGroup: terms.termGroup,
|
|
119
|
+
termTaxonomyId: termTaxonomy.termTaxonomyId,
|
|
120
|
+
taxonomy: termTaxonomy.taxonomy,
|
|
121
|
+
description: termTaxonomy.description,
|
|
122
|
+
parent: termTaxonomy.parent,
|
|
123
|
+
count: termTaxonomy.count,
|
|
124
|
+
})
|
|
125
|
+
.from(terms)
|
|
126
|
+
.innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
|
|
127
|
+
.where(and(...conditions))
|
|
128
|
+
.orderBy(terms.name);
|
|
129
|
+
return rows;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Assign terms to an object (post).
|
|
133
|
+
*/
|
|
134
|
+
async setObjectTerms(objectId, termTaxonomyIds) {
|
|
135
|
+
// Remove existing relationships for these taxonomies
|
|
136
|
+
const existingTtIds = termTaxonomyIds.length > 0
|
|
137
|
+
? await this.db
|
|
138
|
+
.select({ taxonomy: termTaxonomy.taxonomy })
|
|
139
|
+
.from(termTaxonomy)
|
|
140
|
+
.where(inArray(termTaxonomy.termTaxonomyId, termTaxonomyIds))
|
|
141
|
+
: [];
|
|
142
|
+
const taxonomies = [...new Set(existingTtIds.map((r) => r.taxonomy))];
|
|
143
|
+
if (taxonomies.length > 0) {
|
|
144
|
+
// Get all term_taxonomy_ids for these taxonomies
|
|
145
|
+
const allTtIds = await this.db
|
|
146
|
+
.select({ termTaxonomyId: termTaxonomy.termTaxonomyId })
|
|
147
|
+
.from(termTaxonomy)
|
|
148
|
+
.where(inArray(termTaxonomy.taxonomy, taxonomies));
|
|
149
|
+
const allTtIdValues = allTtIds.map((r) => r.termTaxonomyId);
|
|
150
|
+
if (allTtIdValues.length > 0) {
|
|
151
|
+
await this.db
|
|
152
|
+
.delete(termRelationships)
|
|
153
|
+
.where(and(eq(termRelationships.objectId, objectId), inArray(termRelationships.termTaxonomyId, allTtIdValues)));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Insert new relationships
|
|
157
|
+
if (termTaxonomyIds.length > 0) {
|
|
158
|
+
await this.db.insert(termRelationships).values(termTaxonomyIds.map((ttId, i) => ({
|
|
159
|
+
objectId,
|
|
160
|
+
termTaxonomyId: ttId,
|
|
161
|
+
termOrder: i,
|
|
162
|
+
}))).onConflictDoNothing();
|
|
163
|
+
}
|
|
164
|
+
// Update counts
|
|
165
|
+
await this.recountTerms(termTaxonomyIds);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get terms assigned to an object.
|
|
169
|
+
*/
|
|
170
|
+
async getObjectTerms(objectId, taxonomy) {
|
|
171
|
+
const conditions = [eq(termRelationships.objectId, objectId)];
|
|
172
|
+
if (taxonomy) {
|
|
173
|
+
conditions.push(eq(termTaxonomy.taxonomy, taxonomy));
|
|
174
|
+
}
|
|
175
|
+
const rows = await this.db
|
|
176
|
+
.select({
|
|
177
|
+
termId: terms.termId,
|
|
178
|
+
name: terms.name,
|
|
179
|
+
slug: terms.slug,
|
|
180
|
+
termGroup: terms.termGroup,
|
|
181
|
+
termTaxonomyId: termTaxonomy.termTaxonomyId,
|
|
182
|
+
taxonomy: termTaxonomy.taxonomy,
|
|
183
|
+
description: termTaxonomy.description,
|
|
184
|
+
parent: termTaxonomy.parent,
|
|
185
|
+
count: termTaxonomy.count,
|
|
186
|
+
})
|
|
187
|
+
.from(termRelationships)
|
|
188
|
+
.innerJoin(termTaxonomy, eq(termRelationships.termTaxonomyId, termTaxonomy.termTaxonomyId))
|
|
189
|
+
.innerJoin(terms, eq(termTaxonomy.termId, terms.termId))
|
|
190
|
+
.where(and(...conditions))
|
|
191
|
+
.orderBy(termRelationships.termOrder);
|
|
192
|
+
return rows;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Delete a term and all its relationships.
|
|
196
|
+
*/
|
|
197
|
+
async deleteTerm(termId, taxonomy) {
|
|
198
|
+
const term = await this.getTermById(termId, taxonomy);
|
|
199
|
+
if (!term)
|
|
200
|
+
return false;
|
|
201
|
+
// Delete relationships
|
|
202
|
+
await this.db
|
|
203
|
+
.delete(termRelationships)
|
|
204
|
+
.where(eq(termRelationships.termTaxonomyId, term.termTaxonomyId));
|
|
205
|
+
// Delete term_taxonomy
|
|
206
|
+
await this.db
|
|
207
|
+
.delete(termTaxonomy)
|
|
208
|
+
.where(eq(termTaxonomy.termTaxonomyId, term.termTaxonomyId));
|
|
209
|
+
// Delete term (if not used by another taxonomy)
|
|
210
|
+
const otherUsages = await this.db
|
|
211
|
+
.select({ termTaxonomyId: termTaxonomy.termTaxonomyId })
|
|
212
|
+
.from(termTaxonomy)
|
|
213
|
+
.where(eq(termTaxonomy.termId, termId))
|
|
214
|
+
.limit(1);
|
|
215
|
+
if (otherUsages.length === 0) {
|
|
216
|
+
await this.db.delete(terms).where(eq(terms.termId, termId));
|
|
217
|
+
}
|
|
218
|
+
// Delete meta
|
|
219
|
+
await this.meta.deleteAllForObject(termId);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Recount the number of objects assigned to terms.
|
|
224
|
+
*/
|
|
225
|
+
async recountTerms(termTaxonomyIds) {
|
|
226
|
+
for (const ttId of termTaxonomyIds) {
|
|
227
|
+
const [result] = await this.db
|
|
228
|
+
.select({ count: sql `count(*)::int` })
|
|
229
|
+
.from(termRelationships)
|
|
230
|
+
.where(eq(termRelationships.termTaxonomyId, ttId));
|
|
231
|
+
await this.db
|
|
232
|
+
.update(termTaxonomy)
|
|
233
|
+
.set({ count: result.count })
|
|
234
|
+
.where(eq(termTaxonomy.termTaxonomyId, ttId));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
generateSlug(name) {
|
|
238
|
+
return name
|
|
239
|
+
.toLowerCase()
|
|
240
|
+
.normalize('NFD')
|
|
241
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
242
|
+
.replace(/[^a-z0-9_\s-]/g, '')
|
|
243
|
+
.replace(/\s+/g, '-')
|
|
244
|
+
.replace(/-+/g, '-')
|
|
245
|
+
.replace(/^-|-$/g, '')
|
|
246
|
+
.substring(0, 200);
|
|
247
|
+
}
|
|
248
|
+
async ensureUniqueSlug(slug, excludeId) {
|
|
249
|
+
let candidate = slug;
|
|
250
|
+
let suffix = 2;
|
|
251
|
+
while (true) {
|
|
252
|
+
const conditions = [eq(terms.slug, candidate)];
|
|
253
|
+
if (excludeId !== undefined) {
|
|
254
|
+
conditions.push(sql `${terms.termId} != ${excludeId}`);
|
|
255
|
+
}
|
|
256
|
+
const existing = await this.db
|
|
257
|
+
.select({ termId: terms.termId })
|
|
258
|
+
.from(terms)
|
|
259
|
+
.where(and(...conditions))
|
|
260
|
+
.limit(1);
|
|
261
|
+
if (existing.length === 0)
|
|
262
|
+
return candidate;
|
|
263
|
+
candidate = `${slug}-${suffix}`;
|
|
264
|
+
suffix++;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=taxonomy-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy-repository.js","sourceRoot":"","sources":["../../src/repositories/taxonomy-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe7B,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAepB,CAAC"}
|
package/dist/schema/terms.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { pgTable, serial, bigint, text, varchar, index, jsonb, uniqueIndex, } from 'drizzle-orm/pg-core';
|
|
1
|
+
import { pgTable, serial, bigint, text, varchar, index, jsonb, uniqueIndex, primaryKey, } from 'drizzle-orm/pg-core';
|
|
2
2
|
import { posts } from './posts.js';
|
|
3
3
|
export const terms = pgTable('terms', {
|
|
4
4
|
termId: serial('term_id').primaryKey(),
|
|
@@ -28,6 +28,7 @@ export const termRelationships = pgTable('term_relationships', {
|
|
|
28
28
|
.references(() => termTaxonomy.termTaxonomyId, { onDelete: 'cascade' }),
|
|
29
29
|
termOrder: bigint('term_order', { mode: 'number' }).notNull().default(0),
|
|
30
30
|
}, (table) => [
|
|
31
|
+
primaryKey({ columns: [table.objectId, table.termTaxonomyId] }),
|
|
31
32
|
index('idx_term_taxonomy_id').on(table.termTaxonomyId),
|
|
32
33
|
]);
|
|
33
34
|
export const termmeta = pgTable('termmeta', {
|
package/dist/schema/terms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,OAAO,EACP,MAAM,EACN,MAAM,EACN,IAAI,EACJ,OAAO,EACP,KAAK,EACL,KAAK,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newcms/database",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Database schema, object cache, and repositories for NewCMS",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"README.md"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"drizzle-orm": "^0.
|
|
37
|
-
"
|
|
38
|
-
"
|
|
36
|
+
"drizzle-orm": "^0.45.2",
|
|
37
|
+
"ioredis": "^5.6.1",
|
|
38
|
+
"postgres": "^3.4.7"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^22.15.3",
|
|
42
|
-
"drizzle-kit": "^0.31.1",
|
|
43
42
|
"dotenv": "^16.5.0",
|
|
43
|
+
"drizzle-kit": "^0.31.1",
|
|
44
44
|
"tsx": "^4.19.4",
|
|
45
45
|
"typescript": "^5.9.3",
|
|
46
46
|
"vitest": "^3.2.4",
|