@voyantjs/legal 0.2.0 → 0.3.0

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.
@@ -0,0 +1,415 @@
1
+ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ import { type ContractTemplateListQuery, type CreateContractTemplateInput, type CreateContractTemplateVersionInput, type RenderTemplateInput, type UpdateContractTemplateInput } from "./service-shared.js";
3
+ export declare const contractTemplatesService: {
4
+ listTemplates(db: PostgresJsDatabase, query: ContractTemplateListQuery): Promise<{
5
+ data: {
6
+ id: string;
7
+ name: string;
8
+ slug: string;
9
+ scope: "customer" | "partner" | "supplier" | "other" | "channel";
10
+ language: string;
11
+ description: string | null;
12
+ bodyFormat: "markdown" | "html" | "lexical_json";
13
+ body: string;
14
+ variableSchema: unknown;
15
+ currentVersionId: string | null;
16
+ active: boolean;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }[];
20
+ total: number;
21
+ limit: number;
22
+ offset: number;
23
+ }>;
24
+ getTemplateById(db: PostgresJsDatabase, id: string): Promise<{
25
+ id: string;
26
+ name: string;
27
+ slug: string;
28
+ scope: "customer" | "partner" | "supplier" | "other" | "channel";
29
+ language: string;
30
+ description: string | null;
31
+ bodyFormat: "markdown" | "html" | "lexical_json";
32
+ body: string;
33
+ variableSchema: unknown;
34
+ currentVersionId: string | null;
35
+ active: boolean;
36
+ createdAt: Date;
37
+ updatedAt: Date;
38
+ } | null>;
39
+ createTemplate(db: PostgresJsDatabase, data: CreateContractTemplateInput): Promise<{
40
+ id: string;
41
+ name: string;
42
+ active: boolean;
43
+ createdAt: Date;
44
+ updatedAt: Date;
45
+ description: string | null;
46
+ slug: string;
47
+ scope: "customer" | "partner" | "supplier" | "other" | "channel";
48
+ language: string;
49
+ bodyFormat: "markdown" | "html" | "lexical_json";
50
+ body: string;
51
+ variableSchema: unknown;
52
+ currentVersionId: string | null;
53
+ } | null>;
54
+ updateTemplate(db: PostgresJsDatabase, id: string, data: UpdateContractTemplateInput): Promise<{
55
+ id: string;
56
+ name: string;
57
+ slug: string;
58
+ scope: "customer" | "partner" | "supplier" | "other" | "channel";
59
+ language: string;
60
+ description: string | null;
61
+ bodyFormat: "markdown" | "html" | "lexical_json";
62
+ body: string;
63
+ variableSchema: unknown;
64
+ currentVersionId: string | null;
65
+ active: boolean;
66
+ createdAt: Date;
67
+ updatedAt: Date;
68
+ } | null>;
69
+ deleteTemplate(db: PostgresJsDatabase, id: string): Promise<{
70
+ id: string;
71
+ } | null>;
72
+ listTemplateVersions(db: PostgresJsDatabase, templateId: string): Omit<import("drizzle-orm/pg-core").PgSelectBase<"contract_template_versions", {
73
+ id: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: string;
75
+ tableName: "contract_template_versions";
76
+ dataType: "string";
77
+ columnType: "PgText";
78
+ data: string;
79
+ driverParam: string;
80
+ notNull: true;
81
+ hasDefault: true;
82
+ isPrimaryKey: true;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: true;
85
+ enumValues: [string, ...string[]];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {}>;
90
+ templateId: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: string;
92
+ tableName: "contract_template_versions";
93
+ dataType: "string";
94
+ columnType: "PgText";
95
+ data: string;
96
+ driverParam: string;
97
+ notNull: true;
98
+ hasDefault: false;
99
+ isPrimaryKey: false;
100
+ isAutoincrement: false;
101
+ hasRuntimeDefault: false;
102
+ enumValues: [string, ...string[]];
103
+ baseColumn: never;
104
+ identity: undefined;
105
+ generated: undefined;
106
+ }, {}, {}>;
107
+ version: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "version";
109
+ tableName: "contract_template_versions";
110
+ dataType: "number";
111
+ columnType: "PgInteger";
112
+ data: number;
113
+ driverParam: string | number;
114
+ notNull: true;
115
+ hasDefault: false;
116
+ isPrimaryKey: false;
117
+ isAutoincrement: false;
118
+ hasRuntimeDefault: false;
119
+ enumValues: undefined;
120
+ baseColumn: never;
121
+ identity: undefined;
122
+ generated: undefined;
123
+ }, {}, {}>;
124
+ bodyFormat: import("drizzle-orm/pg-core").PgColumn<{
125
+ name: "body_format";
126
+ tableName: "contract_template_versions";
127
+ dataType: "string";
128
+ columnType: "PgEnumColumn";
129
+ data: "markdown" | "html" | "lexical_json";
130
+ driverParam: string;
131
+ notNull: true;
132
+ hasDefault: true;
133
+ isPrimaryKey: false;
134
+ isAutoincrement: false;
135
+ hasRuntimeDefault: false;
136
+ enumValues: ["markdown", "html", "lexical_json"];
137
+ baseColumn: never;
138
+ identity: undefined;
139
+ generated: undefined;
140
+ }, {}, {}>;
141
+ body: import("drizzle-orm/pg-core").PgColumn<{
142
+ name: "body";
143
+ tableName: "contract_template_versions";
144
+ dataType: "string";
145
+ columnType: "PgText";
146
+ data: string;
147
+ driverParam: string;
148
+ notNull: true;
149
+ hasDefault: false;
150
+ isPrimaryKey: false;
151
+ isAutoincrement: false;
152
+ hasRuntimeDefault: false;
153
+ enumValues: [string, ...string[]];
154
+ baseColumn: never;
155
+ identity: undefined;
156
+ generated: undefined;
157
+ }, {}, {}>;
158
+ variableSchema: import("drizzle-orm/pg-core").PgColumn<{
159
+ name: "variable_schema";
160
+ tableName: "contract_template_versions";
161
+ dataType: "json";
162
+ columnType: "PgJsonb";
163
+ data: unknown;
164
+ driverParam: unknown;
165
+ notNull: false;
166
+ hasDefault: false;
167
+ isPrimaryKey: false;
168
+ isAutoincrement: false;
169
+ hasRuntimeDefault: false;
170
+ enumValues: undefined;
171
+ baseColumn: never;
172
+ identity: undefined;
173
+ generated: undefined;
174
+ }, {}, {}>;
175
+ changelog: import("drizzle-orm/pg-core").PgColumn<{
176
+ name: "changelog";
177
+ tableName: "contract_template_versions";
178
+ dataType: "string";
179
+ columnType: "PgText";
180
+ data: string;
181
+ driverParam: string;
182
+ notNull: false;
183
+ hasDefault: false;
184
+ isPrimaryKey: false;
185
+ isAutoincrement: false;
186
+ hasRuntimeDefault: false;
187
+ enumValues: [string, ...string[]];
188
+ baseColumn: never;
189
+ identity: undefined;
190
+ generated: undefined;
191
+ }, {}, {}>;
192
+ createdBy: import("drizzle-orm/pg-core").PgColumn<{
193
+ name: "created_by";
194
+ tableName: "contract_template_versions";
195
+ dataType: "string";
196
+ columnType: "PgText";
197
+ data: string;
198
+ driverParam: string;
199
+ notNull: false;
200
+ hasDefault: false;
201
+ isPrimaryKey: false;
202
+ isAutoincrement: false;
203
+ hasRuntimeDefault: false;
204
+ enumValues: [string, ...string[]];
205
+ baseColumn: never;
206
+ identity: undefined;
207
+ generated: undefined;
208
+ }, {}, {}>;
209
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
210
+ name: "created_at";
211
+ tableName: "contract_template_versions";
212
+ dataType: "date";
213
+ columnType: "PgTimestamp";
214
+ data: Date;
215
+ driverParam: string;
216
+ notNull: true;
217
+ hasDefault: true;
218
+ isPrimaryKey: false;
219
+ isAutoincrement: false;
220
+ hasRuntimeDefault: false;
221
+ enumValues: undefined;
222
+ baseColumn: never;
223
+ identity: undefined;
224
+ generated: undefined;
225
+ }, {}, {}>;
226
+ }, "single", Record<"contract_template_versions", "not-null">, false, "where" | "orderBy", {
227
+ id: string;
228
+ templateId: string;
229
+ version: number;
230
+ bodyFormat: "markdown" | "html" | "lexical_json";
231
+ body: string;
232
+ variableSchema: unknown;
233
+ changelog: string | null;
234
+ createdBy: string | null;
235
+ createdAt: Date;
236
+ }[], {
237
+ id: import("drizzle-orm/pg-core").PgColumn<{
238
+ name: string;
239
+ tableName: "contract_template_versions";
240
+ dataType: "string";
241
+ columnType: "PgText";
242
+ data: string;
243
+ driverParam: string;
244
+ notNull: true;
245
+ hasDefault: true;
246
+ isPrimaryKey: true;
247
+ isAutoincrement: false;
248
+ hasRuntimeDefault: true;
249
+ enumValues: [string, ...string[]];
250
+ baseColumn: never;
251
+ identity: undefined;
252
+ generated: undefined;
253
+ }, {}, {}>;
254
+ templateId: import("drizzle-orm/pg-core").PgColumn<{
255
+ name: string;
256
+ tableName: "contract_template_versions";
257
+ dataType: "string";
258
+ columnType: "PgText";
259
+ data: string;
260
+ driverParam: string;
261
+ notNull: true;
262
+ hasDefault: false;
263
+ isPrimaryKey: false;
264
+ isAutoincrement: false;
265
+ hasRuntimeDefault: false;
266
+ enumValues: [string, ...string[]];
267
+ baseColumn: never;
268
+ identity: undefined;
269
+ generated: undefined;
270
+ }, {}, {}>;
271
+ version: import("drizzle-orm/pg-core").PgColumn<{
272
+ name: "version";
273
+ tableName: "contract_template_versions";
274
+ dataType: "number";
275
+ columnType: "PgInteger";
276
+ data: number;
277
+ driverParam: string | number;
278
+ notNull: true;
279
+ hasDefault: false;
280
+ isPrimaryKey: false;
281
+ isAutoincrement: false;
282
+ hasRuntimeDefault: false;
283
+ enumValues: undefined;
284
+ baseColumn: never;
285
+ identity: undefined;
286
+ generated: undefined;
287
+ }, {}, {}>;
288
+ bodyFormat: import("drizzle-orm/pg-core").PgColumn<{
289
+ name: "body_format";
290
+ tableName: "contract_template_versions";
291
+ dataType: "string";
292
+ columnType: "PgEnumColumn";
293
+ data: "markdown" | "html" | "lexical_json";
294
+ driverParam: string;
295
+ notNull: true;
296
+ hasDefault: true;
297
+ isPrimaryKey: false;
298
+ isAutoincrement: false;
299
+ hasRuntimeDefault: false;
300
+ enumValues: ["markdown", "html", "lexical_json"];
301
+ baseColumn: never;
302
+ identity: undefined;
303
+ generated: undefined;
304
+ }, {}, {}>;
305
+ body: import("drizzle-orm/pg-core").PgColumn<{
306
+ name: "body";
307
+ tableName: "contract_template_versions";
308
+ dataType: "string";
309
+ columnType: "PgText";
310
+ data: string;
311
+ driverParam: string;
312
+ notNull: true;
313
+ hasDefault: false;
314
+ isPrimaryKey: false;
315
+ isAutoincrement: false;
316
+ hasRuntimeDefault: false;
317
+ enumValues: [string, ...string[]];
318
+ baseColumn: never;
319
+ identity: undefined;
320
+ generated: undefined;
321
+ }, {}, {}>;
322
+ variableSchema: import("drizzle-orm/pg-core").PgColumn<{
323
+ name: "variable_schema";
324
+ tableName: "contract_template_versions";
325
+ dataType: "json";
326
+ columnType: "PgJsonb";
327
+ data: unknown;
328
+ driverParam: unknown;
329
+ notNull: false;
330
+ hasDefault: false;
331
+ isPrimaryKey: false;
332
+ isAutoincrement: false;
333
+ hasRuntimeDefault: false;
334
+ enumValues: undefined;
335
+ baseColumn: never;
336
+ identity: undefined;
337
+ generated: undefined;
338
+ }, {}, {}>;
339
+ changelog: import("drizzle-orm/pg-core").PgColumn<{
340
+ name: "changelog";
341
+ tableName: "contract_template_versions";
342
+ dataType: "string";
343
+ columnType: "PgText";
344
+ data: string;
345
+ driverParam: string;
346
+ notNull: false;
347
+ hasDefault: false;
348
+ isPrimaryKey: false;
349
+ isAutoincrement: false;
350
+ hasRuntimeDefault: false;
351
+ enumValues: [string, ...string[]];
352
+ baseColumn: never;
353
+ identity: undefined;
354
+ generated: undefined;
355
+ }, {}, {}>;
356
+ createdBy: import("drizzle-orm/pg-core").PgColumn<{
357
+ name: "created_by";
358
+ tableName: "contract_template_versions";
359
+ dataType: "string";
360
+ columnType: "PgText";
361
+ data: string;
362
+ driverParam: string;
363
+ notNull: false;
364
+ hasDefault: false;
365
+ isPrimaryKey: false;
366
+ isAutoincrement: false;
367
+ hasRuntimeDefault: false;
368
+ enumValues: [string, ...string[]];
369
+ baseColumn: never;
370
+ identity: undefined;
371
+ generated: undefined;
372
+ }, {}, {}>;
373
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
374
+ name: "created_at";
375
+ tableName: "contract_template_versions";
376
+ dataType: "date";
377
+ columnType: "PgTimestamp";
378
+ data: Date;
379
+ driverParam: string;
380
+ notNull: true;
381
+ hasDefault: true;
382
+ isPrimaryKey: false;
383
+ isAutoincrement: false;
384
+ hasRuntimeDefault: false;
385
+ enumValues: undefined;
386
+ baseColumn: never;
387
+ identity: undefined;
388
+ generated: undefined;
389
+ }, {}, {}>;
390
+ }>, "where" | "orderBy">;
391
+ getTemplateVersionById(db: PostgresJsDatabase, id: string): Promise<{
392
+ id: string;
393
+ templateId: string;
394
+ version: number;
395
+ bodyFormat: "markdown" | "html" | "lexical_json";
396
+ body: string;
397
+ variableSchema: unknown;
398
+ changelog: string | null;
399
+ createdBy: string | null;
400
+ createdAt: Date;
401
+ } | null>;
402
+ createTemplateVersion(db: PostgresJsDatabase, templateId: string, data: CreateContractTemplateVersionInput): Promise<{
403
+ id: string;
404
+ createdAt: Date;
405
+ bodyFormat: "markdown" | "html" | "lexical_json";
406
+ body: string;
407
+ variableSchema: unknown;
408
+ templateId: string;
409
+ version: number;
410
+ changelog: string | null;
411
+ createdBy: string | null;
412
+ } | null>;
413
+ renderPreview(input: RenderTemplateInput): string;
414
+ };
415
+ //# sourceMappingURL=service-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-templates.d.ts","sourceRoot":"","sources":["../../src/contracts/service-templates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAGjE,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EAEvC,KAAK,mBAAmB,EAExB,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAA;AAE5B,eAAO,MAAM,wBAAwB;sBACX,kBAAkB,SAAS,yBAAyB;;;;;;;;;;;;;;;;;;;;wBA6BlD,kBAAkB,MAAM,MAAM;;;;;;;;;;;;;;;uBAQ/B,kBAAkB,QAAQ,2BAA2B;;;;;;;;;;;;;;;uBAIrD,kBAAkB,MAAM,MAAM,QAAQ,2BAA2B;;;;;;;;;;;;;;;uBAQjE,kBAAkB,MAAM,MAAM;;;6BAO9B,kBAAkB,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAO9B,kBAAkB,MAAM,MAAM;;;;;;;;;;;8BASzD,kBAAkB,cACV,MAAM,QACZ,kCAAkC;;;;;;;;;;;yBAmCrB,mBAAmB,GAAG,MAAM;CAKlD,CAAA"}
@@ -0,0 +1,108 @@
1
+ import { and, desc, eq, ilike, or, sql } from "drizzle-orm";
2
+ import { contractTemplates, contractTemplateVersions } from "./schema.js";
3
+ import { paginate, renderTemplate, } from "./service-shared.js";
4
+ export const contractTemplatesService = {
5
+ async listTemplates(db, query) {
6
+ const conditions = [];
7
+ if (query.scope)
8
+ conditions.push(eq(contractTemplates.scope, query.scope));
9
+ if (query.language)
10
+ conditions.push(eq(contractTemplates.language, query.language));
11
+ if (query.active !== undefined)
12
+ conditions.push(eq(contractTemplates.active, query.active));
13
+ if (query.search) {
14
+ const term = `%${query.search}%`;
15
+ conditions.push(or(ilike(contractTemplates.name, term), ilike(contractTemplates.slug, term), ilike(contractTemplates.description, term)));
16
+ }
17
+ const where = conditions.length ? and(...conditions) : undefined;
18
+ return paginate(db
19
+ .select()
20
+ .from(contractTemplates)
21
+ .where(where)
22
+ .limit(query.limit)
23
+ .offset(query.offset)
24
+ .orderBy(desc(contractTemplates.updatedAt)), db.select({ total: sql `count(*)::int` }).from(contractTemplates).where(where), query.limit, query.offset);
25
+ },
26
+ async getTemplateById(db, id) {
27
+ const [row] = await db
28
+ .select()
29
+ .from(contractTemplates)
30
+ .where(eq(contractTemplates.id, id))
31
+ .limit(1);
32
+ return row ?? null;
33
+ },
34
+ async createTemplate(db, data) {
35
+ const [row] = await db.insert(contractTemplates).values(data).returning();
36
+ return row ?? null;
37
+ },
38
+ async updateTemplate(db, id, data) {
39
+ const [row] = await db
40
+ .update(contractTemplates)
41
+ .set({ ...data, updatedAt: new Date() })
42
+ .where(eq(contractTemplates.id, id))
43
+ .returning();
44
+ return row ?? null;
45
+ },
46
+ async deleteTemplate(db, id) {
47
+ const [row] = await db
48
+ .delete(contractTemplates)
49
+ .where(eq(contractTemplates.id, id))
50
+ .returning({ id: contractTemplates.id });
51
+ return row ?? null;
52
+ },
53
+ listTemplateVersions(db, templateId) {
54
+ return db
55
+ .select()
56
+ .from(contractTemplateVersions)
57
+ .where(eq(contractTemplateVersions.templateId, templateId))
58
+ .orderBy(desc(contractTemplateVersions.version));
59
+ },
60
+ async getTemplateVersionById(db, id) {
61
+ const [row] = await db
62
+ .select()
63
+ .from(contractTemplateVersions)
64
+ .where(eq(contractTemplateVersions.id, id))
65
+ .limit(1);
66
+ return row ?? null;
67
+ },
68
+ async createTemplateVersion(db, templateId, data) {
69
+ return db.transaction(async (tx) => {
70
+ const [template] = await tx
71
+ .select({ id: contractTemplates.id })
72
+ .from(contractTemplates)
73
+ .where(eq(contractTemplates.id, templateId))
74
+ .limit(1);
75
+ if (!template)
76
+ return null;
77
+ const [maxRow] = await tx
78
+ .select({ max: sql `coalesce(max(${contractTemplateVersions.version}), 0)::int` })
79
+ .from(contractTemplateVersions)
80
+ .where(eq(contractTemplateVersions.templateId, templateId));
81
+ const nextVersion = (maxRow?.max ?? 0) + 1;
82
+ const [version] = await tx
83
+ .insert(contractTemplateVersions)
84
+ .values({
85
+ templateId,
86
+ version: nextVersion,
87
+ bodyFormat: data.bodyFormat,
88
+ body: data.body,
89
+ variableSchema: data.variableSchema ?? null,
90
+ changelog: data.changelog ?? null,
91
+ createdBy: data.createdBy ?? null,
92
+ })
93
+ .returning();
94
+ if (version) {
95
+ await tx
96
+ .update(contractTemplates)
97
+ .set({ currentVersionId: version.id, updatedAt: new Date() })
98
+ .where(eq(contractTemplates.id, templateId));
99
+ }
100
+ return version ?? null;
101
+ });
102
+ },
103
+ renderPreview(input) {
104
+ const body = input.body ?? "";
105
+ const format = input.bodyFormat ?? "markdown";
106
+ return renderTemplate(body, format, input.variables);
107
+ },
108
+ };