@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.
@@ -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;AAoBjE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAqP7B,CAAA;AAEJ,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAO9D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAkB9B,CAAA;AAEJ,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,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"}
@@ -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;;;;;;;;;;;;;;;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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAI5B,CAAA"}
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.0",
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.0",
57
- "@voyantjs/crm": "0.3.0",
58
- "@voyantjs/db": "0.3.0",
59
- "@voyantjs/hono": "0.3.0",
60
- "@voyantjs/suppliers": "0.3.0"
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",