@inpageedit/core 0.14.4 → 0.15.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 (71) hide show
  1. package/dist/{BasePlugin-DD7l-5Xw.js → BasePlugin-BCVSn9QJ.js} +2 -2
  2. package/dist/{BasePlugin-DD7l-5Xw.js.map → BasePlugin-BCVSn9QJ.js.map} +1 -1
  3. package/dist/InputBox-CZ1v4_l3.js +50 -0
  4. package/dist/InputBox-CZ1v4_l3.js.map +1 -0
  5. package/dist/PluginImagesUsed-Bq_C_rgg.js +90 -0
  6. package/dist/PluginImagesUsed-Bq_C_rgg.js.map +1 -0
  7. package/dist/{PluginPrefSync-CbFuuC19.js → PluginPrefSync-DP5NyPnI.js} +4 -4
  8. package/dist/{PluginPrefSync-CbFuuC19.js.map → PluginPrefSync-DP5NyPnI.js.map} +1 -1
  9. package/dist/{PluginStoreApp-MbC3G9tu.js → PluginStoreApp-_YWpLgfs.js} +2 -2
  10. package/dist/{PluginStoreApp-MbC3G9tu.js.map → PluginStoreApp-_YWpLgfs.js.map} +1 -1
  11. package/dist/PluginTemplatesUsed-DS_rHctR.js +76 -0
  12. package/dist/PluginTemplatesUsed-DS_rHctR.js.map +1 -0
  13. package/dist/Preferences-DqtjY7XU.js +1541 -0
  14. package/dist/Preferences-DqtjY7XU.js.map +1 -0
  15. package/dist/browser-DR-yCqVg.js +1160 -0
  16. package/dist/browser-DR-yCqVg.js.map +1 -0
  17. package/dist/components/index.js +1 -1
  18. package/dist/{index-BpQ6VGMz.js → index-B9VO3swL.js} +108 -63
  19. package/dist/index-B9VO3swL.js.map +1 -0
  20. package/dist/{index-BanevHQ2.js → index-C3t-Xj3e.js} +85 -82
  21. package/dist/index-C3t-Xj3e.js.map +1 -0
  22. package/dist/{index-WfXtYVMt.js → index-CS1kidKF.js} +149 -117
  23. package/dist/index-CS1kidKF.js.map +1 -0
  24. package/dist/index-Cb2_vqBl.js +44 -0
  25. package/dist/index-Cb2_vqBl.js.map +1 -0
  26. package/dist/{index-B3jld2sl.js → index-CbdkXGs7.js} +4 -4
  27. package/dist/{index-B3jld2sl.js.map → index-CbdkXGs7.js.map} +1 -1
  28. package/dist/{index-BdHmr8jw.js → index-CcAmmXbb.js} +904 -704
  29. package/dist/index-CcAmmXbb.js.map +1 -0
  30. package/dist/index-Cq8xPcEY.js +170 -0
  31. package/dist/index-Cq8xPcEY.js.map +1 -0
  32. package/dist/{index-DensW9qt.js → index-DPA1ptYq.js} +5 -5
  33. package/dist/index-DPA1ptYq.js.map +1 -0
  34. package/dist/{index-BjDTD66_.js → index-DVvsTsLI.js} +29 -15
  35. package/dist/index-DVvsTsLI.js.map +1 -0
  36. package/dist/{index-CnR6CqkM.js → index-DjyjqpeO.js} +2 -2
  37. package/dist/{index-CnR6CqkM.js.map → index-DjyjqpeO.js.map} +1 -1
  38. package/dist/index-FvMu0Ka0.js +342 -0
  39. package/dist/index-FvMu0Ka0.js.map +1 -0
  40. package/dist/index-mFwJhDwE.js +168 -0
  41. package/dist/index-mFwJhDwE.js.map +1 -0
  42. package/dist/{index-De25v1_Q.js → index-n5KKWE9v.js} +6 -6
  43. package/dist/index-n5KKWE9v.js.map +1 -0
  44. package/dist/{index-DKCZDN-Q.js → index-rKL4D_7I.js} +5 -5
  45. package/dist/{index-DKCZDN-Q.js.map → index-rKL4D_7I.js.map} +1 -1
  46. package/dist/index.d.ts +334 -147
  47. package/dist/index.js +5 -5
  48. package/dist/models/index.js +1 -1
  49. package/dist/plugins/index.js +18 -14
  50. package/dist/plugins/index.js.map +1 -1
  51. package/dist/services/index.js +9 -8
  52. package/dist/style.css +1 -1
  53. package/lib/index.umd.js +14 -12
  54. package/lib/index.umd.js.map +1 -1
  55. package/lib/style.css +1 -1
  56. package/package.json +4 -2
  57. package/dist/InputBox-nQKtiWtZ.js +0 -30
  58. package/dist/InputBox-nQKtiWtZ.js.map +0 -1
  59. package/dist/Preferences-C10tZMl1.js +0 -2701
  60. package/dist/Preferences-C10tZMl1.js.map +0 -1
  61. package/dist/index-BXNyXvre.js +0 -116
  62. package/dist/index-BXNyXvre.js.map +0 -1
  63. package/dist/index-BanevHQ2.js.map +0 -1
  64. package/dist/index-BdHmr8jw.js.map +0 -1
  65. package/dist/index-BjDTD66_.js.map +0 -1
  66. package/dist/index-BpQ6VGMz.js.map +0 -1
  67. package/dist/index-DVOc6fB6.js +0 -211
  68. package/dist/index-DVOc6fB6.js.map +0 -1
  69. package/dist/index-De25v1_Q.js.map +0 -1
  70. package/dist/index-DensW9qt.js.map +0 -1
  71. package/dist/index-WfXtYVMt.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -9,12 +9,14 @@ import "@inpageedit/modal/style.css";
9
9
  import { IDBPlus } from "idb-plus";
10
10
  import "@/styles/index.scss";
11
11
  import Schema, { default as Schema$1 } from "schemastery";
12
- import * as jsx_dom2 from "jsx-dom";
12
+ import * as jsx_dom1 from "jsx-dom";
13
13
  import { JSX, ReactElement, ReactNode } from "jsx-dom";
14
14
  import { JSX as JSX$1 } from "jsx-dom/jsx-runtime";
15
15
  import { JSX as JSX$2 } from "vue/jsx-runtime";
16
16
  import * as vue0 from "vue";
17
17
  import { App } from "vue";
18
+ import "./plugins/quick-preview/style.scss";
19
+ import "./plugins/quick-upload/style.scss";
18
20
  import "./plugins/toolbox/styles.scss";
19
21
  export * from "@inpageedit/logger";
20
22
  export * from "wiki-saikou/browser";
@@ -22,19 +24,6 @@ export * from "@inpageedit/modal";
22
24
 
23
25
  //#region rolldown:runtime
24
26
  //#endregion
25
- //#region src/services/ApiService.d.ts
26
- // ↓ '@/InPageEdit'
27
- declare module '.' {
28
- interface InPageEdit {
29
- api: MwApi;
30
- }
31
- }
32
- interface ApiServiceOptions extends Partial<FexiosConfigs> {}
33
- declare class ApiService {
34
- ctx: InPageEdit;
35
- constructor(ctx: InPageEdit, options?: Partial<ApiServiceOptions>);
36
- }
37
- //#endregion
38
27
  //#region src/types/WikiMetadata.d.ts
39
28
  interface WikiSiteInfo {
40
29
  general: WikiSiteGeneralInfo;
@@ -42,6 +31,7 @@ interface WikiSiteInfo {
42
31
  namespacealiases: WikiNameSpaceAlias[];
43
32
  magicwords: WikiMagicWord[];
44
33
  namespaces: Record<string, WikiNamespace>;
34
+ repos: WikiFileRepo[];
45
35
  }
46
36
  interface WikiSiteGeneralInfo {
47
37
  mainpage: string;
@@ -166,6 +156,35 @@ interface WikiUserOptions {
166
156
  language: string;
167
157
  [key: string]: unknown;
168
158
  }
159
+ interface WikiFileRepo {
160
+ name: string;
161
+ displayname: string;
162
+ rootUrl: string;
163
+ local: boolean;
164
+ url: string;
165
+ thumbUrl: string;
166
+ initialCapital: boolean;
167
+ scriptDirUrl: string;
168
+ canUpload: boolean;
169
+ }
170
+ //#endregion
171
+ //#region src/services/ApiService.d.ts
172
+ // ↓ '@/InPageEdit'
173
+ declare module '.' {
174
+ interface InPageEdit {
175
+ api: MwApi;
176
+ apiService: ApiService;
177
+ }
178
+ }
179
+ interface ApiServiceOptions extends Partial<FexiosConfigs> {}
180
+ declare class ApiService {
181
+ ctx: InPageEdit;
182
+ private options;
183
+ api: MwApi;
184
+ constructor(ctx: InPageEdit, options?: Partial<ApiServiceOptions>);
185
+ private _apiClients;
186
+ getClientByFileRepo(repo: WikiFileRepo): MwApi;
187
+ }
169
188
  //#endregion
170
189
  //#region src/models/WikiTitle/index.d.ts
171
190
  interface IWikiTitle {
@@ -332,102 +351,6 @@ declare class ModalService {
332
351
  notify: (...args: Parameters<typeof CustomIPEModal.notify>) => CustomIPEModal;
333
352
  }
334
353
  //#endregion
335
- //#region src/services/storage/managers/LocalStorageManager.d.ts
336
- declare class LocalStorageManager<T = unknown> implements AbstractIPEStorageManager<T> {
337
- dbName?: string | undefined;
338
- readonly storeName?: string | undefined;
339
- ttl: number;
340
- version?: number | string | undefined;
341
- engine: 'localStorage' | 'sessionStorage' | 'memory';
342
- private db;
343
- constructor(dbName?: string | undefined, storeName?: string | undefined, ttl?: number, version?: number | string | undefined, engine?: 'localStorage' | 'sessionStorage' | 'memory');
344
- private makeKey;
345
- private load;
346
- private getRaw;
347
- private setRaw;
348
- private deleteSync;
349
- private isExpired;
350
- get(key: string, ttl?: number, setter?: () => Promise<T> | T): Promise<T | null>;
351
- set(key: string, value: null | undefined): Promise<void>;
352
- set(key: string, value: T): Promise<TypedStorageEntry<T>>;
353
- set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
354
- has(key: string, ttl?: number): Promise<boolean>;
355
- delete(key: string): Promise<void>;
356
- updatedAt(key: string): Promise<number>;
357
- clear(): Promise<this>;
358
- keys(): AsyncIterable<string>;
359
- values(): AsyncIterable<TypedStorageEntry<T>>;
360
- entries(): AsyncIterable<[string, TypedStorageEntry<T>]>;
361
- }
362
- //#endregion
363
- //#region src/services/storage/managers/IDBStorageManager.d.ts
364
- declare class IDBStorageManager<T = unknown> implements AbstractIPEStorageManager<T> {
365
- readonly dbName: string;
366
- readonly storeName: string;
367
- ttl: number;
368
- version?: number | string | undefined;
369
- readonly db: IDBPlus<string, TypedStorageEntry<T>>;
370
- keys: () => AsyncIterable<string>;
371
- values: () => AsyncIterable<TypedStorageEntry<T>>;
372
- entries: () => AsyncIterable<[string, TypedStorageEntry<T>]>;
373
- constructor(dbName: string, storeName: string, ttl?: number, version?: number | string | undefined);
374
- private _clearExpiredEntries;
375
- get(key: string, ttl?: number, setter?: () => Promise<T> | T): Promise<T | null>;
376
- set(key: string, value: null | undefined): Promise<void>;
377
- set(key: string, value: T): Promise<TypedStorageEntry<T>>;
378
- set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
379
- has(key: string, ttl?: number): Promise<boolean>;
380
- delete(key: string): Promise<void>;
381
- updatedAt(key: string): Promise<number>;
382
- private loadFromDB;
383
- private checkIfExpired;
384
- /**
385
- * [DANGER] Use with caution!
386
- * Delete all data from the database.
387
- */
388
- clear(): Promise<this>;
389
- }
390
- //#endregion
391
- //#region src/services/storage/index.d.ts
392
- // ↓ '@/InPageEdit'
393
- declare module '.' {
394
- interface InPageEdit {
395
- storage: StorageService;
396
- }
397
- }
398
- interface StorageServiceConfig {
399
- dbName: string;
400
- }
401
- declare class StorageService extends Service<StorageServiceConfig> {
402
- config: StorageServiceConfig;
403
- readonly kv: IDBStorageManager<any>;
404
- readonly simpleKV: LocalStorageManager<any>;
405
- readonly memoryKV: LocalStorageManager<any>;
406
- constructor(ctx: InPageEdit, config: StorageServiceConfig);
407
- createDatabase<T = any>(storeName: string, ttl?: number, version?: number | string, engine?: 'indexedDB' | 'localStorage' | 'sessionStorage' | 'memory'): AbstractIPEStorageManager<T>;
408
- }
409
- interface TypedStorageEntry<T = any> {
410
- /** last update time */
411
- time: number;
412
- /** stored value */
413
- value: T;
414
- /** version */
415
- version?: number | string;
416
- }
417
- interface AbstractIPEStorageManager<T = unknown> {
418
- get(key: string, ttl?: number, setter?: () => Promise<any> | any): Promise<T | null>;
419
- set(key: string, value: null | undefined): Promise<void>;
420
- set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
421
- set(key: string, value: T): Promise<TypedStorageEntry<T>>;
422
- has(key: string, ttl?: number): Promise<boolean>;
423
- delete(key: string): Promise<void>;
424
- keys(): AsyncIterable<string>;
425
- values(): AsyncIterable<TypedStorageEntry<T>>;
426
- entries(): AsyncIterable<[string, TypedStorageEntry<T>]>;
427
- updatedAt(key: string): Promise<number>;
428
- clear(): Promise<this>;
429
- }
430
- //#endregion
431
354
  //#region src/services/WikiMetadataService.d.ts
432
355
  // ↓ '@/InPageEdit'
433
356
  declare module '.' {
@@ -489,6 +412,7 @@ declare class WikiMetadataService extends Service {
489
412
  get isUserBlocked(): boolean | "" | undefined;
490
413
  get userGroups(): string[];
491
414
  get userRights(): string[];
415
+ get fileRepos(): WikiFileRepo[];
492
416
  /**
493
417
  * Base URL, without trailing slash
494
418
  * @example "https://mediawiki.org"
@@ -544,6 +468,102 @@ declare class WikiMetadataService extends Service {
544
468
  getBlockInfo(): WikiUserBlockInfo | null;
545
469
  }
546
470
  //#endregion
471
+ //#region src/services/storage/managers/LocalStorageManager.d.ts
472
+ declare class LocalStorageManager<T = unknown> implements AbstractIPEStorageManager<T> {
473
+ dbName?: string | undefined;
474
+ readonly storeName?: string | undefined;
475
+ ttl: number;
476
+ version?: number | string | undefined;
477
+ engine: 'localStorage' | 'sessionStorage' | 'memory';
478
+ private db;
479
+ constructor(dbName?: string | undefined, storeName?: string | undefined, ttl?: number, version?: number | string | undefined, engine?: 'localStorage' | 'sessionStorage' | 'memory');
480
+ private makeKey;
481
+ private load;
482
+ private getRaw;
483
+ private setRaw;
484
+ private deleteSync;
485
+ private isExpired;
486
+ get(key: string, ttl?: number, setter?: () => Promise<T> | T): Promise<T | null>;
487
+ set(key: string, value: null | undefined): Promise<void>;
488
+ set(key: string, value: T): Promise<TypedStorageEntry<T>>;
489
+ set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
490
+ has(key: string, ttl?: number): Promise<boolean>;
491
+ delete(key: string): Promise<void>;
492
+ updatedAt(key: string): Promise<number>;
493
+ clear(): Promise<this>;
494
+ keys(): AsyncIterable<string>;
495
+ values(): AsyncIterable<TypedStorageEntry<T>>;
496
+ entries(): AsyncIterable<[string, TypedStorageEntry<T>]>;
497
+ }
498
+ //#endregion
499
+ //#region src/services/storage/managers/IDBStorageManager.d.ts
500
+ declare class IDBStorageManager<T = unknown> implements AbstractIPEStorageManager<T> {
501
+ readonly dbName: string;
502
+ readonly storeName: string;
503
+ ttl: number;
504
+ version?: number | string | undefined;
505
+ readonly db: IDBPlus<string, TypedStorageEntry<T>>;
506
+ keys: () => AsyncIterable<string>;
507
+ values: () => AsyncIterable<TypedStorageEntry<T>>;
508
+ entries: () => AsyncIterable<[string, TypedStorageEntry<T>]>;
509
+ constructor(dbName: string, storeName: string, ttl?: number, version?: number | string | undefined);
510
+ private _clearExpiredEntries;
511
+ get(key: string, ttl?: number, setter?: () => Promise<T> | T): Promise<T | null>;
512
+ set(key: string, value: null | undefined): Promise<void>;
513
+ set(key: string, value: T): Promise<TypedStorageEntry<T>>;
514
+ set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
515
+ has(key: string, ttl?: number): Promise<boolean>;
516
+ delete(key: string): Promise<void>;
517
+ updatedAt(key: string): Promise<number>;
518
+ private loadFromDB;
519
+ private checkIfExpired;
520
+ /**
521
+ * [DANGER] Use with caution!
522
+ * Delete all data from the database.
523
+ */
524
+ clear(): Promise<this>;
525
+ }
526
+ //#endregion
527
+ //#region src/services/storage/index.d.ts
528
+ // ↓ '@/InPageEdit'
529
+ declare module '.' {
530
+ interface InPageEdit {
531
+ storage: StorageService;
532
+ }
533
+ }
534
+ interface StorageServiceConfig {
535
+ dbName: string;
536
+ }
537
+ declare class StorageService extends Service<StorageServiceConfig> {
538
+ config: StorageServiceConfig;
539
+ readonly kv: IDBStorageManager<any>;
540
+ readonly simpleKV: LocalStorageManager<any>;
541
+ readonly memoryKV: LocalStorageManager<any>;
542
+ constructor(ctx: InPageEdit, config: StorageServiceConfig);
543
+ createDatabase<T = any>(storeName: string, ttl?: number, version?: number | string, engine?: 'indexedDB' | 'localStorage' | 'sessionStorage' | 'memory'): AbstractIPEStorageManager<T>;
544
+ }
545
+ interface TypedStorageEntry<T = any> {
546
+ /** last update time */
547
+ time: number;
548
+ /** stored value */
549
+ value: T;
550
+ /** version */
551
+ version?: number | string;
552
+ }
553
+ interface AbstractIPEStorageManager<T = unknown> {
554
+ get(key: string, ttl?: number, setter?: () => Promise<any> | any): Promise<T | null>;
555
+ set(key: string, value: null | undefined): Promise<void>;
556
+ set(record: Record<string, T | null | undefined>): Promise<Record<string, TypedStorageEntry<T> | void>>;
557
+ set(key: string, value: T): Promise<TypedStorageEntry<T>>;
558
+ has(key: string, ttl?: number): Promise<boolean>;
559
+ delete(key: string): Promise<void>;
560
+ keys(): AsyncIterable<string>;
561
+ values(): AsyncIterable<TypedStorageEntry<T>>;
562
+ entries(): AsyncIterable<[string, TypedStorageEntry<T>]>;
563
+ updatedAt(key: string): Promise<number>;
564
+ clear(): Promise<this>;
565
+ }
566
+ //#endregion
547
567
  //#region src/models/WikiPage/types/PageInfo.d.ts
548
568
  /**
549
569
  * @url https://www.mediawiki.org/wiki/Content_handlers
@@ -631,8 +651,12 @@ declare enum WatchlistAction {
631
651
  nochange = "nochange",
632
652
  }
633
653
  //#endregion
634
- //#region src/models/WikiPage/index.d.ts
635
- interface WikiPageEditPayload {
654
+ //#region src/models/WikiPage/types/WikiPageActionEdit.d.ts
655
+ /**
656
+ * Request body of MediaWiki edit action
657
+ * @see https://www.mediawiki.org/wiki/API:Edit
658
+ */
659
+ interface WikiPageActionEditRequest {
636
660
  text?: string;
637
661
  prependtext?: string;
638
662
  appendtext?: string;
@@ -644,6 +668,20 @@ interface WikiPageEditPayload {
644
668
  starttimestamp?: string;
645
669
  baserevid?: number;
646
670
  }
671
+ /**
672
+ * Result of MediaWiki edit action
673
+ * @see https://www.mediawiki.org/wiki/API:Edit
674
+ */
675
+ interface WikiPageActionEditResult {
676
+ result: 'Success' | 'Failure';
677
+ pageid: number;
678
+ title: string;
679
+ contentmodel: string;
680
+ nochange?: boolean;
681
+ watched?: boolean;
682
+ }
683
+ //#endregion
684
+ //#region src/models/WikiPage/index.d.ts
647
685
  interface IWikiPage {
648
686
  pageInfo: PageInfo;
649
687
  parse(params?: MwApiParams$1): Promise<FexiosFinalContext<MwApiResponse<{
@@ -652,15 +690,15 @@ interface IWikiPage {
652
690
  preview(text: string, params?: MwApiParams$1): Promise<FexiosFinalContext<MwApiResponse<{
653
691
  parse: PageParseData;
654
692
  }>>>;
655
- edit(payload: WikiPageEditPayload & MwApiParams$1, /** @deprecated Append params in `payload` instead */
693
+ edit(payload: WikiPageActionEditRequest & MwApiParams$1, /** @deprecated Append params in `payload` instead */
656
694
  params?: MwApiParams$1): Promise<FexiosFinalContext<MwApiResponse<{
657
- success: boolean;
695
+ edit: WikiPageActionEditResult;
658
696
  }>>>;
659
- createOnly(payload: Pick<WikiPageEditPayload, 'summary' | 'watchlist'> & {
697
+ createOnly(payload: Pick<WikiPageActionEditRequest, 'summary' | 'watchlist'> & {
660
698
  text: string;
661
699
  recreate?: boolean;
662
700
  }, params?: MwApiParams$1): Promise<FexiosFinalContext<MwApiResponse<{
663
- success: boolean;
701
+ edit: WikiPageActionEditResult;
664
702
  }>>>;
665
703
  delete(reason?: string, params?: MwApiParams$1): Promise<FexiosFinalContext<MwApiResponse<{
666
704
  delete: {
@@ -752,7 +790,7 @@ declare class WikiTitleService extends Service {
752
790
  readonly Title: WikiTitleConstructor;
753
791
  constructor(ctx: InPageEdit);
754
792
  private readonly logger;
755
- newTitle(title: string, namespace?: number): IWikiTitle;
793
+ newTitle(title: string | IWikiTitle, namespace?: number): IWikiTitle;
756
794
  newMainPageTitle(): IWikiTitle;
757
795
  newTitleFromUrl(url: string | URL): Promise<any>;
758
796
  private _cachedTitles;
@@ -1197,6 +1235,104 @@ declare class I18nService extends Service {
1197
1235
  private onClearCache;
1198
1236
  }
1199
1237
  //#endregion
1238
+ //#region src/models/MemoryStorage.d.ts
1239
+ declare class MemoryStorage implements Storage {
1240
+ private values;
1241
+ get length(): number;
1242
+ clear(): void;
1243
+ getItem(key: string): string | null;
1244
+ setItem(key: string, value: string): void;
1245
+ removeItem(key: string): void;
1246
+ key(index: number): string | null;
1247
+ }
1248
+ declare const useMemoryStorage: () => MemoryStorage;
1249
+ //#endregion
1250
+ //#region src/services/WikiFileService.d.ts
1251
+ // ↓ '@/InPageEdit.js'
1252
+ declare module '.' {
1253
+ interface InPageEdit {
1254
+ wikiFile: WikiFileService;
1255
+ }
1256
+ }
1257
+ /**
1258
+ * @see https://www.mediawiki.org/wiki/API:Upload
1259
+ */
1260
+ interface UploadFileParams {
1261
+ file: File;
1262
+ filekey: string;
1263
+ url: string;
1264
+ filename: string;
1265
+ comment: string;
1266
+ text: string;
1267
+ tags: string[] | string;
1268
+ watchlist: WatchlistAction;
1269
+ ignorewarnings: boolean;
1270
+ filesize: number;
1271
+ offset: number;
1272
+ chunk: File;
1273
+ stash: boolean;
1274
+ checkstatus: boolean;
1275
+ }
1276
+ type UploadFileResult = {
1277
+ result: 'Success';
1278
+ filename: string;
1279
+ imageinfo: WikiImageInfo;
1280
+ } | {
1281
+ result: 'Failure' | 'Warning' | 'Continue' | 'Poll';
1282
+ filekey: string;
1283
+ sessionkey?: string;
1284
+ warnings?: {
1285
+ /** file with this filekey already exists */
1286
+ exists?: string;
1287
+ /** uploaded file is the same as stored file with this timestamp */
1288
+ nochange?: {
1289
+ timestamp: string;
1290
+ };
1291
+ /** uploaded file is duplicated with these files */
1292
+ duplicate?: string[];
1293
+ };
1294
+ imageinfo: never;
1295
+ };
1296
+ interface WikiImageInfo {
1297
+ timestamp: string;
1298
+ user: string;
1299
+ userid: number;
1300
+ size: number;
1301
+ width: number;
1302
+ height: number;
1303
+ duration: number;
1304
+ parsedcomment: string;
1305
+ comment: string;
1306
+ html: string;
1307
+ canonicaltitle: string;
1308
+ url: string;
1309
+ descriptionurl: string;
1310
+ sha1: string;
1311
+ metadata: {
1312
+ name: string;
1313
+ value: any;
1314
+ }[];
1315
+ commonmetadata: unknown[];
1316
+ extmetadata: unknown;
1317
+ mime: string;
1318
+ mediatype: string;
1319
+ bitdepth: number;
1320
+ }
1321
+ declare class WikiFileService extends Service {
1322
+ ctx: InPageEdit;
1323
+ constructor(ctx: InPageEdit);
1324
+ get fileRepos(): WikiFileRepo[];
1325
+ get defaultFileRepo(): WikiFileRepo | undefined;
1326
+ get localFileRepo(): WikiFileRepo | undefined;
1327
+ get writableFileRepo(): WikiFileRepo | undefined;
1328
+ getFileName(title: string | IWikiTitle): string;
1329
+ getHashPath(title: string | IWikiTitle, hashLevel?: number): string;
1330
+ getFileUrl(title: string | IWikiTitle, repo?: WikiFileRepo): string;
1331
+ upload(params: Partial<UploadFileParams>, repo?: WikiFileRepo): Promise<wiki_saikou0.FexiosFinalContext<wiki_saikou0.MwApiResponse<{
1332
+ upload: UploadFileResult;
1333
+ }>>>;
1334
+ }
1335
+ //#endregion
1200
1336
  //#region src/InPageEdit.d.ts
1201
1337
  interface InPageEditCoreConfig {
1202
1338
  apiConfigs: Partial<FexiosConfigs>;
@@ -1338,21 +1474,21 @@ declare function TabView({
1338
1474
  content: ReactNode;
1339
1475
  })[];
1340
1476
  defaultActiveIndex?: number;
1341
- }): jsx_dom2.ReactElement;
1477
+ }): jsx_dom1.ReactElement;
1342
1478
  declare function TabLabel({
1343
1479
  name,
1344
1480
  children
1345
1481
  }: {
1346
1482
  name: string;
1347
1483
  children: ReactNode;
1348
- }): jsx_dom2.ReactElement;
1484
+ }): jsx_dom1.ReactElement;
1349
1485
  declare function TabContent({
1350
1486
  name,
1351
1487
  children
1352
1488
  }: {
1353
1489
  name: string;
1354
1490
  children: ReactNode;
1355
- }): jsx_dom2.ReactElement;
1491
+ }): jsx_dom1.ReactElement;
1356
1492
  //#endregion
1357
1493
  //#region src/components/TwinSwapInput/index.d.ts
1358
1494
  type TwinSwapInputProps = {
@@ -1397,7 +1533,7 @@ type CheckBoxProps = {
1397
1533
  inputProps?: JSX.IntrinsicElements['input'];
1398
1534
  labelProps?: JSX.IntrinsicElements['span'];
1399
1535
  } & JSX.IntrinsicElements['label'];
1400
- declare const CheckBox: (props: CheckBoxProps) => jsx_dom2.ReactElement;
1536
+ declare const CheckBox: (props: CheckBoxProps) => jsx_dom1.ReactElement;
1401
1537
  //#endregion
1402
1538
  //#region src/components/InputBox.d.ts
1403
1539
  type InputBoxProps = {
@@ -1405,11 +1541,13 @@ type InputBoxProps = {
1405
1541
  id?: string;
1406
1542
  name: string;
1407
1543
  value?: string;
1544
+ placeholder?: string;
1408
1545
  disabled?: boolean;
1546
+ required?: boolean;
1409
1547
  labelProps?: JSX.IntrinsicElements['label'];
1410
1548
  inputProps?: JSX.IntrinsicElements['input'];
1411
1549
  } & JSX.IntrinsicElements['div'];
1412
- declare const InputBox: (props: InputBoxProps) => jsx_dom2.ReactElement;
1550
+ declare const InputBox: (props: InputBoxProps) => jsx_dom1.ReactElement;
1413
1551
  //#endregion
1414
1552
  //#region src/components/RadioBox.d.ts
1415
1553
  type RadioBoxProps = {
@@ -1420,19 +1558,7 @@ type RadioBoxProps = {
1420
1558
  inputProps?: JSX.IntrinsicElements['input'];
1421
1559
  labelProps?: JSX.IntrinsicElements['span'];
1422
1560
  } & JSX.IntrinsicElements['label'];
1423
- declare const RadioBox: (props: RadioBoxProps) => jsx_dom2.ReactElement;
1424
- //#endregion
1425
- //#region src/models/MemoryStorage.d.ts
1426
- declare class MemoryStorage implements Storage {
1427
- private values;
1428
- get length(): number;
1429
- clear(): void;
1430
- getItem(key: string): string | null;
1431
- setItem(key: string, value: string): void;
1432
- removeItem(key: string): void;
1433
- key(index: number): string | null;
1434
- }
1435
- declare const useMemoryStorage: () => MemoryStorage;
1561
+ declare const RadioBox: (props: RadioBoxProps) => jsx_dom1.ReactElement;
1436
1562
  //#endregion
1437
1563
  //#region src/plugins/analytics/index.d.ts
1438
1564
  // ↓ '@/InPageEdit'
@@ -1440,6 +1566,13 @@ declare module '.' {
1440
1566
  interface InPageEdit {
1441
1567
  analytics: PluginAnalytics;
1442
1568
  }
1569
+ interface Events {
1570
+ 'analytics/event'(payload: {
1571
+ feature: string;
1572
+ subtype?: string;
1573
+ page?: string;
1574
+ }): void;
1575
+ }
1443
1576
  }
1444
1577
  interface IPEBeaconPayload {
1445
1578
  siteApi: string;
@@ -1469,7 +1602,7 @@ declare class PluginAnalytics extends BasePlugin {
1469
1602
  private _registerUnloadHandler;
1470
1603
  private _showConfirmNotify;
1471
1604
  private _initPluginListeners;
1472
- addEvent(feature: string, subtype?: string, page?: string): this;
1605
+ addEvent(feature: string, subtype?: string, page?: string): this | undefined;
1473
1606
  private sendBeacon;
1474
1607
  /**
1475
1608
  * 清理资源
@@ -1518,6 +1651,7 @@ declare class PluginInArticleLinks extends BasePlugin<{
1518
1651
  private _cachedAnchorInfo;
1519
1652
  parseAnchor(anchor: HTMLAnchorElement): InArticleWikiAnchorMetadata | null;
1520
1653
  scanAnchors(parent: HTMLElement, filter?: (info: InArticleWikiAnchorMetadata) => boolean): InArticleWikiAnchorMetadata[];
1654
+ private onContentReady;
1521
1655
  handleQuickEdit(): Promise<void>;
1522
1656
  handleQuickDiff(): void;
1523
1657
  }
@@ -1782,6 +1916,10 @@ declare class PluginQuickDiff extends BasePlugin {
1782
1916
  private injectQuickEdit;
1783
1917
  readonly COMPARE_API_DEFAULT_OPTIONS: Partial<CompareApiRequestOptions>;
1784
1918
  comparePages(options: Partial<CompareApiRequestOptions>, modal?: IPEModal, modalOptions?: Partial<IPEModalOptions>): IPEModal;
1919
+ createQuickDiffButton(payload: Partial<CompareApiRequestOptions>, options?: {
1920
+ label?: ReactNode;
1921
+ icon?: ReactNode;
1922
+ }): HTMLAnchorElement;
1785
1923
  }
1786
1924
  //#endregion
1787
1925
  //#region src/plugins/quick-edit/index.d.ts
@@ -1849,9 +1987,9 @@ declare class PluginQuickEdit extends BasePlugin {
1849
1987
  constructor(ctx: InPageEdit);
1850
1988
  protected start(): Promise<void> | void;
1851
1989
  showModal(payload?: string | Partial<QuickEditOptions>): Promise<void>;
1852
- handleSubmit(payload: QuickEditSubmitPayload): Promise<Required<wiki_saikou0.FexiosContext<wiki_saikou0.MwApiResponse<{
1853
- success: boolean;
1854
- }>>>>;
1990
+ handleSubmit(payload: QuickEditSubmitPayload): Promise<wiki_saikou0.FexiosFinalContext<wiki_saikou0.MwApiResponse<{
1991
+ edit: WikiPageActionEditResult;
1992
+ }>>>;
1855
1993
  static readonly BUILT_IN_FONT_OPTIONS: string[];
1856
1994
  getEditFontOptions(): Promise<{
1857
1995
  className: string;
@@ -1860,6 +1998,10 @@ declare class PluginQuickEdit extends BasePlugin {
1860
1998
  getWikiPageFromPayload(payload: Partial<QuickEditOptions>): Promise<IWikiPage>;
1861
1999
  private injectToolbox;
1862
2000
  protected removeToolbox(ctx: InPageEdit): void;
2001
+ createQuickEditButton(payload: Partial<QuickEditOptions>, options?: {
2002
+ icon?: ReactNode;
2003
+ label?: ReactNode;
2004
+ }): HTMLAnchorElement;
1863
2005
  }
1864
2006
  //#endregion
1865
2007
  //#region src/plugins/quick-move/index.d.ts
@@ -1905,9 +2047,9 @@ declare class PluginQuickMove extends BasePlugin {
1905
2047
  protected start(): Promise<void> | void;
1906
2048
  private injectToolbox;
1907
2049
  showModal(options?: Partial<QuickMoveOptions>): Promise<CustomIPEModal>;
1908
- movePage(options: MovePageOptions): Promise<Required<wiki_saikou0.FexiosContext<wiki_saikou0.MwApiResponse<{
2050
+ movePage(options: MovePageOptions): Promise<wiki_saikou0.FexiosFinalContext<wiki_saikou0.MwApiResponse<{
1909
2051
  success: boolean;
1910
- }>>>>;
2052
+ }>>>;
1911
2053
  }
1912
2054
  //#endregion
1913
2055
  //#region src/plugins/quick-preview/index.d.ts
@@ -1941,6 +2083,14 @@ declare class PluginQuickPreview extends BasePlugin {
1941
2083
  protected stop(): Promise<void> | void;
1942
2084
  previewWikitext(text: string, params?: MwApiParams, wikiPage?: IWikiPage, modal?: IPEModal, modalOptions?: Partial<IPEModalOptions>): IPEModal;
1943
2085
  private injectQuickEdit;
2086
+ private _contentTypeCache;
2087
+ private fetchContentType;
2088
+ getPreviewType(fileOrUrl: File | string): Promise<"unknown" | "image" | "video" | "audio" | "html" | "markdown" | "text" | "pdf">;
2089
+ previewFile(fileOrUrl: File | string, alt?: string): Promise<CustomIPEModal | undefined>;
2090
+ private _objectUrls;
2091
+ private getObjectUrl;
2092
+ getPreviewElement(fileOrUrl: File | string, alt?: string): Promise<jsx_dom1.ReactElement | null>;
2093
+ previewWikiPage(title: string): void;
1944
2094
  }
1945
2095
  //#endregion
1946
2096
  //#region src/plugins/quick-redirect/index.d.ts
@@ -1986,9 +2136,46 @@ declare class PluginQuickRedirect extends BasePlugin {
1986
2136
  protected start(): Promise<void> | void;
1987
2137
  protected stop(): Promise<void> | void;
1988
2138
  showModal(options?: Partial<QuickRedirectOptions>): Promise<CustomIPEModal>;
1989
- redirectPage(options: RedirectPageOptions): Promise<Required<wiki_saikou0.FexiosContext<wiki_saikou0.MwApiResponse<{
1990
- success: boolean;
1991
- }>>>>;
2139
+ redirectPage(options: RedirectPageOptions): Promise<wiki_saikou0.FexiosFinalContext<wiki_saikou0.MwApiResponse<{
2140
+ edit: WikiPageActionEditResult;
2141
+ }>>>;
2142
+ }
2143
+ //#endregion
2144
+ //#region src/plugins/quick-upload/index.d.ts
2145
+ // ↓ '@/InPageEdit'
2146
+ declare module '.' {
2147
+ interface InPageEdit {
2148
+ quickUpload: PluginQuickUpload;
2149
+ }
2150
+ interface Preferences {
2151
+ 'quickUpload.summary': string;
2152
+ }
2153
+ }
2154
+ declare class PluginQuickUpload extends BasePlugin {
2155
+ ctx: InPageEdit;
2156
+ constructor(ctx: InPageEdit);
2157
+ protected start(): Promise<void>;
2158
+ protected stop(): Promise<void>;
2159
+ private injectQuickEdit;
2160
+ private injectToolbox;
2161
+ private formatFileSize;
2162
+ private getDefaultPreviewPlaceholder;
2163
+ private isFileAccepted;
2164
+ showModal(): Promise<CustomIPEModal>;
2165
+ }
2166
+ //#endregion
2167
+ //#region src/plugins/quick-usage/index.d.ts
2168
+ // ↓ '@/InPageEdit'
2169
+ declare module '.' {
2170
+ interface InPageEdit {
2171
+ quickUsage: PluginQuickUsage;
2172
+ }
2173
+ }
2174
+ declare class PluginQuickUsage extends BasePlugin {
2175
+ ctx: InPageEdit;
2176
+ constructor(ctx: InPageEdit);
2177
+ protected start(): Promise<void>;
2178
+ getWrapperForQuickEdit(modal: IPEModal): Element | SVGElement;
1992
2179
  }
1993
2180
  //#endregion
1994
2181
  //#region src/plugins/toolbox/index.d.ts
@@ -2066,10 +2253,10 @@ declare class PluginToolbox extends Service {
2066
2253
  toggle(force?: boolean): void;
2067
2254
  }
2068
2255
  declare namespace index_d_exports$1 {
2069
- export { AbstractIPEStorageManager, ApiService, ApiServiceOptions, CurrentPageService, CustomIPEModal, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, ModalService, PreferencesService, ResourceLoaderService, StorageService, StorageServiceConfig, TypedStorageEntry, WikiLinkMetadata, WikiMetadataService, WikiPageService, WikiTitleService };
2256
+ export { AbstractIPEStorageManager, ApiService, ApiServiceOptions, CurrentPageService, CustomIPEModal, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, ModalService, PreferencesService, ResourceLoaderService, StorageService, StorageServiceConfig, TypedStorageEntry, UploadFileParams, UploadFileResult, WikiFileService, WikiImageInfo, WikiLinkMetadata, WikiMetadataService, WikiPageService, WikiTitleService };
2070
2257
  }
2071
2258
  declare namespace index_d_exports {
2072
- export { AbstractIPEStorageManager, ActionButton, ActionButtonProps, ApiService, ApiServiceOptions, BasePlugin, CheckBox, CheckBoxProps, CompareApiRequestOptions, CompareApiResponse, ContentModelMap, CordisError, CordisSymbols, CurrentPageService, CustomIPEModal, EffectScope, Endpoints, Events, ForkScope, IPEBeaconPayload, IPEBeaconUsage, IPEPlugin, IPERegistry, IWikiPage, IWikiTitle, InArticleWikiAnchorMetadata, InPageEdit, InPageEditCoreConfig, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, Inject, InputBox, InputBoxProps, Lifecycle, MBox, MBoxElement, MBoxProps, MainScope, MemoryStorage, ModalService, MovePageOptions, PageInfo, PageParseData, PluginAnalytics, PluginInArticleLinks, PluginPluginStore, PluginPreferencesUI, PluginQuickDiff, PluginQuickEdit, PluginQuickMove, PluginQuickPreview, PluginQuickRedirect, PluginStoreRegistrySource, PluginToolbox, PreferencesMap, PreferencesService, ProgressBar, QuickEditEventPayload, QuickEditOptions, QuickEditSubmitPayload, QuickMoveOptions, QuickRedirectOptions, RadioBox, RadioBoxProps, RedirectPageOptions, RegisterPreferences, ResourceLoaderService, Schema, ScopeStatus, Service, StorageService, StorageServiceConfig, TabContent, TabLabel, TabView, TabViewLabelOptions, TwinSwapElement, TwinSwapInput, TwinSwapInputInput, TwinSwapInputProps, TypedStorageEntry, WatchlistAction, WikiLinkMetadata, WikiMagicWord, WikiMetadataService, WikiNameSpaceAlias, WikiNamespace, WikiPageConstructor, WikiPageEditPayload, WikiPageService, WikiSiteGeneralInfo, WikiSiteInfo, WikiSpecialPageAlias, WikiTitleConstructor, WikiTitleService, WikiUserBlockInfo, WikiUserInfo, WikiUserOptions, createWikiPageModel, createWikiTitleModel, useMemoryStorage };
2259
+ export { AbstractIPEStorageManager, ActionButton, ActionButtonProps, ApiService, ApiServiceOptions, BasePlugin, CheckBox, CheckBoxProps, CompareApiRequestOptions, CompareApiResponse, ContentModelMap, CordisError, CordisSymbols, CurrentPageService, CustomIPEModal, EffectScope, Endpoints, Events, ForkScope, IPEBeaconPayload, IPEBeaconUsage, IPEPlugin, IPERegistry, IWikiPage, IWikiTitle, InArticleWikiAnchorMetadata, InPageEdit, InPageEditCoreConfig, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, Inject, InputBox, InputBoxProps, Lifecycle, MBox, MBoxElement, MBoxProps, MainScope, MemoryStorage, ModalService, MovePageOptions, PageInfo, PageParseData, PluginAnalytics, PluginInArticleLinks, PluginPluginStore, PluginPreferencesUI, PluginQuickDiff, PluginQuickEdit, PluginQuickMove, PluginQuickPreview, PluginQuickRedirect, PluginQuickUpload, PluginQuickUsage, PluginStoreRegistrySource, PluginToolbox, PreferencesMap, PreferencesService, ProgressBar, QuickEditEventPayload, QuickEditOptions, QuickEditSubmitPayload, QuickMoveOptions, QuickRedirectOptions, RadioBox, RadioBoxProps, RedirectPageOptions, RegisterPreferences, ResourceLoaderService, Schema, ScopeStatus, Service, StorageService, StorageServiceConfig, TabContent, TabLabel, TabView, TabViewLabelOptions, TwinSwapElement, TwinSwapInput, TwinSwapInputInput, TwinSwapInputProps, TypedStorageEntry, UploadFileParams, UploadFileResult, WatchlistAction, WikiFileRepo, WikiFileService, WikiImageInfo, WikiLinkMetadata, WikiMagicWord, WikiMetadataService, WikiNameSpaceAlias, WikiNamespace, WikiPageConstructor, WikiPageService, WikiSiteGeneralInfo, WikiSiteInfo, WikiSpecialPageAlias, WikiTitleConstructor, WikiTitleService, WikiUserBlockInfo, WikiUserInfo, WikiUserOptions, createWikiPageModel, createWikiTitleModel, useMemoryStorage };
2073
2260
  }
2074
2261
  declare global {
2075
2262
  const ipe: InPageEdit;
@@ -2105,4 +2292,4 @@ declare global {
2105
2292
  }
2106
2293
  }
2107
2294
  //#endregion
2108
- export { AbstractIPEStorageManager, ActionButton, ActionButtonProps, ApiService, ApiServiceOptions, BasePlugin, CheckBox, CheckBoxProps, CompareApiRequestOptions, CompareApiResponse, ContentModelMap, CordisError, CordisSymbols, CurrentPageService, CustomIPEModal, EffectScope, Endpoints, Events, ForkScope, IPEBeaconPayload, IPEBeaconUsage, IPEPlugin, IPERegistry, IWikiPage, IWikiTitle, InArticleWikiAnchorMetadata, InPageEdit, InPageEditCoreConfig, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, Inject, InputBox, InputBoxProps, Lifecycle, MBox, MBoxElement, MBoxProps, MainScope, MemoryStorage, ModalService, MovePageOptions, PageInfo, PageParseData, PluginAnalytics, PluginInArticleLinks, PluginPluginStore, PluginPreferencesUI, PluginQuickDiff, PluginQuickEdit, PluginQuickMove, PluginQuickPreview, PluginQuickRedirect, PluginStoreRegistrySource, PluginToolbox, PreferencesMap, PreferencesService, ProgressBar, QuickEditEventPayload, QuickEditOptions, QuickEditSubmitPayload, QuickMoveOptions, QuickRedirectOptions, RadioBox, RadioBoxProps, RedirectPageOptions, RegisterPreferences, ResourceLoaderService, Schema, ScopeStatus, Service, StorageService, StorageServiceConfig, TabContent, TabLabel, TabView, TabViewLabelOptions, TwinSwapElement, TwinSwapInput, TwinSwapInputInput, TwinSwapInputProps, TypedStorageEntry, WatchlistAction, WikiLinkMetadata, WikiMagicWord, WikiMetadataService, WikiNameSpaceAlias, WikiNamespace, WikiPageConstructor, WikiPageEditPayload, WikiPageService, WikiSiteGeneralInfo, WikiSiteInfo, WikiSpecialPageAlias, WikiTitleConstructor, WikiTitleService, WikiUserBlockInfo, WikiUserInfo, WikiUserOptions, createWikiPageModel, createWikiTitleModel, useMemoryStorage };
2295
+ export { AbstractIPEStorageManager, ActionButton, ActionButtonProps, ApiService, ApiServiceOptions, BasePlugin, CheckBox, CheckBoxProps, CompareApiRequestOptions, CompareApiResponse, ContentModelMap, CordisError, CordisSymbols, CurrentPageService, CustomIPEModal, EffectScope, Endpoints, Events, ForkScope, IPEBeaconPayload, IPEBeaconUsage, IPEPlugin, IPERegistry, IWikiPage, IWikiTitle, InArticleWikiAnchorMetadata, InPageEdit, InPageEditCoreConfig, InPageEditPreferenceUICategory, InPageEditPreferenceUIRegistryItem, Inject, InputBox, InputBoxProps, Lifecycle, MBox, MBoxElement, MBoxProps, MainScope, MemoryStorage, ModalService, MovePageOptions, PageInfo, PageParseData, PluginAnalytics, PluginInArticleLinks, PluginPluginStore, PluginPreferencesUI, PluginQuickDiff, PluginQuickEdit, PluginQuickMove, PluginQuickPreview, PluginQuickRedirect, PluginQuickUpload, PluginQuickUsage, PluginStoreRegistrySource, PluginToolbox, PreferencesMap, PreferencesService, ProgressBar, QuickEditEventPayload, QuickEditOptions, QuickEditSubmitPayload, QuickMoveOptions, QuickRedirectOptions, RadioBox, RadioBoxProps, RedirectPageOptions, RegisterPreferences, ResourceLoaderService, Schema, ScopeStatus, Service, StorageService, StorageServiceConfig, TabContent, TabLabel, TabView, TabViewLabelOptions, TwinSwapElement, TwinSwapInput, TwinSwapInputInput, TwinSwapInputProps, TypedStorageEntry, UploadFileParams, UploadFileResult, WatchlistAction, WikiFileRepo, WikiFileService, WikiImageInfo, WikiLinkMetadata, WikiMagicWord, WikiMetadataService, WikiNameSpaceAlias, WikiNamespace, WikiPageConstructor, WikiPageService, WikiSiteGeneralInfo, WikiSiteInfo, WikiSpecialPageAlias, WikiTitleConstructor, WikiTitleService, WikiUserBlockInfo, WikiUserInfo, WikiUserOptions, createWikiPageModel, createWikiTitleModel, useMemoryStorage };