@pdfme/common
Version:
TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!
219 lines (184 loc) • 6.76 kB
text/typescript
import { z } from 'zod';
const langs = ['en', 'zh', 'ja', 'ko', 'ar', 'th', 'pl', 'it', 'de', 'es', 'fr'] as const;
export const Lang = z.enum(langs);
export const Dict = z.object({
// -----------------used in ui-----------------
cancel: z.string(),
close: z.string(),
set: z.string(),
clear: z.string(),
field: z.string(),
fieldName: z.string(),
align: z.string(),
width: z.string(),
opacity: z.string(),
height: z.string(),
rotate: z.string(),
edit: z.string(),
required: z.string(),
editable: z.string(),
plsInputName: z.string(),
fieldMustUniq: z.string(),
notUniq: z.string(),
noKeyName: z.string(),
fieldsList: z.string(),
editField: z.string(),
type: z.string(),
errorOccurred: z.string(),
errorBulkUpdateFieldName: z.string(),
commitBulkUpdateFieldName: z.string(),
bulkUpdateFieldName: z.string(),
addPageAfter: z.string(),
removePage: z.string(),
removePageConfirm: z.string(),
// --------------------validation-------------------
'validation.uniqueName': z.string(),
'validation.hexColor': z.string(),
'validation.dateTimeFormat': z.string(),
// -----------------used in schemas-----------------
'schemas.color': z.string(),
'schemas.borderWidth': z.string(),
'schemas.borderColor': z.string(),
'schemas.backgroundColor': z.string(),
'schemas.textColor': z.string(),
'schemas.bgColor': z.string(),
'schemas.horizontal': z.string(),
'schemas.vertical': z.string(),
'schemas.left': z.string(),
'schemas.center': z.string(),
'schemas.right': z.string(),
'schemas.top': z.string(),
'schemas.middle': z.string(),
'schemas.bottom': z.string(),
'schemas.padding': z.string(),
'schemas.text.fontName': z.string(),
'schemas.text.size': z.string(),
'schemas.text.spacing': z.string(),
'schemas.text.textAlign': z.string(),
'schemas.text.verticalAlign': z.string(),
'schemas.text.lineHeight': z.string(),
'schemas.text.min': z.string(),
'schemas.text.max': z.string(),
'schemas.text.fit': z.string(),
'schemas.text.dynamicFontSize': z.string(),
'schemas.text.format': z.string(),
'schemas.radius': z.string(),
'schemas.mvt.typingInstructions': z.string(),
'schemas.mvt.sampleField': z.string(),
'schemas.mvt.variablesSampleData': z.string(),
'schemas.barcodes.barColor': z.string(),
'schemas.barcodes.includetext': z.string(),
'schemas.table.alternateBackgroundColor': z.string(),
'schemas.table.tableStyle': z.string(),
'schemas.table.showHead': z.string(),
'schemas.table.headStyle': z.string(),
'schemas.table.bodyStyle': z.string(),
'schemas.table.columnStyle': z.string(),
'schemas.date.format': z.string(),
'schemas.date.locale': z.string(),
'schemas.select.options': z.string(),
'schemas.select.optionPlaceholder': z.string(),
'schemas.radioGroup.groupName': z.string(),
});
export const Mode = z.enum(['viewer', 'form', 'designer']);
export const ColorType = z.enum(['rgb', 'cmyk']).optional();
export const Size = z.object({ height: z.number(), width: z.number() });
export const Schema = z
.object({
name: z.string(),
type: z.string(),
content: z.string().optional(),
position: z.object({ x: z.number(), y: z.number() }),
width: z.number(),
height: z.number(),
rotate: z.number().optional(),
opacity: z.number().optional(),
readOnly: z.boolean().optional(),
required: z.boolean().optional(),
__bodyRange: z.object({ start: z.number(), end: z.number().optional() }).optional(),
__isSplit: z.boolean().optional(),
})
.passthrough();
const SchemaForUIAdditionalInfo = z.object({ id: z.string() });
export const SchemaForUI = Schema.merge(SchemaForUIAdditionalInfo);
const ArrayBufferSchema: z.ZodSchema<ArrayBuffer> = z.any().refine((v) => v instanceof ArrayBuffer);
const Uint8ArraySchema: z.ZodSchema<Uint8Array> = z.any().refine((v) => v instanceof Uint8Array);
export const BlankPdf = z.object({
width: z.number(),
height: z.number(),
padding: z.tuple([z.number(), z.number(), z.number(), z.number()]),
staticSchema: z.array(Schema).optional(),
});
export const CustomPdf = z.union([z.string(), ArrayBufferSchema, Uint8ArraySchema]);
export const BasePdf = z.union([CustomPdf, BlankPdf]);
// Legacy keyed structure for BC - we convert to SchemaPageArray on import
export const LegacySchemaPageArray = z.array(z.record(Schema));
export const SchemaPageArray = z.array(z.array(Schema));
export const Template = z
.object({
schemas: SchemaPageArray,
basePdf: BasePdf,
pdfmeVersion: z.string().optional(),
})
.passthrough();
export const Inputs = z.array(z.record(z.any())).min(1);
export const Font = z.record(
z.object({
data: z.union([z.string(), ArrayBufferSchema, Uint8ArraySchema]),
fallback: z.boolean().optional(),
subset: z.boolean().optional(),
}),
);
export const Plugin = z
.object({
ui: z.function().args(z.any()).returns(z.any()),
pdf: z.function().args(z.any()).returns(z.any()),
propPanel: z.object({
schema: z.unknown(),
widgets: z.record(z.any()).optional(),
defaultSchema: Schema,
}),
icon: z.string().optional(),
})
.passthrough();
export const CommonOptions = z.object({ font: Font.optional() }).passthrough();
const CommonProps = z.object({
template: Template,
options: CommonOptions.optional(),
plugins: z.record(Plugin).optional(),
});
// -------------------generate-------------------
export const GeneratorOptions = CommonOptions.extend({
colorType: ColorType,
author: z.string().optional(),
creationDate: z.date().optional(),
creator: z.string().optional(),
keywords: z.array(z.string()).optional(),
lang: Lang.optional(),
modificationDate: z.date().optional(),
producer: z.string().optional(),
subject: z.string().optional(),
title: z.string().optional(),
});
export const GenerateProps = CommonProps.extend({
inputs: Inputs,
options: GeneratorOptions.optional(),
}).strict();
// ---------------------ui------------------------
export const UIOptions = CommonOptions.extend({
lang: Lang.optional(),
labels: z.record(z.string(), z.string()).optional(),
theme: z.record(z.string(), z.unknown()).optional(),
icons: z.record(z.string(), z.string()).optional(),
requiredByDefault: z.boolean().optional(),
maxZoom: z.number().optional(),
sidebarOpen: z.boolean().optional(),
zoomLevel: z.number().optional(),
});
const HTMLElementSchema: z.ZodSchema<HTMLElement> = z.any().refine((v) => v instanceof HTMLElement);
export const UIProps = CommonProps.extend({
domContainer: HTMLElementSchema,
options: UIOptions.optional(),
});
export const PreviewProps = UIProps.extend({ inputs: Inputs }).strict();
export const DesignerProps = UIProps.extend({}).strict();