template-replacement 3.3.2 → 3.4.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.
Files changed (56) hide show
  1. package/.editorconfig +8 -0
  2. package/.oxfmtrc.jsonc +7 -0
  3. package/.oxlintrc.json +3 -0
  4. package/README.md +39 -9
  5. package/core/base.ts +54 -55
  6. package/core/general.ts +37 -9
  7. package/core/sign.ts +43 -8
  8. package/dispatcher/general.ts +2 -1
  9. package/dispatcher/sign.ts +2 -1
  10. package/dispatcher/workerGeneral.ts +1 -1
  11. package/dispatcher/workerSign.ts +1 -1
  12. package/dist/base-DQz39fXI.js +249 -0
  13. package/dist/index-oILo_kXG.js +46 -0
  14. package/dist/main/general.js +1373 -1401
  15. package/dist/main/sign.js +1559 -1573
  16. package/dist/replace/general.js +281 -306
  17. package/dist/replace/sign.js +304 -315
  18. package/download/index.ts +13 -13
  19. package/download/stream.ts +29 -28
  20. package/eslint.config.ts +28 -0
  21. package/fileSystem/db/index.ts +25 -25
  22. package/fileSystem/db/indexedDBCache.ts +142 -124
  23. package/fileSystem/index.ts +5 -8
  24. package/fileSystem/interface.ts +4 -5
  25. package/fileSystem/opfs/index.ts +40 -36
  26. package/helper/index.ts +144 -116
  27. package/index.ts +9 -17
  28. package/office/zip.ts +106 -97
  29. package/package.json +17 -11
  30. package/replace/base.ts +203 -214
  31. package/replace/general.ts +44 -19
  32. package/replace/image.ts +88 -86
  33. package/replace/interface.ts +29 -24
  34. package/replace/paramsData.ts +108 -96
  35. package/replace/sign.ts +79 -43
  36. package/task/urlDownloadTask.ts +54 -63
  37. package/temp/index.ts +139 -131
  38. package/temp/interface.ts +8 -8
  39. package/tsconfig.json +1 -1
  40. package/vite.config.ts +11 -14
  41. package/worker/child/agency.ts +49 -41
  42. package/worker/child/base.ts +125 -89
  43. package/worker/child/general.ts +2 -3
  44. package/worker/child/sign.ts +4 -4
  45. package/worker/index.ts +52 -51
  46. package/worker/interface.ts +9 -6
  47. package/worker/main/general.ts +5 -5
  48. package/worker/main/index.ts +191 -66
  49. package/worker/main/sign.ts +5 -5
  50. package/worker/type.ts +16 -15
  51. package/dist/assets/template_replacement_core_wasm_bg.wasm +0 -0
  52. package/dist/assets/template_replacement_sign_core_wasm_bg.wasm +0 -0
  53. package/dist/base-BuKBOMgk.js +0 -269
  54. package/dist/general.d.ts +0 -1
  55. package/dist/index-tFDVIkZX.js +0 -46
  56. package/dist/sign.d.ts +0 -1
package/download/index.ts CHANGED
@@ -1,22 +1,22 @@
1
- import streamClass from "./stream"
1
+ import Stream from './stream'
2
2
 
3
3
  function download(fileName: string, blob: Blob): void {
4
- const href = window.URL.createObjectURL(blob)
5
- const a = document.createElement('a')
6
- a.href = href
7
- a.target = 'target'
8
- a.download = fileName
9
- document.body.appendChild(a)
10
- a.click();
11
- document.body.removeChild(a)
12
- window.URL.revokeObjectURL(href)
4
+ const href = window.URL.createObjectURL(blob)
5
+ const a = document.createElement('a')
6
+ a.href = href
7
+ a.target = 'target'
8
+ a.download = fileName
9
+ document.body.appendChild(a)
10
+ a.click()
11
+ document.body.removeChild(a)
12
+ window.URL.revokeObjectURL(href)
13
13
  }
14
14
 
15
15
  export default (fileName: string, blob: Blob): void => {
16
- download(fileName, blob)
16
+ download(fileName, blob)
17
17
  }
18
18
 
19
19
  //流式下载
20
- export function stream(fileName: string, size?: number): streamClass {
21
- return new streamClass(fileName, size)
20
+ export function stream(fileName: string, size?: number): Stream {
21
+ return new Stream(fileName, size)
22
22
  }
@@ -1,38 +1,39 @@
1
- import streamSaver from "streamsaver"
1
+ import streamSaver from 'streamsaver'
2
+
3
+ streamSaver.mitm = 'https://unpkg.com/streamsaver/mitm.html'
2
4
 
3
5
  export function setMitm(mitm: string) {
4
- streamSaver.mitm = mitm
6
+ streamSaver.mitm = mitm
5
7
  }
6
8
 
7
9
  export default class Stream {
8
- tasks: Promise<any>[] = []
9
- writer: WritableStreamDefaultWriter<any>
10
- fileStream: WritableStream
10
+ #tasks: Promise<unknown>[] = []
11
+ #writer: WritableStreamDefaultWriter<unknown>
12
+ #fileStream: WritableStream
11
13
 
12
- constructor(fileName: string, size?: number) {
13
- this.fileStream = streamSaver.createWriteStream(fileName, {
14
- size
15
- })
16
- this.writer = this.fileStream.getWriter()
17
- }
14
+ constructor(fileName: string, size?: number) {
15
+ this.#fileStream = streamSaver.createWriteStream(fileName, {
16
+ size,
17
+ })
18
+ this.#writer = this.#fileStream.getWriter()
19
+ }
18
20
 
19
- async write(chunk: any): Promise<void> {
20
- const a = this.writer.write(chunk)
21
- this.tasks.push(a)
22
- const res = await a
23
- return res
24
- }
21
+ write(chunk: unknown): Promise<void> {
22
+ const res = this.#writer.write(chunk)
23
+ this.#tasks.push(res)
24
+ return res
25
+ }
25
26
 
26
- async close(): Promise<void> {
27
- if (this.tasks.length) {
28
- await Promise.all(this.tasks)
29
- }
30
- const res = await this.writer.close()
31
- this.writer.releaseLock()
32
- return res
27
+ async close(): Promise<void> {
28
+ if (this.#tasks.length) {
29
+ await Promise.all(this.#tasks)
33
30
  }
31
+ const res = await this.#writer.close()
32
+ this.#writer.releaseLock()
33
+ return res
34
+ }
34
35
 
35
- async abort(reason?: any): Promise<void> {
36
- return await this.fileStream.abort(reason)
37
- }
38
- }
36
+ abort(reason?: unknown): Promise<void> {
37
+ return this.#fileStream.abort(reason)
38
+ }
39
+ }
@@ -0,0 +1,28 @@
1
+ import { globalIgnores } from 'eslint/config'
2
+ import oxlint from 'eslint-plugin-oxlint'
3
+ import tseslint from '@typescript-eslint/eslint-plugin'
4
+ import tsParser from '@typescript-eslint/parser'
5
+
6
+ export default [
7
+ {
8
+ name: 'app/files-to-lint',
9
+ files: ['**/*.{ts,mts,tsx}'],
10
+ languageOptions: {
11
+ parser: tsParser,
12
+ parserOptions: {
13
+ ecmaVersion: 'latest',
14
+ sourceType: 'module',
15
+ },
16
+ },
17
+ plugins: {
18
+ '@typescript-eslint': tseslint,
19
+ },
20
+ rules: {
21
+ ...tseslint.configs.recommended.rules,
22
+ },
23
+ },
24
+
25
+ globalIgnores(['/dist/**', '/node_modules/**']),
26
+
27
+ ...oxlint.configs['flat/recommended'], // oxlint should be the last one
28
+ ]
@@ -1,37 +1,37 @@
1
1
  import indexedDBCache from './indexedDBCache'
2
- import FileSystem, {fileDataType} from '../interface'
2
+ import FileSystem, { fileDataType } from '../interface'
3
3
 
4
4
  const db = new indexedDBCache()
5
5
 
6
6
  export default class DbFile implements FileSystem {
7
- #name: string = ''
7
+ #name: string
8
8
 
9
- constructor(name: string){
10
- this.#name = name
11
- }
9
+ constructor(name: string = '') {
10
+ this.#name = name
11
+ }
12
12
 
13
- async write(data: fileDataType): Promise<boolean> {
14
- try {
15
- await db.putData<File>({
16
- url: this.#name,
17
- data: new File([data], this.#name),
18
- })
19
- return true
20
- } catch (error) {
21
- console.error(error)
22
- return false
23
- }
13
+ async write(data: fileDataType): Promise<boolean> {
14
+ try {
15
+ await db.putData<File>({
16
+ key: this.#name,
17
+ data: new File([data], this.#name),
18
+ })
19
+ return true
20
+ } catch (error) {
21
+ console.error(error)
22
+ return false
24
23
  }
24
+ }
25
25
 
26
- async read(): Promise<File>{
27
- const data = await db.getDataByKey<File>(this.#name)
28
- if (data && data.data) {
29
- return data.data
30
- }
31
- return new File([], this.#name)
26
+ async read(): Promise<File> {
27
+ const data = await db.getDataByKey<File>(this.#name)
28
+ if (data && data.data) {
29
+ return data.data
32
30
  }
31
+ return new File([], this.#name)
32
+ }
33
33
 
34
- remove(): Promise<void> {
35
- return db.deleteDataByKey(this.#name)
36
- }
34
+ remove(): Promise<void> {
35
+ return db.deleteDataByKey(this.#name)
36
+ }
37
37
  }
@@ -1,145 +1,163 @@
1
-
2
1
  type templateData<T> = {
3
- url: string
4
- data: T
2
+ key: string // 主键
3
+ data: T // 文件数据
5
4
  }
6
5
 
7
6
  export default class indexedDBCache {
8
- _initFinishCallBackFuns?: Function[] = [] //初始化完成回调
9
- _isInitFinish: boolean = false //是否初始化完成
7
+ private _initFinishCallBackFuns?: ((value: void) => void)[] = [] //初始化完成回调
8
+ #isInitFinish: boolean = false //是否初始化完成
10
9
 
11
- _db?: IDBDatabase //数据库
12
- _dbName: string = 'template_replacement' //数据库名
13
- _dbversion: number = 1 //数据库版本
14
- _cacheTableName: string = 'templates' //表名
15
- _tableMap: any = {} //表配置
10
+ private _db?: IDBDatabase //数据库
11
+ #dbName: string = 'template_replacement_db' //数据库名
12
+ #dbversion: number = 1 //数据库版本
13
+ #cacheTableName: string = 'template_files' //表名
16
14
 
15
+ private _init: Promise<unknown> | undefined
17
16
 
18
- // 构造函数
19
- constructor() {
20
- this.initDB()
21
- }
17
+ // 构造函数
18
+ constructor() {
19
+ this.#initDB()
20
+ }
22
21
 
23
- initDB(): Promise<any> {
24
- return new Promise((resolve, reject) => {
25
- const request = indexedDB.open(this._dbName, this._dbversion) // 打开数据库
26
- // 数据库初始化成功
27
- request.onsuccess = (event) => {
28
- this._db = request.result
29
- this._isInitFinish = true
30
- if (this._initFinishCallBackFuns) {
31
- try {
32
- for (const fun of this._initFinishCallBackFuns) {
33
- fun()
34
- }
35
- } catch (error) {
36
- }
37
- this._initFinishCallBackFuns = undefined
38
- }
39
- resolve(event)
40
- }
41
- // 数据库初始化失败
42
- request.onerror = (event) => {
43
- console.error(event)
44
- reject(event)
45
- }
46
- // 数据库初次创建或更新时会触发
47
- request.onupgradeneeded = (event) => {
48
- let db = request.result
49
- if (!db.objectStoreNames.contains(this._cacheTableName)) {
50
- db.createObjectStore(this._cacheTableName, {
51
- keyPath: 'url', // 设置主键
52
- })
53
- }
54
- resolve(event)
55
- }
56
- })
22
+ #initDB(): Promise<unknown> {
23
+ if (this._init) {
24
+ return this._init
57
25
  }
58
-
59
- async awaitInit(): Promise<void> {
60
- if(this._isInitFinish || !this._initFinishCallBackFuns) {
61
- return
26
+ this._init = new Promise((resolve, reject) => {
27
+ const request = indexedDB.open(this.#dbName, this.#dbversion) // 打开数据库
28
+ // 数据库初始化成功
29
+ request.onsuccess = (event) => {
30
+ this._db = request.result
31
+ this.#isInitFinish = true
32
+ if (this._initFinishCallBackFuns) {
33
+ try {
34
+ for (const fun of this._initFinishCallBackFuns) {
35
+ fun()
36
+ }
37
+ } catch (error) { }
38
+ this._initFinishCallBackFuns = undefined
62
39
  }
63
- await new Promise((resolve, reject) => {
64
- this._initFinishCallBackFuns?.push(resolve)
65
- })
66
- }
40
+ resolve(event)
41
+ }
42
+ // 数据库初始化失败
43
+ request.onerror = (event) => {
44
+ console.error(event)
45
+ reject(event)
46
+ }
47
+ // 数据库初次创建或更新时会触发
48
+ request.onupgradeneeded = (event) => {
49
+ let db = request.result
50
+ if (!db.objectStoreNames.contains(this.#cacheTableName)) {
51
+ db.createObjectStore(this.#cacheTableName, {
52
+ keyPath: 'key', // 设置主键
53
+ })
54
+ }
55
+ resolve(event)
56
+ }
57
+ })
67
58
 
68
- closeDB(): void {
69
- this._db?.close()
70
- }
59
+ return this._init
60
+ }
71
61
 
72
- async store(mode?: IDBTransactionMode): Promise<IDBObjectStore> {
73
- await this.awaitInit()
74
- const db = this._db as IDBDatabase
75
- const transaction = db.transaction(this._cacheTableName, mode)
76
- return transaction.objectStore(this._cacheTableName)
62
+ async awaitInit(): Promise<void> {
63
+ if (this.#isInitFinish || !this._initFinishCallBackFuns) {
64
+ return
77
65
  }
66
+ await new Promise((resolve, reject) => {
67
+ this._initFinishCallBackFuns?.push(resolve)
68
+ })
69
+ }
78
70
 
79
- /**
80
- * @description : 更新数据
81
- * @param {Object} params 添加到数据库中的数据 { url: 文件地址, data: 文件blob }
82
- * @return {*}
83
- */
84
- putData<T>(params: templateData<T>): Promise<any> {
85
- return new Promise(async (resolve, reject) => {
86
- const response = (await this.store('readwrite')).put(params)
87
- // 操作成功
88
- response.onsuccess = (event) => {
89
- resolve(event)
90
- }
91
- // 操作失败
92
- response.onerror = (event) => {
93
- reject(event)
94
- }
95
- })
96
- }
71
+ closeDB(): void {
72
+ this._db?.close()
73
+ }
97
74
 
98
- // 通过主键读取数据
99
- getDataByKey<T>(key: string): Promise<templateData<T>> {
100
- return new Promise(async (resolve, reject) => {
101
- // 通过主键读取数据
102
- const request = (await this.store()).get(key)
103
- // 操作成功
104
- request.onsuccess = () => {
105
- resolve(request.result)
106
- }
107
- // 操作失败
108
- request.onerror = (event) => {
109
- reject(event)
110
- }
75
+ async store(mode?: IDBTransactionMode): Promise<IDBObjectStore> {
76
+ await this.awaitInit()
77
+ const db = this._db as IDBDatabase
78
+ const transaction = db.transaction(this.#cacheTableName, mode)
79
+ return transaction.objectStore(this.#cacheTableName)
80
+ }
81
+
82
+ /**
83
+ * @description : 更新数据
84
+ * @param {templateData} params 添加到数据库中的数据 { key: 文件key, data: 文件blob }
85
+ * @return {*}
86
+ */
87
+ putData<T>(params: templateData<T>): Promise<unknown> {
88
+ return new Promise((resolve, reject) => {
89
+ this.store('readwrite')
90
+ .then((store) => {
91
+ const response = store.put(params)
92
+ // 操作成功
93
+ response.onsuccess = (event) => {
94
+ resolve(event)
95
+ }
96
+ // 操作失败
97
+ response.onerror = (event) => {
98
+ reject(event)
99
+ }
111
100
  })
112
- }
101
+ .catch(reject)
102
+ })
103
+ }
113
104
 
114
- // 通过主键移除数据
115
- deleteDataByKey<T>(key: string): Promise<void> {
116
- return new Promise(async (resolve, reject) => {
117
- // 通过主键读取数据
118
- const request = (await this.store()).delete(key)
119
- // 操作成功
120
- request.onsuccess = () => {
121
- resolve()
122
- }
123
- // 操作失败
124
- request.onerror = (event) => {
125
- reject(event)
126
- }
105
+ // 通过主键读取数据
106
+ getDataByKey<T>(key: string): Promise<templateData<T>> {
107
+ return new Promise((resolve, reject) => {
108
+ this.store()
109
+ .then((store) => {
110
+ // 通过主键读取数据
111
+ const request = store.get(key)
112
+ // 操作成功
113
+ request.onsuccess = () => {
114
+ resolve(request.result)
115
+ }
116
+ // 操作失败
117
+ request.onerror = (event) => {
118
+ reject(event)
119
+ }
127
120
  })
128
- }
121
+ .catch(reject)
122
+ })
123
+ }
129
124
 
130
- // 清空数据库数据
131
- clearDB(): Promise<any> {
132
- return new Promise(async (resolve, reject) => {
133
- const response = (await this.store('readwrite')).clear()
134
- // 操作成功
135
- response.onsuccess = (event) => {
136
- resolve(event)
137
- }
138
- // 操作失败
139
- response.onerror = (event) => {
140
- reject(event)
141
- }
125
+ // 通过主键移除数据
126
+ deleteDataByKey(key: string): Promise<void> {
127
+ return new Promise((resolve, reject) => {
128
+ this.store()
129
+ .then((store) => {
130
+ // 通过主键读取数据
131
+ const request = store.delete(key)
132
+ // 操作成功
133
+ request.onsuccess = () => {
134
+ resolve(request.result)
135
+ }
136
+ // 操作失败
137
+ request.onerror = (event) => {
138
+ reject(event)
139
+ }
142
140
  })
143
- }
141
+ .catch(reject)
142
+ })
143
+ }
144
144
 
145
- }
145
+ // 清空数据库数据
146
+ clearDB(): Promise<unknown> {
147
+ return new Promise((resolve, reject) => {
148
+ this.store('readwrite')
149
+ .then((store) => {
150
+ const response = store.clear()
151
+ // 操作成功
152
+ response.onsuccess = (event) => {
153
+ resolve(event)
154
+ }
155
+ // 操作失败
156
+ response.onerror = (event) => {
157
+ reject(event)
158
+ }
159
+ })
160
+ .catch(reject)
161
+ })
162
+ }
163
+ }
@@ -2,12 +2,9 @@ import FileSystem from './interface'
2
2
  import OpfsFile from './opfs'
3
3
  import DbFile from './db'
4
4
 
5
- export default (name: string): FileSystem => {
6
- if (navigator?.storage?.getDirectory) {
7
- return new OpfsFile(name)
8
- }
9
- return new DbFile(name)
5
+ export default (name: string): FileSystem => {
6
+ if ('storage' in navigator && typeof navigator.storage.getDirectory === 'function') {
7
+ return new OpfsFile(name)
8
+ }
9
+ return new DbFile(name)
10
10
  }
11
-
12
-
13
-
@@ -1,8 +1,7 @@
1
-
2
1
  export type fileDataType = BufferSource | Blob | string
3
2
 
4
3
  export default interface FileSystem {
5
- write(data: fileDataType): Promise<boolean>
6
- read(): Promise<File>
7
- remove(): Promise<void>
8
- }
4
+ write(data: fileDataType): Promise<boolean>
5
+ read(): Promise<File>
6
+ remove(): Promise<void>
7
+ }
@@ -1,48 +1,52 @@
1
- import FileSystem, {fileDataType} from '../interface'
1
+ import FileSystem, { fileDataType } from '../interface'
2
2
 
3
3
  let opfsRoot: FileSystemDirectoryHandle | undefined = undefined
4
4
 
5
5
  async function getOpfsRoot(): Promise<FileSystemDirectoryHandle> {
6
- if (!opfsRoot) {
7
- opfsRoot = await (await navigator.storage.getDirectory()).getDirectoryHandle('template_replacement', {
8
- create: true,
9
- })
10
- }
11
- return opfsRoot
6
+ if (!opfsRoot) {
7
+ opfsRoot = await (
8
+ await navigator.storage.getDirectory()
9
+ ).getDirectoryHandle('template_replacement', {
10
+ create: true,
11
+ })
12
+ }
13
+ return opfsRoot
12
14
  }
13
15
 
14
16
  export default class OpfsFile implements FileSystem {
15
- #name: string = ''
16
- #handle: FileSystemFileHandle | undefined
17
-
18
- constructor(name: string){
19
- this.#name = name
17
+ #name: string = ''
18
+ private _handle: FileSystemFileHandle | undefined
19
+
20
+ constructor(name: string) {
21
+ this.#name = name
22
+ }
23
+
24
+ async getHandle(): Promise<FileSystemFileHandle> {
25
+ if (!this._handle) {
26
+ this._handle = await (
27
+ await getOpfsRoot()
28
+ ).getFileHandle(this.#name, { create: true })
20
29
  }
21
-
22
- async getHandle(): Promise<FileSystemFileHandle> {
23
- if (!this.#handle) {
24
- this.#handle = await (await getOpfsRoot()).getFileHandle(this.#name, { create: true })
25
- }
26
- return this.#handle
30
+ return this._handle
31
+ }
32
+
33
+ async write(data: fileDataType): Promise<boolean> {
34
+ try {
35
+ const writable = await (await this.getHandle()).createWritable()
36
+ await writable.write(data)
37
+ await writable.close()
38
+ return true
39
+ } catch (error) {
40
+ console.error(error)
41
+ return false
27
42
  }
43
+ }
28
44
 
29
- async write(data: fileDataType): Promise<boolean> {
30
- try {
31
- const writable = await (await this.getHandle()).createWritable()
32
- await writable.write(data)
33
- await writable.close()
34
- return true
35
- } catch (error) {
36
- console.error(error)
37
- return false
38
- }
39
- }
45
+ async read(): Promise<File> {
46
+ return (await this.getHandle()).getFile()
47
+ }
40
48
 
41
- async read(): Promise<File>{
42
- return (await this.getHandle()).getFile()
43
- }
44
-
45
- async remove(): Promise<void> {
46
- return (await getOpfsRoot()).removeEntry(this.#name)
47
- }
49
+ async remove(): Promise<void> {
50
+ return (await getOpfsRoot()).removeEntry(this.#name)
51
+ }
48
52
  }