@xwiki/cristal-backend-dexie 0.12.0 → 0.14.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/CHANGELOG.md +26 -0
- package/dist/index.es.js +38 -31
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/wrappingOfflineStorage.d.ts +4 -0
- package/package.json +17 -7
- package/src/wrappingOfflineStorage.ts +12 -0
- package/tsconfig.json +5 -1
- package/vitest.config.ts +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @xwiki/cristal-backend-dexie
|
|
2
2
|
|
|
3
|
+
## 0.14.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 3e5f853: Cristal 0.14 Release
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [3e5f853]
|
|
12
|
+
- @xwiki/cristal-api@0.14.0
|
|
13
|
+
- @xwiki/cristal-backend-api@0.14.0
|
|
14
|
+
- @xwiki/cristal-sharedworker-api@0.14.0
|
|
15
|
+
|
|
16
|
+
## 0.13.0
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- 06a5d1b: Cristal 0.13 Release
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- Updated dependencies [06a5d1b]
|
|
25
|
+
- @xwiki/cristal-api@0.13.0
|
|
26
|
+
- @xwiki/cristal-backend-api@0.13.0
|
|
27
|
+
- @xwiki/cristal-sharedworker-api@0.13.0
|
|
28
|
+
|
|
3
29
|
## 0.12.0
|
|
4
30
|
|
|
5
31
|
### Minor Changes
|
package/dist/index.es.js
CHANGED
|
@@ -11,11 +11,11 @@ class d extends h {
|
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
var p = Object.defineProperty, S = Object.getOwnPropertyDescriptor,
|
|
15
|
-
for (var
|
|
16
|
-
(s = e[a]) && (
|
|
17
|
-
return
|
|
18
|
-
},
|
|
14
|
+
var p = Object.defineProperty, S = Object.getOwnPropertyDescriptor, v = (e, t, o, r) => {
|
|
15
|
+
for (var g = r > 1 ? void 0 : r ? S(t, o) : t, a = e.length - 1, s; a >= 0; a--)
|
|
16
|
+
(s = e[a]) && (g = (r ? s(t, o, g) : s(g)) || g);
|
|
17
|
+
return r && g && p(t, o, g), g;
|
|
18
|
+
}, m = (e, t) => (o, r) => t(o, r, e);
|
|
19
19
|
let l = class {
|
|
20
20
|
constructor(e) {
|
|
21
21
|
this.pageStorageMap = /* @__PURE__ */ new Map(), this.logger = e, this.logger.setModule("storage.components.dexieOfflineStorage");
|
|
@@ -29,8 +29,8 @@ let l = class {
|
|
|
29
29
|
this.logger.debug("Ready to load page from local storage", t);
|
|
30
30
|
const o = this.getPageStorage(e);
|
|
31
31
|
this.logger.debug("pageStorage is ready, asking for page");
|
|
32
|
-
const
|
|
33
|
-
return
|
|
32
|
+
const r = await o.pages.get(t), g = new u();
|
|
33
|
+
return g.fromObject(r), g;
|
|
34
34
|
} catch (o) {
|
|
35
35
|
this.logger.debug("Exception while trying to read from local storage", o);
|
|
36
36
|
return;
|
|
@@ -39,40 +39,40 @@ let l = class {
|
|
|
39
39
|
async savePage(e, t, o) {
|
|
40
40
|
try {
|
|
41
41
|
await this.getPageStorage(e).pages.put(o.toObject(), t);
|
|
42
|
-
} catch (
|
|
42
|
+
} catch (r) {
|
|
43
43
|
this.logger.debug(
|
|
44
44
|
"Exception while trying to store in local storage",
|
|
45
45
|
e,
|
|
46
46
|
t,
|
|
47
47
|
o,
|
|
48
|
-
|
|
48
|
+
r
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
async updatePage(e, t, o) {
|
|
53
53
|
try {
|
|
54
|
-
const
|
|
55
|
-
this.logger.debug("Ready to store", o), await
|
|
56
|
-
} catch (
|
|
54
|
+
const r = this.getPageStorage(e);
|
|
55
|
+
this.logger.debug("Ready to store", o), await r.pages.update(t, o.toObject());
|
|
56
|
+
} catch (r) {
|
|
57
57
|
this.logger.debug(
|
|
58
58
|
"Exception while trying to store in local storage",
|
|
59
59
|
e,
|
|
60
60
|
t,
|
|
61
61
|
o,
|
|
62
|
-
|
|
62
|
+
r
|
|
63
63
|
);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
|
-
l =
|
|
67
|
+
l = v([
|
|
68
68
|
f(),
|
|
69
|
-
|
|
69
|
+
m(0, i("Logger"))
|
|
70
70
|
], l);
|
|
71
|
-
var
|
|
72
|
-
for (var
|
|
73
|
-
(s = e[a]) && (
|
|
74
|
-
return
|
|
75
|
-
}, n = (e, t) => (o,
|
|
71
|
+
var P = Object.defineProperty, b = Object.getOwnPropertyDescriptor, _ = (e, t, o, r) => {
|
|
72
|
+
for (var g = r > 1 ? void 0 : r ? b(t, o) : t, a = e.length - 1, s; a >= 0; a--)
|
|
73
|
+
(s = e[a]) && (g = (r ? s(t, o, g) : s(g)) || g);
|
|
74
|
+
return r && g && P(t, o, g), g;
|
|
75
|
+
}, n = (e, t) => (o, r) => t(o, r, e);
|
|
76
76
|
let c = class {
|
|
77
77
|
constructor(e, t, o) {
|
|
78
78
|
this.logger = e, this.logger.setModule("storage.components.wrappingOfflineStorage"), this.offlineStorage = t, this.queueWorker = o;
|
|
@@ -101,16 +101,18 @@ let c = class {
|
|
|
101
101
|
getImageURL(e, t) {
|
|
102
102
|
return this.storage.getImageURL(e, t);
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
// TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.
|
|
105
|
+
// eslint-disable-next-line max-statements
|
|
106
|
+
async getPageContent(e, t, o, r) {
|
|
105
107
|
if (this.logger.debug("Trying to get data for page ", e), this.offlineStorage) {
|
|
106
108
|
this.logger.debug("Asking offline storage for ", e);
|
|
107
|
-
const
|
|
109
|
+
const g = await this.offlineStorage.getPage(
|
|
108
110
|
this.getWikiConfig().name,
|
|
109
111
|
e + "_" + t
|
|
110
112
|
);
|
|
111
|
-
return
|
|
113
|
+
return g != null && g != null ? (this.logger.debug("Loading data from local storage for page", e), (r == null || r) && this.queueWorker.addToQueue(
|
|
112
114
|
this.getWikiConfig().name + ":" + e + "_" + t
|
|
113
|
-
),
|
|
115
|
+
), g) : (this.logger.debug(
|
|
114
116
|
"Could not find data in local storage for page",
|
|
115
117
|
e
|
|
116
118
|
), this.savePageContent(e, t));
|
|
@@ -133,19 +135,21 @@ let c = class {
|
|
|
133
135
|
), o;
|
|
134
136
|
throw new Error("Can't save missing page.");
|
|
135
137
|
}
|
|
138
|
+
// TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.
|
|
139
|
+
// eslint-disable-next-line max-statements
|
|
136
140
|
async updatePageContent(e, t) {
|
|
137
141
|
const o = await this.offlineStorage.getPage(
|
|
138
142
|
this.getWikiConfig().name,
|
|
139
143
|
e + "_" + t
|
|
140
|
-
),
|
|
141
|
-
return o &&
|
|
144
|
+
), r = await this.storage.getPageContent(e, t);
|
|
145
|
+
return o && r ? (r.id = e + "_" + t, this.logger.debug("Saving page to offline storage", e), this.offlineStorage.savePage(
|
|
142
146
|
this.getWikiConfig().name,
|
|
143
147
|
e + "_" + t,
|
|
144
|
-
|
|
145
|
-
), !0) : (o == null ? void 0 : o.version) != (
|
|
148
|
+
r
|
|
149
|
+
), !0) : (o == null ? void 0 : o.version) != (r == null ? void 0 : r.version) && r ? (r.id = e + "_" + t, this.logger.debug("Updating page to offline storage", e), this.offlineStorage.updatePage(
|
|
146
150
|
this.getWikiConfig().name,
|
|
147
151
|
e + "_" + t,
|
|
148
|
-
|
|
152
|
+
r
|
|
149
153
|
), !0) : (this.logger.debug(
|
|
150
154
|
"Local storage not updated, because version are identical"
|
|
151
155
|
), !1);
|
|
@@ -156,8 +160,8 @@ let c = class {
|
|
|
156
160
|
async getEditField(e, t) {
|
|
157
161
|
return await this.storage.getEditField(e, t);
|
|
158
162
|
}
|
|
159
|
-
save(e, t, o,
|
|
160
|
-
return this.storage.save(e, t, o,
|
|
163
|
+
save(e, t, o, r) {
|
|
164
|
+
return this.storage.save(e, t, o, r);
|
|
161
165
|
}
|
|
162
166
|
async saveAttachments(e, t) {
|
|
163
167
|
return this.storage.saveAttachments(e, t);
|
|
@@ -165,6 +169,9 @@ let c = class {
|
|
|
165
169
|
async delete(e) {
|
|
166
170
|
return this.storage.delete(e);
|
|
167
171
|
}
|
|
172
|
+
async move(e, t, o) {
|
|
173
|
+
return this.storage.move(e, t, o);
|
|
174
|
+
}
|
|
168
175
|
};
|
|
169
176
|
c = _([
|
|
170
177
|
f(),
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/dexiePageStorage.ts","../src/dexieOfflineStorage.ts","../src/wrappingOfflineStorage.ts","../src/index.ts"],"sourcesContent":["/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n// eslint-disable-next-line import/no-named-as-default\nimport Dexie from \"dexie\";\nimport type { Table } from \"dexie\";\n\nexport default class DexiePageStorage extends Dexie {\n pages!: Table<object>;\n\n constructor(wikiName: string) {\n super(\"pages_\" + wikiName);\n this.version(2).stores({\n pages:\n // Primary key and indexed props\n \"id, name, content, document, css, js, document.name, document.headline, document.creator\",\n });\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexiePageStorage from \"./dexiePageStorage\";\nimport { DefaultPageData, PageData } from \"@xwiki/cristal-api\";\nimport { inject, injectable } from \"inversify\";\nimport type { Logger } from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\n\n@injectable()\nexport default class DexieOfflineStorage implements OfflineStorage {\n private pageStorageMap: Map<string, DexiePageStorage> = new Map<\n string,\n DexiePageStorage\n >();\n private logger: Logger;\n\n constructor(@inject<Logger>(\"Logger\") logger: Logger) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.dexieOfflineStorage\");\n }\n\n getPageStorage(wikiName: string): DexiePageStorage {\n let pageStorage = this.pageStorageMap.get(wikiName);\n if (pageStorage == null) {\n pageStorage = new DexiePageStorage(wikiName);\n this.pageStorageMap.set(wikiName, pageStorage);\n }\n return pageStorage;\n }\n\n async getPage(wikiName: string, id: string): Promise<PageData | undefined> {\n try {\n this.logger.debug(\"Ready to load page from local storage\", id);\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"pageStorage is ready, asking for page\");\n const pageObject = await pageStorage.pages.get(id);\n const pageData = new DefaultPageData();\n pageData.fromObject(pageObject);\n return pageData;\n } catch (e) {\n this.logger.debug(\"Exception while trying to read from local storage\", e);\n return undefined;\n }\n }\n\n async savePage(wikiName: string, id: string, page: PageData): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n // Put must be used instead of get since the later does not allow for\n // content update.\n await pageStorage.pages.put(page.toObject(), id);\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n\n async updatePage(\n wikiName: string,\n id: string,\n page: PageData,\n ): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"Ready to store\", page);\n await pageStorage.pages.update(id, page.toObject());\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport { inject, injectable } from \"inversify\";\nimport type {\n AttachmentsData,\n Document,\n Logger,\n PageAttachment,\n PageData,\n Storage,\n WikiConfig,\n WrappingStorage,\n} from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport type { QueueWorker } from \"@xwiki/cristal-sharedworker-api\";\n\n@injectable()\nexport class WrappingOfflineStorage implements WrappingStorage {\n public logger: Logger;\n // @ts-expect-error storage can be temporarily undefined during class\n // initialization\n public storage: Storage;\n public offlineStorage: OfflineStorage;\n public queueWorker: QueueWorker;\n\n constructor(\n @inject<Logger>(\"Logger\") logger: Logger,\n @inject<OfflineStorage>(\"OfflineStorage\") offlineStorage: OfflineStorage,\n @inject<QueueWorker>(\"QueueWorker\") queueWorker: QueueWorker,\n ) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.wrappingOfflineStorage\");\n this.offlineStorage = offlineStorage;\n this.queueWorker = queueWorker;\n }\n\n public setStorage(storage: Storage): void {\n this.storage = storage;\n }\n\n public getStorage(): Storage {\n return this.storage;\n }\n\n public setWikiConfig(config: WikiConfig): void {\n return this.storage.setWikiConfig(config);\n }\n\n public getWikiConfig(): WikiConfig {\n return this.storage.getWikiConfig();\n }\n\n public async isStorageReady(): Promise<boolean> {\n return this.storage.isStorageReady();\n }\n\n public getPageRestURL(page: string, syntax: string): string {\n return this.storage.getPageRestURL(page, syntax);\n }\n\n public getPageFromViewURL(url: string): string | null {\n return this.storage.getPageFromViewURL(url);\n }\n\n public getImageURL(page: string, image: string): string {\n return this.storage.getImageURL(page, image);\n }\n\n public async getPageContent(\n page: string,\n syntax: string,\n _revision?: string,\n requeue?: boolean,\n ): Promise<PageData | undefined> {\n this.logger.debug(\"Trying to get data for page \", page);\n if (this.offlineStorage) {\n this.logger.debug(\"Asking offline storage for \", page);\n const pageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n if (pageData != null && pageData != undefined) {\n this.logger.debug(\"Loading data from local storage for page\", page);\n // Adding page to refresh queue in shared worker\n if (requeue == undefined || requeue) {\n this.queueWorker.addToQueue(\n this.getWikiConfig().name + \":\" + page + \"_\" + syntax,\n );\n }\n return pageData;\n } else {\n this.logger.debug(\n \"Could not find data in local storage for page\",\n page,\n );\n return this.savePageContent(page, syntax);\n }\n } else {\n this.logger.debug(\"No offline local storage available\");\n return this.storage.getPageContent(page, syntax);\n }\n }\n\n public getAttachments(page: string): Promise<AttachmentsData | undefined> {\n // TODO: add support for offline storage of attachments.\n return this.storage.getAttachments(page);\n }\n\n getAttachment(\n page: string,\n name: string,\n ): Promise<PageAttachment | undefined> {\n return this.storage.getAttachment(page, name);\n }\n\n private async savePageContent(\n page: string,\n syntax: string,\n ): Promise<PageData> {\n const pageData = await this.storage.getPageContent(page, syntax);\n if (pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n\n return pageData;\n } else {\n throw new Error(\"Can't save missing page.\");\n }\n }\n\n public async updatePageContent(\n page: string,\n syntax: string,\n ): Promise<boolean> {\n const currentPageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n const pageData = await this.storage.getPageContent(page, syntax);\n if (currentPageData && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else if (currentPageData?.version != pageData?.version && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Updating page to offline storage\", page);\n this.offlineStorage.updatePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else {\n this.logger.debug(\n \"Local storage not updated, because version are identical\",\n );\n return false;\n }\n }\n\n public async getPanelContent(\n panel: string,\n contextPage: string,\n syntax: string,\n ): Promise<PageData> {\n return this.storage.getPanelContent(panel, contextPage, syntax);\n }\n\n public async getEditField(\n document: Document,\n fieldName: string,\n ): Promise<string> {\n return await this.storage.getEditField(document, fieldName);\n }\n\n save(\n page: string,\n title: string,\n content: string,\n syntax: string,\n ): Promise<unknown> {\n return this.storage.save(page, title, content, syntax);\n }\n\n async saveAttachments(page: string, files: File[]): Promise<unknown> {\n return this.storage.saveAttachments(page, files);\n }\n\n async delete(page: string): Promise<{ success: boolean; error?: string }> {\n return this.storage.delete(page);\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexieOfflineStorage from \"./dexieOfflineStorage\";\nimport { WrappingOfflineStorage } from \"./wrappingOfflineStorage\";\nimport { WrappingStorage } from \"@xwiki/cristal-api\";\nimport { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport { Container } from \"inversify\";\n\nexport class ComponentInit {\n constructor(container: Container) {\n container\n .bind<WrappingStorage>(\"WrappingStorage\")\n .to(WrappingOfflineStorage)\n .inSingletonScope();\n container\n .bind<OfflineStorage>(\"OfflineStorage\")\n .to(DexieOfflineStorage)\n .inSingletonScope();\n }\n}\n"],"names":["DexiePageStorage","Dexie","wikiName","DexieOfflineStorage","logger","pageStorage","id","pageObject","pageData","DefaultPageData","e","page","__decorateClass","injectable","__decorateParam","WrappingOfflineStorage","offlineStorage","queueWorker","storage","config","syntax","url","image","_revision","requeue","name","currentPageData","panel","contextPage","document","fieldName","title","content","files","ComponentInit","container"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/dexiePageStorage.ts","../src/dexieOfflineStorage.ts","../src/wrappingOfflineStorage.ts","../src/index.ts"],"sourcesContent":["/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n// eslint-disable-next-line import/no-named-as-default\nimport Dexie from \"dexie\";\nimport type { Table } from \"dexie\";\n\nexport default class DexiePageStorage extends Dexie {\n pages!: Table<object>;\n\n constructor(wikiName: string) {\n super(\"pages_\" + wikiName);\n this.version(2).stores({\n pages:\n // Primary key and indexed props\n \"id, name, content, document, css, js, document.name, document.headline, document.creator\",\n });\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexiePageStorage from \"./dexiePageStorage\";\nimport { DefaultPageData, PageData } from \"@xwiki/cristal-api\";\nimport { inject, injectable } from \"inversify\";\nimport type { Logger } from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\n\n@injectable()\nexport default class DexieOfflineStorage implements OfflineStorage {\n private pageStorageMap: Map<string, DexiePageStorage> = new Map<\n string,\n DexiePageStorage\n >();\n private logger: Logger;\n\n constructor(@inject<Logger>(\"Logger\") logger: Logger) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.dexieOfflineStorage\");\n }\n\n getPageStorage(wikiName: string): DexiePageStorage {\n let pageStorage = this.pageStorageMap.get(wikiName);\n if (pageStorage == null) {\n pageStorage = new DexiePageStorage(wikiName);\n this.pageStorageMap.set(wikiName, pageStorage);\n }\n return pageStorage;\n }\n\n async getPage(wikiName: string, id: string): Promise<PageData | undefined> {\n try {\n this.logger.debug(\"Ready to load page from local storage\", id);\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"pageStorage is ready, asking for page\");\n const pageObject = await pageStorage.pages.get(id);\n const pageData = new DefaultPageData();\n pageData.fromObject(pageObject);\n return pageData;\n } catch (e) {\n this.logger.debug(\"Exception while trying to read from local storage\", e);\n return undefined;\n }\n }\n\n async savePage(wikiName: string, id: string, page: PageData): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n // Put must be used instead of get since the later does not allow for\n // content update.\n await pageStorage.pages.put(page.toObject(), id);\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n\n async updatePage(\n wikiName: string,\n id: string,\n page: PageData,\n ): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"Ready to store\", page);\n await pageStorage.pages.update(id, page.toObject());\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport { inject, injectable } from \"inversify\";\nimport type {\n AttachmentsData,\n Document,\n Logger,\n PageAttachment,\n PageData,\n Storage,\n WikiConfig,\n WrappingStorage,\n} from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport type { QueueWorker } from \"@xwiki/cristal-sharedworker-api\";\n\n@injectable()\nexport class WrappingOfflineStorage implements WrappingStorage {\n public logger: Logger;\n // @ts-expect-error storage can be temporarily undefined during class\n // initialization\n public storage: Storage;\n public offlineStorage: OfflineStorage;\n public queueWorker: QueueWorker;\n\n constructor(\n @inject<Logger>(\"Logger\") logger: Logger,\n @inject<OfflineStorage>(\"OfflineStorage\") offlineStorage: OfflineStorage,\n @inject<QueueWorker>(\"QueueWorker\") queueWorker: QueueWorker,\n ) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.wrappingOfflineStorage\");\n this.offlineStorage = offlineStorage;\n this.queueWorker = queueWorker;\n }\n\n public setStorage(storage: Storage): void {\n this.storage = storage;\n }\n\n public getStorage(): Storage {\n return this.storage;\n }\n\n public setWikiConfig(config: WikiConfig): void {\n return this.storage.setWikiConfig(config);\n }\n\n public getWikiConfig(): WikiConfig {\n return this.storage.getWikiConfig();\n }\n\n public async isStorageReady(): Promise<boolean> {\n return this.storage.isStorageReady();\n }\n\n public getPageRestURL(page: string, syntax: string): string {\n return this.storage.getPageRestURL(page, syntax);\n }\n\n public getPageFromViewURL(url: string): string | null {\n return this.storage.getPageFromViewURL(url);\n }\n\n public getImageURL(page: string, image: string): string {\n return this.storage.getImageURL(page, image);\n }\n\n // TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.\n // eslint-disable-next-line max-statements\n public async getPageContent(\n page: string,\n syntax: string,\n _revision?: string,\n requeue?: boolean,\n ): Promise<PageData | undefined> {\n this.logger.debug(\"Trying to get data for page \", page);\n if (this.offlineStorage) {\n this.logger.debug(\"Asking offline storage for \", page);\n const pageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n if (pageData != null && pageData != undefined) {\n this.logger.debug(\"Loading data from local storage for page\", page);\n // Adding page to refresh queue in shared worker\n if (requeue == undefined || requeue) {\n this.queueWorker.addToQueue(\n this.getWikiConfig().name + \":\" + page + \"_\" + syntax,\n );\n }\n return pageData;\n } else {\n this.logger.debug(\n \"Could not find data in local storage for page\",\n page,\n );\n return this.savePageContent(page, syntax);\n }\n } else {\n this.logger.debug(\"No offline local storage available\");\n return this.storage.getPageContent(page, syntax);\n }\n }\n\n public getAttachments(page: string): Promise<AttachmentsData | undefined> {\n // TODO: add support for offline storage of attachments.\n return this.storage.getAttachments(page);\n }\n\n getAttachment(\n page: string,\n name: string,\n ): Promise<PageAttachment | undefined> {\n return this.storage.getAttachment(page, name);\n }\n\n private async savePageContent(\n page: string,\n syntax: string,\n ): Promise<PageData> {\n const pageData = await this.storage.getPageContent(page, syntax);\n if (pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n\n return pageData;\n } else {\n throw new Error(\"Can't save missing page.\");\n }\n }\n\n // TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.\n // eslint-disable-next-line max-statements\n public async updatePageContent(\n page: string,\n syntax: string,\n ): Promise<boolean> {\n const currentPageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n const pageData = await this.storage.getPageContent(page, syntax);\n if (currentPageData && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else if (currentPageData?.version != pageData?.version && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Updating page to offline storage\", page);\n this.offlineStorage.updatePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else {\n this.logger.debug(\n \"Local storage not updated, because version are identical\",\n );\n return false;\n }\n }\n\n public async getPanelContent(\n panel: string,\n contextPage: string,\n syntax: string,\n ): Promise<PageData> {\n return this.storage.getPanelContent(panel, contextPage, syntax);\n }\n\n public async getEditField(\n document: Document,\n fieldName: string,\n ): Promise<string> {\n return await this.storage.getEditField(document, fieldName);\n }\n\n save(\n page: string,\n title: string,\n content: string,\n syntax: string,\n ): Promise<unknown> {\n return this.storage.save(page, title, content, syntax);\n }\n\n async saveAttachments(page: string, files: File[]): Promise<unknown> {\n return this.storage.saveAttachments(page, files);\n }\n\n async delete(page: string): Promise<{ success: boolean; error?: string }> {\n return this.storage.delete(page);\n }\n\n async move(\n page: string,\n newPage: string,\n preserveChildren: boolean,\n ): Promise<{ success: boolean; error?: string }> {\n return this.storage.move(page, newPage, preserveChildren);\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexieOfflineStorage from \"./dexieOfflineStorage\";\nimport { WrappingOfflineStorage } from \"./wrappingOfflineStorage\";\nimport { WrappingStorage } from \"@xwiki/cristal-api\";\nimport { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport { Container } from \"inversify\";\n\nexport class ComponentInit {\n constructor(container: Container) {\n container\n .bind<WrappingStorage>(\"WrappingStorage\")\n .to(WrappingOfflineStorage)\n .inSingletonScope();\n container\n .bind<OfflineStorage>(\"OfflineStorage\")\n .to(DexieOfflineStorage)\n .inSingletonScope();\n }\n}\n"],"names":["DexiePageStorage","Dexie","wikiName","DexieOfflineStorage","logger","pageStorage","id","pageObject","pageData","DefaultPageData","e","page","__decorateClass","injectable","__decorateParam","WrappingOfflineStorage","offlineStorage","queueWorker","storage","config","syntax","url","image","_revision","requeue","name","currentPageData","panel","contextPage","document","fieldName","title","content","files","newPage","preserveChildren","ComponentInit","container"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(a,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("dexie"),require("@xwiki/cristal-api"),require("inversify")):typeof define=="function"&&define.amd?define(["exports","dexie","@xwiki/cristal-api","inversify"],l):(a=typeof globalThis<"u"?globalThis:a||self,l(a["cristal_backend-dexie"]={},a.Dexie,a.cristalApi,a.inversify))})(this,function(a,l,h,n){"use strict";class d extends l{constructor(t){super("pages_"+t),this.version(2).stores({pages:"id, name, content, document, css, js, document.name, document.headline, document.creator"})}}var p=Object.defineProperty,S=Object.getOwnPropertyDescriptor,P=(e,t,o,r)=>{for(var g=r>1?void 0:r?S(t,o):t,i=e.length-1,s;i>=0;i--)(s=e[i])&&(g=(r?s(t,o,g):s(g))||g);return r&&g&&p(t,o,g),g},v=(e,t)=>(o,r)=>t(o,r,e);let c=class{constructor(e){this.pageStorageMap=new Map,this.logger=e,this.logger.setModule("storage.components.dexieOfflineStorage")}getPageStorage(e){let t=this.pageStorageMap.get(e);return t==null&&(t=new d(e),this.pageStorageMap.set(e,t)),t}async getPage(e,t){try{this.logger.debug("Ready to load page from local storage",t);const o=this.getPageStorage(e);this.logger.debug("pageStorage is ready, asking for page");const r=await o.pages.get(t),g=new h.DefaultPageData;return g.fromObject(r),g}catch(o){this.logger.debug("Exception while trying to read from local storage",o);return}}async savePage(e,t,o){try{await this.getPageStorage(e).pages.put(o.toObject(),t)}catch(r){this.logger.debug("Exception while trying to store in local storage",e,t,o,r)}}async updatePage(e,t,o){try{const r=this.getPageStorage(e);this.logger.debug("Ready to store",o),await r.pages.update(t,o.toObject())}catch(r){this.logger.debug("Exception while trying to store in local storage",e,t,o,r)}}};c=P([n.injectable(),v(0,n.inject("Logger"))],c);var m=Object.defineProperty,b=Object.getOwnPropertyDescriptor,_=(e,t,o,r)=>{for(var g=r>1?void 0:r?b(t,o):t,i=e.length-1,s;i>=0;i--)(s=e[i])&&(g=(r?s(t,o,g):s(g))||g);return r&&g&&m(t,o,g),g},f=(e,t)=>(o,r)=>t(o,r,e);let u=class{constructor(e,t,o){this.logger=e,this.logger.setModule("storage.components.wrappingOfflineStorage"),this.offlineStorage=t,this.queueWorker=o}setStorage(e){this.storage=e}getStorage(){return this.storage}setWikiConfig(e){return this.storage.setWikiConfig(e)}getWikiConfig(){return this.storage.getWikiConfig()}async isStorageReady(){return this.storage.isStorageReady()}getPageRestURL(e,t){return this.storage.getPageRestURL(e,t)}getPageFromViewURL(e){return this.storage.getPageFromViewURL(e)}getImageURL(e,t){return this.storage.getImageURL(e,t)}async getPageContent(e,t,o,r){if(this.logger.debug("Trying to get data for page ",e),this.offlineStorage){this.logger.debug("Asking offline storage for ",e);const g=await this.offlineStorage.getPage(this.getWikiConfig().name,e+"_"+t);return g!=null&&g!=null?(this.logger.debug("Loading data from local storage for page",e),(r==null||r)&&this.queueWorker.addToQueue(this.getWikiConfig().name+":"+e+"_"+t),g):(this.logger.debug("Could not find data in local storage for page",e),this.savePageContent(e,t))}else return this.logger.debug("No offline local storage available"),this.storage.getPageContent(e,t)}getAttachments(e){return this.storage.getAttachments(e)}getAttachment(e,t){return this.storage.getAttachment(e,t)}async savePageContent(e,t){const o=await this.storage.getPageContent(e,t);if(o)return o.id=e+"_"+t,this.logger.debug("Saving page to offline storage",e),this.offlineStorage.savePage(this.getWikiConfig().name,e+"_"+t,o),o;throw new Error("Can't save missing page.")}async updatePageContent(e,t){const o=await this.offlineStorage.getPage(this.getWikiConfig().name,e+"_"+t),r=await this.storage.getPageContent(e,t);return o&&r?(r.id=e+"_"+t,this.logger.debug("Saving page to offline storage",e),this.offlineStorage.savePage(this.getWikiConfig().name,e+"_"+t,r),!0):(o==null?void 0:o.version)!=(r==null?void 0:r.version)&&r?(r.id=e+"_"+t,this.logger.debug("Updating page to offline storage",e),this.offlineStorage.updatePage(this.getWikiConfig().name,e+"_"+t,r),!0):(this.logger.debug("Local storage not updated, because version are identical"),!1)}async getPanelContent(e,t,o){return this.storage.getPanelContent(e,t,o)}async getEditField(e,t){return await this.storage.getEditField(e,t)}save(e,t,o,r){return this.storage.save(e,t,o,r)}async saveAttachments(e,t){return this.storage.saveAttachments(e,t)}async delete(e){return this.storage.delete(e)}};u=_([n.injectable(),f(0,n.inject("Logger")),f(1,n.inject("OfflineStorage")),f(2,n.inject("QueueWorker"))],u);class C{constructor(t){t.bind("WrappingStorage").to(u).inSingletonScope(),t.bind("OfflineStorage").to(c).inSingletonScope()}}a.ComponentInit=C,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(a,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("dexie"),require("@xwiki/cristal-api"),require("inversify")):typeof define=="function"&&define.amd?define(["exports","dexie","@xwiki/cristal-api","inversify"],l):(a=typeof globalThis<"u"?globalThis:a||self,l(a["cristal_backend-dexie"]={},a.Dexie,a.cristalApi,a.inversify))})(this,function(a,l,h,n){"use strict";class d extends l{constructor(t){super("pages_"+t),this.version(2).stores({pages:"id, name, content, document, css, js, document.name, document.headline, document.creator"})}}var p=Object.defineProperty,S=Object.getOwnPropertyDescriptor,P=(e,t,o,r)=>{for(var g=r>1?void 0:r?S(t,o):t,i=e.length-1,s;i>=0;i--)(s=e[i])&&(g=(r?s(t,o,g):s(g))||g);return r&&g&&p(t,o,g),g},v=(e,t)=>(o,r)=>t(o,r,e);let c=class{constructor(e){this.pageStorageMap=new Map,this.logger=e,this.logger.setModule("storage.components.dexieOfflineStorage")}getPageStorage(e){let t=this.pageStorageMap.get(e);return t==null&&(t=new d(e),this.pageStorageMap.set(e,t)),t}async getPage(e,t){try{this.logger.debug("Ready to load page from local storage",t);const o=this.getPageStorage(e);this.logger.debug("pageStorage is ready, asking for page");const r=await o.pages.get(t),g=new h.DefaultPageData;return g.fromObject(r),g}catch(o){this.logger.debug("Exception while trying to read from local storage",o);return}}async savePage(e,t,o){try{await this.getPageStorage(e).pages.put(o.toObject(),t)}catch(r){this.logger.debug("Exception while trying to store in local storage",e,t,o,r)}}async updatePage(e,t,o){try{const r=this.getPageStorage(e);this.logger.debug("Ready to store",o),await r.pages.update(t,o.toObject())}catch(r){this.logger.debug("Exception while trying to store in local storage",e,t,o,r)}}};c=P([n.injectable(),v(0,n.inject("Logger"))],c);var m=Object.defineProperty,b=Object.getOwnPropertyDescriptor,_=(e,t,o,r)=>{for(var g=r>1?void 0:r?b(t,o):t,i=e.length-1,s;i>=0;i--)(s=e[i])&&(g=(r?s(t,o,g):s(g))||g);return r&&g&&m(t,o,g),g},f=(e,t)=>(o,r)=>t(o,r,e);let u=class{constructor(e,t,o){this.logger=e,this.logger.setModule("storage.components.wrappingOfflineStorage"),this.offlineStorage=t,this.queueWorker=o}setStorage(e){this.storage=e}getStorage(){return this.storage}setWikiConfig(e){return this.storage.setWikiConfig(e)}getWikiConfig(){return this.storage.getWikiConfig()}async isStorageReady(){return this.storage.isStorageReady()}getPageRestURL(e,t){return this.storage.getPageRestURL(e,t)}getPageFromViewURL(e){return this.storage.getPageFromViewURL(e)}getImageURL(e,t){return this.storage.getImageURL(e,t)}async getPageContent(e,t,o,r){if(this.logger.debug("Trying to get data for page ",e),this.offlineStorage){this.logger.debug("Asking offline storage for ",e);const g=await this.offlineStorage.getPage(this.getWikiConfig().name,e+"_"+t);return g!=null&&g!=null?(this.logger.debug("Loading data from local storage for page",e),(r==null||r)&&this.queueWorker.addToQueue(this.getWikiConfig().name+":"+e+"_"+t),g):(this.logger.debug("Could not find data in local storage for page",e),this.savePageContent(e,t))}else return this.logger.debug("No offline local storage available"),this.storage.getPageContent(e,t)}getAttachments(e){return this.storage.getAttachments(e)}getAttachment(e,t){return this.storage.getAttachment(e,t)}async savePageContent(e,t){const o=await this.storage.getPageContent(e,t);if(o)return o.id=e+"_"+t,this.logger.debug("Saving page to offline storage",e),this.offlineStorage.savePage(this.getWikiConfig().name,e+"_"+t,o),o;throw new Error("Can't save missing page.")}async updatePageContent(e,t){const o=await this.offlineStorage.getPage(this.getWikiConfig().name,e+"_"+t),r=await this.storage.getPageContent(e,t);return o&&r?(r.id=e+"_"+t,this.logger.debug("Saving page to offline storage",e),this.offlineStorage.savePage(this.getWikiConfig().name,e+"_"+t,r),!0):(o==null?void 0:o.version)!=(r==null?void 0:r.version)&&r?(r.id=e+"_"+t,this.logger.debug("Updating page to offline storage",e),this.offlineStorage.updatePage(this.getWikiConfig().name,e+"_"+t,r),!0):(this.logger.debug("Local storage not updated, because version are identical"),!1)}async getPanelContent(e,t,o){return this.storage.getPanelContent(e,t,o)}async getEditField(e,t){return await this.storage.getEditField(e,t)}save(e,t,o,r){return this.storage.save(e,t,o,r)}async saveAttachments(e,t){return this.storage.saveAttachments(e,t)}async delete(e){return this.storage.delete(e)}async move(e,t,o){return this.storage.move(e,t,o)}};u=_([n.injectable(),f(0,n.inject("Logger")),f(1,n.inject("OfflineStorage")),f(2,n.inject("QueueWorker"))],u);class C{constructor(t){t.bind("WrappingStorage").to(u).inSingletonScope(),t.bind("OfflineStorage").to(c).inSingletonScope()}}a.ComponentInit=C,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/dexiePageStorage.ts","../src/dexieOfflineStorage.ts","../src/wrappingOfflineStorage.ts","../src/index.ts"],"sourcesContent":["/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n// eslint-disable-next-line import/no-named-as-default\nimport Dexie from \"dexie\";\nimport type { Table } from \"dexie\";\n\nexport default class DexiePageStorage extends Dexie {\n pages!: Table<object>;\n\n constructor(wikiName: string) {\n super(\"pages_\" + wikiName);\n this.version(2).stores({\n pages:\n // Primary key and indexed props\n \"id, name, content, document, css, js, document.name, document.headline, document.creator\",\n });\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexiePageStorage from \"./dexiePageStorage\";\nimport { DefaultPageData, PageData } from \"@xwiki/cristal-api\";\nimport { inject, injectable } from \"inversify\";\nimport type { Logger } from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\n\n@injectable()\nexport default class DexieOfflineStorage implements OfflineStorage {\n private pageStorageMap: Map<string, DexiePageStorage> = new Map<\n string,\n DexiePageStorage\n >();\n private logger: Logger;\n\n constructor(@inject<Logger>(\"Logger\") logger: Logger) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.dexieOfflineStorage\");\n }\n\n getPageStorage(wikiName: string): DexiePageStorage {\n let pageStorage = this.pageStorageMap.get(wikiName);\n if (pageStorage == null) {\n pageStorage = new DexiePageStorage(wikiName);\n this.pageStorageMap.set(wikiName, pageStorage);\n }\n return pageStorage;\n }\n\n async getPage(wikiName: string, id: string): Promise<PageData | undefined> {\n try {\n this.logger.debug(\"Ready to load page from local storage\", id);\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"pageStorage is ready, asking for page\");\n const pageObject = await pageStorage.pages.get(id);\n const pageData = new DefaultPageData();\n pageData.fromObject(pageObject);\n return pageData;\n } catch (e) {\n this.logger.debug(\"Exception while trying to read from local storage\", e);\n return undefined;\n }\n }\n\n async savePage(wikiName: string, id: string, page: PageData): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n // Put must be used instead of get since the later does not allow for\n // content update.\n await pageStorage.pages.put(page.toObject(), id);\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n\n async updatePage(\n wikiName: string,\n id: string,\n page: PageData,\n ): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"Ready to store\", page);\n await pageStorage.pages.update(id, page.toObject());\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport { inject, injectable } from \"inversify\";\nimport type {\n AttachmentsData,\n Document,\n Logger,\n PageAttachment,\n PageData,\n Storage,\n WikiConfig,\n WrappingStorage,\n} from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport type { QueueWorker } from \"@xwiki/cristal-sharedworker-api\";\n\n@injectable()\nexport class WrappingOfflineStorage implements WrappingStorage {\n public logger: Logger;\n // @ts-expect-error storage can be temporarily undefined during class\n // initialization\n public storage: Storage;\n public offlineStorage: OfflineStorage;\n public queueWorker: QueueWorker;\n\n constructor(\n @inject<Logger>(\"Logger\") logger: Logger,\n @inject<OfflineStorage>(\"OfflineStorage\") offlineStorage: OfflineStorage,\n @inject<QueueWorker>(\"QueueWorker\") queueWorker: QueueWorker,\n ) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.wrappingOfflineStorage\");\n this.offlineStorage = offlineStorage;\n this.queueWorker = queueWorker;\n }\n\n public setStorage(storage: Storage): void {\n this.storage = storage;\n }\n\n public getStorage(): Storage {\n return this.storage;\n }\n\n public setWikiConfig(config: WikiConfig): void {\n return this.storage.setWikiConfig(config);\n }\n\n public getWikiConfig(): WikiConfig {\n return this.storage.getWikiConfig();\n }\n\n public async isStorageReady(): Promise<boolean> {\n return this.storage.isStorageReady();\n }\n\n public getPageRestURL(page: string, syntax: string): string {\n return this.storage.getPageRestURL(page, syntax);\n }\n\n public getPageFromViewURL(url: string): string | null {\n return this.storage.getPageFromViewURL(url);\n }\n\n public getImageURL(page: string, image: string): string {\n return this.storage.getImageURL(page, image);\n }\n\n public async getPageContent(\n page: string,\n syntax: string,\n _revision?: string,\n requeue?: boolean,\n ): Promise<PageData | undefined> {\n this.logger.debug(\"Trying to get data for page \", page);\n if (this.offlineStorage) {\n this.logger.debug(\"Asking offline storage for \", page);\n const pageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n if (pageData != null && pageData != undefined) {\n this.logger.debug(\"Loading data from local storage for page\", page);\n // Adding page to refresh queue in shared worker\n if (requeue == undefined || requeue) {\n this.queueWorker.addToQueue(\n this.getWikiConfig().name + \":\" + page + \"_\" + syntax,\n );\n }\n return pageData;\n } else {\n this.logger.debug(\n \"Could not find data in local storage for page\",\n page,\n );\n return this.savePageContent(page, syntax);\n }\n } else {\n this.logger.debug(\"No offline local storage available\");\n return this.storage.getPageContent(page, syntax);\n }\n }\n\n public getAttachments(page: string): Promise<AttachmentsData | undefined> {\n // TODO: add support for offline storage of attachments.\n return this.storage.getAttachments(page);\n }\n\n getAttachment(\n page: string,\n name: string,\n ): Promise<PageAttachment | undefined> {\n return this.storage.getAttachment(page, name);\n }\n\n private async savePageContent(\n page: string,\n syntax: string,\n ): Promise<PageData> {\n const pageData = await this.storage.getPageContent(page, syntax);\n if (pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n\n return pageData;\n } else {\n throw new Error(\"Can't save missing page.\");\n }\n }\n\n public async updatePageContent(\n page: string,\n syntax: string,\n ): Promise<boolean> {\n const currentPageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n const pageData = await this.storage.getPageContent(page, syntax);\n if (currentPageData && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else if (currentPageData?.version != pageData?.version && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Updating page to offline storage\", page);\n this.offlineStorage.updatePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else {\n this.logger.debug(\n \"Local storage not updated, because version are identical\",\n );\n return false;\n }\n }\n\n public async getPanelContent(\n panel: string,\n contextPage: string,\n syntax: string,\n ): Promise<PageData> {\n return this.storage.getPanelContent(panel, contextPage, syntax);\n }\n\n public async getEditField(\n document: Document,\n fieldName: string,\n ): Promise<string> {\n return await this.storage.getEditField(document, fieldName);\n }\n\n save(\n page: string,\n title: string,\n content: string,\n syntax: string,\n ): Promise<unknown> {\n return this.storage.save(page, title, content, syntax);\n }\n\n async saveAttachments(page: string, files: File[]): Promise<unknown> {\n return this.storage.saveAttachments(page, files);\n }\n\n async delete(page: string): Promise<{ success: boolean; error?: string }> {\n return this.storage.delete(page);\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexieOfflineStorage from \"./dexieOfflineStorage\";\nimport { WrappingOfflineStorage } from \"./wrappingOfflineStorage\";\nimport { WrappingStorage } from \"@xwiki/cristal-api\";\nimport { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport { Container } from \"inversify\";\n\nexport class ComponentInit {\n constructor(container: Container) {\n container\n .bind<WrappingStorage>(\"WrappingStorage\")\n .to(WrappingOfflineStorage)\n .inSingletonScope();\n container\n .bind<OfflineStorage>(\"OfflineStorage\")\n .to(DexieOfflineStorage)\n .inSingletonScope();\n }\n}\n"],"names":["DexiePageStorage","Dexie","wikiName","DexieOfflineStorage","logger","pageStorage","id","pageObject","pageData","DefaultPageData","e","page","__decorateClass","injectable","__decorateParam","WrappingOfflineStorage","offlineStorage","queueWorker","storage","config","syntax","url","image","_revision","requeue","name","currentPageData","panel","contextPage","document","fieldName","title","content","files","ComponentInit","container"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/dexiePageStorage.ts","../src/dexieOfflineStorage.ts","../src/wrappingOfflineStorage.ts","../src/index.ts"],"sourcesContent":["/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n// eslint-disable-next-line import/no-named-as-default\nimport Dexie from \"dexie\";\nimport type { Table } from \"dexie\";\n\nexport default class DexiePageStorage extends Dexie {\n pages!: Table<object>;\n\n constructor(wikiName: string) {\n super(\"pages_\" + wikiName);\n this.version(2).stores({\n pages:\n // Primary key and indexed props\n \"id, name, content, document, css, js, document.name, document.headline, document.creator\",\n });\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexiePageStorage from \"./dexiePageStorage\";\nimport { DefaultPageData, PageData } from \"@xwiki/cristal-api\";\nimport { inject, injectable } from \"inversify\";\nimport type { Logger } from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\n\n@injectable()\nexport default class DexieOfflineStorage implements OfflineStorage {\n private pageStorageMap: Map<string, DexiePageStorage> = new Map<\n string,\n DexiePageStorage\n >();\n private logger: Logger;\n\n constructor(@inject<Logger>(\"Logger\") logger: Logger) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.dexieOfflineStorage\");\n }\n\n getPageStorage(wikiName: string): DexiePageStorage {\n let pageStorage = this.pageStorageMap.get(wikiName);\n if (pageStorage == null) {\n pageStorage = new DexiePageStorage(wikiName);\n this.pageStorageMap.set(wikiName, pageStorage);\n }\n return pageStorage;\n }\n\n async getPage(wikiName: string, id: string): Promise<PageData | undefined> {\n try {\n this.logger.debug(\"Ready to load page from local storage\", id);\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"pageStorage is ready, asking for page\");\n const pageObject = await pageStorage.pages.get(id);\n const pageData = new DefaultPageData();\n pageData.fromObject(pageObject);\n return pageData;\n } catch (e) {\n this.logger.debug(\"Exception while trying to read from local storage\", e);\n return undefined;\n }\n }\n\n async savePage(wikiName: string, id: string, page: PageData): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n // Put must be used instead of get since the later does not allow for\n // content update.\n await pageStorage.pages.put(page.toObject(), id);\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n\n async updatePage(\n wikiName: string,\n id: string,\n page: PageData,\n ): Promise<void> {\n try {\n const pageStorage = this.getPageStorage(wikiName);\n this.logger.debug(\"Ready to store\", page);\n await pageStorage.pages.update(id, page.toObject());\n } catch (e) {\n this.logger.debug(\n \"Exception while trying to store in local storage\",\n wikiName,\n id,\n page,\n e,\n );\n }\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport { inject, injectable } from \"inversify\";\nimport type {\n AttachmentsData,\n Document,\n Logger,\n PageAttachment,\n PageData,\n Storage,\n WikiConfig,\n WrappingStorage,\n} from \"@xwiki/cristal-api\";\nimport type { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport type { QueueWorker } from \"@xwiki/cristal-sharedworker-api\";\n\n@injectable()\nexport class WrappingOfflineStorage implements WrappingStorage {\n public logger: Logger;\n // @ts-expect-error storage can be temporarily undefined during class\n // initialization\n public storage: Storage;\n public offlineStorage: OfflineStorage;\n public queueWorker: QueueWorker;\n\n constructor(\n @inject<Logger>(\"Logger\") logger: Logger,\n @inject<OfflineStorage>(\"OfflineStorage\") offlineStorage: OfflineStorage,\n @inject<QueueWorker>(\"QueueWorker\") queueWorker: QueueWorker,\n ) {\n this.logger = logger;\n this.logger.setModule(\"storage.components.wrappingOfflineStorage\");\n this.offlineStorage = offlineStorage;\n this.queueWorker = queueWorker;\n }\n\n public setStorage(storage: Storage): void {\n this.storage = storage;\n }\n\n public getStorage(): Storage {\n return this.storage;\n }\n\n public setWikiConfig(config: WikiConfig): void {\n return this.storage.setWikiConfig(config);\n }\n\n public getWikiConfig(): WikiConfig {\n return this.storage.getWikiConfig();\n }\n\n public async isStorageReady(): Promise<boolean> {\n return this.storage.isStorageReady();\n }\n\n public getPageRestURL(page: string, syntax: string): string {\n return this.storage.getPageRestURL(page, syntax);\n }\n\n public getPageFromViewURL(url: string): string | null {\n return this.storage.getPageFromViewURL(url);\n }\n\n public getImageURL(page: string, image: string): string {\n return this.storage.getImageURL(page, image);\n }\n\n // TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.\n // eslint-disable-next-line max-statements\n public async getPageContent(\n page: string,\n syntax: string,\n _revision?: string,\n requeue?: boolean,\n ): Promise<PageData | undefined> {\n this.logger.debug(\"Trying to get data for page \", page);\n if (this.offlineStorage) {\n this.logger.debug(\"Asking offline storage for \", page);\n const pageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n if (pageData != null && pageData != undefined) {\n this.logger.debug(\"Loading data from local storage for page\", page);\n // Adding page to refresh queue in shared worker\n if (requeue == undefined || requeue) {\n this.queueWorker.addToQueue(\n this.getWikiConfig().name + \":\" + page + \"_\" + syntax,\n );\n }\n return pageData;\n } else {\n this.logger.debug(\n \"Could not find data in local storage for page\",\n page,\n );\n return this.savePageContent(page, syntax);\n }\n } else {\n this.logger.debug(\"No offline local storage available\");\n return this.storage.getPageContent(page, syntax);\n }\n }\n\n public getAttachments(page: string): Promise<AttachmentsData | undefined> {\n // TODO: add support for offline storage of attachments.\n return this.storage.getAttachments(page);\n }\n\n getAttachment(\n page: string,\n name: string,\n ): Promise<PageAttachment | undefined> {\n return this.storage.getAttachment(page, name);\n }\n\n private async savePageContent(\n page: string,\n syntax: string,\n ): Promise<PageData> {\n const pageData = await this.storage.getPageContent(page, syntax);\n if (pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n\n return pageData;\n } else {\n throw new Error(\"Can't save missing page.\");\n }\n }\n\n // TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.\n // eslint-disable-next-line max-statements\n public async updatePageContent(\n page: string,\n syntax: string,\n ): Promise<boolean> {\n const currentPageData = await this.offlineStorage.getPage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n );\n const pageData = await this.storage.getPageContent(page, syntax);\n if (currentPageData && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Saving page to offline storage\", page);\n this.offlineStorage.savePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else if (currentPageData?.version != pageData?.version && pageData) {\n pageData.id = page + \"_\" + syntax;\n this.logger.debug(\"Updating page to offline storage\", page);\n this.offlineStorage.updatePage(\n this.getWikiConfig().name,\n page + \"_\" + syntax,\n pageData,\n );\n return true;\n } else {\n this.logger.debug(\n \"Local storage not updated, because version are identical\",\n );\n return false;\n }\n }\n\n public async getPanelContent(\n panel: string,\n contextPage: string,\n syntax: string,\n ): Promise<PageData> {\n return this.storage.getPanelContent(panel, contextPage, syntax);\n }\n\n public async getEditField(\n document: Document,\n fieldName: string,\n ): Promise<string> {\n return await this.storage.getEditField(document, fieldName);\n }\n\n save(\n page: string,\n title: string,\n content: string,\n syntax: string,\n ): Promise<unknown> {\n return this.storage.save(page, title, content, syntax);\n }\n\n async saveAttachments(page: string, files: File[]): Promise<unknown> {\n return this.storage.saveAttachments(page, files);\n }\n\n async delete(page: string): Promise<{ success: boolean; error?: string }> {\n return this.storage.delete(page);\n }\n\n async move(\n page: string,\n newPage: string,\n preserveChildren: boolean,\n ): Promise<{ success: boolean; error?: string }> {\n return this.storage.move(page, newPage, preserveChildren);\n }\n}\n","/*\n * See the LICENSE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\nimport DexieOfflineStorage from \"./dexieOfflineStorage\";\nimport { WrappingOfflineStorage } from \"./wrappingOfflineStorage\";\nimport { WrappingStorage } from \"@xwiki/cristal-api\";\nimport { OfflineStorage } from \"@xwiki/cristal-backend-api\";\nimport { Container } from \"inversify\";\n\nexport class ComponentInit {\n constructor(container: Container) {\n container\n .bind<WrappingStorage>(\"WrappingStorage\")\n .to(WrappingOfflineStorage)\n .inSingletonScope();\n container\n .bind<OfflineStorage>(\"OfflineStorage\")\n .to(DexieOfflineStorage)\n .inSingletonScope();\n }\n}\n"],"names":["DexiePageStorage","Dexie","wikiName","DexieOfflineStorage","logger","pageStorage","id","pageObject","pageData","DefaultPageData","e","page","__decorateClass","injectable","__decorateParam","WrappingOfflineStorage","offlineStorage","queueWorker","storage","config","syntax","url","image","_revision","requeue","name","currentPageData","panel","contextPage","document","fieldName","title","content","files","newPage","preserveChildren","ComponentInit","container"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xwiki/cristal-backend-dexie",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"license": "LGPL 2.1",
|
|
5
5
|
"author": "XWiki Org Community <contact@xwiki.org>",
|
|
6
6
|
"homepage": "https://cristal.xwiki.org/",
|
|
@@ -22,15 +22,25 @@
|
|
|
22
22
|
},
|
|
23
23
|
"main": "./dist/index.es.js",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"dexie": "4.0.
|
|
26
|
-
"inversify": "6.
|
|
27
|
-
"@xwiki/cristal-
|
|
28
|
-
"@xwiki/cristal-sharedworker-api": "0.
|
|
29
|
-
"@xwiki/cristal-api": "0.
|
|
25
|
+
"dexie": "4.0.11",
|
|
26
|
+
"inversify": "6.2.1",
|
|
27
|
+
"@xwiki/cristal-api": "0.14.0",
|
|
28
|
+
"@xwiki/cristal-sharedworker-api": "0.14.0",
|
|
29
|
+
"@xwiki/cristal-backend-api": "0.14.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"reflect-metadata": "0.2.2"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"reflect-metadata": "0.2.2",
|
|
36
|
+
"typescript": "5.7.3",
|
|
37
|
+
"vite": "6.0.11",
|
|
38
|
+
"@xwiki/cristal-dev-config": "0.14.0"
|
|
30
39
|
},
|
|
31
40
|
"scripts": {
|
|
32
41
|
"build": "tsc --project tsconfig.json && vite build",
|
|
33
|
-
"lint": "eslint \"./src/**/*.{ts,tsx}\" --max-warnings=0"
|
|
42
|
+
"lint": "eslint \"./src/**/*.{ts,tsx,vue}\" --max-warnings=0",
|
|
43
|
+
"test": "vitest --run"
|
|
34
44
|
},
|
|
35
45
|
"types": "./dist/index.d.ts"
|
|
36
46
|
}
|
|
@@ -84,6 +84,8 @@ export class WrappingOfflineStorage implements WrappingStorage {
|
|
|
84
84
|
return this.storage.getImageURL(page, image);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
// TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.
|
|
88
|
+
// eslint-disable-next-line max-statements
|
|
87
89
|
public async getPageContent(
|
|
88
90
|
page: string,
|
|
89
91
|
syntax: string,
|
|
@@ -151,6 +153,8 @@ export class WrappingOfflineStorage implements WrappingStorage {
|
|
|
151
153
|
}
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
// TODO: reduce the number of statements in the following method and reactivate the disabled eslint rule.
|
|
157
|
+
// eslint-disable-next-line max-statements
|
|
154
158
|
public async updatePageContent(
|
|
155
159
|
page: string,
|
|
156
160
|
syntax: string,
|
|
@@ -217,4 +221,12 @@ export class WrappingOfflineStorage implements WrappingStorage {
|
|
|
217
221
|
async delete(page: string): Promise<{ success: boolean; error?: string }> {
|
|
218
222
|
return this.storage.delete(page);
|
|
219
223
|
}
|
|
224
|
+
|
|
225
|
+
async move(
|
|
226
|
+
page: string,
|
|
227
|
+
newPage: string,
|
|
228
|
+
preserveChildren: boolean,
|
|
229
|
+
): Promise<{ success: boolean; error?: string }> {
|
|
230
|
+
return this.storage.move(page, newPage, preserveChildren);
|
|
231
|
+
}
|
|
220
232
|
}
|
package/tsconfig.json
CHANGED
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* See the LICENSE file distributed with this work for additional
|
|
3
|
+
* information regarding copyright ownership.
|
|
4
|
+
*
|
|
5
|
+
* This is free software; you can redistribute it and/or modify it
|
|
6
|
+
* under the terms of the GNU Lesser General Public License as
|
|
7
|
+
* published by the Free Software Foundation; either version 2.1 of
|
|
8
|
+
* the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* This software is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
* Lesser General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
* License along with this software; if not, write to the Free
|
|
17
|
+
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
18
|
+
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import localConfig from "./vite.config";
|
|
22
|
+
import { mergeConfig } from "vitest/config";
|
|
23
|
+
import defaultConfig from "@xwiki/cristal-dev-config/vitest-vue.config";
|
|
24
|
+
|
|
25
|
+
export default mergeConfig(defaultConfig, localConfig);
|