@daxiangme/form-adapter 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/LICENSE ADDED
@@ -0,0 +1,2 @@
1
+ MIT License. See the workspace root LICENSE for the complete text.
2
+
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @daxiangme/form-adapter
2
+
3
+ DX Form 的本地预览和 DX BPM 宿主适配实现。传输生命周期由宿主提供,Adapter 不保存 Token,也不创建 Axios 实例。
4
+
5
+ ```bash
6
+ pnpm add @daxiangme/form-core @daxiangme/form-adapter
7
+ ```
8
+
9
+ ```ts
10
+ import { createDxBpmFormAdapter } from '@daxiangme/form-adapter'
11
+
12
+ const adapters = createDxBpmFormAdapter({
13
+ transport: {
14
+ request: ({ method, path, query, body }) =>
15
+ dxHttp.request({ method, url: path, params: query, data: body }),
16
+ download: ({ path, query }) => dxHttp.download(path, { params: query }),
17
+ },
18
+ context: { applicationCode: 'expense', resourceCode: 'expense-form', recordToken },
19
+ })
20
+ ```
21
+
22
+ `createLocalPreviewFormAdapter()` 返回 `{ adapters, dispose }`;其文件只保存在当前页面的内存与 Object URL 中,不会产生业务网络请求。
@@ -0,0 +1,58 @@
1
+ import { FormRuntimeAdapterContext } from '@daxiangme/form-core';
2
+ import { FormRuntimeAdapters } from '@daxiangme/form-core';
3
+
4
+ /**
5
+ * 使用 DX BPM 已发布表单协议创建运行 Adapter。
6
+ *
7
+ * 认证、租户、错误拦截和响应包络生命周期全部由 FormTransport 负责;本模块只解释表单领域路径和数据。
8
+ */
9
+ export declare function createDxBpmFormAdapter(options: CreateDxBpmFormAdapterOptions): FormRuntimeAdapters;
10
+
11
+ /** 创建 DX BPM Adapter 时由宿主注入的运行上下文和可选页面能力。 */
12
+ export declare interface CreateDxBpmFormAdapterOptions {
13
+ transport: FormTransport;
14
+ context: FormRuntimeAdapterContext;
15
+ navigateResource?: (resourceCode: string, openInNewPage: boolean) => Promise<void>;
16
+ confirmOverwrite?: (message: string) => Promise<boolean>;
17
+ }
18
+
19
+ /**
20
+ * 创建只使用浏览器内存的预览 Adapter。
21
+ *
22
+ * 文件不会发起网络请求;Object URL 只在当前页面会话有效,调用方卸载 Playground 时应执行 dispose。
23
+ */
24
+ export declare function createLocalPreviewFormAdapter(options?: CreateLocalPreviewFormAdapterOptions): LocalPreviewFormAdapterHandle;
25
+
26
+ /** 本地预览 Adapter 的交互选项。 */
27
+ export declare interface CreateLocalPreviewFormAdapterOptions {
28
+ confirmOverwrite?: (message: string) => Promise<boolean>;
29
+ }
30
+
31
+ /** DX BPM Adapter 唯一依赖的传输端口。 */
32
+ export declare interface FormTransport {
33
+ request: (request: FormTransportRequest) => Promise<unknown>;
34
+ download: (request: Omit<FormTransportRequest, 'method' | 'body'>) => Promise<FormTransportDownload>;
35
+ }
36
+
37
+ /** 下载传输结果。 */
38
+ export declare interface FormTransportDownload {
39
+ blob: Blob;
40
+ fileName?: string;
41
+ contentType?: string;
42
+ }
43
+
44
+ /** 由宿主实现的最小传输请求;Adapter 不创建 HTTP 客户端,也不保存认证信息。 */
45
+ export declare interface FormTransportRequest {
46
+ method: 'GET' | 'POST';
47
+ path: string;
48
+ query?: Readonly<Record<string, string | number | boolean | undefined>>;
49
+ body?: unknown;
50
+ }
51
+
52
+ /** 带资源释放能力的本地预览 Adapter。 */
53
+ export declare interface LocalPreviewFormAdapterHandle {
54
+ adapters: FormRuntimeAdapters;
55
+ dispose: () => void;
56
+ }
57
+
58
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,229 @@
1
+ function h(t = {}) {
2
+ const o = /* @__PURE__ */ new Map();
3
+ return {
4
+ adapters: {
5
+ asset: {
6
+ async upload(n) {
7
+ const e = g(), r = URL.createObjectURL(n.file), i = {
8
+ assetId: e,
9
+ name: n.file.name,
10
+ size: n.file.size,
11
+ contentType: n.file.type || void 0,
12
+ downloadUrl: r
13
+ };
14
+ return o.set(e, { reference: i, file: n.file, objectUrl: r }), { ...i };
15
+ },
16
+ async resolve(n) {
17
+ return n.assetIds.map((e) => {
18
+ const r = o.get(e);
19
+ return r ? { ...r.reference } : { assetId: e, name: e, size: 0 };
20
+ });
21
+ },
22
+ async download(n) {
23
+ const e = o.get(n.assetId);
24
+ if (!e) throw new Error(`本地预览中不存在文件 ${n.assetId}`);
25
+ return {
26
+ kind: "BLOB",
27
+ blob: e.file,
28
+ fileName: e.reference.name,
29
+ contentType: e.reference.contentType
30
+ };
31
+ }
32
+ },
33
+ linkageConfirmation: {
34
+ confirmOverwrite: async (n) => {
35
+ const e = `字段“${n.fieldLabel}”已有值,是否使用联动计算结果覆盖?`;
36
+ return t.confirmOverwrite ? t.confirmOverwrite(e) : globalThis.confirm(e);
37
+ }
38
+ },
39
+ directory: {
40
+ async query(n) {
41
+ const e = n.keyword.trim().toLowerCase(), r = w(n.subjectType), i = e ? r.filter(
42
+ (s) => `${s.label} ${s.description ?? ""}`.toLowerCase().includes(e)
43
+ ) : r, c = Math.max(0, n.pageNo - 1) * n.pageSize;
44
+ return {
45
+ items: i.slice(c, c + n.pageSize),
46
+ totalCount: i.length
47
+ };
48
+ }
49
+ },
50
+ scan: {
51
+ async scan() {
52
+ const n = globalThis.prompt("输入用于本地预览的扫码结果");
53
+ if (!n) throw new Error("已取消本地扫码预览");
54
+ return { text: n };
55
+ }
56
+ },
57
+ location: {
58
+ async locate() {
59
+ if (!globalThis.navigator?.geolocation) throw new Error("当前浏览器不支持定位");
60
+ return new Promise((n, e) => {
61
+ globalThis.navigator.geolocation.getCurrentPosition(
62
+ (r) => n({
63
+ longitude: r.coords.longitude,
64
+ latitude: r.coords.latitude
65
+ }),
66
+ () => e(new Error("浏览器未授权或无法获取定位")),
67
+ { enableHighAccuracy: !1, timeout: 1e4, maximumAge: 6e4 }
68
+ );
69
+ });
70
+ }
71
+ }
72
+ },
73
+ dispose() {
74
+ for (const n of o.values()) URL.revokeObjectURL(n.objectUrl);
75
+ o.clear();
76
+ }
77
+ };
78
+ }
79
+ function g() {
80
+ return `local_${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}_${Math.random().toString(36).slice(2)}`}`;
81
+ }
82
+ function w(t) {
83
+ return {
84
+ user: [
85
+ { id: "user-1", label: "林晓岚", description: "产品中心 · 产品经理" },
86
+ { id: "user-2", label: "陈睿", description: "研发中心 · 前端工程师" },
87
+ { id: "user-3", label: "周宁", description: "财务中心 · 财务主管" }
88
+ ],
89
+ role: [
90
+ { id: "role-1", label: "流程管理员", description: "本地预览角色" },
91
+ { id: "role-2", label: "部门负责人", description: "本地预览角色" }
92
+ ],
93
+ organization: [
94
+ { id: "org-1", label: "产品中心", description: "一级组织" },
95
+ { id: "org-2", label: "研发中心", description: "一级组织" }
96
+ ],
97
+ post: [
98
+ { id: "post-1", label: "产品经理", description: "产品中心" },
99
+ { id: "post-2", label: "前端工程师", description: "研发中心" }
100
+ ],
101
+ "process-reference": [
102
+ { id: "process-1", label: "采购申请 #20260901001", description: "审批中" }
103
+ ],
104
+ "form-reference": [{ id: "form-1", label: "供应商档案 · 华东供应链", description: "正式记录" }],
105
+ "custom-data": [{ id: "data-1", label: "示例记录 A", description: "本地自定义数据" }],
106
+ "data-dialog": [{ id: "dialog-1", label: "数据行 001", description: "本地数据对话框" }]
107
+ }[t] ?? [];
108
+ }
109
+ function I(t) {
110
+ const o = /* @__PURE__ */ new Map(), a = b(t.context), n = {
111
+ asset: {
112
+ async upload(e) {
113
+ const r = new FormData();
114
+ r.append("fieldCode", e.fieldCode), e.context.recordToken && r.append("recordToken", e.context.recordToken);
115
+ const i = p(e.context, "processTaskId");
116
+ i && r.append("processTaskId", i), r.append("file", e.file);
117
+ const c = await t.transport.request({
118
+ method: "POST",
119
+ path: `${a}/attachments`,
120
+ body: r
121
+ }), s = T(c), l = {
122
+ assetId: s.fileId,
123
+ name: s.name,
124
+ size: s.sizeBytes,
125
+ contentType: s.contentType
126
+ };
127
+ return o.set(l.assetId, l), { ...l };
128
+ },
129
+ async resolve(e) {
130
+ return e.assetIds.map((r) => ({
131
+ ...o.get(r) ?? { assetId: r, name: r, size: 0 }
132
+ }));
133
+ },
134
+ async download(e) {
135
+ const r = m(
136
+ e.context,
137
+ "recordToken",
138
+ "请先保存记录后再下载附件"
139
+ ), i = e.fieldCode, c = await t.transport.download({
140
+ path: `${a}/records/${d(r)}/attachments/${d(i)}/content`,
141
+ query: {
142
+ fileId: e.assetId,
143
+ processTaskId: p(e.context, "processTaskId")
144
+ }
145
+ });
146
+ return {
147
+ kind: "BLOB",
148
+ blob: c.blob,
149
+ fileName: c.fileName ?? o.get(e.assetId)?.name ?? e.assetId,
150
+ contentType: c.contentType
151
+ };
152
+ }
153
+ },
154
+ ocr: {
155
+ async recognize(e) {
156
+ const r = e.fieldCode, i = new FormData();
157
+ i.append("file", e.file);
158
+ const c = await t.transport.request({
159
+ method: "POST",
160
+ path: `${a}/fields/${d(r)}/ocr`,
161
+ query: {
162
+ recordToken: e.context.recordToken,
163
+ processTaskId: p(e.context, "processTaskId")
164
+ },
165
+ body: i
166
+ });
167
+ return y(u(c), "OCR 响应");
168
+ }
169
+ },
170
+ linkageConfirmation: {
171
+ confirmOverwrite: async (e) => {
172
+ const r = `字段“${e.fieldLabel}”已有值,是否使用联动计算结果覆盖?`;
173
+ return t.confirmOverwrite ? t.confirmOverwrite(r) : globalThis.confirm(r);
174
+ }
175
+ }
176
+ };
177
+ return t.navigateResource && (n.navigation = {
178
+ navigate: (e) => t.navigateResource(e.resourceCode, e.openInNewPage)
179
+ }, n.hostAction = {
180
+ execute: async () => {
181
+ throw new Error("宿主未配置声明式动作执行器");
182
+ },
183
+ navigateResource: t.navigateResource
184
+ }), n;
185
+ }
186
+ function b(t) {
187
+ const o = m(t, "applicationCode", "缺少 applicationCode"), a = m(t, "resourceCode", "缺少 resourceCode");
188
+ return `/application-portal/${d(o)}/forms/${d(a)}`;
189
+ }
190
+ function T(t) {
191
+ const o = y(u(t), "附件上传响应"), a = f(o.fileId, "fileId"), n = f(o.name, "name"), e = f(o.contentType, "contentType");
192
+ if (typeof o.sizeBytes != "number" || !Number.isFinite(o.sizeBytes) || o.sizeBytes < 0)
193
+ throw new Error("附件上传响应 sizeBytes 不合法");
194
+ return { fileId: a, name: n, contentType: e, sizeBytes: o.sizeBytes };
195
+ }
196
+ function u(t) {
197
+ if (typeof t != "object" || t === null || Array.isArray(t)) return t;
198
+ const o = t;
199
+ if (!("code" in o)) return t;
200
+ if (o.code !== 0)
201
+ throw new Error(typeof o.msg == "string" && o.msg ? o.msg : "DX BPM 请求失败");
202
+ return o.data;
203
+ }
204
+ function y(t, o) {
205
+ if (typeof t != "object" || t === null || Array.isArray(t))
206
+ throw new Error(`${o}必须是对象`);
207
+ return t;
208
+ }
209
+ function f(t, o) {
210
+ if (typeof t != "string" || !t.trim()) throw new Error(`附件上传响应 ${o} 不合法`);
211
+ return t;
212
+ }
213
+ function m(t, o, a) {
214
+ const n = t[o];
215
+ if (typeof n != "string" || !n.trim()) throw new Error(a);
216
+ return n;
217
+ }
218
+ function p(t, o) {
219
+ const a = t.extension?.[o];
220
+ return typeof a == "string" ? a : "";
221
+ }
222
+ function d(t) {
223
+ return encodeURIComponent(t);
224
+ }
225
+ export {
226
+ I as createDxBpmFormAdapter,
227
+ h as createLocalPreviewFormAdapter
228
+ };
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/local/create-local-preview-form-adapter.ts","../src/dx-bpm/create-dx-bpm-form-adapter.ts"],"sourcesContent":["import type { FormAssetReference, FormRuntimeAdapters } from '@daxiangme/form-core'\nimport type { CreateLocalPreviewFormAdapterOptions } from '../types'\n\n/** 带资源释放能力的本地预览 Adapter。 */\nexport interface LocalPreviewFormAdapterHandle {\n adapters: FormRuntimeAdapters\n dispose: () => void\n}\n\n/**\n * 创建只使用浏览器内存的预览 Adapter。\n *\n * 文件不会发起网络请求;Object URL 只在当前页面会话有效,调用方卸载 Playground 时应执行 dispose。\n */\nexport function createLocalPreviewFormAdapter(\n options: CreateLocalPreviewFormAdapterOptions = {},\n): LocalPreviewFormAdapterHandle {\n const assets = new Map<string, { reference: FormAssetReference; file: File; objectUrl: string }>()\n\n const adapters: FormRuntimeAdapters = {\n asset: {\n async upload(request) {\n const assetId = createLocalAssetId()\n const objectUrl = URL.createObjectURL(request.file)\n const reference: FormAssetReference = {\n assetId,\n name: request.file.name,\n size: request.file.size,\n contentType: request.file.type || undefined,\n downloadUrl: objectUrl,\n }\n assets.set(assetId, { reference, file: request.file, objectUrl })\n return { ...reference }\n },\n async resolve(request) {\n return request.assetIds.map((assetId) => {\n const asset = assets.get(assetId)\n return asset ? { ...asset.reference } : { assetId, name: assetId, size: 0 }\n })\n },\n async download(request) {\n const asset = assets.get(request.assetId)\n if (!asset) throw new Error(`本地预览中不存在文件 ${request.assetId}`)\n return {\n kind: 'BLOB',\n blob: asset.file,\n fileName: asset.reference.name,\n contentType: asset.reference.contentType,\n }\n },\n },\n linkageConfirmation: {\n confirmOverwrite: async (request) => {\n const message = `字段“${request.fieldLabel}”已有值,是否使用联动计算结果覆盖?`\n if (options.confirmOverwrite) return options.confirmOverwrite(message)\n return globalThis.confirm(message)\n },\n },\n directory: {\n async query(request) {\n const keyword = request.keyword.trim().toLowerCase()\n const source = localDirectoryItems(request.subjectType)\n const filtered = keyword\n ? source.filter((item) =>\n `${item.label} ${item.description ?? ''}`.toLowerCase().includes(keyword),\n )\n : source\n const offset = Math.max(0, request.pageNo - 1) * request.pageSize\n return {\n items: filtered.slice(offset, offset + request.pageSize),\n totalCount: filtered.length,\n }\n },\n },\n scan: {\n async scan() {\n const text = globalThis.prompt('输入用于本地预览的扫码结果')\n if (!text) throw new Error('已取消本地扫码预览')\n return { text }\n },\n },\n location: {\n async locate() {\n if (!globalThis.navigator?.geolocation) throw new Error('当前浏览器不支持定位')\n return new Promise((resolve, reject) => {\n globalThis.navigator.geolocation.getCurrentPosition(\n (position) =>\n resolve({\n longitude: position.coords.longitude,\n latitude: position.coords.latitude,\n }),\n () => reject(new Error('浏览器未授权或无法获取定位')),\n { enableHighAccuracy: false, timeout: 10_000, maximumAge: 60_000 },\n )\n })\n },\n },\n }\n\n return {\n adapters,\n dispose() {\n for (const asset of assets.values()) URL.revokeObjectURL(asset.objectUrl)\n assets.clear()\n },\n }\n}\n\nfunction createLocalAssetId(): string {\n return `local_${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}_${Math.random().toString(36).slice(2)}`}`\n}\n\nfunction localDirectoryItems(subjectType: string): Array<{\n id: string\n label: string\n description?: string\n}> {\n const catalog: Record<string, Array<{ id: string; label: string; description?: string }>> = {\n user: [\n { id: 'user-1', label: '林晓岚', description: '产品中心 · 产品经理' },\n { id: 'user-2', label: '陈睿', description: '研发中心 · 前端工程师' },\n { id: 'user-3', label: '周宁', description: '财务中心 · 财务主管' },\n ],\n role: [\n { id: 'role-1', label: '流程管理员', description: '本地预览角色' },\n { id: 'role-2', label: '部门负责人', description: '本地预览角色' },\n ],\n organization: [\n { id: 'org-1', label: '产品中心', description: '一级组织' },\n { id: 'org-2', label: '研发中心', description: '一级组织' },\n ],\n post: [\n { id: 'post-1', label: '产品经理', description: '产品中心' },\n { id: 'post-2', label: '前端工程师', description: '研发中心' },\n ],\n 'process-reference': [\n { id: 'process-1', label: '采购申请 #20260901001', description: '审批中' },\n ],\n 'form-reference': [{ id: 'form-1', label: '供应商档案 · 华东供应链', description: '正式记录' }],\n 'custom-data': [{ id: 'data-1', label: '示例记录 A', description: '本地自定义数据' }],\n 'data-dialog': [{ id: 'dialog-1', label: '数据行 001', description: '本地数据对话框' }],\n }\n return catalog[subjectType] ?? []\n}\n","import type {\n FormAssetReference,\n FormRuntimeAdapterContext,\n FormRuntimeAdapters,\n} from '@daxiangme/form-core'\nimport type { CreateDxBpmFormAdapterOptions } from '../types'\n\ninterface DxAttachmentPayload {\n fileId: string\n name: string\n contentType: string\n sizeBytes: number\n}\n\n/**\n * 使用 DX BPM 已发布表单协议创建运行 Adapter。\n *\n * 认证、租户、错误拦截和响应包络生命周期全部由 FormTransport 负责;本模块只解释表单领域路径和数据。\n */\nexport function createDxBpmFormAdapter(\n options: CreateDxBpmFormAdapterOptions,\n): FormRuntimeAdapters {\n const metadata = new Map<string, FormAssetReference>()\n const basePath = runtimePath(options.context)\n const adapters: FormRuntimeAdapters = {\n asset: {\n async upload(request) {\n const body = new FormData()\n body.append('fieldCode', request.fieldCode)\n if (request.context.recordToken) body.append('recordToken', request.context.recordToken)\n const processTaskId = extensionText(request.context, 'processTaskId')\n if (processTaskId) body.append('processTaskId', processTaskId)\n body.append('file', request.file)\n const response = await options.transport.request({\n method: 'POST',\n path: `${basePath}/attachments`,\n body,\n })\n const attachment = decodeAttachment(response)\n const reference: FormAssetReference = {\n assetId: attachment.fileId,\n name: attachment.name,\n size: attachment.sizeBytes,\n contentType: attachment.contentType,\n }\n metadata.set(reference.assetId, reference)\n return { ...reference }\n },\n async resolve(request) {\n return request.assetIds.map((assetId) => ({\n ...(metadata.get(assetId) ?? { assetId, name: assetId, size: 0 }),\n }))\n },\n async download(request) {\n const recordToken = requireContextText(\n request.context,\n 'recordToken',\n '请先保存记录后再下载附件',\n )\n const fieldCode = request.fieldCode\n const download = await options.transport.download({\n path: `${basePath}/records/${segment(recordToken)}/attachments/${segment(fieldCode)}/content`,\n query: {\n fileId: request.assetId,\n processTaskId: extensionText(request.context, 'processTaskId'),\n },\n })\n return {\n kind: 'BLOB',\n blob: download.blob,\n fileName: download.fileName ?? metadata.get(request.assetId)?.name ?? request.assetId,\n contentType: download.contentType,\n }\n },\n },\n ocr: {\n async recognize(request) {\n const fieldCode = request.fieldCode\n const body = new FormData()\n body.append('file', request.file)\n const response = await options.transport.request({\n method: 'POST',\n path: `${basePath}/fields/${segment(fieldCode)}/ocr`,\n query: {\n recordToken: request.context.recordToken,\n processTaskId: extensionText(request.context, 'processTaskId'),\n },\n body,\n })\n return requireRecord(unwrapDxPayload(response), 'OCR 响应')\n },\n },\n linkageConfirmation: {\n confirmOverwrite: async (request) => {\n const message = `字段“${request.fieldLabel}”已有值,是否使用联动计算结果覆盖?`\n if (options.confirmOverwrite) return options.confirmOverwrite(message)\n return globalThis.confirm(message)\n },\n },\n }\n if (options.navigateResource) {\n adapters.navigation = {\n navigate: (request) => options.navigateResource!(request.resourceCode, request.openInNewPage),\n }\n adapters.hostAction = {\n execute: async () => {\n throw new Error('宿主未配置声明式动作执行器')\n },\n navigateResource: options.navigateResource,\n }\n }\n return adapters\n}\n\nfunction runtimePath(context: FormRuntimeAdapterContext): string {\n const applicationCode = requireContextText(context, 'applicationCode', '缺少 applicationCode')\n const resourceCode = requireContextText(context, 'resourceCode', '缺少 resourceCode')\n return `/application-portal/${segment(applicationCode)}/forms/${segment(resourceCode)}`\n}\n\nfunction decodeAttachment(response: unknown): DxAttachmentPayload {\n const value = requireRecord(unwrapDxPayload(response), '附件上传响应')\n const fileId = requirePayloadText(value.fileId, 'fileId')\n const name = requirePayloadText(value.name, 'name')\n const contentType = requirePayloadText(value.contentType, 'contentType')\n if (\n typeof value.sizeBytes !== 'number' ||\n !Number.isFinite(value.sizeBytes) ||\n value.sizeBytes < 0\n ) {\n throw new Error('附件上传响应 sizeBytes 不合法')\n }\n return { fileId, name, contentType, sizeBytes: value.sizeBytes }\n}\n\nfunction unwrapDxPayload(response: unknown): unknown {\n if (typeof response !== 'object' || response === null || Array.isArray(response)) return response\n const source = response as Record<string, unknown>\n if (!('code' in source)) return response\n if (source.code !== 0) {\n throw new Error(typeof source.msg === 'string' && source.msg ? source.msg : 'DX BPM 请求失败')\n }\n return source.data\n}\n\nfunction requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${label}必须是对象`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requirePayloadText(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`附件上传响应 ${label} 不合法`)\n return value\n}\n\nfunction requireContextText(\n context: FormRuntimeAdapterContext,\n key: keyof FormRuntimeAdapterContext,\n message: string,\n): string {\n const value = context[key]\n if (typeof value !== 'string' || !value.trim()) throw new Error(message)\n return value\n}\n\nfunction extensionText(context: FormRuntimeAdapterContext, key: string): string {\n const value = context.extension?.[key]\n return typeof value === 'string' ? value : ''\n}\n\nfunction segment(value: string): string {\n return encodeURIComponent(value)\n}\n"],"names":["createLocalPreviewFormAdapter","options","assets","request","assetId","createLocalAssetId","objectUrl","reference","asset","message","keyword","source","localDirectoryItems","filtered","item","offset","text","resolve","reject","position","subjectType","createDxBpmFormAdapter","metadata","basePath","runtimePath","adapters","body","processTaskId","extensionText","response","attachment","decodeAttachment","recordToken","requireContextText","fieldCode","download","segment","requireRecord","unwrapDxPayload","context","applicationCode","resourceCode","value","fileId","requirePayloadText","name","contentType","label","key"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@daxiangme/form-adapter",
3
+ "version": "0.1.0",
4
+ "description": "DX Form 的本地预览与 DX BPM 宿主适配实现",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "daxiangme",
8
+ "keywords": [
9
+ "form",
10
+ "adapter",
11
+ "upload",
12
+ "dx-bpm"
13
+ ],
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "sideEffects": false,
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
25
+ },
26
+ "scripts": {
27
+ "build": "vite build",
28
+ "typecheck": "tsc -p tsconfig.json --noEmit",
29
+ "pack:dry-run": "npm pack --dry-run"
30
+ },
31
+ "dependencies": {
32
+ "@daxiangme/form-core": "0.1.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ }
37
+ }