@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.
package/README.md CHANGED
@@ -1,3 +1,464 @@
1
- # Temporary Holding Version
1
+ # @sv-print/plugin-cloud
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 给 sv-print 设计器接入 sv-print-cloud 云端能力的插件。一个插件覆盖四件事:
4
+
5
+ - **可插拔登录**:内置 `oauth`(授权码)/ `token`(访问令牌)/ `host`(宿主托管)/ `local`(本地账号)四种登录方式,可同时配置多个,用户在设置面板「账户」中切换;`autoLogin: true` 可让启动时未登录时自动发起登录;业务层统一通过 `accessToken` 调用接口
6
+ - **服务端渲染**:把当前模板/数据提交到服务端渲染,产出 PDF / 图片 / HTML
7
+ - **云打印**:设备查询、任务下发 / 重试 / 取消、任务与日志查询
8
+ - **中转服务打印**:通过 Socket.IO `/transit` 命名空间直接把打印下发到本地中转客户端
9
+ - **模板中心**:设计器内浏览模板(行业 / 分类筛选 + 名称检索 + 大图预览 + 一键使用),无需登录即可浏览,使用需登录
10
+
11
+ 插件包含 UI 组件(模板中心弹窗、设置面板 tab),需要引入样式文件。
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ npm install @sv-print/plugin-cloud
17
+ ```
18
+
19
+ ```js
20
+ import "@sv-print/plugin-cloud/dist/style.css";
21
+ import pluginCloud from "@sv-print/plugin-cloud";
22
+
23
+ const plugins = [
24
+ pluginCloud({
25
+ // host 缺省时走当前站点 /api
26
+ auth: {
27
+ type: "oauth",
28
+ authorizeOrigin: "https://www.example.com",
29
+ clientId: "svprint-demo",
30
+ clientSecret: "8iJTOt1t7sJBlE4dSp6UOGOXOVJCsFKv", // 公共密钥,用于 开发联调、快速接入
31
+ scope: "print:template:read,member:cloud:job:write",
32
+ },
33
+ }),
34
+ ];
35
+ ```
36
+
37
+ ## 功能特性
38
+
39
+ - **四种登录方式(可多选配置,面板切换)**:
40
+ - `oauth` 授权码:打开 `{authorizeOrigin}/oauth/authorize`,监听 `postMessage`(`type: "sv-print-oauth"`)拿 `code`,校验 `origin` 与 `state` 后换取 token。`authorizeOrigin` 支持绝对域名,也支持 `/xxx/xxx` 相对路径(同源代理);`mode` 可选 `iframe`(默认,设计器内弹层)/ `popup`(独立小窗)/ `page`(新标签页)/ `custom`(自定义 `authorize` 回调)
41
+ - `token` 访问令牌:配置直给 `token`,或由设置面板粘贴写入,无交互式授权
42
+ - `host` 宿主托管:插件调用宿主 `getToken()` 取 token,完全不参与认证
43
+ - `local` 本地账号:设置面板账号密码表单 → 调宿主 `login(username, password)`
44
+ - **自动登录**:`autoLogin: true` 时,启动若未登录且配置完整会自动发起一次登录(仅初始生效的登录方式,`local` 需账号密码不参与)
45
+ - **OAuth 两种换 token 模式**:
46
+ - 前端直连:配置匿名接入方公共密钥 `clientSecret`,浏览器内直接 `POST /auth/member/oauth/token`(开发联调、快速接入)
47
+ - 宿主后端换取:配置 `exchangeToken(code, state)` 回调,`client_secret` 只在宿主服务端,插件只负责转交 `code`(生产安全)
48
+ - **统一 401 兜底**:任意业务请求返回 401 → 清空本地 token 并广播未登录,UI 自动回到登录入口
49
+ - **请求地址两种模式**:配置 `host` → 请求 `${host}/api/...`(跨域直连);缺省 → 请求 `/api/...`(由宿主前端代理 / 同源后端处理)
50
+ - **模板对象扩展**:`printTemplate.serverRender()` / `.cloudPrint()` / `.transitPrint()` / `.restoreCloud()`
51
+ - **运行时 API**:`designerUtils.cloud` 提供登录态 / 渲染 / 云打印 / 中转 / 模板中心全套能力
52
+ - **设置弹窗 tab**:在「设计器设置」中注入「云打印」tab,含登录/退出、配置查看与连通性测试按钮(可用 `enableSettingsTab` 关闭)
53
+ - **header 菜单**:自动在顶部菜单插入「模板中心」入口(可控制显隐、顺序、标题与图标)
54
+ - **模板中心弹窗**:行业/分类筛选 + 名称检索 + 分页;缩略图点击查看大图;「使用」未登录先触发登录,已登录确认后覆盖当前设计器
55
+
56
+ ## 配置项
57
+
58
+ ```ts
59
+ interface PluginConfig {
60
+ /** 服务端地址(不含 /api)。缺省 "" → 使用当前站点 /api 前端代理模式 */
61
+ host?: string;
62
+ /** 登录方式配置;可配多个(数组),运行时由用户在设置面板选择,缺省取第一个 */
63
+ auth?: AuthConfig | AuthConfig[];
64
+ /**
65
+ * 多登录方式时的默认方式 id。优先级:用户上次选择 > defaultAuth > 有凭据的方式 > 数组首项。
66
+ * 只在首次使用或偏好被清空时生效,之后由用户在设置面板的选择覆盖。
67
+ */
68
+ defaultAuth?: "oauth" | "token" | "host" | "local";
69
+ /**
70
+ * 启动时若未登录,是否自动发起登录,默认 false。
71
+ * 适用于 oauth / token / host;local 需账号密码,不参与自动登录。
72
+ * 多登录方式时作用于初始生效的那个。
73
+ */
74
+ autoLogin?: boolean;
75
+ /** 自定义 token 存储;不传则默认走 sv-print preferences store */
76
+ storage?: CloudTokenStorage;
77
+ /** 覆盖默认存储 key(默认 sv_print_cloud_auth_{providerId}) */
78
+ storageKey?: string;
79
+ /** 是否在设置弹窗添加「云打印」tab,默认 true */
80
+ enableSettingsTab?: boolean;
81
+ /** 设置面板 tab 排序,默认 2 */
82
+ settingsTabSort?: number;
83
+ /** 设置面板 是否显示连接配置,默认 true */
84
+ settingsTabShowConfig?: boolean;
85
+ /** 模板中心菜单配置 */
86
+ templateCenter?: TemplateCenterMenuConfig;
87
+ /** 模板中心每页数量,默认 12 */
88
+ templateCenterPageSize?: number;
89
+ /** 自定义请求适配器(覆盖默认 fetch),返回统一信封 */
90
+ requestAdapter?: CloudRequestAdapter;
91
+ }
92
+ ```
93
+
94
+ ### AuthConfig(登录方式)
95
+
96
+ 单个对象或数组均可:传数组时设置面板会出现登录方式切换(同 `type` 只保留第一个)。
97
+
98
+ ```ts
99
+ type AuthConfig =
100
+ | ({ type: "oauth" } & OAuthConfig)
101
+ | { type: "token"; token?: string }
102
+ | {
103
+ type: "host";
104
+ /** 从宿主获取当前 token,插件不参与认证 */
105
+ getToken: () => Promise<OAuthTokenResult> | OAuthTokenResult;
106
+ logout?: () => Promise<void>;
107
+ getUser?: () => Promise<any>;
108
+ getClientInfo?: () => Promise<OAuthClientInfo | null>;
109
+ }
110
+ | {
111
+ type: "local";
112
+ /** 宿主校验账号密码并返回 token(返回结果无 accessToken 视为失败) */
113
+ login: (username: string, password: string) => Promise<OAuthTokenResult>;
114
+ logout?: () => Promise<void>;
115
+ getUser?: () => Promise<any>;
116
+ /** 登录表单标题,默认「账号登录」 */
117
+ title?: string;
118
+ };
119
+
120
+ interface OAuthTokenResult {
121
+ accessToken: string;
122
+ refreshToken?: string;
123
+ scope?: string[];
124
+ token_type?: string;
125
+ }
126
+
127
+ /** token 存储抽象,可自定义(cookie / 加密存储等) */
128
+ interface CloudTokenStorage {
129
+ get(): OAuthTokenResult | null;
130
+ set(token: OAuthTokenResult | null): void;
131
+ }
132
+ ```
133
+
134
+ 内置三个存储实现,按需传入 `storage`:`preferencesTokenStorage(key)`(默认,走 sv-print 导出的 `preferences` store,底层 `localStorage: sv-print-preferences`)、`sessionStorageToken(key)`、`memoryStorageToken()`。
135
+
136
+ ### OAuthConfig(`auth.type === "oauth"`)
137
+
138
+ ```ts
139
+ interface OAuthConfig {
140
+ /**
141
+ * 授权页地址,最终访问 `${authorizeOrigin}/oauth/authorize`:
142
+ * - 绝对域名:如 https://www.example.com(跨域 iframe,按域名校验回传来源)
143
+ * - 相对路径:如 /web-user(同源代理前缀,按当前站点 origin 校验)
144
+ */
145
+ authorizeOrigin: string;
146
+ /**
147
+ * 授权页展示方式,默认 "iframe":
148
+ * - iframe:设计器内弹层嵌入授权页
149
+ * - popup:window.open 独立小窗
150
+ * - page:新标签页打开
151
+ * - custom:调用 authorize 回调,由接入方自行展示
152
+ * popup / page 取 code 有三条路径:授权页 postMessage 给 opener、
153
+ * 回调 redirect 回本站后由 opener 读取窗口地址、回调页经 localStorage 中转;
154
+ * 因此 redirect_uri 应落在会加载本插件的同源页面
155
+ */
156
+ mode?: "iframe" | "popup" | "page" | "custom";
157
+ /** mode=custom 时的自定义授权流程:自行展示授权页并 resolve 出 code */
158
+ authorize?: (url: string, state: string) => Promise<string>;
159
+ /** 接入方标识 */
160
+ clientId: string;
161
+ /** 匿名接入方公共密钥(前端直连模式);使用 exchangeToken 时可不传 */
162
+ clientSecret?: string;
163
+ /** 回调地址,默认 location.origin */
164
+ redirectUri?: string;
165
+ /** 申请权限,逗号分隔或数组 */
166
+ scope?: string[] | string;
167
+ /** 宿主后端换取 token(覆盖前端直连),client_secret 由宿主服务端持有 */
168
+ exchangeToken?: (code: string, state: string) => Promise<OAuthTokenResult>;
169
+ /** 已登录用户信息获取地址,默认 /auth/member/profile */
170
+ getProfileUrl?: string;
171
+ }
172
+ ```
173
+
174
+ 各登录方式示例:
175
+
176
+ ```js
177
+ // 授权登录 + 启动自动登录:未登录时自动弹出授权页
178
+ pluginCloud({
179
+ autoLogin: true, // 默认 false;开启后启动未登录会自动发起一次登录
180
+ auth: {
181
+ type: "oauth",
182
+ authorizeOrigin: "https://www.example.com",
183
+ clientId: "svprint-demo",
184
+ clientSecret: "匿名接入方公共密钥",
185
+ },
186
+ });
187
+
188
+ // 访问令牌:配置直给,启动即登录
189
+ pluginCloud({ auth: { type: "token", token: "eyJhbGciOi..." } });
190
+
191
+ // 宿主托管:token 由宿主持有(可随时刷新)
192
+ pluginCloud({
193
+ auth: {
194
+ type: "host",
195
+ getToken: () => hostSdk.getAccessToken(), // { accessToken, ... }
196
+ logout: () => hostSdk.logout(),
197
+ getUser: () => hostSdk.getCurrentUser(),
198
+ },
199
+ });
200
+
201
+ // 本地账号:设置面板账号密码表单
202
+ pluginCloud({
203
+ auth: {
204
+ type: "local",
205
+ title: "企业账号登录",
206
+ login: async (username, password) => {
207
+ const res = await fetch("/my-backend/login", {
208
+ method: "POST",
209
+ headers: { "Content-Type": "application/json" },
210
+ body: JSON.stringify({ username, password }),
211
+ });
212
+ return (await res.json()).data; // { accessToken, ... }
213
+ },
214
+ },
215
+ });
216
+
217
+ // 多种方式并存:设置面板「账户」顶部出现切换标签
218
+ pluginCloud({
219
+ auth: [
220
+ { type: "oauth", authorizeOrigin: "https://www.example.com", clientId: "svprint-demo" },
221
+ { type: "token" }, // 备用:面板粘贴访问令牌
222
+ ],
223
+ });
224
+ ```
225
+
226
+ 多方式并存时:
227
+
228
+ - 初始生效的选择顺序:用户上次选择 > `defaultAuth` > 已有凭据的方式 > 数组首项
229
+ - `defaultAuth` 指定默认方式(如 `defaultAuth: "host"`);用户手动切换过之后以其选择为准
230
+ - 各方式凭据独立存储(`sv_print_cloud_auth_{type}`),切换只换 token 来源,不清除其它方式的凭据
231
+ - 传入 `storageKey` 且配置了多个方式时,实际 key 为 `{storageKey}_{type}`
232
+
233
+ ### TemplateCenterMenuConfig
234
+
235
+ ```ts
236
+ interface TemplateCenterMenuConfig {
237
+ /** 是否添加模板中心菜单,默认 true */
238
+ enable?: boolean;
239
+ /** 菜单插入位置(索引,默认 0 最前;负数从末尾倒数,-1 = 末尾) */
240
+ menuOrder?: number;
241
+ /** 菜单标题,默认 "模板中心" */
242
+ menuTitle?: string;
243
+ /** 菜单图标 class,默认 "sv-templates" */
244
+ icon?: string;
245
+ }
246
+ ```
247
+
248
+ ## 运行时 API
249
+
250
+ 插件挂载后可通过 `designerUtils.cloud` 访问:
251
+
252
+ ```ts
253
+ interface CloudAPI {
254
+ // ---- 服务端渲染 ----
255
+ render(opts?: RenderOptions): Promise<RenderTask>;
256
+ getRenderTask(id: string | number): Promise<RenderTask>;
257
+
258
+ // ---- 云打印 ----
259
+ cloudPrint(opts: CloudPrintOptions): Promise<CloudJob>;
260
+ getDevices(): Promise<CloudDevice[]>;
261
+ getJobs(params?: Record<string, any>): Promise<PageResult<CloudJob>>;
262
+ cancelJob(id: string | number): Promise<any>;
263
+ retryJob(id: string | number): Promise<any>;
264
+
265
+ // ---- 中转打印 ----
266
+ transitPrint(opts?: TransitPrintOptions): Promise<any>;
267
+ getTransitClients(): Promise<TransitClientInfo[]>;
268
+ getTransitPrinters(clientId?: string): Promise<any[]>;
269
+
270
+ // ---- 模板中心 ----
271
+ templateCenter: {
272
+ show(): void;
273
+ hide(): void;
274
+ toggle(): void;
275
+ isOpen(): boolean;
276
+ list(query?: TemplateQuery): Promise<PageResult<TemplateItem>>;
277
+ };
278
+
279
+ // ---- 登录态(按配置的登录方式实现) ----
280
+ auth: {
281
+ readonly type: string; // 当前登录方式:"oauth" | "token" | "host" | "local"
282
+ readonly label: string; // 当前登录方式展示名
283
+ readonly providers: Array<{ id: string; label: string; canLogin: boolean }>;
284
+ readonly activeId: string;
285
+ switchProvider(id: string): Promise<void>;
286
+ canLogin(): boolean;
287
+ isLoggedIn(): boolean;
288
+ getToken(): string | null;
289
+ login(): Promise<OAuthTokenResult>;
290
+ logout(): Promise<void>;
291
+ getUser(): Promise<any>;
292
+ getClientInfo(): Promise<OAuthClientInfo | null>;
293
+ onChange(fn: (token: OAuthTokenResult | null) => void): () => void;
294
+ };
295
+
296
+ /** 插件配置(只读) */
297
+ config: PluginConfig;
298
+ }
299
+ ```
300
+
301
+ ### 调用示例
302
+
303
+ ```js
304
+ const cloud = designerUtils.cloud;
305
+
306
+ // 打开模板中心
307
+ cloud.templateCenter.show();
308
+ cloud.templateCenter.toggle();
309
+
310
+ // 直接用查询参数拉取模板列表(行业/分类/关键词)
311
+ const page = await cloud.templateCenter.list({ keyword: "发票", industry_id: 2, page: 1 });
312
+
313
+ // 应用指定模板:同时更新模板 JSON 与打印数据(需登录)
314
+ await cloud.applyTemplate(page.list[0]);
315
+
316
+ // 随机使用一个模板:一键覆盖当前模板 JSON 与打印数据(需登录)
317
+ const picked = await cloud.useRandomTemplate({ industry_id: 2 });
318
+ console.log("已随机应用:", picked.template_name);
319
+
320
+ // 登录 / 退出
321
+ if (!cloud.auth.canLogin()) console.warn("未配置登录方式");
322
+ if (!cloud.auth.isLoggedIn()) await cloud.auth.login();
323
+ // 多登录方式:查看与切换(切换后 token 来源同步变化)
324
+ console.log(cloud.auth.activeId, cloud.auth.providers);
325
+ await cloud.auth.switchProvider("token");
326
+ const user = await cloud.auth.getUser();
327
+ const clientInfo = await cloud.auth.getClientInfo();
328
+ const off = cloud.auth.onChange((t) => console.log("登录态变更", t));
329
+ await cloud.auth.logout();
330
+ off();
331
+
332
+ // 云打印
333
+ const devices = await cloud.getDevices();
334
+ await cloud.cloudPrint({ device_id: devices[0].device_id });
335
+
336
+ // 中转打印:选客户端 → 选打印机 → 直发
337
+ const clients = await cloud.getTransitClients(); // 仅 clientType=electron 可作为目标
338
+ const printers = await cloud.getTransitPrinters(clients[0].clientId);
339
+ await cloud.transitPrint({
340
+ clientId: clients[0].clientId,
341
+ printer: printers[0].name,
342
+ print_options: { paperName: "A4", copies: 1 },
343
+ });
344
+ ```
345
+
346
+ ## 模板扩展
347
+
348
+ 插件通过 `newPrintTemplate` hook 与 `onDesigned` 扩展 `PrintTemplate` 实例:
349
+
350
+ ```ts
351
+ interface PrintTemplateCloudExtension {
352
+ /** 服务端渲染(默认取当前模板 JSON 与打印数据) */
353
+ serverRender(opts?: RenderOptions): Promise<RenderTask>;
354
+ /** 云打印下发(默认取当前模板 JSON 与打印数据) */
355
+ cloudPrint(opts: CloudPrintOptions): Promise<CloudJob>;
356
+ /** 中转直发打印(默认取当前模板 JSON 与打印数据,需传 clientId / printer) */
357
+ transitPrint(opts?: TransitPrintOptions): Promise<any>;
358
+ /** 移除插件扩展的方法 */
359
+ restoreCloud(): void;
360
+ }
361
+ ```
362
+
363
+ ```js
364
+ const tpl = designerUtils.printTemplate;
365
+
366
+ // 同步渲染当前模板,直接拿到产物地址
367
+ const result = await tpl.serverRender({ sync: true, type: "pdf" });
368
+ console.log(result.file_url);
369
+
370
+ // 异步渲染 + 轮询
371
+ const task = await tpl.serverRender({ type: "img" });
372
+ const done = await designerUtils.cloud.getRenderTask(task.task_id);
373
+
374
+ // 云打印下发(默认带上当前模板与打印数据)
375
+ await tpl.cloudPrint({ device_id: "dev-xxx" });
376
+
377
+ // 中转打印(默认带上当前模板与打印数据)
378
+ await tpl.transitPrint({ clientId: "machine-001", printer: "HP-LaserJet" });
379
+
380
+ // 清理
381
+ tpl.restoreCloud();
382
+ ```
383
+
384
+ ### 宿主后端换取 token(生产推荐)
385
+
386
+ ```js
387
+ pluginCloud({
388
+ host: "https://api.example.com",
389
+ auth: {
390
+ type: "oauth",
391
+ authorizeOrigin: "https://www.example.com",
392
+ clientId: "my-app",
393
+ scope: "print:template:read,member:cloud:job:write",
394
+ // client_secret 只在宿主服务端,插件只把 code 交给它
395
+ exchangeToken: async (code, state) => {
396
+ const res = await fetch("/my-backend/svprint/token", {
397
+ method: "POST",
398
+ headers: { "Content-Type": "application/json" },
399
+ body: JSON.stringify({ code, state }),
400
+ });
401
+ const json = await res.json();
402
+ return json.data; // { accessToken, refreshToken, scope, token_type }
403
+ },
404
+ },
405
+ });
406
+ ```
407
+
408
+ ### 前端直连(匿名接入方,联调)
409
+
410
+ ```js
411
+ pluginCloud({
412
+ auth: {
413
+ type: "oauth",
414
+ authorizeOrigin: "https://www.example.com",
415
+ clientId: "svprint-anon",
416
+ clientSecret: "8iJTOt1t7sJBlE4dSp6UOGOXOVJCsFKv", // 公共密钥,用于 开发联调、快速接入
417
+ scope: "*",
418
+ },
419
+ });
420
+ ```
421
+
422
+ ## 后端接口对照
423
+
424
+ | 能力 | 方法 + 路径 | 登录 |
425
+ | ------------------ | ---------------------------------------------------------- | ---- |
426
+ | 服务端渲染(异步) | `POST /api/print/render` | 是 |
427
+ | 服务端渲染(同步) | `POST /api/print/render/sync` | 是 |
428
+ | 渲染任务查询 | `GET /api/print/render/tasks/:id` | 是 |
429
+ | 云设备列表 | `GET /api/member/cloud/device` | 是 |
430
+ | 云打印下发 | `POST /api/member/cloud/print/submit` | 是 |
431
+ | 云任务列表 | `GET /api/member/cloud/print/jobs` | 是 |
432
+ | 云任务取消/重试 | `POST /api/member/cloud/print/jobs/:id/cancel` `.../retry` | 是 |
433
+ | 中转连接凭证 | `POST /api/member/transit/ticket` | 是 |
434
+ | 模板中心列表 | `GET /api/print/template` | 否 |
435
+ | 模板 JSON | `GET /api/print/template/:id/data` | 是 |
436
+ | 模板使用计数 | `POST /api/print/template/use/:id` | 是 |
437
+ | 模板分类 / 行业 | `GET /api/print/category` `GET /api/print/industry` | 否 |
438
+ | 接入方公开信息 | `GET /api/auth/member/oauth/client/:clientId` | 否 |
439
+ | 授权码换 token | `POST /api/auth/member/oauth/token` | 否 |
440
+ | 撤销凭据 | `POST /api/auth/member/oauth/revoke` | 是 |
441
+ | 会员信息 | `GET /api/auth/member/profile` | 是 |
442
+
443
+ > 统一响应体 `{ code, msg, data }`,`code = 1` 成功;插件自动解包并抛出失败 `msg`。
444
+
445
+ ## 注意事项
446
+
447
+ - `host` 不带 `/api`,插件自动补 `/api` 前缀;缺省时使用相对路径 `/api/...`,宿主需自行配置前端代理(Vite `server.proxy` 等)
448
+ - **中转打印复用页面全局 `window.io`**(与 sv-print 打印客户端连接方式一致),宿主页面需提供 socket.io 并代理 `/socket.io`;若页面无 `io` 会抛出明确错误
449
+ - 中转连接前若存在 `hiwebSocket.requestNetworkPermission` 会先申请本地网络访问权限,被拒绝时不发起连接
450
+ - 模板中心使用、云打印、渲染、中转等接口均需登录;模板列表、分类、行业、接入方公开信息无需登录
451
+ - 未配置 `auth` 时 `designerUtils.cloud.auth.canLogin()` 为 `false`,仅匿名只读能力可用(模板中心浏览正常,写操作提示登录)
452
+ - 中转打印的事件名(`printers` / `print` 等)以后端实际实现为准,可按需在 `TransitClient` 上扩展
453
+
454
+ ## License
455
+
456
+ LGPL
457
+
458
+ ### 开源使用须知
459
+
460
+ 1. 请自觉遵守 LGPL 协议,其他用途可联系作者;
461
+ 2. 允许用于个人学习、毕业设计、教学案例、公益事业、商业使用;
462
+ 3. 如果商用必须保留版权信息,请自觉遵守;
463
+ 4. 禁止将本开源的代码和资源进行任何形式任何名义的出售,否则产生的一切任何后果责任由侵权者自负;
464
+ 5. 商用请仔细审查代码和漏洞,不得用于任一国家许可范围之外的商业应用,产生的一切任何后果责任自负。
@@ -0,0 +1,21 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { PluginConfig } from "../types";
3
+ import type { AuthManager } from "../lib/auth/manager";
4
+ import type { CloudService } from "../lib/cloud-api";
5
+ declare const __propDef: {
6
+ props: {
7
+ config: PluginConfig;
8
+ auth: AuthManager;
9
+ service: CloudService;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {};
15
+ };
16
+ export type CloudSettingsTabProps = typeof __propDef.props;
17
+ export type CloudSettingsTabEvents = typeof __propDef.events;
18
+ export type CloudSettingsTabSlots = typeof __propDef.slots;
19
+ export default class CloudSettingsTab extends SvelteComponentTyped<CloudSettingsTabProps, CloudSettingsTabEvents, CloudSettingsTabSlots> {
20
+ }
21
+ export {};
@@ -0,0 +1,29 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { AuthManager } from "../lib/auth/manager";
3
+ import type { CloudService } from "../lib/cloud-api";
4
+ declare const __propDef: {
5
+ props: {
6
+ auth: AuthManager;
7
+ service: CloudService;
8
+ designerUtils: any;
9
+ pageSize?: number;
10
+ show?: () => void;
11
+ hide?: () => void;
12
+ toggle?: () => void;
13
+ isOpen?: () => boolean;
14
+ };
15
+ events: {
16
+ [evt: string]: CustomEvent<any>;
17
+ };
18
+ slots: {};
19
+ };
20
+ export type TemplateCenterModalProps = typeof __propDef.props;
21
+ export type TemplateCenterModalEvents = typeof __propDef.events;
22
+ export type TemplateCenterModalSlots = typeof __propDef.slots;
23
+ export default class TemplateCenterModal extends SvelteComponentTyped<TemplateCenterModalProps, TemplateCenterModalEvents, TemplateCenterModalSlots> {
24
+ get show(): () => void;
25
+ get hide(): () => void;
26
+ get toggle(): () => void;
27
+ get isOpen(): () => boolean;
28
+ }
29
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { HookOptions } from "sv-print";
2
+ declare const newPrintTemplateHook: () => HookOptions;
3
+ export default newPrintTemplateHook;
@@ -0,0 +1,4 @@
1
+ import type { HookOptions } from "sv-print";
2
+ import type { PluginConfig } from "../types";
3
+ declare const onDesignedHook: (config: PluginConfig) => HookOptions;
4
+ export default onDesignedHook;
@@ -0,0 +1,4 @@
1
+ import type { HookOptions } from "sv-print";
2
+ import type { PluginConfig } from "../types";
3
+ declare const onSettingsHook: (config: PluginConfig) => HookOptions;
4
+ export default onSettingsHook;
@@ -0,0 +1,10 @@
1
+ import type { PluginOptions } from "sv-print";
2
+ import type { PluginConfig } from "./types";
3
+ import "./style.scss";
4
+ export * from "./types";
5
+ export * from "./lib/auth";
6
+ export { CloudClient } from "./lib/cloud-client";
7
+ export { CloudService } from "./lib/cloud-api";
8
+ export { TransitClient } from "./lib/transit-client";
9
+ export { extendTemplate } from "./lib/template-extend";
10
+ export default function plugin(config?: PluginConfig): PluginOptions;