retail-print-kit 0.2.3 → 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.
- package/CHANGELOG.md +7 -0
- package/README.md +45 -1
- package/dist/label-design/builtins-data.d.ts +2 -0
- package/dist/label-design/builtins-data.js +1631 -0
- package/dist/label-design/builtins.d.ts +13 -0
- package/dist/label-design/builtins.js +124 -0
- package/dist/label-design/encode.d.ts +11 -0
- package/dist/label-design/encode.js +151 -0
- package/dist/label-design/fields.d.ts +30 -0
- package/dist/label-design/fields.js +115 -0
- package/dist/label-design/fonts.d.ts +6 -0
- package/dist/label-design/fonts.js +35 -0
- package/dist/label-design/image.d.ts +4 -0
- package/dist/label-design/image.js +48 -0
- package/dist/label-design/index.d.ts +12 -0
- package/dist/label-design/index.js +72 -0
- package/dist/label-design/printer-text.d.ts +12 -0
- package/dist/label-design/printer-text.js +18 -0
- package/dist/label-design/render.d.ts +30 -0
- package/dist/label-design/render.js +419 -0
- package/dist/label-design/types.d.ts +137 -0
- package/dist/label-design/types.js +2 -0
- package/dist/label-design/units.d.ts +5 -0
- package/dist/label-design/units.js +17 -0
- package/dist/label-design/validate.d.ts +15 -0
- package/dist/label-design/validate.js +97 -0
- package/dist/label-designer/designer.d.ts +26 -0
- package/dist/label-designer/designer.js +1311 -0
- package/dist/label-designer/index.d.ts +4 -0
- package/dist/label-designer/index.js +10 -0
- package/dist/label-designer/preview.d.ts +14 -0
- package/dist/label-designer/preview.js +73 -0
- package/dist/label-designer/styles.d.ts +1 -0
- package/dist/label-designer/styles.js +4 -0
- package/dist/label-fonts/FONTS.md +11 -0
- package/dist/label-fonts/archivo-narrow-400.woff2 +0 -0
- package/dist/label-fonts/archivo-narrow-700.woff2 +0 -0
- package/dist/label-fonts/archivo-narrow-OFL.txt +93 -0
- package/dist/label-fonts/arimo-400-italic.woff2 +0 -0
- package/dist/label-fonts/arimo-400.woff2 +0 -0
- package/dist/label-fonts/arimo-700.woff2 +0 -0
- package/dist/label-fonts/arimo-OFL.txt +93 -0
- package/dist/label-fonts/oswald-500.woff2 +0 -0
- package/dist/label-fonts/oswald-700.woff2 +0 -0
- package/dist/label-fonts/oswald-OFL.txt +93 -0
- package/dist/label-fonts/roboto-slab-400.woff2 +0 -0
- package/dist/label-fonts/roboto-slab-700.woff2 +0 -0
- package/dist/label-fonts/roboto-slab-LICENSE.txt +202 -0
- package/package.json +34 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DESIGN_LIMITS = void 0;
|
|
4
|
+
exports.imageError = imageError;
|
|
5
|
+
exports.elementError = elementError;
|
|
6
|
+
exports.validateDesign = validateDesign;
|
|
7
|
+
const base64_1 = require("../util/base64");
|
|
8
|
+
exports.DESIGN_LIMITS = {
|
|
9
|
+
maxBytes: 256 * 1024,
|
|
10
|
+
maxElements: 300,
|
|
11
|
+
valueMax: 1000,
|
|
12
|
+
sizeMm: [5, 300],
|
|
13
|
+
dpis: [203, 300, 600],
|
|
14
|
+
printers: ['ezpl', 'zpl'],
|
|
15
|
+
elementTypes: ['text', 'price', 'barcode', 'qr', 'box', 'fill', 'line', 'image'],
|
|
16
|
+
gapMm: [0, 20],
|
|
17
|
+
imageMaxDots: 2400
|
|
18
|
+
};
|
|
19
|
+
function isNumber(value) {
|
|
20
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
21
|
+
}
|
|
22
|
+
function isBase64(text) {
|
|
23
|
+
return text.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(text);
|
|
24
|
+
}
|
|
25
|
+
function imageError(image) {
|
|
26
|
+
if (!image || typeof image !== 'object' || Array.isArray(image))
|
|
27
|
+
return 'must be an object';
|
|
28
|
+
const { w, h } = image;
|
|
29
|
+
for (const side of [w, h]) {
|
|
30
|
+
if (!Number.isInteger(side) || side < 1 || side > exports.DESIGN_LIMITS.imageMaxDots)
|
|
31
|
+
return `must be 1 to ${exports.DESIGN_LIMITS.imageMaxDots} dots wide and high`;
|
|
32
|
+
}
|
|
33
|
+
const bits = String(image.bits ?? '');
|
|
34
|
+
if (!isBase64(bits))
|
|
35
|
+
return 'has bits that are not base64';
|
|
36
|
+
if ((0, base64_1.fromBase64)(bits).length !== Math.ceil(w / 8) * h)
|
|
37
|
+
return 'has bits that do not match its size';
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function elementError(element, index, widthMm, heightMm) {
|
|
41
|
+
const where = `element ${index + 1}`;
|
|
42
|
+
if (!element || typeof element !== 'object' || Array.isArray(element))
|
|
43
|
+
return `${where} must be an object`;
|
|
44
|
+
if (!exports.DESIGN_LIMITS.elementTypes.includes(element.type))
|
|
45
|
+
return `${where} has an unknown type`;
|
|
46
|
+
for (const key of ['x', 'y', 'w', 'h']) {
|
|
47
|
+
if (!isNumber(element[key]))
|
|
48
|
+
return `${where} needs a number for ${key}`;
|
|
49
|
+
}
|
|
50
|
+
if (element.w < 0 || element.h < 0)
|
|
51
|
+
return `${where} cannot have a negative size`;
|
|
52
|
+
if (element.x < -widthMm || element.x > widthMm || element.y < -heightMm || element.y > heightMm)
|
|
53
|
+
return `${where} is placed outside the label`;
|
|
54
|
+
if (element.w > 2 * widthMm || element.h > 2 * heightMm)
|
|
55
|
+
return `${where} is larger than the label`;
|
|
56
|
+
const value = element.value;
|
|
57
|
+
if (value !== undefined && value !== null && (typeof value !== 'string' || value.length > exports.DESIGN_LIMITS.valueMax))
|
|
58
|
+
return `${where} has a value that is not text or is too long`;
|
|
59
|
+
if ('image' in element) {
|
|
60
|
+
const problem = imageError(element.image);
|
|
61
|
+
if (problem)
|
|
62
|
+
return `${where} has an image that ${problem}`;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/** The first reason a design cannot be saved or printed, or null when it is fine. */
|
|
67
|
+
function validateDesign(design) {
|
|
68
|
+
if (!design || typeof design !== 'object' || Array.isArray(design))
|
|
69
|
+
return 'design must be an object';
|
|
70
|
+
if (design.version !== 1 || design.kind !== 'label')
|
|
71
|
+
return 'design must be a version 1 label';
|
|
72
|
+
const [minMm, maxMm] = exports.DESIGN_LIMITS.sizeMm;
|
|
73
|
+
for (const key of ['widthMm', 'heightMm']) {
|
|
74
|
+
const size = design[key];
|
|
75
|
+
if (!isNumber(size) || size < minMm || size > maxMm)
|
|
76
|
+
return `${key} must be between ${minMm} and ${maxMm} mm`;
|
|
77
|
+
}
|
|
78
|
+
if (!exports.DESIGN_LIMITS.dpis.includes(design.dpi))
|
|
79
|
+
return `dpi must be one of ${exports.DESIGN_LIMITS.dpis.join(', ')}`;
|
|
80
|
+
if (design.printer !== undefined && design.printer !== null && !exports.DESIGN_LIMITS.printers.includes(design.printer))
|
|
81
|
+
return 'printer must be ezpl or zpl';
|
|
82
|
+
const gap = design.gapMm === undefined ? 0 : design.gapMm;
|
|
83
|
+
if (!isNumber(gap) || gap < exports.DESIGN_LIMITS.gapMm[0] || gap > exports.DESIGN_LIMITS.gapMm[1])
|
|
84
|
+
return 'gapMm must be between 0 and 20';
|
|
85
|
+
if (!Array.isArray(design.elements))
|
|
86
|
+
return 'design elements must be a list';
|
|
87
|
+
if (design.elements.length > exports.DESIGN_LIMITS.maxElements)
|
|
88
|
+
return `a label can have at most ${exports.DESIGN_LIMITS.maxElements} elements`;
|
|
89
|
+
for (let i = 0; i < design.elements.length; i++) {
|
|
90
|
+
const problem = elementError(design.elements[i], i, design.widthMm, design.heightMm);
|
|
91
|
+
if (problem)
|
|
92
|
+
return problem;
|
|
93
|
+
}
|
|
94
|
+
if (JSON.stringify(design).length > exports.DESIGN_LIMITS.maxBytes)
|
|
95
|
+
return 'design is too large';
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LabelDesign } from '../label-design';
|
|
2
|
+
export interface LabelItemSource {
|
|
3
|
+
search?(query: string): Promise<any[]>;
|
|
4
|
+
page?(offset: number, limit: number): Promise<{
|
|
5
|
+
items: any[];
|
|
6
|
+
total: number;
|
|
7
|
+
storeName?: string;
|
|
8
|
+
} | null>;
|
|
9
|
+
}
|
|
10
|
+
export interface LabelDesignerElement extends HTMLElement {
|
|
11
|
+
design: LabelDesign | null;
|
|
12
|
+
name: string;
|
|
13
|
+
readOnly: boolean;
|
|
14
|
+
fontsUrl: string;
|
|
15
|
+
itemSource: LabelItemSource | null;
|
|
16
|
+
storeName: string;
|
|
17
|
+
error: string;
|
|
18
|
+
readonly dirty: boolean;
|
|
19
|
+
getDesign(): LabelDesign | null;
|
|
20
|
+
markSaved(): void;
|
|
21
|
+
requestSave(): void;
|
|
22
|
+
undo(): void;
|
|
23
|
+
redo(): void;
|
|
24
|
+
useSample(item: any): void;
|
|
25
|
+
}
|
|
26
|
+
export declare function defineLabelDesigner(tag?: string): void;
|