@sv-print/plugin-cloud 0.0.0-stage → 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,24 @@
1
+ import type { PluginConfig, TransitTicket } from "../types";
2
+ type Handler = (...args: any[]) => void;
3
+ export declare class TransitClient {
4
+ private host;
5
+ private socket;
6
+ private ticket;
7
+ private handlers;
8
+ constructor(config: PluginConfig);
9
+ private getIo;
10
+ private resolveBase;
11
+ private ensureNetworkPermission;
12
+ private attachHandlers;
13
+ on(event: string, fn: Handler): void;
14
+ off(event: string, fn?: Handler): void;
15
+ private waitFor;
16
+ emit(event: string, payload?: any): boolean;
17
+ connect(ticket: TransitTicket): Promise<any>;
18
+ getClients(timeout?: number): Promise<any[]>;
19
+ getPrinters(clientId?: string, timeout?: number): Promise<any[]>;
20
+ print(payload: any, timeout?: number): Promise<any>;
21
+ isConnected(): boolean;
22
+ disconnect(): void;
23
+ }
24
+ export {};
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ @charset "UTF-8";.svp-cloud-oauth-overlay{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:#00000073}.svp-cloud-oauth-box{width:420px;max-width:calc(100vw - 32px);height:620px;max-height:calc(100vh - 64px);display:flex;flex-direction:column;background:var(--color-base-100, #fff);color:var(--color-base-content, #1f2937);border-radius:6px;overflow:hidden;box-shadow:0 8px 30px #0000004d}.svp-cloud-oauth-head{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;font-size:14px;font-weight:600;border-bottom:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 12%,transparent)}.svp-cloud-oauth-close{border:none;background:transparent;font-size:20px;line-height:1;cursor:pointer;color:inherit}.svp-cloud-oauth-close:hover{opacity:.7}.svp-cloud-oauth-frame{flex:1;width:100%;border:none}.svp-cloud-auth-form{display:flex;flex-direction:column;gap:8px}.svp-cloud-auth-hint{margin:0;font-size:12px;opacity:.7}.svp-cloud-auth-input{width:100%;box-sizing:border-box;padding:6px 8px;font-size:12px;font-family:inherit;color:inherit;border-radius:4px;border:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 20%,transparent);background-color:var(--color-base-100, #fff)}.svp-cloud-auth-textarea{resize:vertical}.svp-cloud-auth-error{font-size:12px;color:var(--color-error, #ef4444);min-height:14px}.svp-cloud-auth-actions{display:flex;gap:8px}.svp-cloud-tc-box.svelte-1qg2qyu.svelte-1qg2qyu{width:80vw;max-width:1100px;height:78vh;display:flex;flex-direction:column;padding:14px 16px;background-color:var(--color-base-100, #fff);color:var(--color-base-content, #1f2937)}.svp-cloud-tc-head.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;align-items:center;gap:10px;padding-bottom:10px;border-bottom:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 12%,transparent)}.svp-cloud-tc-title.svelte-1qg2qyu.svelte-1qg2qyu{font-size:16px;font-weight:700}.tc-search-wrap.svelte-1qg2qyu.svelte-1qg2qyu{position:relative;margin-left:auto}.svp-cloud-tc-search.svelte-1qg2qyu.svelte-1qg2qyu{width:168px;height:26px;padding:0 24px 0 8px;font-size:12px}.tc-search-clear.svelte-1qg2qyu.svelte-1qg2qyu{position:absolute;top:50%;right:4px;transform:translateY(-50%);width:18px;height:18px;line-height:16px;border:none;border-radius:50%;background:transparent;color:inherit;opacity:.55;font-size:14px;cursor:pointer}.tc-search-clear.svelte-1qg2qyu.svelte-1qg2qyu:hover{opacity:1}.svp-cloud-tc-filters.svelte-1qg2qyu.svelte-1qg2qyu{padding:8px 0;display:flex;flex-direction:column;gap:6px;max-height:108px;overflow-y:auto}.tc-filter.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.tc-filter-label.svelte-1qg2qyu.svelte-1qg2qyu{font-size:12px;opacity:.7;margin-right:4px;flex:0 0 auto}.tc-chip.svelte-1qg2qyu.svelte-1qg2qyu{border:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 20%,transparent);background:transparent;color:inherit;font-size:12px;line-height:1;padding:4px 8px;border-radius:999px;cursor:pointer}.tc-chip.active.svelte-1qg2qyu.svelte-1qg2qyu{background:var(--color-primary, #409eff);color:var(--color-primary-content, #fff);border-color:transparent}.svp-cloud-tc-body.svelte-1qg2qyu.svelte-1qg2qyu{flex:1;min-height:0;overflow-y:auto;padding:4px 0}.svp-cloud-tc-grid.svelte-1qg2qyu.svelte-1qg2qyu{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.tc-card.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;flex-direction:column;border:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 12%,transparent);border-radius:6px;overflow:hidden;background:var(--color-base-200, #f7f7f7)}.tc-thumb.svelte-1qg2qyu.svelte-1qg2qyu{position:relative;height:150px;cursor:zoom-in;display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--color-base-300, #ededed)}.tc-thumb.svelte-1qg2qyu img.svelte-1qg2qyu{max-width:100%;max-height:100%;object-fit:contain}.tc-noimg.svelte-1qg2qyu.svelte-1qg2qyu{font-size:40px;opacity:.3}.tc-zoom.svelte-1qg2qyu.svelte-1qg2qyu{position:absolute;right:6px;bottom:6px;font-size:11px;padding:2px 6px;border-radius:4px;background:#00000080;color:#fff;opacity:0;transition:opacity .15s}.tc-thumb.svelte-1qg2qyu:hover .tc-zoom.svelte-1qg2qyu{opacity:1}.tc-meta.svelte-1qg2qyu.svelte-1qg2qyu{padding:8px 8px 4px;flex:1}.tc-name.svelte-1qg2qyu.svelte-1qg2qyu{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tc-tags.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.tc-tag.svelte-1qg2qyu.svelte-1qg2qyu{font-size:10px;line-height:1;padding:2px 5px;border-radius:3px;background:color-mix(in oklch,var(--color-primary, #409eff) 20%,transparent);color:var(--color-primary, #409eff)}.tc-tag.rec.svelte-1qg2qyu.svelte-1qg2qyu{background:color-mix(in oklch,#f59e0b 25%,transparent);color:#b45309}.tc-tag.paid.svelte-1qg2qyu.svelte-1qg2qyu{background:color-mix(in oklch,#ef4444 20%,transparent);color:#dc2626}.tc-tag.plain.svelte-1qg2qyu.svelte-1qg2qyu{background:color-mix(in oklch,var(--color-base-content, #1f2937) 10%,transparent);color:inherit;opacity:.75}.tc-actions.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:0 8px 8px}.tc-stats.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;gap:8px;font-size:11px;opacity:.65;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tc-use.svelte-1qg2qyu.svelte-1qg2qyu{flex:0 0 auto}.svp-cloud-tc-foot.svelte-1qg2qyu.svelte-1qg2qyu{display:flex;align-items:center;justify-content:center;gap:12px;padding-top:8px;border-top:1px solid color-mix(in oklch,var(--color-base-content, #1f2937) 12%,transparent)}.tc-page.svelte-1qg2qyu.svelte-1qg2qyu{font-size:12px;opacity:.75}.svp-cloud-tc-preview.svelte-1qg2qyu.svelte-1qg2qyu{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;background:#000c;cursor:zoom-out}.svp-cloud-tc-preview.svelte-1qg2qyu img.svelte-1qg2qyu{max-width:92vw;max-height:92vh;object-fit:contain}.svp-cloud-tc-preview-close.svelte-1qg2qyu.svelte-1qg2qyu{position:absolute;top:16px;right:16px;border:none;background:transparent;color:#fff;font-size:24px;cursor:pointer}.cloud-layout.svelte-qx44lr.svelte-qx44lr{display:flex;gap:12px;flex:1;min-height:0;overflow:hidden}.cloud-sidebar.svelte-qx44lr.svelte-qx44lr{width:130px;flex-shrink:0;height:100%;overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding:4px 10px 4px 0;border-right:1px solid color-mix(in oklch,var(--color-base-content) 12%,transparent)}.cloud-status-bar.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:6px;padding:6px 8px;margin-bottom:8px;border-radius:6px;background-color:color-mix(in oklch,var(--color-base-content) 5%,transparent);font-size:12px}.cloud-status-dot.svelte-qx44lr.svelte-qx44lr{width:8px;height:8px;border-radius:50%;flex-shrink:0;display:inline-block}.cloud-status-dot.dot-on.svelte-qx44lr.svelte-qx44lr{background-color:var(--color-success, #22c55e);box-shadow:0 0 4px var(--color-success, #22c55e)}.cloud-status-dot.dot-off.svelte-qx44lr.svelte-qx44lr{background-color:var(--color-error, #ef4444)}.cloud-status-text.svelte-qx44lr.svelte-qx44lr{color:color-mix(in oklch,var(--color-base-content) 80%,transparent)}.cloud-nav-item.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:6px;padding:8px 10px;border:none;background:transparent;color:color-mix(in oklch,var(--color-base-content) 65%,transparent);font-size:13px;cursor:pointer;border-radius:6px;transition:background-color .15s ease,color .15s ease;text-align:left}.cloud-nav-item.svelte-qx44lr.svelte-qx44lr:hover{background-color:color-mix(in oklch,var(--color-base-content) 6%,transparent);color:var(--color-base-content)}.cloud-nav-active.svelte-qx44lr.svelte-qx44lr{background-color:color-mix(in oklch,var(--color-primary, #409eff) 10%,transparent);color:var(--color-primary, #409eff);font-weight:600}.cloud-content.svelte-qx44lr.svelte-qx44lr{flex:1;min-width:0;min-height:0;overflow-y:auto;padding:4px 8px 4px 4px}.svp-spin.svelte-qx44lr.svelte-qx44lr{animation:svelte-qx44lr-cloud-spin .8s linear infinite;display:inline-block}@keyframes svelte-qx44lr-cloud-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.cloud-client-box.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:10px;padding:10px 12px;margin-bottom:12px;border-radius:8px;border:1px solid color-mix(in oklch,var(--color-primary) 20%,transparent);background-color:color-mix(in oklch,var(--color-primary) 4%,transparent)}.cloud-client-box.svelte-qx44lr>.svicon.svelte-qx44lr{font-size:18px;color:var(--color-primary, #409eff)}.cloud-client-info.svelte-qx44lr.svelte-qx44lr{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.cloud-client-name.svelte-qx44lr.svelte-qx44lr{font-size:13px;font-weight:600}.cloud-client-id.svelte-qx44lr.svelte-qx44lr{font-size:11px;opacity:.6}.cloud-user-box.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;background-color:color-mix(in oklch,var(--color-base-content) 4%,transparent);border:1px solid color-mix(in oklch,var(--color-base-content) 8%,transparent)}.cloud-avatar.svelte-qx44lr.svelte-qx44lr,.cloud-avatar-icon.svelte-qx44lr.svelte-qx44lr{width:36px;height:36px;border-radius:50%;flex-shrink:0;object-fit:cover}.cloud-avatar-icon.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;justify-content:center;font-size:20px;background-color:color-mix(in oklch,var(--color-primary) 15%,transparent);color:var(--color-primary, #409eff)}.cloud-user-info.svelte-qx44lr.svelte-qx44lr{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.cloud-user-name.svelte-qx44lr.svelte-qx44lr{font-size:13px;font-weight:600}.cloud-user-sub.svelte-qx44lr.svelte-qx44lr{font-size:11px;opacity:.6}.cloud-login-box.svelte-qx44lr.svelte-qx44lr{padding:4px 0}.cloud-provider-tabs.svelte-qx44lr.svelte-qx44lr{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.cloud-provider-tab.svelte-qx44lr.svelte-qx44lr{padding:4px 10px;font-size:12px;cursor:pointer;border-radius:6px;border:1px solid color-mix(in oklch,var(--color-base-content) 15%,transparent);background:transparent;color:color-mix(in oklch,var(--color-base-content) 70%,transparent)}.cloud-provider-tab.svelte-qx44lr.svelte-qx44lr:hover:not(:disabled){border-color:var(--color-primary, #409eff);color:var(--color-primary, #409eff)}.cloud-provider-tab.active.svelte-qx44lr.svelte-qx44lr{border-color:var(--color-primary, #409eff);background-color:color-mix(in oklch,var(--color-primary, #409eff) 10%,transparent);color:var(--color-primary, #409eff);font-weight:600}.cloud-provider-tab.svelte-qx44lr.svelte-qx44lr:disabled{cursor:not-allowed;opacity:.6}.cloud-provider-warn.svelte-qx44lr.svelte-qx44lr{margin-left:2px;color:var(--color-warning, #f59e0b);font-weight:700}.cloud-search-row.svelte-qx44lr.svelte-qx44lr{display:flex;gap:8px;align-items:center;margin-bottom:10px}.cloud-tpl-list.svelte-qx44lr.svelte-qx44lr{display:flex;flex-direction:column;gap:6px}.cloud-tpl-item.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:6px;border:1px solid color-mix(in oklch,var(--color-base-content) 10%,transparent);background-color:color-mix(in oklch,var(--color-base-content) 3%,transparent)}.cloud-tpl-thumb.svelte-qx44lr.svelte-qx44lr{width:40px;height:40px;border-radius:4px;flex-shrink:0;display:flex;align-items:center;justify-content:center;overflow:hidden;background-color:color-mix(in oklch,var(--color-base-content) 8%,transparent)}.cloud-tpl-thumb.svelte-qx44lr img.svelte-qx44lr{width:100%;height:100%;object-fit:cover}.cloud-tpl-info.svelte-qx44lr.svelte-qx44lr{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.cloud-tpl-name.svelte-qx44lr.svelte-qx44lr{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cloud-tpl-meta.svelte-qx44lr.svelte-qx44lr{font-size:11px;opacity:.6}.cloud-device-list.svelte-qx44lr.svelte-qx44lr{display:flex;flex-direction:column;gap:6px}.cloud-device-item.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;border:1px solid color-mix(in oklch,var(--color-base-content) 12%,transparent);font-size:13px;cursor:pointer}.cloud-device-item.active.svelte-qx44lr.svelte-qx44lr{border-color:var(--color-primary, #409eff);background-color:color-mix(in oklch,var(--color-primary) 6%,transparent)}.cloud-device-name.svelte-qx44lr.svelte-qx44lr{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cloud-device-status.svelte-qx44lr.svelte-qx44lr{font-size:11px;opacity:.6}.cloud-table.svelte-qx44lr.svelte-qx44lr{width:100%;border-collapse:collapse;font-size:12px}.cloud-table.svelte-qx44lr thead th.svelte-qx44lr{text-align:left;padding:6px 8px;border-bottom:1px solid color-mix(in oklch,var(--color-base-content) 15%,transparent);font-weight:600;opacity:.65;white-space:nowrap}.cloud-table.svelte-qx44lr td.svelte-qx44lr{padding:6px 8px;border-bottom:1px solid color-mix(in oklch,var(--color-base-content) 6%,transparent);white-space:nowrap}.cloud-cell-ellipsis.svelte-qx44lr.svelte-qx44lr{max-width:140px;overflow:hidden;text-overflow:ellipsis}.cloud-cell-actions.svelte-qx44lr.svelte-qx44lr{display:flex;gap:4px}.cloud-kv.svelte-qx44lr.svelte-qx44lr{display:grid;grid-template-columns:110px 1fr;gap:6px 10px;font-size:12px;align-items:center;margin-bottom:10px}.cloud-kv.svelte-qx44lr span.svelte-qx44lr{opacity:.7}.cloud-kv.svelte-qx44lr code.svelte-qx44lr{font-size:12px;background:color-mix(in oklch,var(--color-base-content) 8%,transparent);padding:2px 6px;border-radius:4px;word-break:break-all}.cloud-checkbox-label.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:4px;font-size:13px;cursor:pointer}.cloud-loading.svelte-qx44lr.svelte-qx44lr{padding:16px;text-align:center;font-size:13px;opacity:.6}.cloud-msg.svelte-qx44lr.svelte-qx44lr{display:flex;align-items:center;gap:6px;font-size:12px;padding:6px 10px;border-radius:6px;margin-top:10px}.cloud-msg.msg-success.svelte-qx44lr.svelte-qx44lr{color:var(--color-success, #22c55e);background-color:color-mix(in oklch,var(--color-success, #22c55e) 8%,transparent)}.cloud-msg.msg-error.svelte-qx44lr.svelte-qx44lr{color:var(--color-error, #ef4444);background-color:color-mix(in oklch,var(--color-error, #ef4444) 8%,transparent)}.cloud-output.svelte-qx44lr.svelte-qx44lr{font-size:12px;max-height:240px;overflow:auto;padding:8px;margin-top:10px;border-radius:4px;background:color-mix(in oklch,var(--color-base-content) 6%,transparent);white-space:pre-wrap;word-break:break-all}.cloud-code.svelte-qx44lr.svelte-qx44lr{font-family:monospace;font-size:12px;padding:1px 5px;border-radius:4px;background-color:color-mix(in oklch,var(--color-base-content) 10%,transparent)}.cloud-render-frame.svelte-qx44lr.svelte-qx44lr{width:100%;height:420px;margin-top:10px;border:1px solid color-mix(in oklch,var(--color-base-content) 15%,transparent);border-radius:6px;background:#fff}.cloud-render-img.svelte-qx44lr.svelte-qx44lr{display:block;max-width:100%;max-height:420px;margin-top:10px;border:1px solid color-mix(in oklch,var(--color-base-content) 15%,transparent);border-radius:6px}.svp-badge.badge-on.svelte-qx44lr.svelte-qx44lr{color:var(--color-success, #22c55e);background-color:color-mix(in oklch,var(--color-success, #22c55e) 12%,transparent)}@media (max-width: 768px){.cloud-sidebar.svelte-qx44lr.svelte-qx44lr{width:80px}}
@@ -0,0 +1,239 @@
1
+ import type { AuthConfig, AuthProviderType, CloudTokenStorage } from "./lib/auth/types";
2
+ export interface ApiEnvelope<T = any> {
3
+ code: number;
4
+ msg?: string;
5
+ message?: string;
6
+ data: T;
7
+ isOk?: boolean;
8
+ statusCode?: number;
9
+ }
10
+ export type CloudRequestAdapter = (config: {
11
+ url: string;
12
+ method: string;
13
+ headers: Record<string, string>;
14
+ body?: any;
15
+ }) => Promise<ApiEnvelope>;
16
+ export interface OAuthTokenResult {
17
+ accessToken: string;
18
+ refreshToken?: string;
19
+ scope?: string[];
20
+ token_type?: string;
21
+ }
22
+ export interface OAuthClientInfo {
23
+ client_id: string;
24
+ client_name: string;
25
+ client_icon?: string | null;
26
+ require_consent?: boolean;
27
+ client_type?: number;
28
+ scopes?: Array<{
29
+ scope: string;
30
+ label?: string;
31
+ }>;
32
+ }
33
+ export type OAuthAuthorizeMode = "iframe" | "popup" | "page" | "custom";
34
+ export interface OAuthConfig {
35
+ authorizeOrigin: string;
36
+ mode?: OAuthAuthorizeMode;
37
+ authorize?: (url: string, state: string) => Promise<string>;
38
+ clientId: string;
39
+ clientSecret?: string;
40
+ redirectUri?: string;
41
+ scope?: string[] | string;
42
+ exchangeToken?: (code: string, state: string) => Promise<OAuthTokenResult>;
43
+ getProfileUrl?: string;
44
+ }
45
+ export interface CloudAuthProviderInfo {
46
+ id: string;
47
+ label: string;
48
+ canLogin: boolean;
49
+ }
50
+ export interface CloudAuthAPI {
51
+ readonly type: string;
52
+ readonly label: string;
53
+ readonly providers: CloudAuthProviderInfo[];
54
+ readonly activeId: string;
55
+ switchProvider(id: string): Promise<void>;
56
+ canLogin(): boolean;
57
+ isLoggedIn(): boolean;
58
+ getToken(): string | null;
59
+ login(): Promise<OAuthTokenResult>;
60
+ logout(): Promise<void>;
61
+ getUser(): Promise<any>;
62
+ getClientInfo(): Promise<OAuthClientInfo | null>;
63
+ onChange(fn: (token: OAuthTokenResult | null) => void): () => void;
64
+ }
65
+ export interface RenderOptions {
66
+ template?: any;
67
+ template_id?: number | string;
68
+ print_data?: any;
69
+ options?: Record<string, any>;
70
+ renderer_id?: number | string;
71
+ type?: "pdf" | "img" | "html";
72
+ sync?: boolean;
73
+ }
74
+ export interface RenderTask {
75
+ task_id: string | number;
76
+ status?: number | string;
77
+ file_url?: string;
78
+ file_path?: string;
79
+ ext?: string;
80
+ file_size?: number;
81
+ render_ms?: number;
82
+ total_ms?: number;
83
+ [key: string]: any;
84
+ }
85
+ export interface CloudDevice {
86
+ id?: number | string;
87
+ device_id?: string;
88
+ device_name?: string;
89
+ remark?: string;
90
+ status?: number;
91
+ [key: string]: any;
92
+ }
93
+ export interface CloudJob {
94
+ id?: number | string;
95
+ job_id?: string;
96
+ status?: number;
97
+ device_id?: string;
98
+ [key: string]: any;
99
+ }
100
+ export interface CloudPrintOptions {
101
+ device_id: string;
102
+ template_id?: number | string;
103
+ template_data?: any;
104
+ preview_data?: any;
105
+ print_type?: string;
106
+ print_options?: Record<string, any>;
107
+ remark?: string;
108
+ }
109
+ export interface TransitTicket {
110
+ ticket: string;
111
+ expires_in?: number;
112
+ namespace?: string;
113
+ }
114
+ export interface TransitClientInfo {
115
+ clientId: string;
116
+ clientType?: string;
117
+ ip?: string;
118
+ connectedAt?: string;
119
+ hostname?: string;
120
+ platform?: string;
121
+ printerList?: any[];
122
+ printerCount?: number;
123
+ [key: string]: any;
124
+ }
125
+ export interface TransitPrintOptions {
126
+ clientId?: string;
127
+ printer?: string;
128
+ template?: any;
129
+ preview_data?: any;
130
+ print_type?: string;
131
+ print_options?: string | Record<string, any>;
132
+ }
133
+ export interface PageResult<T = any> {
134
+ list: T[];
135
+ total: number;
136
+ page?: number;
137
+ pageSize?: number;
138
+ }
139
+ export interface TemplateItem {
140
+ template_id: number;
141
+ template_name: string;
142
+ preview_img?: string | null;
143
+ category_id?: number | null;
144
+ industry_id?: number | null;
145
+ category_name?: string | null;
146
+ industry_name?: string | null;
147
+ template_type?: number;
148
+ member_id?: number | null;
149
+ is_free?: boolean;
150
+ price?: number;
151
+ status?: number;
152
+ view_cnt?: number;
153
+ use_cnt?: number;
154
+ share_cnt?: number;
155
+ fav_cnt?: number;
156
+ is_recommend?: boolean;
157
+ created_time?: string;
158
+ category?: CategoryItem | null;
159
+ industry?: IndustryItem | null;
160
+ [key: string]: any;
161
+ }
162
+ export interface CategoryItem {
163
+ category_id: number;
164
+ parent_id?: number | null;
165
+ category_name: string;
166
+ category_img?: string | null;
167
+ category_sort?: number;
168
+ industry_id?: number | null;
169
+ industry_name?: string | null;
170
+ status?: number;
171
+ children?: CategoryItem[];
172
+ [key: string]: any;
173
+ }
174
+ export interface IndustryItem {
175
+ industry_id: number;
176
+ industry_name: string;
177
+ industry_code?: string;
178
+ industry_img?: string | null;
179
+ industry_sort?: number;
180
+ status?: number;
181
+ [key: string]: any;
182
+ }
183
+ export interface TemplateQuery {
184
+ keyword?: string;
185
+ category_id?: number | string;
186
+ industry_id?: number | string;
187
+ template_type?: string;
188
+ is_free?: boolean | number;
189
+ is_recommend?: boolean | number;
190
+ page?: number;
191
+ pageSize?: number;
192
+ }
193
+ export interface TemplateCenterMenuConfig {
194
+ enable?: boolean;
195
+ menuOrder?: number;
196
+ menuTitle?: string;
197
+ icon?: string;
198
+ }
199
+ export interface PluginConfig {
200
+ host?: string;
201
+ auth?: AuthConfig | AuthConfig[];
202
+ defaultAuth?: AuthProviderType;
203
+ autoLogin?: boolean;
204
+ storage?: CloudTokenStorage;
205
+ storageKey?: string;
206
+ enableSettingsTab?: boolean;
207
+ settingsTabSort?: number;
208
+ settingsTabShowConfig?: boolean;
209
+ templateCenter?: TemplateCenterMenuConfig;
210
+ templateCenterPageSize?: number;
211
+ requestAdapter?: CloudRequestAdapter;
212
+ }
213
+ export interface TemplateCenterAPI {
214
+ show: () => void;
215
+ hide: () => void;
216
+ toggle: () => void;
217
+ isOpen: () => boolean;
218
+ list: (query?: TemplateQuery) => Promise<PageResult<TemplateItem>>;
219
+ }
220
+ export interface CloudAPI {
221
+ render: (opts?: RenderOptions) => Promise<RenderTask>;
222
+ getRenderTask: (id: string | number) => Promise<RenderTask>;
223
+ cloudPrint: (opts: CloudPrintOptions) => Promise<CloudJob>;
224
+ getDevices: () => Promise<CloudDevice[]>;
225
+ getJobs: (params?: Record<string, any>) => Promise<PageResult<CloudJob>>;
226
+ cancelJob: (id: string | number) => Promise<any>;
227
+ retryJob: (id: string | number) => Promise<any>;
228
+ transitPrint: (opts?: TransitPrintOptions) => Promise<any>;
229
+ getTransitClients: () => Promise<TransitClientInfo[]>;
230
+ getTransitPrinters: (clientId?: string) => Promise<any[]>;
231
+ applyTemplate: (item: TemplateItem) => Promise<{
232
+ template_data: any;
233
+ preview_data: any;
234
+ }>;
235
+ useRandomTemplate: (query?: TemplateQuery) => Promise<TemplateItem>;
236
+ templateCenter: TemplateCenterAPI;
237
+ auth: CloudAuthAPI;
238
+ config: PluginConfig;
239
+ }
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "@sv-print/plugin-cloud",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "sv-print plugin: cloud (pluggable auth / server render / cloud print / transit / template center)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "svelte": "./dist/index.mjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.ts",
10
+ "jsdelivr": "./dist/index.umd.js",
11
+ "unpkg": "./dist/index.umd.js",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.mjs",
16
+ "require": "./dist/index.umd.js"
17
+ },
18
+ "./dist/style.css": {
19
+ "import": "./dist/style.css",
20
+ "require": "./dist/style.css"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "vite build && node scripts/emit-dts.js",
28
+ "build-browserify": "vite build --mode=browserify && node scripts/emit-dts.js",
29
+ "pub": "pnpm build && npm --registry https://registry.npmjs.org/ publish --access public",
30
+ "pub-beta": "pnpm build && pnpm --registry https://registry.npmjs.org/ publish --access public --tag beta"
31
+ },
32
+ "keywords": [
33
+ "sv-print",
34
+ "hiprint",
35
+ "cloud",
36
+ "oauth",
37
+ "template-center"
38
+ ],
39
+ "author": "CcSimple",
40
+ "license": "MIT",
41
+ "devDependencies": {
42
+ "sv-print": "^0.2.26",
43
+ "typescript": "^5.9.3",
44
+ "vite": "^5.4.11",
45
+ "@sveltejs/vite-plugin-svelte": "2.0.2",
46
+ "@tsconfig/svelte": "^3.0.0",
47
+ "interactjs": "^1.10.0",
48
+ "sass": "^1.53.0",
49
+ "svelte": "^3.55.0",
50
+ "svelte-preprocess": "^5.1.4",
51
+ "svelte2tsx": "^0.5.12"
52
+ },
53
+ "peerDependencies": {
54
+ "sv-print": ">=0.2.26 <0.3.0-0"
55
+ }
56
+ }