@shuo-li/i18n 1.0.8 → 1.0.9

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.
@@ -339,7 +339,8 @@ async function _initI18n(options) {
339
339
  resolvedStaticModules = options.staticLocales ? [...new Set(
340
340
  Object.values(options.staticLocales).flatMap((langModules) => Object.keys(langModules))
341
341
  )] : [];
342
- await storage.ensureStores(resolvedStores);
342
+ const schemaVersion = options.version != null ? Math.max(1, Math.trunc(Number(options.version)) || 1) : 1;
343
+ await storage.ensureStores(resolvedStores, schemaVersion);
343
344
  await checkCacheVersion(storage, options);
344
345
  const allKnownModules = sortedModules();
345
346
  for (const lang of resolvedLanguages) {
@@ -339,7 +339,8 @@ async function _initI18n(options) {
339
339
  resolvedStaticModules = options.staticLocales ? [...new Set(
340
340
  Object.values(options.staticLocales).flatMap((langModules) => Object.keys(langModules))
341
341
  )] : [];
342
- await storage.ensureStores(resolvedStores);
342
+ const schemaVersion = options.version != null ? Math.max(1, Math.trunc(Number(options.version)) || 1) : 1;
343
+ await storage.ensureStores(resolvedStores, schemaVersion);
343
344
  await checkCacheVersion(storage, options);
344
345
  const allKnownModules = sortedModules();
345
346
  for (const lang of resolvedLanguages) {
package/dist/index.cjs CHANGED
@@ -7,7 +7,7 @@ var _chunkAJJKJPNBcjs = require('./chunk-AJJKJPNB.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunk2EV6FQILcjs = require('./chunk-2EV6FQIL.cjs');
10
+ var _chunkDSK7CM4Gcjs = require('./chunk-DSK7CM4G.cjs');
11
11
 
12
12
  // src/index.ts
13
13
  var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next);
@@ -20,12 +20,10 @@ function resourceStoreName(name) {
20
20
  }
21
21
  var dbInstance = null;
22
22
  var dbOpenPromise = null;
23
- var dbStoreNames = [];
24
- function openDB(storeNames, version) {
23
+ function openDB(storeNames, idbVersion) {
25
24
  return new Promise((resolve, reject) => {
26
- const req = version !== void 0 ? indexedDB.open(DB_NAME, version) : indexedDB.open(DB_NAME);
27
- req.onupgradeneeded = (event) => {
28
- if (version === void 0) return;
25
+ const request = indexedDB.open(DB_NAME, idbVersion);
26
+ request.onupgradeneeded = (event) => {
29
27
  const db = event.target.result;
30
28
  for (const name of storeNames) {
31
29
  const storeName = resourceStoreName(name);
@@ -36,8 +34,8 @@ function openDB(storeNames, version) {
36
34
  }
37
35
  }
38
36
  };
39
- req.onsuccess = () => {
40
- const db = req.result;
37
+ request.onsuccess = () => {
38
+ const db = request.result;
41
39
  db.onversionchange = () => {
42
40
  db.close();
43
41
  dbInstance = null;
@@ -47,31 +45,15 @@ function openDB(storeNames, version) {
47
45
  dbInstance = null;
48
46
  dbOpenPromise = null;
49
47
  };
50
- const missing = storeNames.filter((n) => !db.objectStoreNames.contains(resourceStoreName(n)));
51
- if (missing.length === 0 || version !== void 0) {
52
- resolve(db);
53
- return;
54
- }
55
- const nextVersion = db.version + 1;
56
- db.close();
57
- openDB(storeNames, nextVersion).then(resolve).catch(reject);
48
+ resolve(db);
58
49
  };
59
- req.onerror = () => reject(req.error);
60
- req.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
50
+ request.onerror = () => reject(request.error);
51
+ request.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
61
52
  });
62
53
  }
63
54
  function getDB() {
64
55
  if (dbInstance) return Promise.resolve(dbInstance);
65
- if (!dbOpenPromise) {
66
- dbOpenPromise = openDB(dbStoreNames).then((db) => {
67
- dbInstance = db;
68
- dbOpenPromise = null;
69
- return db;
70
- }).catch((err) => {
71
- dbOpenPromise = null;
72
- throw err;
73
- });
74
- }
56
+ if (!dbOpenPromise) throw new Error("[i18n] ensureStores must be called before using the DB");
75
57
  return dbOpenPromise;
76
58
  }
77
59
  function idbRequest(req) {
@@ -89,23 +71,26 @@ async function withRetry(fn) {
89
71
  }
90
72
  }
91
73
  var IndexedDBAdapter = class {
92
- async ensureStores(stores) {
74
+ /**
75
+ * schemaVersion 来自外部传入的 options.version。
76
+ * IDB 版本 = schemaVersion * 100 + stores.length,保证:
77
+ * - options.version 变化 → IDB 版本变化 → onupgradeneeded → 触发 checkCacheVersion 的数据清理
78
+ * - store 数量变化(未登录→登录)→ IDB 版本变化 → onupgradeneeded → 新增 store
79
+ */
80
+ async ensureStores(stores, schemaVersion = 1) {
93
81
  const storeNames = stores.map((s) => s.name);
94
- dbStoreNames = storeNames;
82
+ const idbVersion = schemaVersion * 100 + storeNames.length;
95
83
  if (dbInstance) {
96
84
  const allExist = storeNames.every(
97
85
  (n) => dbInstance.objectStoreNames.contains(resourceStoreName(n))
98
86
  );
99
- if (allExist) return;
100
- const nextVersion = dbInstance.version + 1;
87
+ if (allExist && dbInstance.version === idbVersion) return;
101
88
  dbInstance.close();
102
89
  dbInstance = null;
103
90
  dbOpenPromise = null;
104
- dbInstance = await openDB(storeNames, nextVersion);
105
- return;
106
91
  }
107
92
  if (!dbOpenPromise) {
108
- dbOpenPromise = openDB(storeNames).then((db) => {
93
+ dbOpenPromise = openDB(storeNames, idbVersion).then((db) => {
109
94
  dbInstance = db;
110
95
  dbOpenPromise = null;
111
96
  return db;
@@ -195,7 +180,7 @@ if (!_i18next2.default.isInitialized) {
195
180
  }
196
181
  });
197
182
  }
198
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
183
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkDSK7CM4Gcjs.createI18nManager.call(void 0, {
199
184
  storage: new IndexedDBAdapter(),
200
185
  createWorker: () => new (0, _chunkAJJKJPNBcjs.WebWorkerAdapter)(
201
186
  new Worker(new URL("./workers/preload-worker.js", import.meta.url), { type: "module" })
@@ -211,4 +196,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
211
196
 
212
197
 
213
198
 
214
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
199
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunkDSK7CM4Gcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkDSK7CM4Gcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  I18N_RESOURCES_UPDATED_EVENT,
8
8
  createI18nManager,
9
9
  emitI18nResourcesUpdated
10
- } from "./chunk-5VHZCG34.js";
10
+ } from "./chunk-3ALMQ7Q5.js";
11
11
 
12
12
  // src/index.ts
13
13
  import i18n from "i18next";
@@ -20,12 +20,10 @@ function resourceStoreName(name) {
20
20
  }
21
21
  var dbInstance = null;
22
22
  var dbOpenPromise = null;
23
- var dbStoreNames = [];
24
- function openDB(storeNames, version) {
23
+ function openDB(storeNames, idbVersion) {
25
24
  return new Promise((resolve, reject) => {
26
- const req = version !== void 0 ? indexedDB.open(DB_NAME, version) : indexedDB.open(DB_NAME);
27
- req.onupgradeneeded = (event) => {
28
- if (version === void 0) return;
25
+ const request = indexedDB.open(DB_NAME, idbVersion);
26
+ request.onupgradeneeded = (event) => {
29
27
  const db = event.target.result;
30
28
  for (const name of storeNames) {
31
29
  const storeName = resourceStoreName(name);
@@ -36,8 +34,8 @@ function openDB(storeNames, version) {
36
34
  }
37
35
  }
38
36
  };
39
- req.onsuccess = () => {
40
- const db = req.result;
37
+ request.onsuccess = () => {
38
+ const db = request.result;
41
39
  db.onversionchange = () => {
42
40
  db.close();
43
41
  dbInstance = null;
@@ -47,31 +45,15 @@ function openDB(storeNames, version) {
47
45
  dbInstance = null;
48
46
  dbOpenPromise = null;
49
47
  };
50
- const missing = storeNames.filter((n) => !db.objectStoreNames.contains(resourceStoreName(n)));
51
- if (missing.length === 0 || version !== void 0) {
52
- resolve(db);
53
- return;
54
- }
55
- const nextVersion = db.version + 1;
56
- db.close();
57
- openDB(storeNames, nextVersion).then(resolve).catch(reject);
48
+ resolve(db);
58
49
  };
59
- req.onerror = () => reject(req.error);
60
- req.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
50
+ request.onerror = () => reject(request.error);
51
+ request.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
61
52
  });
62
53
  }
63
54
  function getDB() {
64
55
  if (dbInstance) return Promise.resolve(dbInstance);
65
- if (!dbOpenPromise) {
66
- dbOpenPromise = openDB(dbStoreNames).then((db) => {
67
- dbInstance = db;
68
- dbOpenPromise = null;
69
- return db;
70
- }).catch((err) => {
71
- dbOpenPromise = null;
72
- throw err;
73
- });
74
- }
56
+ if (!dbOpenPromise) throw new Error("[i18n] ensureStores must be called before using the DB");
75
57
  return dbOpenPromise;
76
58
  }
77
59
  function idbRequest(req) {
@@ -89,23 +71,26 @@ async function withRetry(fn) {
89
71
  }
90
72
  }
91
73
  var IndexedDBAdapter = class {
92
- async ensureStores(stores) {
74
+ /**
75
+ * schemaVersion 来自外部传入的 options.version。
76
+ * IDB 版本 = schemaVersion * 100 + stores.length,保证:
77
+ * - options.version 变化 → IDB 版本变化 → onupgradeneeded → 触发 checkCacheVersion 的数据清理
78
+ * - store 数量变化(未登录→登录)→ IDB 版本变化 → onupgradeneeded → 新增 store
79
+ */
80
+ async ensureStores(stores, schemaVersion = 1) {
93
81
  const storeNames = stores.map((s) => s.name);
94
- dbStoreNames = storeNames;
82
+ const idbVersion = schemaVersion * 100 + storeNames.length;
95
83
  if (dbInstance) {
96
84
  const allExist = storeNames.every(
97
85
  (n) => dbInstance.objectStoreNames.contains(resourceStoreName(n))
98
86
  );
99
- if (allExist) return;
100
- const nextVersion = dbInstance.version + 1;
87
+ if (allExist && dbInstance.version === idbVersion) return;
101
88
  dbInstance.close();
102
89
  dbInstance = null;
103
90
  dbOpenPromise = null;
104
- dbInstance = await openDB(storeNames, nextVersion);
105
- return;
106
91
  }
107
92
  if (!dbOpenPromise) {
108
- dbOpenPromise = openDB(storeNames).then((db) => {
93
+ dbOpenPromise = openDB(storeNames, idbVersion).then((db) => {
109
94
  dbInstance = db;
110
95
  dbOpenPromise = null;
111
96
  return db;
package/dist/mp/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk2EV6FQILcjs = require('../chunk-2EV6FQIL.cjs');
5
+ var _chunkDSK7CM4Gcjs = require('../chunk-DSK7CM4G.cjs');
6
6
 
7
7
  // src/storage/wx-sqlite.ts
8
8
  var DB_NAME = "i18n_cache";
@@ -39,7 +39,7 @@ function exec(db, sql, args = []) {
39
39
  });
40
40
  }
41
41
  var WxSQLiteAdapter = class {
42
- async ensureStores(stores) {
42
+ async ensureStores(stores, _schemaVersion) {
43
43
  const db = await getDB();
44
44
  for (const store of stores) {
45
45
  const table = resourceTable(store.name);
@@ -181,7 +181,7 @@ function wxFetch(input, init) {
181
181
  }
182
182
 
183
183
  // src/mp/index.ts
184
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
184
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkDSK7CM4Gcjs.createI18nManager.call(void 0, {
185
185
  storage: new WxSQLiteAdapter(),
186
186
  createWorker: () => new WxWorkerAdapter(wx.createWorker("workers/preload-worker-mp.js")),
187
187
  fetchFn: wxFetch
@@ -194,4 +194,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
194
194
 
195
195
 
196
196
 
197
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n;
197
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunkDSK7CM4Gcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkDSK7CM4Gcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n;
package/dist/mp/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  I18N_RESOURCES_UPDATED_EVENT,
3
3
  createI18nManager,
4
4
  emitI18nResourcesUpdated
5
- } from "../chunk-5VHZCG34.js";
5
+ } from "../chunk-3ALMQ7Q5.js";
6
6
 
7
7
  // src/storage/wx-sqlite.ts
8
8
  var DB_NAME = "i18n_cache";
@@ -39,7 +39,7 @@ function exec(db, sql, args = []) {
39
39
  });
40
40
  }
41
41
  var WxSQLiteAdapter = class {
42
- async ensureStores(stores) {
42
+ async ensureStores(stores, _schemaVersion) {
43
43
  const db = await getDB();
44
44
  for (const store of stores) {
45
45
  const table = resourceTable(store.name);
@@ -7,7 +7,7 @@ var _chunkAJJKJPNBcjs = require('../chunk-AJJKJPNB.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunk2EV6FQILcjs = require('../chunk-2EV6FQIL.cjs');
10
+ var _chunkDSK7CM4Gcjs = require('../chunk-DSK7CM4G.cjs');
11
11
 
12
12
  // src/native/index.ts
13
13
  var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next);
@@ -30,7 +30,7 @@ async function execute(sql, params = []) {
30
30
  return db.executeAsync(sql, params);
31
31
  }
32
32
  var SQLiteAdapter = class {
33
- async ensureStores(stores) {
33
+ async ensureStores(stores, _schemaVersion) {
34
34
  for (const store of stores) {
35
35
  const table = resourceTable(store.name);
36
36
  await execute(`
@@ -121,7 +121,7 @@ if (!_i18next2.default.isInitialized) {
121
121
  }
122
122
  });
123
123
  }
124
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
124
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkDSK7CM4Gcjs.createI18nManager.call(void 0, {
125
125
  storage: new SQLiteAdapter(),
126
126
  // Hermes Worker(RN 0.71+),API 与 Web Worker 一致
127
127
  createWorker: () => new (0, _chunkAJJKJPNBcjs.WebWorkerAdapter)(
@@ -138,4 +138,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
138
138
 
139
139
 
140
140
 
141
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
141
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunkDSK7CM4Gcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkDSK7CM4Gcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
@@ -7,7 +7,7 @@ import {
7
7
  I18N_RESOURCES_UPDATED_EVENT,
8
8
  createI18nManager,
9
9
  emitI18nResourcesUpdated
10
- } from "../chunk-5VHZCG34.js";
10
+ } from "../chunk-3ALMQ7Q5.js";
11
11
 
12
12
  // src/native/index.ts
13
13
  import i18n from "i18next";
@@ -30,7 +30,7 @@ async function execute(sql, params = []) {
30
30
  return db.executeAsync(sql, params);
31
31
  }
32
32
  var SQLiteAdapter = class {
33
- async ensureStores(stores) {
33
+ async ensureStores(stores, _schemaVersion) {
34
34
  for (const store of stores) {
35
35
  const table = resourceTable(store.name);
36
36
  await execute(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shuo-li/i18n",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Cross-platform i18n library for Web, React Native and WeChat MiniProgram",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",