@payhos/api 2.5.0 → 3.1.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/README.md CHANGED
@@ -115,3 +115,32 @@ const gptResp = await payhos.ai.prompt({
115
115
  ```
116
116
 
117
117
  For full API details, see https://docs.payhos.com.
118
+
119
+ ## Translator
120
+
121
+ Use the `translator` helper to download published translation bundles and upsert app label codes.
122
+
123
+ ```ts
124
+ import { PayHos } from "@payhos/api";
125
+ const payhos = new PayHos("<YOUR_API_TOKEN>");
126
+
127
+ const bundle = await payhos.translator.download(7, "latest", "en");
128
+ if (bundle.success && bundle.data) {
129
+ console.log(bundle.data.versionNumber);
130
+ console.log(bundle.data.translations.en["home.title"]);
131
+ }
132
+ ```
133
+
134
+ ```ts
135
+ await payhos.translator.upsertLabels(7, {
136
+ labels: ["home.title", "checkout.total", "profile.saved"],
137
+ });
138
+ ```
139
+
140
+ ### Translator integration flow
141
+
142
+ 1. Create a Translator app in dashboard and enable `API enabled` / `API labels sync`.
143
+ 2. Upsert app label keys from your runtime (`translator.upsertLabels`) whenever new keys are introduced.
144
+ 3. Publish app versions in dashboard after translators complete label values.
145
+ 4. Download `latest`, `default`, `debug`, or numbered versions at runtime (`translator.download`).
146
+ 5. Honor `cacheTime` from payload to control local refresh interval.
package/ai.d.ts CHANGED
@@ -1,6 +1,20 @@
1
+ import { Log } from './log';
1
2
  import { AIPromptOpts, AIResponse } from './model';
3
+ /**
4
+ * Provides PAYHOS AI API operations.
5
+ */
2
6
  export declare class AI {
7
+ private log;
8
+ /**
9
+ * Bearer API key used for all outgoing AI requests.
10
+ */
3
11
  private _apiKey;
4
- constructor(key: string);
12
+ /**
13
+ * Creates an AI client instance.
14
+ */
15
+ constructor(key: string, log: Log);
16
+ /**
17
+ * Sends a prompt to the PAYHOS AI endpoint.
18
+ */
5
19
  prompt(opts: AIPromptOpts): Promise<import("./model").ApiResponse<AIResponse>>;
6
20
  }
package/ai.js CHANGED
@@ -2,11 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AI = void 0;
4
4
  const api_service_1 = require("./api.service");
5
+ /**
6
+ * Provides PAYHOS AI API operations.
7
+ */
5
8
  class AI {
6
- constructor(key) {
9
+ /**
10
+ * Creates an AI client instance.
11
+ */
12
+ constructor(key, log) {
13
+ this.log = log;
7
14
  this._apiKey = key;
8
15
  }
16
+ /**
17
+ * Sends a prompt to the PAYHOS AI endpoint.
18
+ */
9
19
  prompt(opts) {
20
+ this.log.print('Sending AI prompt with PAYHOS...');
10
21
  return api_service_1.apiHandler.post('ai/prompt', opts, (0, api_service_1.apiHeaders)(this._apiKey));
11
22
  }
12
23
  }
package/ai.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAGvD,MAAa,EAAE;IAGb,YAAY,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAEM,MAAM,CAAC,IAAkB;QAC9B,OAAO,wBAAU,CAAC,IAAI,CAAa,WAAW,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;CACF;AAVD,gBAUC"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAIvD;;GAEG;AACH,MAAa,EAAE;IAMb;;OAEG;IACH,YAAY,GAAW,EAAU,GAAQ;QAAR,QAAG,GAAH,GAAG,CAAK;QACvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,IAAkB;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACnD,OAAO,wBAAU,CAAC,IAAI,CAAa,WAAW,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;CACF;AApBD,gBAoBC"}
package/api.service.d.ts CHANGED
@@ -1,10 +1,26 @@
1
- import { ApiResponse, Map } from './model';
1
+ import { ApiResponse } from './model';
2
+ /**
3
+ * Minimal HTTP wrapper used by all SDK feature clients.
4
+ */
2
5
  export declare const apiHandler: {
3
- post: <T>(path: string, body: Map<any>, headers: Map<any>) => Promise<ApiResponse<T>>;
4
- get: <T_1>(path: string, headers: Map<any>) => Promise<ApiResponse<T_1>>;
6
+ /**
7
+ * Sends a POST request to the PAYHOS API and returns typed response data.
8
+ */
9
+ post: <T>(path: string, body: Record<string, any>, headers: Record<string, string>) => Promise<ApiResponse<T>>;
10
+ /**
11
+ * Sends a GET request to the PAYHOS API and returns typed response data.
12
+ */
13
+ get: <T_1>(path: string, headers: Record<string, string>) => Promise<ApiResponse<T_1>>;
5
14
  };
15
+ /**
16
+ * Builds standard headers for PAYHOS API calls.
17
+ */
6
18
  export declare const apiHeaders: (apiKey: string) => {
7
19
  Authorization: string;
8
20
  'Content-Type': string;
9
21
  platform: string;
10
22
  };
23
+ /**
24
+ * Creates a Promise-based timeout helper.
25
+ */
26
+ export declare const delay: (ms: number) => Promise<unknown>;
package/api.service.js CHANGED
@@ -1,20 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.apiHeaders = exports.apiHandler = void 0;
3
+ exports.delay = exports.apiHeaders = exports.apiHandler = void 0;
4
4
  const axios_1 = require("axios");
5
5
  const config_1 = require("./config");
6
+ /**
7
+ * Minimal HTTP wrapper used by all SDK feature clients.
8
+ */
6
9
  exports.apiHandler = {
10
+ /**
11
+ * Sends a POST request to the PAYHOS API and returns typed response data.
12
+ */
7
13
  post: async (path, body, headers) => {
8
- const url = `${config_1.baseUrl}/v1/api/${path}`;
14
+ const url = `${(0, config_1.apiUrl)()}/v1/api/${path}`;
9
15
  const res = await axios_1.default.post(url, body, { headers });
10
16
  return res.data;
11
17
  },
18
+ /**
19
+ * Sends a GET request to the PAYHOS API and returns typed response data.
20
+ */
12
21
  get: async (path, headers) => {
13
- const url = `${config_1.baseUrl}/v1/api/${path}`;
22
+ const url = `${(0, config_1.apiUrl)()}/v1/api/${path}`;
14
23
  const res = await axios_1.default.get(url, { headers });
15
24
  return res.data;
16
25
  }
17
26
  };
27
+ /**
28
+ * Builds standard headers for PAYHOS API calls.
29
+ */
18
30
  const apiHeaders = (apiKey) => {
19
31
  return {
20
32
  Authorization: `Bearer ${apiKey}`,
@@ -23,4 +35,9 @@ const apiHeaders = (apiKey) => {
23
35
  };
24
36
  };
25
37
  exports.apiHeaders = apiHeaders;
38
+ /**
39
+ * Creates a Promise-based timeout helper.
40
+ */
41
+ const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
42
+ exports.delay = delay;
26
43
  //# sourceMappingURL=api.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.service.js","sourceRoot":"","sources":["../src/api.service.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,qCAAmC;AAEtB,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,KAAK,EAAK,IAAY,EAAE,IAAc,EAAE,OAAiB,EAAE,EAAE;QACjE,MAAM,GAAG,GAAG,GAAG,gBAAO,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,IAAsB,CAAC;IACpC,CAAC;IACD,GAAG,EAAE,KAAK,EAAK,IAAY,EAAE,OAAiB,EAAE,EAAE;QAChD,MAAM,GAAG,GAAG,GAAG,gBAAO,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,IAAsB,CAAC;IACpC,CAAC;CACF,CAAA;AAEM,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;IAC3C,OAAO;QACL,aAAa,EAAE,UAAU,MAAM,EAAE;QACjC,cAAc,EAAE,kBAAkB;QAClC,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC,CAAA;AANY,QAAA,UAAU,cAMtB"}
1
+ {"version":3,"file":"api.service.js","sourceRoot":"","sources":["../src/api.service.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,qCAAkC;AAElC;;GAEG;AACU,QAAA,UAAU,GAAG;IACxB;;OAEG;IACH,IAAI,EAAE,KAAK,EAAK,IAAY,EAAE,IAAyB,EAAE,OAA+B,EAAE,EAAE;QAC1F,MAAM,GAAG,GAAG,GAAG,IAAA,eAAM,GAAE,WAAW,IAAI,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,IAAsB,CAAC;IACpC,CAAC;IACD;;OAEG;IACH,GAAG,EAAE,KAAK,EAAK,IAAY,EAAE,OAA+B,EAAE,EAAE;QAC9D,MAAM,GAAG,GAAG,GAAG,IAAA,eAAM,GAAE,WAAW,IAAI,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,IAAsB,CAAC;IACpC,CAAC;CACF,CAAA;AAED;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;IAC3C,OAAO;QACL,aAAa,EAAE,UAAU,MAAM,EAAE;QACjC,cAAc,EAAE,kBAAkB;QAClC,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC,CAAA;AANY,QAAA,UAAU,cAMtB;AAED;;GAEG;AACI,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAAxE,QAAA,KAAK,SAAmE"}
package/config.d.ts CHANGED
@@ -1 +1,3 @@
1
- export declare let baseUrl: string;
1
+ export declare let isProduction: boolean;
2
+ export declare function setProduction(prod: boolean): void;
3
+ export declare function apiUrl(): "https://api-server.payhos.com" | "http://localhost:8850";
package/config.js CHANGED
@@ -1,13 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.baseUrl = void 0;
4
- // const platform: string = 'dev';
5
- const platform = 'prod';
6
- exports.baseUrl = 'a';
7
- if (platform === 'dev') {
8
- exports.baseUrl = 'http://localhost:8850';
3
+ exports.apiUrl = exports.setProduction = exports.isProduction = void 0;
4
+ exports.isProduction = true;
5
+ function setProduction(prod) {
6
+ exports.isProduction = prod;
9
7
  }
10
- else if (platform === 'prod') {
11
- exports.baseUrl = 'https://payhos-server.payhos.com';
8
+ exports.setProduction = setProduction;
9
+ function apiUrl() {
10
+ if (exports.isProduction) {
11
+ return 'https://api-server.payhos.com';
12
+ }
13
+ else {
14
+ return 'http://localhost:8850';
15
+ }
12
16
  }
17
+ exports.apiUrl = apiUrl;
13
18
  //# sourceMappingURL=config.js.map
package/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAAA,kCAAkC;AAClC,MAAM,QAAQ,GAAW,MAAM,CAAC;AAErB,QAAA,OAAO,GAAG,GAAG,CAAC;AAEzB,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;IACvB,eAAO,GAAG,uBAAuB,CAAC;AACpC,CAAC;KAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;IAC/B,eAAO,GAAG,kCAAkC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAAW,QAAA,YAAY,GAAG,IAAI,CAAC;AAE/B,SAAgB,aAAa,CAAC,IAAa;IACzC,oBAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAFD,sCAEC;AAED,SAAgB,MAAM;IACpB,IAAI,oBAAY,EAAE,CAAC;QACjB,OAAO,+BAA+B,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,uBAAuB,CAAC;IACjC,CAAC;AACH,CAAC;AAND,wBAMC"}
package/email.d.ts CHANGED
@@ -1,7 +1,24 @@
1
+ import { Log } from './log';
1
2
  import { EmailOpts } from './model';
3
+ /**
4
+ * Provides PAYHOS Email API operations.
5
+ */
2
6
  export declare class Email {
7
+ private log;
8
+ /**
9
+ * Bearer API key used for all email requests.
10
+ */
3
11
  private _apiKey;
4
- constructor(key: string);
12
+ /**
13
+ * Creates an email client instance.
14
+ */
15
+ constructor(key: string, log: Log);
16
+ /**
17
+ * Sends a single email payload.
18
+ */
5
19
  sendEmail(opts: EmailOpts): Promise<import("./model").ApiResponse<any>>;
20
+ /**
21
+ * Sends multiple emails in one request.
22
+ */
6
23
  sendEmails(opts: EmailOpts[]): Promise<import("./model").ApiResponse<any>>;
7
24
  }
package/email.js CHANGED
@@ -2,13 +2,27 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Email = void 0;
4
4
  const api_service_1 = require("./api.service");
5
+ /**
6
+ * Provides PAYHOS Email API operations.
7
+ */
5
8
  class Email {
6
- constructor(key) {
9
+ /**
10
+ * Creates an email client instance.
11
+ */
12
+ constructor(key, log) {
13
+ this.log = log;
7
14
  this._apiKey = key;
8
15
  }
16
+ /**
17
+ * Sends a single email payload.
18
+ */
9
19
  sendEmail(opts) {
20
+ this.log.print('Sending emails with PAYHOS...');
10
21
  return this.sendEmails([opts]);
11
22
  }
23
+ /**
24
+ * Sends multiple emails in one request.
25
+ */
12
26
  sendEmails(opts) {
13
27
  return api_service_1.apiHandler.post('emails/send', opts, (0, api_service_1.apiHeaders)(this._apiKey));
14
28
  }
package/email.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAGvD,MAAa,KAAK;IAGhB,YAAY,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,IAAe;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAEM,UAAU,CAAC,IAAiB;QACjC,OAAO,wBAAU,CAAC,IAAI,CAAM,aAAa,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;AAdD,sBAcC"}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAIvD;;GAEG;AACH,MAAa,KAAK;IAMhB;;OAEG;IACH,YAAY,GAAW,EAAU,GAAQ;QAAR,QAAG,GAAH,GAAG,CAAK;QACvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,IAAe;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,IAAiB;QACjC,OAAO,wBAAU,CAAC,IAAI,CAAM,aAAa,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;AA3BD,sBA2BC"}
package/index.d.ts CHANGED
@@ -2,11 +2,35 @@ import { Email } from './email';
2
2
  import { PreRender } from './prerender';
3
3
  import { SMS } from './sms';
4
4
  import { AI } from './ai';
5
+ import { Translator } from './translator';
6
+ import { PayHosOptions } from './model';
5
7
  export * from './model';
8
+ /**
9
+ * Root PAYHOS SDK class that exposes feature clients.
10
+ */
6
11
  export declare class PayHos {
12
+ /**
13
+ * SMS feature client.
14
+ */
7
15
  sms: SMS;
16
+ /**
17
+ * Email feature client.
18
+ */
8
19
  email: Email;
20
+ /**
21
+ * Pre-render feature client.
22
+ */
9
23
  prerender: PreRender;
24
+ /**
25
+ * AI feature client.
26
+ */
10
27
  ai: AI;
11
- constructor(key: string);
28
+ /**
29
+ * Translator feature client.
30
+ */
31
+ translator: Translator;
32
+ /**
33
+ * Initializes all PAYHOS SDK clients with a shared logger and API key.
34
+ */
35
+ constructor(opts: PayHosOptions);
12
36
  }
package/index.js CHANGED
@@ -6,13 +6,27 @@ const email_1 = require("./email");
6
6
  const prerender_1 = require("./prerender");
7
7
  const sms_1 = require("./sms");
8
8
  const ai_1 = require("./ai");
9
+ const translator_1 = require("./translator");
10
+ const log_1 = require("./log");
11
+ const config_1 = require("./config");
9
12
  tslib_1.__exportStar(require("./model"), exports);
13
+ /**
14
+ * Root PAYHOS SDK class that exposes feature clients.
15
+ */
10
16
  class PayHos {
11
- constructor(key) {
12
- this.sms = new sms_1.SMS(key);
13
- this.email = new email_1.Email(key);
14
- this.prerender = new prerender_1.PreRender(key);
15
- this.ai = new ai_1.AI(key);
17
+ /**
18
+ * Initializes all PAYHOS SDK clients with a shared logger and API key.
19
+ */
20
+ constructor(opts) {
21
+ const logger = new log_1.Log(opts.logger);
22
+ if (opts.production !== undefined) {
23
+ (0, config_1.setProduction)(opts.production);
24
+ }
25
+ this.sms = new sms_1.SMS(opts.apiKey, logger);
26
+ this.email = new email_1.Email(opts.apiKey, logger);
27
+ this.prerender = new prerender_1.PreRender(opts.apiKey, logger);
28
+ this.ai = new ai_1.AI(opts.apiKey, logger);
29
+ this.translator = new translator_1.Translator(opts.apiKey, logger);
16
30
  }
17
31
  }
18
32
  exports.PayHos = PayHos;
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAChC,2CAAwC;AACxC,+BAA4B;AAC5B,6BAA0B;AAE1B,kDAAwB;AAExB,MAAa,MAAM;IAMjB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,GAAG,IAAI,OAAE,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;CACF;AAZD,wBAYC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAChC,2CAAwC;AACxC,+BAA4B;AAC5B,6BAA0B;AAC1B,6CAA0C;AAE1C,+BAA4B;AAC5B,qCAAyC;AAEzC,kDAAwB;AAExB;;GAEG;AACH,MAAa,MAAM;IAsBjB;;OAEG;IACH,YAAY,IAAmB;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAA,sBAAa,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,SAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,GAAG,IAAI,OAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;CACF;AAtCD,wBAsCC"}
package/log.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { PayhosLogger } from "./model";
2
+ /**
3
+ * Lightweight logging adapter used across SDK clients.
4
+ */
5
+ export declare class Log {
6
+ /**
7
+ * Optional user-provided logger callback.
8
+ */
9
+ private logger?;
10
+ /**
11
+ * Creates a log adapter instance.
12
+ */
13
+ constructor(logger?: PayhosLogger);
14
+ /**
15
+ * Forwards log messages to the configured logger when available.
16
+ */
17
+ print(...messages: any[]): void;
18
+ }
package/log.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Log = void 0;
4
+ /**
5
+ * Lightweight logging adapter used across SDK clients.
6
+ */
7
+ class Log {
8
+ /**
9
+ * Creates a log adapter instance.
10
+ */
11
+ constructor(logger) {
12
+ this.logger = logger;
13
+ }
14
+ /**
15
+ * Forwards log messages to the configured logger when available.
16
+ */
17
+ print(...messages) {
18
+ if (this.logger) {
19
+ this.logger(...messages);
20
+ }
21
+ }
22
+ }
23
+ exports.Log = Log;
24
+ //# sourceMappingURL=log.js.map
package/log.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,GAAG;IAMd;;OAEG;IACH,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,GAAG,QAAe;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AArBD,kBAqBC"}
package/model.d.ts CHANGED
@@ -5,8 +5,11 @@ export interface ApiResponse<T> {
5
5
  message?: string;
6
6
  timestamp: Date;
7
7
  }
8
- export interface Map<T> {
9
- [key: string]: T;
8
+ export type PayhosLogger = (...message: any[]) => void;
9
+ export interface PayHosOptions {
10
+ apiKey: string;
11
+ logger?: PayhosLogger;
12
+ production?: boolean;
10
13
  }
11
14
  export interface RecipientItem {
12
15
  email: string;
@@ -50,3 +53,36 @@ export interface AIResponse {
50
53
  ratePer1000Chars: number;
51
54
  };
52
55
  }
56
+ export interface TranslatorLanguage {
57
+ name: string;
58
+ code: string;
59
+ active: boolean;
60
+ isDefault?: boolean;
61
+ }
62
+ export interface PublishedTranslation {
63
+ file: string;
64
+ title: string;
65
+ date: number;
66
+ cacheTime: number;
67
+ versionId: number;
68
+ versionNumber: number;
69
+ appId: number;
70
+ translations: Record<string, Record<string, string>>;
71
+ languages: TranslatorLanguage[];
72
+ }
73
+ export type TranslatorStorageTypes = 'memory' | 'localStorage' | 'sessionStorage' | MemoryStorage | Storage;
74
+ export interface TranslatorOptions {
75
+ appId: number;
76
+ secret?: string;
77
+ storage?: TranslatorStorageTypes;
78
+ syncIntervalSeconds?: number;
79
+ }
80
+ export interface UpsertTranslationLabelsOpts {
81
+ labels: string[];
82
+ }
83
+ export declare class MemoryStorage {
84
+ private storage;
85
+ setItem(key: string, value: string): void;
86
+ getItem(key: string): string | undefined;
87
+ removeItem(key: string): void;
88
+ }
package/model.js CHANGED
@@ -1,3 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryStorage = void 0;
4
+ class MemoryStorage {
5
+ constructor() {
6
+ this.storage = {};
7
+ }
8
+ setItem(key, value) {
9
+ this.storage[key] = value;
10
+ }
11
+ getItem(key) {
12
+ return this.storage[key];
13
+ }
14
+ removeItem(key) {
15
+ delete this.storage[key];
16
+ }
17
+ }
18
+ exports.MemoryStorage = MemoryStorage;
3
19
  //# sourceMappingURL=model.js.map
package/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":";;;AAgGA,MAAa,aAAa;IAA1B;QACU,YAAO,GAA2B,EAAE,CAAC;IAa/C,CAAC;IAXQ,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IAEM,OAAO,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,UAAU,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF;AAdD,sCAcC"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@payhos/api",
3
3
  "description": "An API package for payhos's API built for JavaScript and Typescript developers",
4
- "version": "2.5.0",
4
+ "version": "3.1.0",
5
5
  "main": "index.js",
6
6
  "typings": "index.d.ts",
7
7
  "scripts": {
8
8
  "test": "mocha --require ts-node/register test/**/*.ts",
9
- "deploy": "node copy-models && tsc && node copy-assets && cd dist && npm publish --access=public",
9
+ "deploy": "node copy-models && tsc && node copy-assets && cd dist && npm stage publish --access=public",
10
10
  "unpublish": "npm unpublish @payhos/api@2.3.0"
11
11
  },
12
12
  "dependencies": {
package/prerender.d.ts CHANGED
@@ -1,6 +1,20 @@
1
+ import { Log } from './log';
1
2
  import { PreRenderOpts } from './model';
3
+ /**
4
+ * Provides PAYHOS pre-render API operations.
5
+ */
2
6
  export declare class PreRender {
7
+ private log;
8
+ /**
9
+ * Bearer API key used for pre-render requests.
10
+ */
3
11
  private _apiKey;
4
- constructor(key: string);
12
+ /**
13
+ * Creates a pre-render client instance.
14
+ */
15
+ constructor(key: string, log: Log);
16
+ /**
17
+ * Requests a pre-rendered HTML snapshot for the specified page URL.
18
+ */
5
19
  page(opts: PreRenderOpts): Promise<import("./model").ApiResponse<string>>;
6
20
  }
package/prerender.js CHANGED
@@ -2,11 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PreRender = void 0;
4
4
  const api_service_1 = require("./api.service");
5
+ /**
6
+ * Provides PAYHOS pre-render API operations.
7
+ */
5
8
  class PreRender {
6
- constructor(key) {
9
+ /**
10
+ * Creates a pre-render client instance.
11
+ */
12
+ constructor(key, log) {
13
+ this.log = log;
7
14
  this._apiKey = key;
8
15
  }
16
+ /**
17
+ * Requests a pre-rendered HTML snapshot for the specified page URL.
18
+ */
9
19
  page(opts) {
20
+ this.log.print('Pre-rendering page with PAYHOS...');
10
21
  const path = `prerender?url=${encodeURIComponent(opts.url)}&cacheMs=${opts.cacheMs || 86400000 * 3}`;
11
22
  return api_service_1.apiHandler.get(path, (0, api_service_1.apiHeaders)(this._apiKey));
12
23
  }
package/prerender.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prerender.js","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAGvD,MAAa,SAAS;IAGpB,YAAY,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAEM,IAAI,CAAC,IAAmB;QAC7B,MAAM,IAAI,GAAG,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACrG,OAAO,wBAAU,CAAC,GAAG,CAAS,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAXD,8BAWC"}
1
+ {"version":3,"file":"prerender.js","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAIvD;;GAEG;AACH,MAAa,SAAS;IAMpB;;OAEG;IACH,YAAY,GAAW,EAAU,GAAQ;QAAR,QAAG,GAAH,GAAG,CAAK;QACvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,IAAmB;QAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACrG,OAAO,wBAAU,CAAC,GAAG,CAAS,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAtBD,8BAsBC"}
package/sms.d.ts CHANGED
@@ -1,6 +1,20 @@
1
+ import { Log } from './log';
1
2
  import { SMSOpts } from './model';
3
+ /**
4
+ * Provides PAYHOS SMS API operations.
5
+ */
2
6
  export declare class SMS {
7
+ private log;
8
+ /**
9
+ * Bearer API key used for SMS requests.
10
+ */
3
11
  private _apiKey;
4
- constructor(key: string);
12
+ /**
13
+ * Creates an SMS client instance.
14
+ */
15
+ constructor(key: string, log: Log);
16
+ /**
17
+ * Sends one or more SMS payloads.
18
+ */
5
19
  sendSMS<T>(opts: SMSOpts[]): Promise<import("./model").ApiResponse<T>>;
6
20
  }
package/sms.js CHANGED
@@ -2,11 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SMS = void 0;
4
4
  const api_service_1 = require("./api.service");
5
+ /**
6
+ * Provides PAYHOS SMS API operations.
7
+ */
5
8
  class SMS {
6
- constructor(key) {
9
+ /**
10
+ * Creates an SMS client instance.
11
+ */
12
+ constructor(key, log) {
13
+ this.log = log;
7
14
  this._apiKey = key;
8
15
  }
16
+ /**
17
+ * Sends one or more SMS payloads.
18
+ */
9
19
  sendSMS(opts) {
20
+ this.log.print('Sending SMS with PAYHOS...');
10
21
  return api_service_1.apiHandler.post('sms/send', opts, (0, api_service_1.apiHeaders)(this._apiKey));
11
22
  }
12
23
  }
package/sms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sms.js","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAGvD,MAAa,GAAG;IAGd,YAAY,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAEM,OAAO,CAAI,IAAe;QAC/B,OAAO,wBAAU,CAAC,IAAI,CAAI,UAAU,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;CACF;AAVD,kBAUC"}
1
+ {"version":3,"file":"sms.js","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":";;;AAAA,+CAAuD;AAIvD;;GAEG;AACH,MAAa,GAAG;IAMd;;OAEG;IACH,YAAY,GAAW,EAAU,GAAQ;QAAR,QAAG,GAAH,GAAG,CAAK;QACvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,OAAO,CAAI,IAAe;QAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC7C,OAAO,wBAAU,CAAC,IAAI,CAAI,UAAU,EAAE,IAAI,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;CACF;AApBD,kBAoBC"}
@@ -0,0 +1,116 @@
1
+ import { Log } from './log';
2
+ import { PublishedTranslation, TranslatorLanguage, TranslatorOptions, UpsertTranslationLabelsOpts } from './model';
3
+ /**
4
+ * Provides translation download, caching, lookup, and label sync operations.
5
+ */
6
+ export declare class Translator {
7
+ private log;
8
+ /**
9
+ * Bearer API key used for translator requests.
10
+ */
11
+ private _apiKey;
12
+ /**
13
+ * Active translator runtime options.
14
+ */
15
+ private opts;
16
+ /**
17
+ * Storage adapter for persisted translation data.
18
+ */
19
+ private storage;
20
+ /**
21
+ * Guards against concurrent translation load requests.
22
+ */
23
+ private loading;
24
+ /**
25
+ * In-memory queue of newly-seen labels waiting for upsert.
26
+ */
27
+ private newLabelsBatch;
28
+ /**
29
+ * Storage key for labels dictionary cache.
30
+ */
31
+ private LABELS;
32
+ /**
33
+ * Storage key for active translation version.
34
+ */
35
+ private VERSION;
36
+ /**
37
+ * Storage key for active language code.
38
+ */
39
+ private DEFAULT_LANGUAGE;
40
+ /**
41
+ * Storage key for supported language metadata.
42
+ */
43
+ private LANGUAGES;
44
+ /**
45
+ * Creates a translator client instance.
46
+ */
47
+ constructor(key: string, log: Log);
48
+ /**
49
+ * Returns the configured translator app id.
50
+ */
51
+ private get appId();
52
+ /**
53
+ * Validates required runtime options before performing operations.
54
+ */
55
+ private assetRequiredProps;
56
+ /**
57
+ * Sets the active language used by translate calls.
58
+ */
59
+ setActiveLanguage(langCode: string): void;
60
+ /**
61
+ * Returns the currently active language code.
62
+ */
63
+ getActiveLanguage(): string;
64
+ /**
65
+ * Returns all available languages currently cached in storage.
66
+ */
67
+ getLanguages(): TranslatorLanguage[];
68
+ /**
69
+ * Validates translator label code format.
70
+ */
71
+ private isValidLabelCode;
72
+ /**
73
+ * Reads cached labels dictionary from storage.
74
+ */
75
+ private getLabels;
76
+ /**
77
+ * Translates a label code using the selected language and interpolation payload.
78
+ */
79
+ translate(label: string, payload?: Record<string, any>, lang?: string): string;
80
+ /**
81
+ * Continuously flushes batched labels to the server at the configured interval.
82
+ */
83
+ private saveBatchedLabels;
84
+ /**
85
+ * Queues a missing label code for async upsert.
86
+ */
87
+ sync(label: string): void;
88
+ /**
89
+ * Resolves nested object value by dot-notation path.
90
+ */
91
+ private getValue;
92
+ /**
93
+ * Interpolates placeholders inside translation strings.
94
+ */
95
+ private interpolateText;
96
+ /**
97
+ * Downloads a translation package from the API.
98
+ */
99
+ download(versionNumber?: number | string, langCode?: string): Promise<import("./model").ApiResponse<PublishedTranslation>>;
100
+ /**
101
+ * Downloads and stores translation payload in the configured storage backend.
102
+ */
103
+ loadTranslations(versionNumber?: number | string, langCode?: string): Promise<void>;
104
+ /**
105
+ * Applies runtime options and starts periodic label sync when secret is provided.
106
+ */
107
+ updateOptions(opts: TranslatorOptions): this;
108
+ /**
109
+ * Upserts translation labels for server-side tracking and sync.
110
+ */
111
+ upsertLabels(opts: UpsertTranslationLabelsOpts): Promise<import("./model").ApiResponse<string>>;
112
+ /**
113
+ * Clears all translation-related cache keys.
114
+ */
115
+ resetCache(): void;
116
+ }
package/translator.js ADDED
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Translator = void 0;
4
+ const api_service_1 = require("./api.service");
5
+ const model_1 = require("./model");
6
+ /**
7
+ * Resolves the configured storage strategy into a unified storage adapter.
8
+ */
9
+ class TranslatorStorage {
10
+ /**
11
+ * Creates a storage adapter from the provided storage mode.
12
+ */
13
+ constructor(storage) {
14
+ if (storage === 'memory') {
15
+ this.storage = new model_1.MemoryStorage();
16
+ }
17
+ else if (storage === 'localStorage') {
18
+ this.storage = window.localStorage;
19
+ }
20
+ else if (storage === 'sessionStorage') {
21
+ this.storage = window.sessionStorage;
22
+ }
23
+ else {
24
+ this.storage = storage;
25
+ }
26
+ }
27
+ /**
28
+ * Stores a value under the given key.
29
+ */
30
+ setItem(key, value) {
31
+ this.storage.setItem(key, value);
32
+ }
33
+ /**
34
+ * Reads a value by key.
35
+ */
36
+ getItem(key) {
37
+ return this.storage.getItem(key);
38
+ }
39
+ /**
40
+ * Removes a cached value by key.
41
+ */
42
+ removeItem(key) {
43
+ this.storage.removeItem(key);
44
+ }
45
+ }
46
+ /**
47
+ * Provides translation download, caching, lookup, and label sync operations.
48
+ */
49
+ class Translator {
50
+ /**
51
+ * Creates a translator client instance.
52
+ */
53
+ constructor(key, log) {
54
+ this.log = log;
55
+ /**
56
+ * Storage adapter for persisted translation data.
57
+ */
58
+ this.storage = new TranslatorStorage('memory');
59
+ /**
60
+ * Guards against concurrent translation load requests.
61
+ */
62
+ this.loading = false;
63
+ /**
64
+ * In-memory queue of newly-seen labels waiting for upsert.
65
+ */
66
+ this.newLabelsBatch = {};
67
+ /**
68
+ * Storage key for labels dictionary cache.
69
+ */
70
+ this.LABELS = 'payhos_labels';
71
+ /**
72
+ * Storage key for active translation version.
73
+ */
74
+ this.VERSION = 'payhos_translations_version';
75
+ /**
76
+ * Storage key for active language code.
77
+ */
78
+ this.DEFAULT_LANGUAGE = 'payhos_translations_default_language';
79
+ /**
80
+ * Storage key for supported language metadata.
81
+ */
82
+ this.LANGUAGES = 'payhos_translations_languages';
83
+ /**
84
+ * Interpolates placeholders inside translation strings.
85
+ */
86
+ this.interpolateText = (text, data) => {
87
+ const regex = /{{\s*([^}]+)\s*}}/g;
88
+ return text.replace(regex, (_, key) => {
89
+ const value = this.getValue(data, key.trim());
90
+ if (value === undefined || value === null)
91
+ return '';
92
+ if (typeof value === 'object') {
93
+ return JSON.stringify(value);
94
+ }
95
+ return String(value);
96
+ });
97
+ };
98
+ this._apiKey = key;
99
+ }
100
+ /**
101
+ * Returns the configured translator app id.
102
+ */
103
+ get appId() {
104
+ var _a;
105
+ return (_a = this.opts) === null || _a === void 0 ? void 0 : _a.appId;
106
+ }
107
+ /**
108
+ * Validates required runtime options before performing operations.
109
+ */
110
+ assetRequiredProps() {
111
+ if (!this.appId) {
112
+ throw new Error('App ID is not set. Please set the App ID before making this request.');
113
+ }
114
+ if (!this.opts.storage) {
115
+ throw new Error('Storage option is not set. Please set the storage option before making this request.');
116
+ }
117
+ }
118
+ /**
119
+ * Sets the active language used by translate calls.
120
+ */
121
+ setActiveLanguage(langCode) {
122
+ this.assetRequiredProps();
123
+ this.storage.setItem(this.DEFAULT_LANGUAGE, langCode);
124
+ }
125
+ /**
126
+ * Returns the currently active language code.
127
+ */
128
+ getActiveLanguage() {
129
+ this.assetRequiredProps();
130
+ return this.storage.getItem(this.DEFAULT_LANGUAGE);
131
+ }
132
+ /**
133
+ * Returns all available languages currently cached in storage.
134
+ */
135
+ getLanguages() {
136
+ this.assetRequiredProps();
137
+ const languagesStr = this.storage.getItem(this.LANGUAGES);
138
+ if (!languagesStr) {
139
+ this.log.print('No languages found in storage. Please load translations before getting available languages.');
140
+ return [];
141
+ }
142
+ return JSON.parse(languagesStr);
143
+ }
144
+ /**
145
+ * Validates translator label code format.
146
+ */
147
+ isValidLabelCode(labelId) {
148
+ return (typeof labelId === 'string' &&
149
+ labelId.length > 0 &&
150
+ labelId.length <= 100 &&
151
+ /^[a-zA-Z0-9_.]+$/.test(labelId));
152
+ }
153
+ /**
154
+ * Reads cached labels dictionary from storage.
155
+ */
156
+ getLabels() {
157
+ const labelsStr = this.storage.getItem(this.LABELS);
158
+ if (!labelsStr) {
159
+ this.log.print('No translations found in storage. Please load translations before translating labels.');
160
+ return {};
161
+ }
162
+ const labels = JSON.parse(labelsStr);
163
+ return labels || {};
164
+ }
165
+ /**
166
+ * Translates a label code using the selected language and interpolation payload.
167
+ */
168
+ translate(label, payload = {}, lang) {
169
+ this.assetRequiredProps();
170
+ if (!this.isValidLabelCode(label)) {
171
+ this.log.print(`Invalid label code: '${label}'. Label codes must be non-empty strings up to 100 characters long, containing only letters, numbers, underscores, or dots.`);
172
+ return label;
173
+ }
174
+ const labels = this.getLabels();
175
+ const trans = labels === null || labels === void 0 ? void 0 : labels[label];
176
+ const code = lang || this.getActiveLanguage() || 'en';
177
+ if (trans) {
178
+ return trans[code] ? this.interpolateText(trans[code], payload) : label;
179
+ }
180
+ else {
181
+ // sync translation label here if not found in list
182
+ this.sync(label);
183
+ return label;
184
+ }
185
+ }
186
+ /**
187
+ * Continuously flushes batched labels to the server at the configured interval.
188
+ */
189
+ saveBatchedLabels() {
190
+ (0, api_service_1.delay)(this.opts.syncIntervalSeconds * 1000).then(() => {
191
+ const labels = Object.keys(this.newLabelsBatch);
192
+ this.newLabelsBatch = {};
193
+ if (labels.length > 0) {
194
+ this.log.print('Syncing batch labels to translator server: ', labels);
195
+ this.upsertLabels({ labels }).then(() => this.log.print('Batch labels synced successfully.')).catch(this.log.print.bind(this.log));
196
+ // appends new labels to existing translations data
197
+ const cached = this.getLabels();
198
+ if (cached) {
199
+ labels.forEach(label => {
200
+ if (!cached[label]) {
201
+ cached[label] = {};
202
+ }
203
+ });
204
+ this.storage.setItem(this.LABELS, JSON.stringify(cached));
205
+ }
206
+ }
207
+ this.saveBatchedLabels();
208
+ });
209
+ }
210
+ /**
211
+ * Queues a missing label code for async upsert.
212
+ */
213
+ sync(label) {
214
+ this.assetRequiredProps();
215
+ if (this.isValidLabelCode(label) && !this.newLabelsBatch[label]) {
216
+ this.log.print(`Label: '${label}' will be synced with translator server in next batch...`);
217
+ this.newLabelsBatch[label] = true;
218
+ }
219
+ }
220
+ /**
221
+ * Resolves nested object value by dot-notation path.
222
+ */
223
+ getValue(obj, path) {
224
+ return path.split('.').reduce((acc, key) => acc === null || acc === void 0 ? void 0 : acc[key], obj);
225
+ }
226
+ /**
227
+ * Downloads a translation package from the API.
228
+ */
229
+ download(versionNumber = 'default', langCode) {
230
+ this.assetRequiredProps();
231
+ const query = langCode ? `?langCode=${encodeURIComponent(langCode)}` : '';
232
+ return api_service_1.apiHandler.get(`translation/${this.appId}/${versionNumber}/download${query}`, (0, api_service_1.apiHeaders)(this._apiKey));
233
+ }
234
+ /**
235
+ * Downloads and stores translation payload in the configured storage backend.
236
+ */
237
+ async loadTranslations(versionNumber = 'default', langCode) {
238
+ this.assetRequiredProps();
239
+ if (this.loading) {
240
+ this.log.print('Translations are already loading. Please wait for the current load to finish before loading again.');
241
+ return;
242
+ }
243
+ this.loading = true;
244
+ const lang = langCode || this.storage.getItem(this.DEFAULT_LANGUAGE) || 'en';
245
+ const res = await this.download(versionNumber, lang);
246
+ const version = res.data;
247
+ if (!res.success || !version || !version.translations) {
248
+ this.loading = false;
249
+ throw new Error('Error: No translation data found for the specified version and language.');
250
+ }
251
+ // Cache translations in storage
252
+ this.storage.setItem(this.VERSION, version.versionNumber.toString());
253
+ this.storage.setItem(this.DEFAULT_LANGUAGE, lang);
254
+ this.storage.setItem(this.LANGUAGES, JSON.stringify(version.languages));
255
+ this.storage.setItem(this.LABELS, JSON.stringify(version.translations));
256
+ this.loading = false;
257
+ this.log.print(`Translations for version ${version.versionNumber} and language ${lang} loaded successfully.`);
258
+ }
259
+ /**
260
+ * Applies runtime options and starts periodic label sync when secret is provided.
261
+ */
262
+ updateOptions(opts) {
263
+ this.opts = Object.assign(Object.assign({}, opts), { storage: opts.storage || 'memory', syncIntervalSeconds: opts.syncIntervalSeconds || 30 });
264
+ this.storage = new TranslatorStorage(this.opts.storage);
265
+ this.assetRequiredProps();
266
+ // recursively saves batched labels to server at specified interval
267
+ if (this.opts.secret) {
268
+ this.saveBatchedLabels();
269
+ }
270
+ return this;
271
+ }
272
+ /**
273
+ * Upserts translation labels for server-side tracking and sync.
274
+ */
275
+ upsertLabels(opts) {
276
+ this.assetRequiredProps();
277
+ return api_service_1.apiHandler.post(`translation/${this.appId}/labels/upsert`, opts, Object.assign(Object.assign({}, (0, api_service_1.apiHeaders)(this._apiKey)), { 'payhos-translator-api-secret': this.opts.secret }));
278
+ }
279
+ /**
280
+ * Clears all translation-related cache keys.
281
+ */
282
+ resetCache() {
283
+ this.storage.removeItem(this.LABELS);
284
+ this.storage.removeItem(this.VERSION);
285
+ this.storage.removeItem(this.DEFAULT_LANGUAGE);
286
+ this.storage.removeItem(this.LANGUAGES);
287
+ }
288
+ }
289
+ exports.Translator = Translator;
290
+ //# sourceMappingURL=translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translator.js","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"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"}