@plevands/epson-thermal-printer 0.1.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 @@
1
+ {"version":3,"file":"index.cjs","names":["intervalId: ReturnType<typeof setInterval> | null","DEFAULT_CONFIG: EpsonPrinterConfig"],"sources":["../src/hooks/useEpsonPrinter.ts","../src/hooks/usePrinterConfig.ts","../src/hooks/usePdfProcessor.ts"],"sourcesContent":["/**\n * React hook for Epson printer operations\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { EposPrintService, checkEpsonSDKStatus } from '../lib/epos-print';\nimport type { \n EpsonPrinterConfig, \n PrintResult, \n PrintOptions,\n UseEpsonPrinterReturn,\n PrinterStatus,\n} from '../types';\n\nexport function useEpsonPrinter(\n config: EpsonPrinterConfig,\n options?: PrintOptions\n): UseEpsonPrinterReturn {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [sdkStatus, setSdkStatus] = useState<PrinterStatus>({\n loaded: false,\n loading: false,\n error: null,\n classes: [],\n });\n\n // Check SDK status periodically until loaded\n useEffect(() => {\n let intervalId: ReturnType<typeof setInterval> | null = null;\n \n const checkStatus = () => {\n const status = checkEpsonSDKStatus();\n setSdkStatus(status);\n \n // Stop checking once SDK is loaded\n if (status.loaded && intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n \n // Initial check\n const initialStatus = checkEpsonSDKStatus();\n setSdkStatus(initialStatus);\n \n // Only start interval if SDK is not loaded yet\n if (!initialStatus.loaded) {\n intervalId = setInterval(checkStatus, 1000);\n }\n\n return () => {\n if (intervalId !== null) {\n clearInterval(intervalId);\n }\n };\n }, []); // Empty deps - only run on mount\n\n const print = useCallback(\n async (canvas: HTMLCanvasElement): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n const result = await service.printCanvas(canvas);\n\n if (!result.success) {\n setError(result.message || 'Print failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n },\n [config, options]\n );\n\n const printPages = useCallback(\n async (\n canvases: HTMLCanvasElement[],\n pageOptions?: {\n pageSelection?: 'all' | number[];\n headerText?: string;\n footerText?: string;\n }\n ): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n\n // Filter canvases based on page selection\n let selectedCanvases = canvases;\n if (pageOptions?.pageSelection && pageOptions.pageSelection !== 'all') {\n selectedCanvases = pageOptions.pageSelection\n .map(pageNum => canvases[pageNum - 1])\n .filter(Boolean);\n }\n\n const result = await service.printPages(selectedCanvases, {\n header: pageOptions?.headerText,\n footer: pageOptions?.footerText,\n });\n\n if (!result.success) {\n setError(result.message || 'Print failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n },\n [config, options]\n );\n\n const testConnection = useCallback(async (): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n \n // Use the service's testConnection method which prints a test receipt\n const result = await service.testConnection();\n\n if (!result.success) {\n setError(result.message || 'Connection test failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n }, [config, options]);\n\n return {\n print,\n printPages,\n testConnection,\n isLoading,\n error,\n sdkStatus,\n };\n}\n","/**\n * React hook for managing printer configuration with localStorage persistence\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { EpsonPrinterConfig, UsePrinterConfigReturn } from '../types';\nimport { error } from '../lib/logger';\n\nconst STORAGE_KEY = 'epson-printer-config';\n\nconst DEFAULT_CONFIG: EpsonPrinterConfig = {\n printerIP: '192.168.1.100',\n printerPort: 80,\n deviceId: 'local_printer',\n timeout: 60000,\n};\n\nexport function usePrinterConfig(): UsePrinterConfigReturn {\n const [config, setConfig] = useState<EpsonPrinterConfig>(() => {\n // Load from localStorage on mount\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n return { ...DEFAULT_CONFIG, ...JSON.parse(stored) };\n }\n } catch (err) {\n error('Failed to load printer config from localStorage:', err);\n }\n return DEFAULT_CONFIG;\n });\n\n // Save to localStorage whenever config changes\n useEffect(() => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(config));\n } catch (err) {\n error('Failed to save printer config to localStorage:', err);\n }\n }, [config]);\n\n const updateConfig = useCallback((newConfig: Partial<EpsonPrinterConfig>) => {\n setConfig(prev => ({ ...prev, ...newConfig }));\n }, []);\n\n const resetConfig = useCallback(() => {\n setConfig(DEFAULT_CONFIG);\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch (err) {\n error('Failed to remove printer config from localStorage:', err);\n }\n }, []);\n\n const isConfigured = Boolean(\n config.printerIP && \n config.printerIP.trim() !== '' && \n config.printerIP !== '0.0.0.0'\n );\n\n return {\n config,\n updateConfig,\n resetConfig,\n isConfigured,\n };\n}\n","/**\n * React hook for PDF processing operations\n */\n\nimport { useState, useCallback } from 'react';\nimport { processPdfFile } from '../lib/pdf-processor';\nimport type { \n PdfProcessingConfig, \n ProcessedPage,\n UsePdfProcessorReturn,\n} from '../types';\n\nexport function usePdfProcessor(\n config?: PdfProcessingConfig\n): UsePdfProcessorReturn {\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const processFile = useCallback(\n async (file: File): Promise<ProcessedPage[]> => {\n setIsProcessing(true);\n setError(null);\n\n try {\n const pages = await processPdfFile(file, config);\n return pages;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to process PDF';\n setError(errorMessage);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n },\n [config]\n );\n\n return {\n processFile,\n isProcessing,\n error,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @plevands/epson-thermal-printer
3
+ * Main library exports
4
+ */
5
+ export { EposPrintService, checkEpsonSDKStatus } from './lib/epos-print';
6
+ export { loadEpsonSDK, isEpsonSDKLoaded, initializeEpsonSDK, getEpsonSDK, getLoaderState, resetLoaderState, } from './lib/epson-sdk-loader';
7
+ export { processPdfPage, processPdfFile, DEFAULT_PDF_CONFIG, } from './lib/pdf-processor';
8
+ export { configureLogger, getLoggerConfig } from './lib/logger';
9
+ export { useEpsonPrinter } from './hooks/useEpsonPrinter';
10
+ export { usePrinterConfig } from './hooks/usePrinterConfig';
11
+ export { usePdfProcessor } from './hooks/usePdfProcessor';
12
+ export type { EpsonPrinterConfig, PrintResult, PrintOptions, PdfProcessingConfig, ProcessedPage, LoaderState, SDKLoadOptions, InitializeSDKResult, PrinterStatus, UseEpsonPrinterReturn, UsePrinterConfigReturn, UsePdfProcessorReturn, LogLevel, LogEntry, LoggerConfig, } from './types';
package/dist/index.js ADDED
@@ -0,0 +1,140 @@
1
+ import { a as checkEpsonSDKStatus, c as initializeEpsonSDK, d as resetLoaderState, f as configureLogger, h as getLoggerConfig, i as EposPrintService, l as isEpsonSDKLoaded, m as error, n as processPdfFile, o as getEpsonSDK, r as processPdfPage, s as getLoaderState, t as DEFAULT_PDF_CONFIG, u as loadEpsonSDK } from "./pdf-processor-B7cA9poK.js";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ function useEpsonPrinter(m, h) {
4
+ let [g, _] = useState(!1), [v, y] = useState(null), [b, x] = useState({
5
+ loaded: !1,
6
+ loading: !1,
7
+ error: null,
8
+ classes: []
9
+ });
10
+ return useEffect(() => {
11
+ let m = null, h = () => {
12
+ let h = checkEpsonSDKStatus();
13
+ x(h), h.loaded && m !== null && (clearInterval(m), m = null);
14
+ }, g = checkEpsonSDKStatus();
15
+ return x(g), g.loaded || (m = setInterval(h, 1e3)), () => {
16
+ m !== null && clearInterval(m);
17
+ };
18
+ }, []), {
19
+ print: useCallback(async (e) => {
20
+ _(!0), y(null);
21
+ try {
22
+ let g = await new EposPrintService(m, h).printCanvas(e);
23
+ return g.success || y(g.message || "Print failed"), g;
24
+ } catch (e) {
25
+ let m = e instanceof Error ? e.message : "Unknown error";
26
+ return y(m), {
27
+ success: !1,
28
+ code: "ERROR",
29
+ message: m
30
+ };
31
+ } finally {
32
+ _(!1);
33
+ }
34
+ }, [m, h]),
35
+ printPages: useCallback(async (e, g) => {
36
+ _(!0), y(null);
37
+ try {
38
+ let _ = new EposPrintService(m, h), v = e;
39
+ g?.pageSelection && g.pageSelection !== "all" && (v = g.pageSelection.map((m) => e[m - 1]).filter(Boolean));
40
+ let b = await _.printPages(v, {
41
+ header: g?.headerText,
42
+ footer: g?.footerText
43
+ });
44
+ return b.success || y(b.message || "Print failed"), b;
45
+ } catch (e) {
46
+ let m = e instanceof Error ? e.message : "Unknown error";
47
+ return y(m), {
48
+ success: !1,
49
+ code: "ERROR",
50
+ message: m
51
+ };
52
+ } finally {
53
+ _(!1);
54
+ }
55
+ }, [m, h]),
56
+ testConnection: useCallback(async () => {
57
+ _(!0), y(null);
58
+ try {
59
+ let e = await new EposPrintService(m, h).testConnection();
60
+ return e.success || y(e.message || "Connection test failed"), e;
61
+ } catch (e) {
62
+ let m = e instanceof Error ? e.message : "Unknown error";
63
+ return y(m), {
64
+ success: !1,
65
+ code: "ERROR",
66
+ message: m
67
+ };
68
+ } finally {
69
+ _(!1);
70
+ }
71
+ }, [m, h]),
72
+ isLoading: g,
73
+ error: v,
74
+ sdkStatus: b
75
+ };
76
+ }
77
+ var STORAGE_KEY = "epson-printer-config", DEFAULT_CONFIG = {
78
+ printerIP: "192.168.1.100",
79
+ printerPort: 80,
80
+ deviceId: "local_printer",
81
+ timeout: 6e4
82
+ };
83
+ function usePrinterConfig() {
84
+ let [e, m] = useState(() => {
85
+ try {
86
+ let e = localStorage.getItem(STORAGE_KEY);
87
+ if (e) return {
88
+ ...DEFAULT_CONFIG,
89
+ ...JSON.parse(e)
90
+ };
91
+ } catch (e) {
92
+ error("Failed to load printer config from localStorage:", e);
93
+ }
94
+ return DEFAULT_CONFIG;
95
+ });
96
+ return useEffect(() => {
97
+ try {
98
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(e));
99
+ } catch (e) {
100
+ error("Failed to save printer config to localStorage:", e);
101
+ }
102
+ }, [e]), {
103
+ config: e,
104
+ updateConfig: useCallback((e) => {
105
+ m((m) => ({
106
+ ...m,
107
+ ...e
108
+ }));
109
+ }, []),
110
+ resetConfig: useCallback(() => {
111
+ m(DEFAULT_CONFIG);
112
+ try {
113
+ localStorage.removeItem(STORAGE_KEY);
114
+ } catch (e) {
115
+ error("Failed to remove printer config from localStorage:", e);
116
+ }
117
+ }, []),
118
+ isConfigured: !!(e.printerIP && e.printerIP.trim() !== "" && e.printerIP !== "0.0.0.0")
119
+ };
120
+ }
121
+ function usePdfProcessor(e) {
122
+ let [m, h] = useState(!1), [g, _] = useState(null);
123
+ return {
124
+ processFile: useCallback(async (m) => {
125
+ h(!0), _(null);
126
+ try {
127
+ return await processPdfFile(m, e);
128
+ } catch (e) {
129
+ throw _(e instanceof Error ? e.message : "Failed to process PDF"), e;
130
+ } finally {
131
+ h(!1);
132
+ }
133
+ }, [e]),
134
+ isProcessing: m,
135
+ error: g
136
+ };
137
+ }
138
+ export { DEFAULT_PDF_CONFIG, EposPrintService, checkEpsonSDKStatus, configureLogger, getEpsonSDK, getLoaderState, getLoggerConfig, initializeEpsonSDK, isEpsonSDKLoaded, loadEpsonSDK, processPdfFile, processPdfPage, resetLoaderState, useEpsonPrinter, usePdfProcessor, usePrinterConfig };
139
+
140
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["intervalId: ReturnType<typeof setInterval> | null","DEFAULT_CONFIG: EpsonPrinterConfig"],"sources":["../src/hooks/useEpsonPrinter.ts","../src/hooks/usePrinterConfig.ts","../src/hooks/usePdfProcessor.ts"],"sourcesContent":["/**\n * React hook for Epson printer operations\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { EposPrintService, checkEpsonSDKStatus } from '../lib/epos-print';\nimport type { \n EpsonPrinterConfig, \n PrintResult, \n PrintOptions,\n UseEpsonPrinterReturn,\n PrinterStatus,\n} from '../types';\n\nexport function useEpsonPrinter(\n config: EpsonPrinterConfig,\n options?: PrintOptions\n): UseEpsonPrinterReturn {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [sdkStatus, setSdkStatus] = useState<PrinterStatus>({\n loaded: false,\n loading: false,\n error: null,\n classes: [],\n });\n\n // Check SDK status periodically until loaded\n useEffect(() => {\n let intervalId: ReturnType<typeof setInterval> | null = null;\n \n const checkStatus = () => {\n const status = checkEpsonSDKStatus();\n setSdkStatus(status);\n \n // Stop checking once SDK is loaded\n if (status.loaded && intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n \n // Initial check\n const initialStatus = checkEpsonSDKStatus();\n setSdkStatus(initialStatus);\n \n // Only start interval if SDK is not loaded yet\n if (!initialStatus.loaded) {\n intervalId = setInterval(checkStatus, 1000);\n }\n\n return () => {\n if (intervalId !== null) {\n clearInterval(intervalId);\n }\n };\n }, []); // Empty deps - only run on mount\n\n const print = useCallback(\n async (canvas: HTMLCanvasElement): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n const result = await service.printCanvas(canvas);\n\n if (!result.success) {\n setError(result.message || 'Print failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n },\n [config, options]\n );\n\n const printPages = useCallback(\n async (\n canvases: HTMLCanvasElement[],\n pageOptions?: {\n pageSelection?: 'all' | number[];\n headerText?: string;\n footerText?: string;\n }\n ): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n\n // Filter canvases based on page selection\n let selectedCanvases = canvases;\n if (pageOptions?.pageSelection && pageOptions.pageSelection !== 'all') {\n selectedCanvases = pageOptions.pageSelection\n .map(pageNum => canvases[pageNum - 1])\n .filter(Boolean);\n }\n\n const result = await service.printPages(selectedCanvases, {\n header: pageOptions?.headerText,\n footer: pageOptions?.footerText,\n });\n\n if (!result.success) {\n setError(result.message || 'Print failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n },\n [config, options]\n );\n\n const testConnection = useCallback(async (): Promise<PrintResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = new EposPrintService(config, options);\n \n // Use the service's testConnection method which prints a test receipt\n const result = await service.testConnection();\n\n if (!result.success) {\n setError(result.message || 'Connection test failed');\n }\n\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n return {\n success: false,\n code: 'ERROR',\n message: errorMessage,\n };\n } finally {\n setIsLoading(false);\n }\n }, [config, options]);\n\n return {\n print,\n printPages,\n testConnection,\n isLoading,\n error,\n sdkStatus,\n };\n}\n","/**\n * React hook for managing printer configuration with localStorage persistence\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { EpsonPrinterConfig, UsePrinterConfigReturn } from '../types';\nimport { error } from '../lib/logger';\n\nconst STORAGE_KEY = 'epson-printer-config';\n\nconst DEFAULT_CONFIG: EpsonPrinterConfig = {\n printerIP: '192.168.1.100',\n printerPort: 80,\n deviceId: 'local_printer',\n timeout: 60000,\n};\n\nexport function usePrinterConfig(): UsePrinterConfigReturn {\n const [config, setConfig] = useState<EpsonPrinterConfig>(() => {\n // Load from localStorage on mount\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n return { ...DEFAULT_CONFIG, ...JSON.parse(stored) };\n }\n } catch (err) {\n error('Failed to load printer config from localStorage:', err);\n }\n return DEFAULT_CONFIG;\n });\n\n // Save to localStorage whenever config changes\n useEffect(() => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(config));\n } catch (err) {\n error('Failed to save printer config to localStorage:', err);\n }\n }, [config]);\n\n const updateConfig = useCallback((newConfig: Partial<EpsonPrinterConfig>) => {\n setConfig(prev => ({ ...prev, ...newConfig }));\n }, []);\n\n const resetConfig = useCallback(() => {\n setConfig(DEFAULT_CONFIG);\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch (err) {\n error('Failed to remove printer config from localStorage:', err);\n }\n }, []);\n\n const isConfigured = Boolean(\n config.printerIP && \n config.printerIP.trim() !== '' && \n config.printerIP !== '0.0.0.0'\n );\n\n return {\n config,\n updateConfig,\n resetConfig,\n isConfigured,\n };\n}\n","/**\n * React hook for PDF processing operations\n */\n\nimport { useState, useCallback } from 'react';\nimport { processPdfFile } from '../lib/pdf-processor';\nimport type { \n PdfProcessingConfig, \n ProcessedPage,\n UsePdfProcessorReturn,\n} from '../types';\n\nexport function usePdfProcessor(\n config?: PdfProcessingConfig\n): UsePdfProcessorReturn {\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const processFile = useCallback(\n async (file: File): Promise<ProcessedPage[]> => {\n setIsProcessing(true);\n setError(null);\n\n try {\n const pages = await processPdfFile(file, config);\n return pages;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to process PDF';\n setError(errorMessage);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n },\n [config]\n );\n\n return {\n processFile,\n isProcessing,\n error,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { epson } from './epson-sdk';
2
+ import { loadEpsonSDK, isEpsonSDKLoaded, getLoaderState, initializeEpsonSDK } from './epson-sdk-loader';
3
+ import { EpsonPrinterConfig, PrintResult, PrintOptions } from '../types';
4
+ export type { EpsonPrinterConfig, PrintResult, PrintOptions } from '../types';
5
+ export { loadEpsonSDK, isEpsonSDKLoaded, initializeEpsonSDK, getLoaderState, };
6
+ /**
7
+ * Check SDK status - useful for debugging
8
+ */
9
+ export declare function checkEpsonSDKStatus(): {
10
+ loaded: boolean;
11
+ loading: boolean;
12
+ error: Error | null;
13
+ classes: string[];
14
+ };
15
+ /**
16
+ * ePOS Print Service using official SDK
17
+ */
18
+ export declare class EposPrintService {
19
+ private config;
20
+ private printOptions;
21
+ private initPromise;
22
+ constructor(config: EpsonPrinterConfig, options?: PrintOptions);
23
+ /**
24
+ * Ensure SDK is loaded before any print operation (lazy loading)
25
+ */
26
+ private ensureSDKLoaded;
27
+ /**
28
+ * Get the printer URL for ePOS Print
29
+ */
30
+ private getPrinterUrl;
31
+ /**
32
+ * Print a canvas element using ePOSBuilder
33
+ *
34
+ * IMPORTANT: We don't use CanvasPrint.print() directly due to an SDK bug.
35
+ * The SDK's prototypal inheritance causes CanvasPrint.print() to call
36
+ * this.send(printjobid) which internally creates a new empty ePOSBuilder,
37
+ * ignoring all the commands built in 'this'.
38
+ *
39
+ * Instead, we use ePOSBuilder to construct the print commands manually,
40
+ * get the XML, and send it via ePOSPrint.send(xml).
41
+ */
42
+ printCanvas(canvas: HTMLCanvasElement): Promise<PrintResult>;
43
+ /**
44
+ * Get alignment value for SDK (instance property values are strings)
45
+ */
46
+ private getAlignValue;
47
+ /**
48
+ * Print using ePOSPrint with builder pattern
49
+ */
50
+ printWithBuilder(buildFn: (builder: epson.ePOSBuilder) => void): Promise<PrintResult>;
51
+ /**
52
+ * Print multiple canvases (pages) with optional header/footer
53
+ */
54
+ printPages(canvases: HTMLCanvasElement[], options?: {
55
+ header?: string;
56
+ footer?: string;
57
+ pageSeparator?: boolean;
58
+ }): Promise<PrintResult>;
59
+ /**
60
+ * Test printer connection
61
+ */
62
+ testConnection(): Promise<PrintResult>;
63
+ /**
64
+ * Print a test page
65
+ */
66
+ printTestPage(): Promise<PrintResult>;
67
+ }
68
+ /**
69
+ * PDF to Canvas conversion utilities
70
+ */
71
+ export declare function pdfToCanvases(pdfFile: File, options?: {
72
+ scale?: number;
73
+ maxWidth?: number;
74
+ }): Promise<{
75
+ canvas: HTMLCanvasElement;
76
+ width: number;
77
+ height: number;
78
+ }[]>;
79
+ /**
80
+ * Convert image file to canvas
81
+ */
82
+ export declare function imageToCanvas(file: File, maxWidth?: number): Promise<{
83
+ canvas: HTMLCanvasElement;
84
+ width: number;
85
+ height: number;
86
+ }>;
87
+ export declare class EposPrintBuilder {
88
+ private builder;
89
+ constructor();
90
+ reset(): this;
91
+ addText(text: string): this;
92
+ addTextLine(text: string): this;
93
+ addFeedLine(lines?: number): this;
94
+ addCut(type?: 'no_feed' | 'feed' | 'reserve'): this;
95
+ addTextAlign(align: 'left' | 'center' | 'right'): this;
96
+ addTextStyle(reverse?: boolean, underline?: boolean, bold?: boolean, color?: 'color_1' | 'color_2' | 'color_3' | 'color_4'): this;
97
+ addTextSize(width?: number, height?: number): this;
98
+ addImage(canvas: HTMLCanvasElement, mode?: 'mono' | 'gray16'): this;
99
+ addBarcode(data: string, type?: string, hri?: 'none' | 'above' | 'below' | 'both', width?: number, height?: number): this;
100
+ addQRCode(data: string, type?: 'model_1' | 'model_2' | 'micro', level?: 'level_l' | 'level_m' | 'level_q' | 'level_h', width?: number): this;
101
+ build(): string;
102
+ getBuilder(): epson.ePOSBuilder;
103
+ }
104
+ export declare function pdfToImages(pdfFile: File, options?: {
105
+ scale?: number;
106
+ maxWidth?: number;
107
+ }): Promise<{
108
+ images: string[];
109
+ width: number;
110
+ height: number;
111
+ }[]>;
112
+ export declare function imageToBase64(file: File): Promise<{
113
+ base64: string;
114
+ width: number;
115
+ height: number;
116
+ }>;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Dynamic loader for Epson ePOS SDK
3
+ * Implements singleton pattern to avoid multiple loads
4
+ */
5
+ interface LoaderState {
6
+ loading: boolean;
7
+ loaded: boolean;
8
+ error: Error | null;
9
+ promise: Promise<boolean> | null;
10
+ }
11
+ /**
12
+ * Check if SDK is already available in window
13
+ */
14
+ export declare function isEpsonSDKLoaded(): boolean;
15
+ /**
16
+ * Load Epson SDK dynamically (singleton pattern)
17
+ * Returns true if loaded successfully, false otherwise
18
+ */
19
+ export declare function loadEpsonSDK(options?: {
20
+ sdkPath?: string;
21
+ timeout?: number;
22
+ }): Promise<boolean>;
23
+ /**
24
+ * Get current loader state
25
+ */
26
+ export declare function getLoaderState(): Readonly<LoaderState>;
27
+ /**
28
+ * Reset loader state (useful for testing)
29
+ */
30
+ export declare function resetLoaderState(): void;
31
+ /**
32
+ * Get Epson SDK (throws if not loaded)
33
+ */
34
+ export declare function getEpsonSDK(): typeof window.epson;
35
+ /**
36
+ * Initialize SDK (optional - for eager loading)
37
+ */
38
+ export declare function initializeEpsonSDK(options?: {
39
+ sdkPath?: string;
40
+ timeout?: number;
41
+ }): Promise<{
42
+ success: boolean;
43
+ error?: string;
44
+ }>;
45
+ export {};
@@ -0,0 +1,29 @@
1
+ import { LoggerConfig } from '../types';
2
+ /**
3
+ * Configure the logger
4
+ * @param newConfig - Logger configuration options
5
+ */
6
+ export declare function configureLogger(newConfig: Partial<LoggerConfig>): void;
7
+ /**
8
+ * Get current logger configuration
9
+ */
10
+ export declare function getLoggerConfig(): Readonly<LoggerConfig>;
11
+ /**
12
+ * Log debug message (only when enabled)
13
+ */
14
+ export declare function debug(message: string, ...args: unknown[]): void;
15
+ /**
16
+ * Log warning message (only when enabled)
17
+ */
18
+ export declare function warn(message: string, ...args: unknown[]): void;
19
+ /**
20
+ * Log error message (always shown)
21
+ */
22
+ export declare function error(message: string, ...args: unknown[]): void;
23
+ export declare const logger: {
24
+ debug: typeof debug;
25
+ warn: typeof warn;
26
+ error: typeof error;
27
+ configure: typeof configureLogger;
28
+ getConfig: typeof getLoggerConfig;
29
+ };
@@ -0,0 +1,37 @@
1
+ import { PDFPageProxy } from 'pdfjs-dist';
2
+ export interface PdfProcessingConfig {
3
+ /** Enable PDF processing (trimming, scaling) */
4
+ enabled: boolean;
5
+ /** Margin settings for trimming white space */
6
+ trimMargins?: {
7
+ top?: number;
8
+ bottom?: number;
9
+ left?: number;
10
+ right?: number;
11
+ };
12
+ /** Target width for printer paper (576 for 80mm, 384 for 58mm) */
13
+ targetWidth?: number;
14
+ /** Rendering scale for quality (higher = better quality) */
15
+ scale?: number;
16
+ /** Threshold for monochrome conversion (0-255, lower = darker) */
17
+ monochromeThreshold?: number;
18
+ }
19
+ export interface ProcessedPage {
20
+ base64: string;
21
+ width: number;
22
+ height: number;
23
+ rasterBase64: string;
24
+ canvas: HTMLCanvasElement;
25
+ }
26
+ /**
27
+ * Default configuration for PDF processing
28
+ */
29
+ export declare const DEFAULT_PDF_CONFIG: Required<PdfProcessingConfig>;
30
+ /**
31
+ * Process a PDF page to canvas with optional trimming and scaling
32
+ */
33
+ export declare function processPdfPage(page: PDFPageProxy, config?: PdfProcessingConfig): Promise<ProcessedPage>;
34
+ /**
35
+ * Process all pages of a PDF file
36
+ */
37
+ export declare function processPdfFile(file: File, config?: PdfProcessingConfig): Promise<ProcessedPage[]>;