1+ import { getStorageName } from "@App/pkg/utils/utils" ;
12import { db } from "./repo/dao" ;
2- import { Script } from "./repo/scripts" ;
3+ import { Script , ScriptAndCode , ScriptCodeDAO , ScriptDAO } from "./repo/scripts" ;
4+ import { Subscribe , SubscribeDAO } from "./repo/subscribe" ;
5+ import { Value , ValueDAO } from "./repo/value" ;
6+ import { Permission , PermissionDAO } from "./repo/permission" ;
37
48// 0.10.0重构,重命名字段,统一使用小峰驼
5- function renameField ( ) : void {
9+ function renameField ( ) {
610 db . version ( 16 )
711 . stores ( {
812 scripts :
@@ -32,10 +36,199 @@ function renameField(): void {
3236 // export是0.10.x时的兼容性处理
3337 export : "++id,&scriptId" ,
3438 } ) ;
39+ const v = 36 ;
3540 // 将脚本数据迁移到chrome.storage
36- // db.version(18)
37- // .stores({})
38- // .upgrade((tx) => {});
41+ db . version ( v ) . upgrade ( ( ) => {
42+ // 默认使用的事务,这里加个延时,用db.open()打开数据库后,再执行
43+ setTimeout ( async ( ) => {
44+ try {
45+ // 迁移脚本
46+ const scripts = await db . table ( "scripts" ) . toArray ( ) ;
47+ const scriptDAO = new ScriptDAO ( ) ;
48+ const scriptCodeDAO = new ScriptCodeDAO ( ) ;
49+ console . log ( "开始迁移脚本数据" , scripts . length ) ;
50+ await Promise . all (
51+ scripts . map ( async ( script : ScriptAndCode ) => {
52+ const {
53+ uuid,
54+ name,
55+ namespace,
56+ author,
57+ originDomain,
58+ subscribeUrl,
59+ type,
60+ sort,
61+ status,
62+ runStatus,
63+ metadata,
64+ createtime,
65+ checktime,
66+ code,
67+ checkUpdateUrl,
68+ downloadUrl,
69+ selfMetadata,
70+ config,
71+ error,
72+ updatetime,
73+ lastruntime,
74+ nextruntime,
75+ } = script ;
76+ const s = await scriptDAO . save ( {
77+ uuid,
78+ name,
79+ namespace,
80+ author,
81+ originDomain,
82+ origin,
83+ checkUpdateUrl,
84+ downloadUrl,
85+ metadata,
86+ selfMetadata,
87+ subscribeUrl,
88+ config,
89+ type,
90+ status,
91+ sort,
92+ runStatus,
93+ error,
94+ createtime,
95+ updatetime,
96+ checktime,
97+ lastruntime,
98+ nextruntime,
99+ } ) ;
100+ return scriptCodeDAO
101+ . save ( {
102+ uuid : s . uuid ,
103+ code,
104+ } )
105+ . catch ( ( e ) => {
106+ console . log ( "脚本代码迁移失败" , e ) ;
107+ return Promise . reject ( e ) ;
108+ } ) ;
109+ } )
110+ ) ;
111+ // 迁移订阅
112+ const subscribe = await db . table ( "subscribe" ) . toArray ( ) ;
113+ const subscribeDAO = new SubscribeDAO ( ) ;
114+ if ( subscribe . length ) {
115+ await Promise . all (
116+ subscribe . map ( ( s : Subscribe ) => {
117+ console . log ( "1234" , s ) ;
118+ const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s ;
119+ return subscribeDAO . save ( {
120+ url,
121+ name,
122+ code,
123+ author,
124+ scripts,
125+ metadata,
126+ status,
127+ createtime,
128+ updatetime,
129+ checktime,
130+ } ) ;
131+ } )
132+ ) ;
133+ }
134+ console . log ( "订阅数据迁移完成" , subscribe . length ) ;
135+ // 迁移value
136+ interface MV2Value {
137+ id : number ;
138+ scriptId : number ;
139+ storageName ?: string ;
140+ key : string ;
141+ value : any ;
142+ createtime : number ;
143+ updatetime : number ;
144+ }
145+ const values = await db . table ( "value" ) . toArray ( ) ;
146+ const valueDAO = new ValueDAO ( ) ;
147+ const valueMap = new Map < string , Value > ( ) ;
148+ await Promise . all (
149+ values . map ( ( v : MV2Value ) => {
150+ const { scriptId, storageName, key, value, createtime } = v ;
151+ return db
152+ . table ( "scripts" )
153+ . where ( "id" )
154+ . equals ( scriptId )
155+ . first ( ( script : Script ) => {
156+ if ( script ) {
157+ let data : { [ key : string ] : any } = { } ;
158+ if ( ! valueMap . has ( script . uuid ) ) {
159+ valueMap . set ( script . uuid , {
160+ uuid : script . uuid ,
161+ storageName : getStorageName ( script ) ,
162+ data : data ,
163+ createtime,
164+ updatetime : 0 ,
165+ } ) ;
166+ } else {
167+ data = valueMap . get ( script . uuid ) ! . data ;
168+ }
169+ data [ key ] = value ;
170+ }
171+ } ) ;
172+ } )
173+ ) ;
174+ // 保存到数据库
175+ await Promise . all (
176+ Array . from ( valueMap . keys ( ) ) . map ( ( uuid ) => {
177+ const { storageName, data, createtime } = valueMap . get ( uuid ) ! ;
178+ return valueDAO . save ( storageName ! , {
179+ uuid,
180+ storageName,
181+ data,
182+ createtime,
183+ updatetime : 0 ,
184+ } ) ;
185+ } )
186+ ) ;
187+ console . log ( "脚本value数据迁移完成" , values . length ) ;
188+ // 迁移permission
189+ const permissions = await db . table ( "permission" ) . toArray ( ) ;
190+ const permissionDAO = new PermissionDAO ( ) ;
191+ await Promise . all (
192+ permissions . map ( ( p : Permission & { scriptId : number } ) => {
193+ const { scriptId, permission, permissionValue, createtime, updatetime, allow } = p ;
194+ return db
195+ . table ( "scripts" )
196+ . where ( "id" )
197+ . equals ( scriptId )
198+ . first ( ( script : Script ) => {
199+ if ( script ) {
200+ return permissionDAO . save ( {
201+ uuid : script . uuid ,
202+ permission,
203+ permissionValue,
204+ createtime,
205+ updatetime,
206+ allow,
207+ } ) ;
208+ }
209+ } ) ;
210+ } )
211+ ) ;
212+ console . log ( "脚本permission数据迁移完成" , permissions . length ) ;
213+ // 打开页面,告知数据储存+升级至了mv3,重启一次扩展
214+ setTimeout ( async ( ) => {
215+ const scripts = await scriptDAO . all ( ) ;
216+ console . log ( "脚本数据迁移完成" , scripts . length ) ;
217+ if ( scripts . length > 0 ) {
218+ chrome . tabs . create ( {
219+ url : "https://docs.scriptcat.org/docs/change/v0.17/" ,
220+ } ) ;
221+ setTimeout ( ( ) => {
222+ chrome . runtime . reload ( ) ;
223+ } , 1000 ) ;
224+ }
225+ } , 2000 ) ;
226+ } catch ( e ) {
227+ console . error ( "脚本数据迁移失败" , e ) ;
228+ }
229+ } , 200 ) ;
230+ } ) ;
231+ return db . open ( ) ;
39232}
40233
41234export default function migrate ( ) {
@@ -90,7 +283,8 @@ export default function migrate() {
90283 value : "++id,scriptId,storageName,key,createtime" ,
91284 } )
92285 . upgrade ( ( tx ) => {
93- tx . table ( "value" )
286+ return tx
287+ . table ( "value" )
94288 . toCollection ( )
95289 . modify ( ( value ) => {
96290 if ( value . namespace ) {
@@ -112,5 +306,5 @@ export default function migrate() {
112306 permission : "++id,scriptId,[scriptId+permission+permissionValue],createtime,updatetime" ,
113307 } ) ;
114308 // 使用小峰驼统一命名规范
115- renameField ( ) ;
309+ return renameField ( ) ;
116310}
0 commit comments