@voyantjs/legal 0.3.0 → 0.3.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/contracts/routes.d.ts +93 -0
- package/dist/contracts/routes.d.ts.map +1 -1
- package/dist/contracts/routes.js +27 -1
- package/dist/contracts/service-templates.d.ts +19 -0
- package/dist/contracts/service-templates.d.ts.map +1 -1
- package/dist/contracts/service-templates.js +24 -0
- package/dist/contracts/service.d.ts +19 -0
- package/dist/contracts/service.d.ts.map +1 -1
- package/dist/contracts/validation.d.ts +14 -0
- package/dist/contracts/validation.d.ts.map +1 -1
- package/dist/contracts/validation.js +16 -0
- package/package.json +6 -6
|
@@ -33,6 +33,38 @@ export declare const contractsAdminRoutes: import("hono/hono-base").HonoBase<Env
|
|
|
33
33
|
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
|
+
} & {
|
|
37
|
+
"/templates/default": {
|
|
38
|
+
$get: {
|
|
39
|
+
input: {};
|
|
40
|
+
output: {
|
|
41
|
+
error: string;
|
|
42
|
+
};
|
|
43
|
+
outputFormat: "json";
|
|
44
|
+
status: 404;
|
|
45
|
+
} | {
|
|
46
|
+
input: {};
|
|
47
|
+
output: {
|
|
48
|
+
data: {
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
slug: string;
|
|
52
|
+
scope: "customer" | "partner" | "supplier" | "other" | "channel";
|
|
53
|
+
language: string;
|
|
54
|
+
description: string | null;
|
|
55
|
+
bodyFormat: "markdown" | "html" | "lexical_json";
|
|
56
|
+
body: string;
|
|
57
|
+
variableSchema: import("hono/utils/types").JSONValue;
|
|
58
|
+
currentVersionId: string | null;
|
|
59
|
+
active: boolean;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
updatedAt: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
outputFormat: "json";
|
|
65
|
+
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
36
68
|
} & {
|
|
37
69
|
"/templates": {
|
|
38
70
|
$post: {
|
|
@@ -1186,6 +1218,67 @@ export declare const contractsAdminRoutes: import("hono/hono-base").HonoBase<Env
|
|
|
1186
1218
|
}, "/", "/attachments/:attachmentId">;
|
|
1187
1219
|
export type ContractsAdminRoutes = typeof contractsAdminRoutes;
|
|
1188
1220
|
export declare const contractsPublicRoutes: import("hono/hono-base").HonoBase<Env, {
|
|
1221
|
+
"/templates/default": {
|
|
1222
|
+
$get: {
|
|
1223
|
+
input: {};
|
|
1224
|
+
output: {
|
|
1225
|
+
error: string;
|
|
1226
|
+
};
|
|
1227
|
+
outputFormat: "json";
|
|
1228
|
+
status: 404;
|
|
1229
|
+
} | {
|
|
1230
|
+
input: {};
|
|
1231
|
+
output: {
|
|
1232
|
+
data: {
|
|
1233
|
+
id: string;
|
|
1234
|
+
name: string;
|
|
1235
|
+
slug: string;
|
|
1236
|
+
scope: "customer" | "partner" | "supplier" | "other" | "channel";
|
|
1237
|
+
language: string;
|
|
1238
|
+
description: string | null;
|
|
1239
|
+
bodyFormat: "markdown" | "html" | "lexical_json";
|
|
1240
|
+
body: string;
|
|
1241
|
+
variableSchema: import("hono/utils/types").JSONValue;
|
|
1242
|
+
currentVersionId: string | null;
|
|
1243
|
+
active: boolean;
|
|
1244
|
+
createdAt: string;
|
|
1245
|
+
updatedAt: string;
|
|
1246
|
+
};
|
|
1247
|
+
};
|
|
1248
|
+
outputFormat: "json";
|
|
1249
|
+
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
1250
|
+
};
|
|
1251
|
+
};
|
|
1252
|
+
} & {
|
|
1253
|
+
"/templates/:id/preview": {
|
|
1254
|
+
$post: {
|
|
1255
|
+
input: {
|
|
1256
|
+
param: {
|
|
1257
|
+
id: string;
|
|
1258
|
+
};
|
|
1259
|
+
};
|
|
1260
|
+
output: {
|
|
1261
|
+
error: string;
|
|
1262
|
+
};
|
|
1263
|
+
outputFormat: "json";
|
|
1264
|
+
status: 404;
|
|
1265
|
+
} | {
|
|
1266
|
+
input: {
|
|
1267
|
+
param: {
|
|
1268
|
+
id: string;
|
|
1269
|
+
};
|
|
1270
|
+
};
|
|
1271
|
+
output: {
|
|
1272
|
+
data: {
|
|
1273
|
+
rendered: string;
|
|
1274
|
+
bodyFormat: "markdown" | "html" | "lexical_json";
|
|
1275
|
+
};
|
|
1276
|
+
};
|
|
1277
|
+
outputFormat: "json";
|
|
1278
|
+
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
1279
|
+
};
|
|
1280
|
+
};
|
|
1281
|
+
} & {
|
|
1189
1282
|
"/:id": {
|
|
1190
1283
|
$get: {
|
|
1191
1284
|
input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/contracts/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/contracts/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAsBjE,KAAK,GAAG,GAAG;IACT,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAMD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA6P7B,CAAA;AAEJ,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAO9D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAuC9B,CAAA;AAEJ,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAA"}
|
package/dist/contracts/routes.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { contractsService } from "./service.js";
|
|
3
|
-
import { contractListQuerySchema, contractTemplateListQuerySchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
3
|
+
import { contractListQuerySchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, publicRenderTemplatePreviewInputSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
4
4
|
// ============================================================================
|
|
5
5
|
// Contracts admin routes — `/v1/admin/contracts/*`
|
|
6
6
|
// ============================================================================
|
|
@@ -9,6 +9,13 @@ export const contractsAdminRoutes = new Hono()
|
|
|
9
9
|
.get("/templates", async (c) => {
|
|
10
10
|
const query = contractTemplateListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
11
11
|
return c.json(await contractsService.listTemplates(c.get("db"), query));
|
|
12
|
+
})
|
|
13
|
+
.get("/templates/default", async (c) => {
|
|
14
|
+
const query = contractTemplateDefaultQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
15
|
+
const row = await contractsService.getDefaultTemplate(c.get("db"), query);
|
|
16
|
+
if (!row)
|
|
17
|
+
return c.json({ error: "Template not found" }, 404);
|
|
18
|
+
return c.json({ data: row });
|
|
12
19
|
})
|
|
13
20
|
.post("/templates", async (c) => {
|
|
14
21
|
const row = await contractsService.createTemplate(c.get("db"), insertContractTemplateSchema.parse(await c.req.json()));
|
|
@@ -204,6 +211,25 @@ export const contractsAdminRoutes = new Hono()
|
|
|
204
211
|
// Customer-facing: fetch own contract + self-sign
|
|
205
212
|
// ============================================================================
|
|
206
213
|
export const contractsPublicRoutes = new Hono()
|
|
214
|
+
.get("/templates/default", async (c) => {
|
|
215
|
+
const query = contractTemplateDefaultQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
216
|
+
const row = await contractsService.getDefaultTemplate(c.get("db"), query);
|
|
217
|
+
if (!row)
|
|
218
|
+
return c.json({ error: "Template not found" }, 404);
|
|
219
|
+
return c.json({ data: row });
|
|
220
|
+
})
|
|
221
|
+
.post("/templates/:id/preview", async (c) => {
|
|
222
|
+
const input = publicRenderTemplatePreviewInputSchema.parse(await c.req.json());
|
|
223
|
+
const template = await contractsService.getTemplateById(c.get("db"), c.req.param("id"));
|
|
224
|
+
if (!template?.active)
|
|
225
|
+
return c.json({ error: "Template not found" }, 404);
|
|
226
|
+
const rendered = contractsService.renderPreview({
|
|
227
|
+
variables: input.variables,
|
|
228
|
+
body: template.body,
|
|
229
|
+
bodyFormat: template.bodyFormat,
|
|
230
|
+
});
|
|
231
|
+
return c.json({ data: { rendered, bodyFormat: template.bodyFormat } });
|
|
232
|
+
})
|
|
207
233
|
.get("/:id", async (c) => {
|
|
208
234
|
const row = await contractsService.getContractById(c.get("db"), c.req.param("id"));
|
|
209
235
|
if (!row)
|
|
@@ -36,6 +36,25 @@ export declare const contractTemplatesService: {
|
|
|
36
36
|
createdAt: Date;
|
|
37
37
|
updatedAt: Date;
|
|
38
38
|
} | null>;
|
|
39
|
+
getDefaultTemplate(db: PostgresJsDatabase, query: {
|
|
40
|
+
scope: "customer" | "supplier" | "partner" | "channel" | "other";
|
|
41
|
+
language?: string;
|
|
42
|
+
fallbackLanguages?: string[];
|
|
43
|
+
}): Promise<{
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
slug: string;
|
|
47
|
+
scope: "customer" | "partner" | "supplier" | "other" | "channel";
|
|
48
|
+
language: string;
|
|
49
|
+
description: string | null;
|
|
50
|
+
bodyFormat: "markdown" | "html" | "lexical_json";
|
|
51
|
+
body: string;
|
|
52
|
+
variableSchema: unknown;
|
|
53
|
+
currentVersionId: string | null;
|
|
54
|
+
active: boolean;
|
|
55
|
+
createdAt: Date;
|
|
56
|
+
updatedAt: Date;
|
|
57
|
+
} | null>;
|
|
39
58
|
createTemplate(db: PostgresJsDatabase, data: CreateContractTemplateInput): Promise<{
|
|
40
59
|
id: string;
|
|
41
60
|
name: string;
|
|
@@ -1 +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;;;;;;;;;;;;;;;
|
|
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;;;;;;;;;;;;;;;2BASlD,kBAAkB,SACf;QACL,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;QAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;KAC7B;;;;;;;;;;;;;;;uBAgCsB,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"}
|
|
@@ -31,6 +31,30 @@ export const contractTemplatesService = {
|
|
|
31
31
|
.limit(1);
|
|
32
32
|
return row ?? null;
|
|
33
33
|
},
|
|
34
|
+
async getDefaultTemplate(db, query) {
|
|
35
|
+
const rows = await db
|
|
36
|
+
.select()
|
|
37
|
+
.from(contractTemplates)
|
|
38
|
+
.where(and(eq(contractTemplates.scope, query.scope), eq(contractTemplates.active, true)))
|
|
39
|
+
.orderBy(desc(contractTemplates.updatedAt));
|
|
40
|
+
if (rows.length === 0) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const preferredLanguages = [
|
|
44
|
+
query.language?.trim().toLowerCase(),
|
|
45
|
+
...(query.fallbackLanguages ?? []).map((value) => value.trim().toLowerCase()),
|
|
46
|
+
].filter((value, index, values) => Boolean(value) && values.indexOf(value) === index);
|
|
47
|
+
if (preferredLanguages.length === 0) {
|
|
48
|
+
return rows[0] ?? null;
|
|
49
|
+
}
|
|
50
|
+
for (const language of preferredLanguages) {
|
|
51
|
+
const match = rows.find((row) => row.language.trim().toLowerCase() === language);
|
|
52
|
+
if (match) {
|
|
53
|
+
return match;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return rows[0] ?? null;
|
|
57
|
+
},
|
|
34
58
|
async createTemplate(db, data) {
|
|
35
59
|
const [row] = await db.insert(contractTemplates).values(data).returning();
|
|
36
60
|
return row ?? null;
|
|
@@ -1328,6 +1328,25 @@ export declare const contractsService: {
|
|
|
1328
1328
|
createdAt: Date;
|
|
1329
1329
|
updatedAt: Date;
|
|
1330
1330
|
} | null>;
|
|
1331
|
+
getDefaultTemplate(db: import("drizzle-orm/postgres-js").PostgresJsDatabase, query: {
|
|
1332
|
+
scope: "customer" | "supplier" | "partner" | "channel" | "other";
|
|
1333
|
+
language?: string;
|
|
1334
|
+
fallbackLanguages?: string[];
|
|
1335
|
+
}): Promise<{
|
|
1336
|
+
id: string;
|
|
1337
|
+
name: string;
|
|
1338
|
+
slug: string;
|
|
1339
|
+
scope: "customer" | "partner" | "supplier" | "other" | "channel";
|
|
1340
|
+
language: string;
|
|
1341
|
+
description: string | null;
|
|
1342
|
+
bodyFormat: "markdown" | "html" | "lexical_json";
|
|
1343
|
+
body: string;
|
|
1344
|
+
variableSchema: unknown;
|
|
1345
|
+
currentVersionId: string | null;
|
|
1346
|
+
active: boolean;
|
|
1347
|
+
createdAt: Date;
|
|
1348
|
+
updatedAt: Date;
|
|
1349
|
+
} | null>;
|
|
1331
1350
|
createTemplate(db: import("drizzle-orm/postgres-js").PostgresJsDatabase, data: import("./service-shared.js").CreateContractTemplateInput): Promise<{
|
|
1332
1351
|
id: string;
|
|
1333
1352
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/contracts/service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,yBAAyB,EAAE,CAAA;AAE5E,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/contracts/service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,yBAAyB,EAAE,CAAA;AAE5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAKy3C,CAAC;yBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CADv7C,CAAA"}
|
|
@@ -87,6 +87,17 @@ export declare const contractTemplateListQuerySchema: z.ZodObject<{
|
|
|
87
87
|
active: z.ZodOptional<z.ZodCoercedBoolean<unknown>>;
|
|
88
88
|
search: z.ZodOptional<z.ZodString>;
|
|
89
89
|
}, z.core.$strip>;
|
|
90
|
+
export declare const contractTemplateDefaultQuerySchema: z.ZodObject<{
|
|
91
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
92
|
+
customer: "customer";
|
|
93
|
+
partner: "partner";
|
|
94
|
+
supplier: "supplier";
|
|
95
|
+
other: "other";
|
|
96
|
+
channel: "channel";
|
|
97
|
+
}>>;
|
|
98
|
+
language: z.ZodOptional<z.ZodString>;
|
|
99
|
+
fallbackLanguages: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string[], string | undefined>>;
|
|
100
|
+
}, z.core.$strip>;
|
|
90
101
|
export declare const insertContractTemplateVersionSchema: z.ZodObject<{
|
|
91
102
|
bodyFormat: z.ZodDefault<z.ZodEnum<{
|
|
92
103
|
markdown: "markdown";
|
|
@@ -235,6 +246,9 @@ export declare const renderTemplateInputSchema: z.ZodObject<{
|
|
|
235
246
|
}>>;
|
|
236
247
|
body: z.ZodOptional<z.ZodString>;
|
|
237
248
|
}, z.core.$strip>;
|
|
249
|
+
export declare const publicRenderTemplatePreviewInputSchema: z.ZodObject<{
|
|
250
|
+
variables: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
251
|
+
}, z.core.$strip>;
|
|
238
252
|
export declare const insertContractSignatureSchema: z.ZodObject<{
|
|
239
253
|
signerName: z.ZodString;
|
|
240
254
|
signerEmail: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/contracts/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,mBAAmB;;;;;;EAAkE,CAAA;AAElG,eAAO,MAAM,oBAAoB;;;;;;;;EAQ/B,CAAA;AAEF,eAAO,MAAM,6BAA6B;;;;;EAAwD,CAAA;AAElG,eAAO,MAAM,iCAAiC;;;;EAAyC,CAAA;AAEvF,eAAO,MAAM,wBAAwB;;;;EAA+C,CAAA;AAyBpF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;iBAA6B,CAAA;AACtE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;iBAAuC,CAAA;AAEhF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;iBAK1C,CAAA;AAIF,eAAO,MAAM,mCAAmC;;;;;;;;;;iBAM9C,CAAA;AAeF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;iBAAiC,CAAA;AAC9E,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;iBAA2C,CAAA;AAsBxF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAqB,CAAA;AACtD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA+B,CAAA;AAEhE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;iBASlC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;iBAIpC,CAAA;AAkBF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;iBAA8B,CAAA;AAcxE,eAAO,MAAM,8BAA8B;;;;;;;;iBAA+B,CAAA;AAC1E,eAAO,MAAM,8BAA8B;;;;;;;;iBAAyC,CAAA"}
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/contracts/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,mBAAmB;;;;;;EAAkE,CAAA;AAElG,eAAO,MAAM,oBAAoB;;;;;;;;EAQ/B,CAAA;AAEF,eAAO,MAAM,6BAA6B;;;;;EAAwD,CAAA;AAElG,eAAO,MAAM,iCAAiC;;;;EAAyC,CAAA;AAEvF,eAAO,MAAM,wBAAwB;;;;EAA+C,CAAA;AAyBpF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;iBAA6B,CAAA;AACtE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;iBAAuC,CAAA;AAEhF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;iBAK1C,CAAA;AAEF,eAAO,MAAM,kCAAkC;;;;;;;;;;iBAc7C,CAAA;AAIF,eAAO,MAAM,mCAAmC;;;;;;;;;;iBAM9C,CAAA;AAeF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;iBAAiC,CAAA;AAC9E,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;iBAA2C,CAAA;AAsBxF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAqB,CAAA;AACtD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA+B,CAAA;AAEhE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;iBASlC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;iBAIpC,CAAA;AAEF,eAAO,MAAM,sCAAsC;;iBAEjD,CAAA;AAkBF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;iBAA8B,CAAA;AAcxE,eAAO,MAAM,8BAA8B;;;;;;;;iBAA+B,CAAA;AAC1E,eAAO,MAAM,8BAA8B;;;;;;;;iBAAyC,CAAA"}
|
|
@@ -40,6 +40,19 @@ export const contractTemplateListQuerySchema = paginationSchema.extend({
|
|
|
40
40
|
active: z.coerce.boolean().optional(),
|
|
41
41
|
search: z.string().optional(),
|
|
42
42
|
});
|
|
43
|
+
export const contractTemplateDefaultQuerySchema = z.object({
|
|
44
|
+
scope: contractScopeSchema.default("customer"),
|
|
45
|
+
language: z.string().min(2).max(10).optional(),
|
|
46
|
+
fallbackLanguages: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.transform((value) => value
|
|
50
|
+
? value
|
|
51
|
+
.split(",")
|
|
52
|
+
.map((item) => item.trim())
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
: []),
|
|
55
|
+
});
|
|
43
56
|
// ---------- contract template versions ----------
|
|
44
57
|
export const insertContractTemplateVersionSchema = z.object({
|
|
45
58
|
bodyFormat: contractBodyFormatSchema.default("markdown"),
|
|
@@ -96,6 +109,9 @@ export const renderTemplateInputSchema = z.object({
|
|
|
96
109
|
bodyFormat: contractBodyFormatSchema.optional(),
|
|
97
110
|
body: z.string().optional(),
|
|
98
111
|
});
|
|
112
|
+
export const publicRenderTemplatePreviewInputSchema = z.object({
|
|
113
|
+
variables: z.record(z.string(), z.unknown()),
|
|
114
|
+
});
|
|
99
115
|
// ---------- contract signatures ----------
|
|
100
116
|
const contractSignatureCoreSchema = z.object({
|
|
101
117
|
signerName: z.string().min(1).max(255),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/legal",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "FSL-1.1-Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -53,11 +53,11 @@
|
|
|
53
53
|
"drizzle-orm": "^0.45.2",
|
|
54
54
|
"hono": "^4.12.10",
|
|
55
55
|
"zod": "^4.3.6",
|
|
56
|
-
"@voyantjs/core": "0.3.
|
|
57
|
-
"@voyantjs/crm": "0.3.
|
|
58
|
-
"@voyantjs/db": "0.3.
|
|
59
|
-
"@voyantjs/hono": "0.3.
|
|
60
|
-
"@voyantjs/suppliers": "0.3.
|
|
56
|
+
"@voyantjs/core": "0.3.1",
|
|
57
|
+
"@voyantjs/crm": "0.3.1",
|
|
58
|
+
"@voyantjs/db": "0.3.1",
|
|
59
|
+
"@voyantjs/hono": "0.3.1",
|
|
60
|
+
"@voyantjs/suppliers": "0.3.1"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"typescript": "^6.0.2",
|