i18n-keyless-react 1.9.3 → 1.9.5

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.
@@ -1,7 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import React, { useEffect, useMemo } from "react";
3
- import { getTranslation } from "i18n-keyless-core";
4
- import { useI18nKeyless } from "./store";
3
+ import { useI18nKeyless, getTranslation } from "./store";
5
4
  const warnAboutWhitespace = (text) => {
6
5
  if (process.env.NODE_ENV === "development" && text !== text.trim()) {
7
6
  console.warn(`I18nKeylessText received text with leading/trailing whitespace: "${text}". ` +
@@ -18,8 +17,7 @@ export const I18nKeylessText = ({ children, replace, context, debug = false, for
18
17
  warnAboutWhitespace(children);
19
18
  }, [children]);
20
19
  useEffect(() => {
21
- const store = useI18nKeyless.getState();
22
- getTranslation(sourceText, store, { context, debug, forceTemporary });
20
+ getTranslation(sourceText, { context, debug, forceTemporary });
23
21
  }, [sourceText, currentLanguage, context, debug, forceTemporary]);
24
22
  const translatedText = currentLanguage === config.languages.primary
25
23
  ? sourceText
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { I18nKeylessText } from "../I18nKeylessText";
4
4
  import { vi, beforeEach, describe, it, expect, afterEach } from "vitest";
5
+ import { getTranslationCore } from "i18n-keyless-core";
5
6
  // Create a mock store before vi.mock call using vi.hoisted
6
7
  const mockStore = vi.hoisted(() => {
7
8
  const store = {
@@ -31,16 +32,15 @@ const mockStore = vi.hoisted(() => {
31
32
  return useI18nKeylessMock;
32
33
  });
33
34
  // Mock the store module - this is hoisted to the top of the file
34
- vi.mock("../store", () => {
35
+ vi.mock("../store", async () => {
35
36
  return {
36
37
  useI18nKeyless: mockStore,
37
- // Add any other exports from the store that might be needed
38
- getTranslation: vi.fn(),
38
+ getTranslation: vi.fn((key, options) => {
39
+ return getTranslationCore(key, mockStore.getState(), options);
40
+ }),
39
41
  };
40
42
  });
41
- // Mock utils module to avoid errors with getTranslation
42
43
  vi.mock("../utils", () => ({
43
- getTranslation: vi.fn(),
44
44
  validateLanguage: vi.fn((lang) => lang),
45
45
  }));
46
46
  describe("I18nKeylessText", () => {
@@ -3,7 +3,7 @@ import { act } from "@testing-library/react";
3
3
  import packageJson from "../package.json";
4
4
  import { mockStore, mockStorage } from "./__mocks__/store";
5
5
  import { useI18nKeyless, init } from "../store";
6
- import { getTranslation, queue } from "i18n-keyless-core";
6
+ import { getTranslationCore, queue } from "i18n-keyless-core";
7
7
  // These vi.mock calls must be at the top level, outside of any function or block
8
8
  vi.mock("zustand", () => ({
9
9
  create: () => ({
@@ -17,7 +17,7 @@ vi.mock("../store", async () => {
17
17
  return {
18
18
  useI18nKeyless: mockStore,
19
19
  useCurrentLanguage: vi.fn(),
20
- getTranslation: vi.fn(),
20
+ getTranslationCore: vi.fn(),
21
21
  setCurrentLanguage: vi.fn(),
22
22
  fetchAllTranslations: vi.fn(),
23
23
  clearI18nKeylessStorage: vi.fn(),
@@ -195,13 +195,13 @@ describe("i18n-keyless store", () => {
195
195
  it("should return original text when current language is primary language", () => {
196
196
  useI18nKeyless.setState({ currentLanguage: "en" });
197
197
  const store = useI18nKeyless.getState();
198
- const result = getTranslation("Hello World", store);
198
+ const result = getTranslationCore("Hello World", store);
199
199
  expect(result).toBe("Hello World");
200
200
  });
201
201
  it("should return original text when current language is primary language whatever context there is", () => {
202
202
  useI18nKeyless.setState({ currentLanguage: "en" });
203
203
  const store = useI18nKeyless.getState();
204
- const result = getTranslation("Hello World again", store, { context: "whatever" });
204
+ const result = getTranslationCore("Hello World again", store, { context: "whatever" });
205
205
  expect(result).toBe("Hello World again");
206
206
  });
207
207
  it("should handle translations with context", () => {
@@ -213,8 +213,8 @@ describe("i18n-keyless store", () => {
213
213
  },
214
214
  });
215
215
  const store = useI18nKeyless.getState();
216
- const headerResult = getTranslation("Welcome", store, { context: "header" });
217
- const footerResult = getTranslation("Good bye", store, { context: "footer" });
216
+ const headerResult = getTranslationCore("Welcome", store, { context: "header" });
217
+ const footerResult = getTranslationCore("Good bye", store, { context: "footer" });
218
218
  expect(headerResult).toBe("Bienvenue");
219
219
  expect(footerResult).toBe("Au revoir");
220
220
  });
@@ -225,7 +225,7 @@ describe("i18n-keyless store", () => {
225
225
  global.fetch = vi.fn().mockResolvedValue({
226
226
  json: () => Promise.resolve({ ok: true, data: { translations: {} } }),
227
227
  });
228
- const result = getTranslation("Hungry", store, {
228
+ const result = getTranslationCore("Hungry", store, {
229
229
  forceTemporary: {
230
230
  fr: "J'ai faim",
231
231
  },
@@ -258,7 +258,7 @@ describe("i18n-keyless store", () => {
258
258
  global.fetch = vi.fn().mockResolvedValue({
259
259
  json: () => Promise.resolve({ ok: true }),
260
260
  });
261
- const result = getTranslation("Happiness", store, {
261
+ const result = getTranslationCore("Happiness", store, {
262
262
  forceTemporary: {
263
263
  fr: "Joie temporaire",
264
264
  },
@@ -288,7 +288,7 @@ describe("i18n-keyless store", () => {
288
288
  useI18nKeyless.setState({ currentLanguage: "fr" });
289
289
  const store = useI18nKeyless.getState();
290
290
  const queueSpy = vi.spyOn(queue, "add");
291
- getTranslation("Missing Translation", store);
291
+ getTranslationCore("Missing Translation", store);
292
292
  expect(queueSpy).toHaveBeenCalled();
293
293
  });
294
294
  it("should handle API translation errors gracefully", async () => {
@@ -297,7 +297,7 @@ describe("i18n-keyless store", () => {
297
297
  // Mock a failed API call
298
298
  global.fetch = vi.fn().mockRejectedValue(new Error("API Error"));
299
299
  useI18nKeyless.setState({ currentLanguage: "fr" });
300
- getTranslation("Test Error", store);
300
+ getTranslationCore("Test Error", store);
301
301
  // Wait for async queue to process
302
302
  await new Promise((resolve) => setTimeout(resolve, 0));
303
303
  expect(console.error).toHaveBeenCalledWith(expect.stringContaining("i18n-keyless: fetch all translations error:"), new Error("API Error"));
@@ -306,7 +306,7 @@ describe("i18n-keyless store", () => {
306
306
  useI18nKeyless.setState({ currentLanguage: "fr" });
307
307
  const store = useI18nKeyless.getState();
308
308
  const queueSpy = vi.spyOn(queue, "add");
309
- getTranslation("", store);
309
+ getTranslationCore("", store);
310
310
  expect(queueSpy).not.toHaveBeenCalled();
311
311
  });
312
312
  it("should handle debug mode logging", async () => {
@@ -314,7 +314,7 @@ describe("i18n-keyless store", () => {
314
314
  vi.clearAllMocks();
315
315
  useI18nKeyless.setState({ currentLanguage: "fr" });
316
316
  const store = useI18nKeyless.getState();
317
- getTranslation("Debug Test", store, { debug: true });
317
+ getTranslationCore("Debug Test", store, { debug: true });
318
318
  // Wait for any async operations to complete
319
319
  await new Promise((resolve) => setTimeout(resolve, 0));
320
320
  expect(console.log).toHaveBeenCalled();
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export { I18nKeylessText } from "./I18nKeylessText";
2
2
  export { init, setCurrentLanguage, useCurrentLanguage } from "./store";
3
3
  export { clearI18nKeylessStorage } from "./utils";
4
4
  export type { I18nKeylessTextProps } from "./I18nKeylessText";
5
+ export { type I18nConfig, type Lang, type PrimaryLang, type Translations, type TranslationStore, type TranslationStoreState, type I18nKeylessRequestBody, type I18nKeylessResponse, type TranslationOptions, fetchAllTranslations, validateLanguage, queue, } from "i18n-keyless-core";
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { I18nKeylessText } from "./I18nKeylessText";
2
2
  export { init, setCurrentLanguage, useCurrentLanguage } from "./store";
3
3
  export { clearI18nKeylessStorage } from "./utils";
4
+ export { fetchAllTranslations, validateLanguage, queue, } from "i18n-keyless-core";
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "i18n-keyless-react",
3
3
  "private": false,
4
- "version": "1.9.3",
4
+ "version": "1.9.5",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
package/dist/store.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { type I18nConfig, type Lang, type TranslationStore } from "i18n-keyless-core";
1
+ import { type I18nConfig, type Lang, type TranslationStore, type TranslationOptions } from "i18n-keyless-core";
2
2
  export declare const useI18nKeyless: import("zustand").UseBoundStore<import("zustand").StoreApi<TranslationStore>>;
3
3
  export declare function init(newConfig: I18nConfig): Promise<void>;
4
4
  export declare function useCurrentLanguage(): Lang | null;
5
+ export declare function getTranslation(key: string, options?: TranslationOptions): string;
5
6
  export declare function setCurrentLanguage(lang: I18nConfig["languages"]["supported"][number]): void;
6
7
  export declare function clearI18nKeylessStorageAndStore(): Promise<void>;
package/dist/store.js CHANGED
@@ -1,4 +1,4 @@
1
- import { queue, fetchAllTranslations, validateLanguage, } from "i18n-keyless-core";
1
+ import { queue, fetchAllTranslations, validateLanguage, getTranslationCore, } from "i18n-keyless-core";
2
2
  import { create } from "zustand";
3
3
  import { init as initRoot, storeKeys, setItem, getItem, clearI18nKeylessStorage } from "./utils";
4
4
  queue.on("empty", () => {
@@ -113,6 +113,10 @@ export function useCurrentLanguage() {
113
113
  const currentLanguage = useI18nKeyless((state) => state.currentLanguage);
114
114
  return currentLanguage;
115
115
  }
116
+ export function getTranslation(key, options) {
117
+ const store = useI18nKeyless.getState();
118
+ return getTranslationCore(key, store, options);
119
+ }
116
120
  export function setCurrentLanguage(lang) {
117
121
  return useI18nKeyless.getState().setLanguage(lang);
118
122
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "i18n-keyless-react",
3
3
  "private": false,
4
- "version": "1.9.3",
4
+ "version": "1.9.5",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",