@tern-secure/shared 1.3.0-canary.v20251030165007 → 1.3.0-canary.v20251125170702

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 (56) hide show
  1. package/dist/chunk-B2SN66XE.mjs +25 -0
  2. package/dist/chunk-B2SN66XE.mjs.map +1 -0
  3. package/dist/{chunk-33U3M4YY.mjs → chunk-IGYBIQYE.mjs} +14 -7
  4. package/dist/chunk-IGYBIQYE.mjs.map +1 -0
  5. package/dist/chunk-N2V3PKFE.mjs +61 -0
  6. package/dist/chunk-N2V3PKFE.mjs.map +1 -0
  7. package/dist/cookie.js.map +1 -1
  8. package/dist/cookie.mjs.map +1 -1
  9. package/dist/date.d.mts +18 -0
  10. package/dist/date.d.ts +18 -0
  11. package/dist/date.js +98 -0
  12. package/dist/date.js.map +1 -0
  13. package/dist/date.mjs +69 -0
  14. package/dist/date.mjs.map +1 -0
  15. package/dist/errors.js +1 -1
  16. package/dist/errors.js.map +1 -1
  17. package/dist/errors.mjs +1 -1
  18. package/dist/errors.mjs.map +1 -1
  19. package/dist/loadScript.js +68 -6
  20. package/dist/loadScript.js.map +1 -1
  21. package/dist/loadScript.mjs +2 -1
  22. package/dist/loadTernUIScript.d.mts +14 -6
  23. package/dist/loadTernUIScript.d.ts +14 -6
  24. package/dist/loadTernUIScript.js +122 -29
  25. package/dist/loadTernUIScript.js.map +1 -1
  26. package/dist/loadTernUIScript.mjs +45 -25
  27. package/dist/loadTernUIScript.mjs.map +1 -1
  28. package/dist/ms.d.mts +52 -0
  29. package/dist/ms.d.ts +52 -0
  30. package/dist/ms.js +181 -0
  31. package/dist/ms.js.map +1 -0
  32. package/dist/ms.mjs +153 -0
  33. package/dist/ms.mjs.map +1 -0
  34. package/dist/react/index.d.mts +19 -1
  35. package/dist/react/index.d.ts +19 -1
  36. package/dist/react/index.js +26 -1
  37. package/dist/react/index.js.map +1 -1
  38. package/dist/react/index.mjs +23 -1
  39. package/dist/react/index.mjs.map +1 -1
  40. package/dist/resolveVersion.d.mts +2 -1
  41. package/dist/resolveVersion.d.ts +2 -1
  42. package/dist/resolveVersion.js +16 -2
  43. package/dist/resolveVersion.js.map +1 -1
  44. package/dist/resolveVersion.mjs +3 -1
  45. package/dist/retry.mjs +3 -56
  46. package/dist/retry.mjs.map +1 -1
  47. package/dist/url.d.mts +2 -1
  48. package/dist/url.d.ts +2 -1
  49. package/dist/url.js +4 -0
  50. package/dist/url.js.map +1 -1
  51. package/dist/url.mjs +3 -0
  52. package/dist/url.mjs.map +1 -1
  53. package/package.json +4 -3
  54. package/dist/chunk-33U3M4YY.mjs.map +0 -1
  55. package/dist/chunk-PHCVLVZY.mjs +0 -12
  56. package/dist/chunk-PHCVLVZY.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadScript.ts"],"sourcesContent":["type LoadScriptOptions = {\n async?: boolean;\n defer?: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n nonce?: string;\n beforeLoad?: (script: HTMLScriptElement) => void;\n };\n\n export async function loadScript(src ='', options: LoadScriptOptions): Promise<HTMLScriptElement> {\n const { async, defer, crossOrigin, nonce, beforeLoad } = options;\n\n const load = () => {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n if (!src) {\n reject(new Error('Script src is required'));\n }\n\n if (!document || !document.body) {\n reject(new Error('Document body is not available'));\n }\n\n const script = document.createElement('script');\n\n if (crossOrigin) script.setAttribute('crossorigin', crossOrigin);\n script.async = async || false;\n script.defer = defer || false;\n\n let resolved = false;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n script.removeEventListener('load', handleLoad);\n script.removeEventListener('error', handleError);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n \n const handleLoad = () => {\n if (resolved) return;\n console.log(`[loadScript] Script loaded successfully: ${src}`);\n\n resolved = true;\n cleanup();\n resolve(script);\n };\n \n const handleError = (error: ErrorEvent) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n script.remove();\n console.error(`[loadScript] Failed to load script: ${src}`, error);\n reject(new Error(`Failed to load script: ${src}, Error: ${error.message}`));\n };\n \n script.addEventListener('load', handleLoad);\n script.addEventListener('error', handleError);\n\n script.src = src;\n script.nonce = nonce;\n beforeLoad?.(script);\n\n console.log(`[loadScript] Appending script to document body: ${src}`);\n document.body.appendChild(script)\n });\n };\n\n return load()\n\n //return retry(load, { shouldRetry: (_, iterations) => iterations <=5 });\n }"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQE,eAAsB,WAAW,MAAK,IAAI,SAAwD;AAChG,QAAM,EAAE,OAAO,OAAO,aAAa,OAAO,WAAW,IAAI;AAEzD,QAAM,OAAO,MAAM;AACjB,WAAO,IAAI,QAA2B,CAAC,SAAS,WAAW;AACzD,UAAI,CAAC,KAAK;AACR,eAAO,IAAI,MAAM,wBAAwB,CAAC;AAAA,MAC5C;AAEA,UAAI,CAAC,YAAY,CAAC,SAAS,MAAM;AAC/B,eAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,MACpD;AAEA,YAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,UAAI,YAAa,QAAO,aAAa,eAAe,WAAW;AAC/D,aAAO,QAAQ,SAAS;AACxB,aAAO,QAAQ,SAAS;AAExB,UAAI,WAAW;AACf,UAAI,YAAmC;AAEvC,YAAM,UAAU,MAAM;AACpB,eAAO,oBAAoB,QAAQ,UAAU;AAC7C,eAAO,oBAAoB,SAAS,WAAW;AAC/C,YAAI,WAAW;AACb,uBAAa,SAAS;AACtB,sBAAY;AAAA,QACd;AAAA,MACF;AAEA,YAAM,aAAa,MAAM;AACvB,YAAI,SAAU;AACd,gBAAQ,IAAI,4CAA4C,GAAG,EAAE;AAE7D,mBAAW;AACX,gBAAQ;AACR,gBAAQ,MAAM;AAAA,MAChB;AAEA,YAAM,cAAc,CAAC,UAAsB;AACzC,YAAI,SAAU;AACd,mBAAW;AACX,gBAAQ;AACR,eAAO,OAAO;AACd,gBAAQ,MAAM,uCAAuC,GAAG,IAAI,KAAK;AACjE,eAAO,IAAI,MAAM,0BAA0B,GAAG,YAAY,MAAM,OAAO,EAAE,CAAC;AAAA,MAC5E;AAEA,aAAO,iBAAiB,QAAQ,UAAU;AAC1C,aAAO,iBAAiB,SAAS,WAAW;AAE5C,aAAO,MAAM;AACb,aAAO,QAAQ;AACf,+CAAa;AAEb,cAAQ,IAAI,mDAAmD,GAAG,EAAE;AACpE,eAAS,KAAK,YAAY,MAAM;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,SAAO,KAAK;AAGd;","names":[]}
1
+ {"version":3,"sources":["../src/loadScript.ts","../src/retry.ts"],"sourcesContent":["import { retry } from './retry';\n\ntype LoadScriptOptions = {\n async?: boolean;\n defer?: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n nonce?: string;\n beforeLoad?: (script: HTMLScriptElement) => void;\n};\n\nexport async function loadScript(src = '', options: LoadScriptOptions): Promise<HTMLScriptElement> {\n const { async, defer, crossOrigin, nonce, beforeLoad } = options;\n\n const load = () => {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n if (!src) {\n reject(new Error('Script src is required'));\n }\n\n if (!document || !document.body) {\n reject(new Error('Document body is not available'));\n }\n\n const script = document.createElement('script');\n\n if (crossOrigin) script.setAttribute('crossorigin', crossOrigin);\n script.async = async || false;\n script.defer = defer || false;\n\n let resolved = false;\n let timeoutId: NodeJS.Timeout | null = null;\n\n /**\n * @deprecated\n */\n const cleanup = () => {\n script.removeEventListener('load', handleLoad);\n script.removeEventListener('error', handleError);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n /**\n * @deprecated\n */\n const handleLoad = () => {\n if (resolved) return;\n\n resolved = true;\n cleanup();\n resolve(script);\n };\n /**\n * @deprecated\n */\n const handleError = (error: ErrorEvent) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n script.remove();\n reject(new Error(`Failed to load script: ${src}, Error: ${error.message}`));\n };\n\n script.addEventListener('load', () => {\n script.remove()\n resolve(script);\n });\n\n script.addEventListener('error', () => {\n script.remove()\n reject()\n });\n\n script.src = src;\n script.nonce = nonce;\n beforeLoad?.(script);\n document.body.appendChild(script)\n });\n };\n\n //return load()\n\n return retry(load, { shouldRetry: (_, iterations) => iterations <= 5 });\n}","type Milliseconds = number;\n\ntype RetryOptions = Partial<{\n /**\n * The initial delay before the first retry.\n * @default 125\n */\n initialDelay: Milliseconds;\n /**\n * The maximum delay between retries.\n * The delay between retries will never exceed this value.\n * If set to 0, the delay will increase indefinitely.\n * @default 0\n */\n maxDelayBetweenRetries: Milliseconds;\n /**\n * The multiplier for the exponential backoff.\n * @default 2\n */\n factor: number;\n /**\n * A function to determine if the operation should be retried.\n * The callback accepts the error that was thrown and the number of iterations.\n * The iterations variable references the number of retries AFTER attempt\n * that caused the error and starts at 1 (as in, this is the 1st, 2nd, nth retry).\n * @default (error, iterations) => iterations < 5\n */\n shouldRetry: (error: unknown, iterations: number) => boolean;\n /**\n * Controls whether the helper should retry the operation immediately once before applying exponential backoff.\n * The delay for the immediate retry is 100ms.\n * @default false\n */\n retryImmediately: boolean;\n /**\n * If true, the intervals will be multiplied by a factor in the range of [1,2].\n * @default true\n */\n jitter: boolean;\n}>;\n\nconst defaultOptions: Required<RetryOptions> = {\n initialDelay: 125,\n maxDelayBetweenRetries: 0,\n factor: 2,\n shouldRetry: (_: unknown, iteration: number) => iteration < 5,\n retryImmediately: false,\n jitter: true,\n};\n\nconst RETRY_IMMEDIATELY_DELAY = 100;\n\nconst sleep = async (ms: Milliseconds) => new Promise(s => setTimeout(s, ms));\n\nconst applyJitter = (delay: Milliseconds, jitter: boolean) => {\n return jitter ? delay * (1 + Math.random()) : delay;\n};\n\nconst createExponentialDelayAsyncFn = (\n opts: Required<Pick<RetryOptions, 'initialDelay' | 'maxDelayBetweenRetries' | 'factor' | 'jitter'>>,\n) => {\n let timesCalled = 0;\n\n const calculateDelayInMs = () => {\n const constant = opts.initialDelay;\n const base = opts.factor;\n let delay = constant * Math.pow(base, timesCalled);\n delay = applyJitter(delay, opts.jitter);\n return Math.min(opts.maxDelayBetweenRetries || delay, delay);\n };\n\n return async (): Promise<void> => {\n await sleep(calculateDelayInMs());\n timesCalled++;\n };\n};\n\n/**\n * Retries a callback until it succeeds or the shouldRetry function returns false.\n * See {@link RetryOptions} for the available options.\n */\nexport const retry = async <T>(callback: () => T | Promise<T>, options: RetryOptions = {}): Promise<T> => {\n let iterations = 0;\n const { shouldRetry, initialDelay, maxDelayBetweenRetries, factor, retryImmediately, jitter } = {\n ...defaultOptions,\n ...options,\n };\n\n const delay = createExponentialDelayAsyncFn({\n initialDelay,\n maxDelayBetweenRetries,\n factor,\n jitter,\n });\n\n while (true) {\n try {\n return await callback();\n } catch (e) {\n iterations++;\n if (!shouldRetry(e, iterations)) {\n throw e;\n }\n if (retryImmediately && iterations === 1) {\n await sleep(applyJitter(RETRY_IMMEDIATELY_DELAY, jitter));\n } else {\n await delay();\n }\n }\n }\n};\n"],"mappings":"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","names":[]}
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  loadScript
3
- } from "./chunk-33U3M4YY.mjs";
3
+ } from "./chunk-IGYBIQYE.mjs";
4
+ import "./chunk-N2V3PKFE.mjs";
4
5
  export {
5
6
  loadScript
6
7
  };
@@ -1,9 +1,11 @@
1
- import { TernSecureInstanceTreeOptions, TernSecureSDK } from '@tern-secure/types';
1
+ import { TernSecureAuthOptions, TernSecureSDK } from '@tern-secure/types';
2
2
 
3
- type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {
3
+ type LoadTernUISCriptOptions = TernSecureAuthOptions & {
4
4
  apiKey?: string;
5
- customDomain?: string;
5
+ apiUrl?: string;
6
+ authDomain?: string;
6
7
  proxyUrl?: string;
8
+ ternUIUrl?: string;
7
9
  ternUIVersion?: string;
8
10
  sdkMetadata?: TernSecureSDK;
9
11
  scriptHost?: string;
@@ -12,11 +14,17 @@ type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {
12
14
  };
13
15
  declare const loadTernUIScript: (options?: LoadTernUISCriptOptions) => Promise<unknown>;
14
16
  declare const ternUIgetScriptUrl: (options: LoadTernUISCriptOptions) => string;
17
+ /**
18
+ * @deprecated Use constructTernUIScriptAttributes instead
19
+ */
15
20
  declare const constructScriptAttributes: (options?: LoadTernUISCriptOptions) => {
16
21
  nonce?: string | undefined;
17
- 'data-domain': string;
22
+ 'data-auth-domain': string;
18
23
  'data-apikey': string;
19
- 'data-proxyUrl': string;
24
+ 'data-api-url': string;
25
+ 'data-proxy-url': string;
20
26
  };
27
+ declare const constructTernUIScriptAttributes: (options: LoadTernUISCriptOptions) => Record<string, string>;
28
+ declare const applyLoadWithOptions: (options: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => void;
21
29
 
22
- export { type LoadTernUISCriptOptions, constructScriptAttributes, loadTernUIScript, ternUIgetScriptUrl };
30
+ export { type LoadTernUISCriptOptions, applyLoadWithOptions, constructScriptAttributes, constructTernUIScriptAttributes, loadTernUIScript, ternUIgetScriptUrl };
@@ -1,9 +1,11 @@
1
- import { TernSecureInstanceTreeOptions, TernSecureSDK } from '@tern-secure/types';
1
+ import { TernSecureAuthOptions, TernSecureSDK } from '@tern-secure/types';
2
2
 
3
- type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {
3
+ type LoadTernUISCriptOptions = TernSecureAuthOptions & {
4
4
  apiKey?: string;
5
- customDomain?: string;
5
+ apiUrl?: string;
6
+ authDomain?: string;
6
7
  proxyUrl?: string;
8
+ ternUIUrl?: string;
7
9
  ternUIVersion?: string;
8
10
  sdkMetadata?: TernSecureSDK;
9
11
  scriptHost?: string;
@@ -12,11 +14,17 @@ type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {
12
14
  };
13
15
  declare const loadTernUIScript: (options?: LoadTernUISCriptOptions) => Promise<unknown>;
14
16
  declare const ternUIgetScriptUrl: (options: LoadTernUISCriptOptions) => string;
17
+ /**
18
+ * @deprecated Use constructTernUIScriptAttributes instead
19
+ */
15
20
  declare const constructScriptAttributes: (options?: LoadTernUISCriptOptions) => {
16
21
  nonce?: string | undefined;
17
- 'data-domain': string;
22
+ 'data-auth-domain': string;
18
23
  'data-apikey': string;
19
- 'data-proxyUrl': string;
24
+ 'data-api-url': string;
25
+ 'data-proxy-url': string;
20
26
  };
27
+ declare const constructTernUIScriptAttributes: (options: LoadTernUISCriptOptions) => Record<string, string>;
28
+ declare const applyLoadWithOptions: (options: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => void;
21
29
 
22
- export { type LoadTernUISCriptOptions, constructScriptAttributes, loadTernUIScript, ternUIgetScriptUrl };
30
+ export { type LoadTernUISCriptOptions, applyLoadWithOptions, constructScriptAttributes, constructTernUIScriptAttributes, loadTernUIScript, ternUIgetScriptUrl };
@@ -20,12 +20,71 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/loadTernUIScript.ts
21
21
  var loadTernUIScript_exports = {};
22
22
  __export(loadTernUIScript_exports, {
23
+ applyLoadWithOptions: () => applyLoadWithOptions,
23
24
  constructScriptAttributes: () => constructScriptAttributes,
25
+ constructTernUIScriptAttributes: () => constructTernUIScriptAttributes,
24
26
  loadTernUIScript: () => loadTernUIScript,
25
27
  ternUIgetScriptUrl: () => ternUIgetScriptUrl
26
28
  });
27
29
  module.exports = __toCommonJS(loadTernUIScript_exports);
28
30
 
31
+ // src/retry.ts
32
+ var defaultOptions = {
33
+ initialDelay: 125,
34
+ maxDelayBetweenRetries: 0,
35
+ factor: 2,
36
+ shouldRetry: (_, iteration) => iteration < 5,
37
+ retryImmediately: false,
38
+ jitter: true
39
+ };
40
+ var RETRY_IMMEDIATELY_DELAY = 100;
41
+ var sleep = async (ms) => new Promise((s) => setTimeout(s, ms));
42
+ var applyJitter = (delay, jitter) => {
43
+ return jitter ? delay * (1 + Math.random()) : delay;
44
+ };
45
+ var createExponentialDelayAsyncFn = (opts) => {
46
+ let timesCalled = 0;
47
+ const calculateDelayInMs = () => {
48
+ const constant = opts.initialDelay;
49
+ const base = opts.factor;
50
+ let delay = constant * Math.pow(base, timesCalled);
51
+ delay = applyJitter(delay, opts.jitter);
52
+ return Math.min(opts.maxDelayBetweenRetries || delay, delay);
53
+ };
54
+ return async () => {
55
+ await sleep(calculateDelayInMs());
56
+ timesCalled++;
57
+ };
58
+ };
59
+ var retry = async (callback, options = {}) => {
60
+ let iterations = 0;
61
+ const { shouldRetry, initialDelay, maxDelayBetweenRetries, factor, retryImmediately, jitter } = {
62
+ ...defaultOptions,
63
+ ...options
64
+ };
65
+ const delay = createExponentialDelayAsyncFn({
66
+ initialDelay,
67
+ maxDelayBetweenRetries,
68
+ factor,
69
+ jitter
70
+ });
71
+ while (true) {
72
+ try {
73
+ return await callback();
74
+ } catch (e) {
75
+ iterations++;
76
+ if (!shouldRetry(e, iterations)) {
77
+ throw e;
78
+ }
79
+ if (retryImmediately && iterations === 1) {
80
+ await sleep(applyJitter(RETRY_IMMEDIATELY_DELAY, jitter));
81
+ } else {
82
+ await delay();
83
+ }
84
+ }
85
+ }
86
+ };
87
+
29
88
  // src/loadScript.ts
30
89
  async function loadScript(src = "", options) {
31
90
  const { async, defer, crossOrigin, nonce, beforeLoad } = options;
@@ -53,7 +112,6 @@ async function loadScript(src = "", options) {
53
112
  };
54
113
  const handleLoad = () => {
55
114
  if (resolved) return;
56
- console.log(`[loadScript] Script loaded successfully: ${src}`);
57
115
  resolved = true;
58
116
  cleanup();
59
117
  resolve(script);
@@ -63,44 +121,60 @@ async function loadScript(src = "", options) {
63
121
  resolved = true;
64
122
  cleanup();
65
123
  script.remove();
66
- console.error(`[loadScript] Failed to load script: ${src}`, error);
67
124
  reject(new Error(`Failed to load script: ${src}, Error: ${error.message}`));
68
125
  };
69
- script.addEventListener("load", handleLoad);
70
- script.addEventListener("error", handleError);
126
+ script.addEventListener("load", () => {
127
+ script.remove();
128
+ resolve(script);
129
+ });
130
+ script.addEventListener("error", () => {
131
+ script.remove();
132
+ reject();
133
+ });
71
134
  script.src = src;
72
135
  script.nonce = nonce;
73
136
  beforeLoad == null ? void 0 : beforeLoad(script);
74
- console.log(`[loadScript] Appending script to document body: ${src}`);
75
137
  document.body.appendChild(script);
76
138
  });
77
139
  };
78
- return load();
140
+ return retry(load, { shouldRetry: (_, iterations) => iterations <= 5 });
79
141
  }
80
142
 
81
143
  // src/resolveVersion.ts
82
- var resolveVersion = (ternUIVersion, packageVersion = TERN_UI_VERSION) => {
144
+ var resolveVersion = (ternUIVersion, packageVersion = "1.1.0-canary.v20251125170702") => {
83
145
  if (ternUIVersion) {
84
146
  return ternUIVersion;
85
147
  }
86
- return packageVersion;
148
+ const prereleaseTag = getPrereleaseTag(packageVersion);
149
+ if (prereleaseTag) {
150
+ if (prereleaseTag === "snapshot") {
151
+ return "1.1.0-canary.v20251125170702";
152
+ }
153
+ return prereleaseTag;
154
+ }
155
+ return getMajorVersion(packageVersion);
156
+ };
157
+ var getPrereleaseTag = (packageVersion) => {
158
+ var _a;
159
+ return (_a = packageVersion.trim().replace(/^v/, "").match(/-(.+?)(\.|$)/)) == null ? void 0 : _a[1];
87
160
  };
161
+ var getMajorVersion = (packageVersion) => packageVersion.trim().replace(/^v/, "").split(".")[0];
88
162
 
89
163
  // src/loadTernUIScript.ts
164
+ var FAILED_TO_LOAD_ERROR = "TernUI: Failed to load TernSecure";
90
165
  var loadTernUIScript = async (options) => {
91
166
  const existingScript = document.querySelector("script[data-ternui-script]");
92
- console.log("[TernSecure-shared] Existing script:", existingScript);
93
167
  if (existingScript) {
94
168
  return new Promise((resolve, reject) => {
95
169
  existingScript.addEventListener("load", () => {
96
170
  resolve(existingScript);
97
171
  });
98
172
  existingScript.addEventListener("error", (error) => {
99
- reject(error);
173
+ reject(FAILED_TO_LOAD_ERROR);
100
174
  });
101
175
  });
102
176
  }
103
- if (!(options == null ? void 0 : options.customDomain)) {
177
+ if (!(options == null ? void 0 : options.authDomain)) {
104
178
  throw new Error(
105
179
  "TernUI script requires a custom domain or proxy URL to be specified in options."
106
180
  );
@@ -108,40 +182,59 @@ var loadTernUIScript = async (options) => {
108
182
  return loadScript(ternUIgetScriptUrl(options), {
109
183
  async: true,
110
184
  //crossOrigin: undefined,
111
- beforeLoad: beforeLoadWithOptions(options)
112
- }).catch((error) => {
113
- console.error("[TernSecure] Failed to load TernUI script:", error);
185
+ beforeLoad: applyLoadWithOptions(options)
186
+ }).catch(() => {
114
187
  throw new Error("Failed to load TernUI script");
115
188
  });
116
189
  };
117
190
  var ternUIgetScriptUrl = (options) => {
118
- const { ternUIVersion, isTernSecureDev } = options;
191
+ const { ternUIUrl, ternUIVersion } = options;
119
192
  const version = resolveVersion(ternUIVersion);
120
- if (isTernSecureDev) {
121
- const localHost = process.env.TERN_UI_HOST || "localhost";
122
- const localPort = (options == null ? void 0 : options.localPort) || process.env.TERN_UI_PORT || "4000";
123
- return `http://${localHost}:${localPort}/ternsecure.browser.js`;
193
+ if (ternUIUrl) {
194
+ return ternUIUrl;
124
195
  }
125
- return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;
126
- };
127
- var beforeLoadWithOptions = (options) => (script) => {
128
- const attributes = constructScriptAttributes(options);
129
- Object.entries(attributes).forEach(([key, value]) => {
130
- if (value) script.setAttribute(key, String(value));
131
- });
132
- console.log("[TernSecure-shared] Script attributes set:", attributes);
196
+ const ternsecureCDN = (options == null ? void 0 : options.authDomain) || (options == null ? void 0 : options.proxyUrl) && new URL(options.proxyUrl).host;
197
+ return `${ternsecureCDN}/${version}/ternsecure.browser.js`;
133
198
  };
134
199
  var constructScriptAttributes = (options) => {
135
200
  return {
136
- "data-domain": (options == null ? void 0 : options.customDomain) || "",
201
+ "data-auth-domain": (options == null ? void 0 : options.authDomain) || "",
137
202
  "data-apikey": (options == null ? void 0 : options.apiKey) || "",
138
- "data-proxyUrl": (options == null ? void 0 : options.proxyUrl) || "",
203
+ "data-api-url": (options == null ? void 0 : options.apiUrl) || "",
204
+ "data-proxy-url": (options == null ? void 0 : options.proxyUrl) || "",
139
205
  ...(options == null ? void 0 : options.nonce) ? { nonce: options.nonce } : {}
140
206
  };
141
207
  };
208
+ var constructTernUIScriptAttributes = (options) => {
209
+ const obj = {};
210
+ if (options.authDomain) {
211
+ obj["data-auth-domain"] = options.authDomain;
212
+ }
213
+ if (options.apiKey) {
214
+ obj["data-apikey"] = options.apiKey;
215
+ }
216
+ if (options.apiUrl) {
217
+ obj["data-api-url"] = options.apiUrl;
218
+ }
219
+ if (options.proxyUrl) {
220
+ obj["data-proxy-url"] = options.proxyUrl;
221
+ }
222
+ if (options.nonce) {
223
+ obj.nonce = options.nonce;
224
+ }
225
+ return obj;
226
+ };
227
+ var applyLoadWithOptions = (options) => (script) => {
228
+ const attributes = constructTernUIScriptAttributes(options);
229
+ for (const attribute in attributes) {
230
+ script.setAttribute(attribute, attributes[attribute]);
231
+ }
232
+ };
142
233
  // Annotate the CommonJS export names for ESM import in node:
143
234
  0 && (module.exports = {
235
+ applyLoadWithOptions,
144
236
  constructScriptAttributes,
237
+ constructTernUIScriptAttributes,
145
238
  loadTernUIScript,
146
239
  ternUIgetScriptUrl
147
240
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadTernUIScript.ts","../src/loadScript.ts","../src/resolveVersion.ts"],"sourcesContent":["import type { TernSecureInstanceTreeOptions, TernSecureSDK } from '@tern-secure/types';\n\nimport { loadScript } from './loadScript';\nimport { resolveVersion } from './resolveVersion';\n\nexport type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {\n apiKey?: string;\n customDomain?: string;\n proxyUrl?: string;\n ternUIVersion?: string;\n sdkMetadata?: TernSecureSDK;\n scriptHost?: string;\n localPort?: string;\n nonce?: string;\n};\n\nexport const loadTernUIScript = async (options?: LoadTernUISCriptOptions) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-ternui-script]');\n console.log('[TernSecure-shared] Existing script:', existingScript);\n\n if (existingScript) {\n return new Promise((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n resolve(existingScript);\n });\n\n existingScript.addEventListener('error', error => {\n reject(error);\n });\n });\n }\n\n if (!options?.customDomain) {\n throw new Error(\n 'TernUI script requires a custom domain or proxy URL to be specified in options.',\n );\n }\n\n return loadScript(ternUIgetScriptUrl(options), {\n async: true,\n //crossOrigin: undefined,\n beforeLoad: beforeLoadWithOptions(options),\n }).catch(error => {\n console.error('[TernSecure] Failed to load TernUI script:', error);\n throw new Error('Failed to load TernUI script');\n });\n};\n\nexport const ternUIgetScriptUrl = (options: LoadTernUISCriptOptions) => {\n const { ternUIVersion, isTernSecureDev } = options;\n const version = resolveVersion(ternUIVersion);\n\n if (isTernSecureDev) {\n const localHost = process.env.TERN_UI_HOST || 'localhost';\n const localPort = options?.localPort || process.env.TERN_UI_PORT || '4000';\n return `http://${localHost}:${localPort}/ternsecure.browser.js`;\n //return `http://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n }\n //return `https://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;\n\n //const ternsecureCDN = options?.customDomain ||\n //(options?.proxyUrl && new URL(options.proxyUrl).host) || 'cdn.tern-secure.com';\n //return `${ternsecureCDN}/ternsecure.browser.js`;\n //return `https://${ternsecureCDN}/npm/@ternsecure/tern-ui@${version}/dist/ternsecure.browser.js`;\n};\n\nconst beforeLoadWithOptions =\n (options?: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructScriptAttributes(options);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value) script.setAttribute(key, String(value));\n });\n console.log('[TernSecure-shared] Script attributes set:', attributes);\n };\n\nexport const constructScriptAttributes = (options?: LoadTernUISCriptOptions) => {\n return {\n 'data-domain': options?.customDomain || '',\n 'data-apikey': options?.apiKey || '',\n 'data-proxyUrl': options?.proxyUrl || '',\n ...(options?.nonce ? { nonce: options.nonce } : {}),\n };\n};\n","type LoadScriptOptions = {\n async?: boolean;\n defer?: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n nonce?: string;\n beforeLoad?: (script: HTMLScriptElement) => void;\n };\n\n export async function loadScript(src ='', options: LoadScriptOptions): Promise<HTMLScriptElement> {\n const { async, defer, crossOrigin, nonce, beforeLoad } = options;\n\n const load = () => {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n if (!src) {\n reject(new Error('Script src is required'));\n }\n\n if (!document || !document.body) {\n reject(new Error('Document body is not available'));\n }\n\n const script = document.createElement('script');\n\n if (crossOrigin) script.setAttribute('crossorigin', crossOrigin);\n script.async = async || false;\n script.defer = defer || false;\n\n let resolved = false;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n script.removeEventListener('load', handleLoad);\n script.removeEventListener('error', handleError);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n \n const handleLoad = () => {\n if (resolved) return;\n console.log(`[loadScript] Script loaded successfully: ${src}`);\n\n resolved = true;\n cleanup();\n resolve(script);\n };\n \n const handleError = (error: ErrorEvent) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n script.remove();\n console.error(`[loadScript] Failed to load script: ${src}`, error);\n reject(new Error(`Failed to load script: ${src}, Error: ${error.message}`));\n };\n \n script.addEventListener('load', handleLoad);\n script.addEventListener('error', handleError);\n\n script.src = src;\n script.nonce = nonce;\n beforeLoad?.(script);\n\n console.log(`[loadScript] Appending script to document body: ${src}`);\n document.body.appendChild(script)\n });\n };\n\n return load()\n\n //return retry(load, { shouldRetry: (_, iterations) => iterations <=5 });\n }","\nexport const resolveVersion = (ternUIVersion: string | undefined, packageVersion = TERN_UI_VERSION) => {\n if (ternUIVersion) {\n return ternUIVersion\n }\n\n return packageVersion;\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/loadTernUIScript.ts","../src/retry.ts","../src/loadScript.ts","../src/resolveVersion.ts"],"sourcesContent":["import type { TernSecureAuthOptions, TernSecureSDK } from '@tern-secure/types';\n\nimport { loadScript } from './loadScript';\nimport { resolveVersion } from './resolveVersion';\n\nconst FAILED_TO_LOAD_ERROR = 'TernUI: Failed to load TernSecure';\n\nexport type LoadTernUISCriptOptions = TernSecureAuthOptions & {\n apiKey?: string;\n apiUrl?: string;\n authDomain?: string;\n proxyUrl?: string;\n ternUIUrl?: string;\n ternUIVersion?: string;\n sdkMetadata?: TernSecureSDK;\n scriptHost?: string;\n localPort?: string;\n nonce?: string;\n};\n\nexport const loadTernUIScript = async (options?: LoadTernUISCriptOptions) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-ternui-script]');\n\n if (existingScript) {\n return new Promise((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n resolve(existingScript);\n });\n\n existingScript.addEventListener('error', error => {\n reject(FAILED_TO_LOAD_ERROR);\n });\n });\n }\n\n if (!options?.authDomain) {\n throw new Error(\n 'TernUI script requires a custom domain or proxy URL to be specified in options.',\n );\n }\n\n return loadScript(ternUIgetScriptUrl(options), {\n async: true,\n //crossOrigin: undefined,\n beforeLoad: applyLoadWithOptions(options),\n }).catch(() => {\n throw new Error('Failed to load TernUI script');\n });\n};\n\nexport const ternUIgetScriptUrl = (options: LoadTernUISCriptOptions) => {\n const { ternUIUrl, ternUIVersion } = options;\n const version = resolveVersion(ternUIVersion);\n\n if (ternUIUrl) {\n return ternUIUrl;\n }\n\n //return `https://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n //return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;\n\n const ternsecureCDN = options?.authDomain ||\n (options?.proxyUrl && new URL(options.proxyUrl).host);\n return `${ternsecureCDN}/${version}/ternsecure.browser.js`;\n //return `https://${ternsecureCDN}/npm/@ternsecure/tern-ui@${version}/dist/ternsecure.browser.js`;\n};\n\n/**\n * @deprecated Use applyLoadWithOptions instead\n */\nconst beforeLoadWithOptions =\n (options?: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructScriptAttributes(options);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value) script.setAttribute(key, String(value));\n });\n console.log('[TernSecure-shared] Script attributes set:', attributes);\n };\n\n/**\n * @deprecated Use constructTernUIScriptAttributes instead\n */\nexport const constructScriptAttributes = (options?: LoadTernUISCriptOptions) => {\n return {\n 'data-auth-domain': options?.authDomain || '',\n 'data-apikey': options?.apiKey || '',\n 'data-api-url': options?.apiUrl || '',\n 'data-proxy-url': options?.proxyUrl || '',\n ...(options?.nonce ? { nonce: options.nonce } : {}),\n };\n};\n\n\nconst constructTernUIScriptAttributes = (options: LoadTernUISCriptOptions) => {\n const obj: Record<string, string> = {};\n\n if (options.authDomain) {\n obj['data-auth-domain'] = options.authDomain;\n }\n if (options.apiKey) {\n obj['data-apikey'] = options.apiKey;\n }\n if (options.apiUrl) {\n obj['data-api-url'] = options.apiUrl;\n }\n if (options.proxyUrl) {\n obj['data-proxy-url'] = options.proxyUrl;\n }\n\n if (options.nonce) {\n obj.nonce = options.nonce;\n }\n\n return obj;\n}\n\nconst applyLoadWithOptions =\n (options: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructTernUIScriptAttributes(options);\n for (const attribute in attributes) {\n script.setAttribute(attribute, attributes[attribute]);\n }\n };\n\n\nexport { constructTernUIScriptAttributes, applyLoadWithOptions };\n\n","type Milliseconds = number;\n\ntype RetryOptions = Partial<{\n /**\n * The initial delay before the first retry.\n * @default 125\n */\n initialDelay: Milliseconds;\n /**\n * The maximum delay between retries.\n * The delay between retries will never exceed this value.\n * If set to 0, the delay will increase indefinitely.\n * @default 0\n */\n maxDelayBetweenRetries: Milliseconds;\n /**\n * The multiplier for the exponential backoff.\n * @default 2\n */\n factor: number;\n /**\n * A function to determine if the operation should be retried.\n * The callback accepts the error that was thrown and the number of iterations.\n * The iterations variable references the number of retries AFTER attempt\n * that caused the error and starts at 1 (as in, this is the 1st, 2nd, nth retry).\n * @default (error, iterations) => iterations < 5\n */\n shouldRetry: (error: unknown, iterations: number) => boolean;\n /**\n * Controls whether the helper should retry the operation immediately once before applying exponential backoff.\n * The delay for the immediate retry is 100ms.\n * @default false\n */\n retryImmediately: boolean;\n /**\n * If true, the intervals will be multiplied by a factor in the range of [1,2].\n * @default true\n */\n jitter: boolean;\n}>;\n\nconst defaultOptions: Required<RetryOptions> = {\n initialDelay: 125,\n maxDelayBetweenRetries: 0,\n factor: 2,\n shouldRetry: (_: unknown, iteration: number) => iteration < 5,\n retryImmediately: false,\n jitter: true,\n};\n\nconst RETRY_IMMEDIATELY_DELAY = 100;\n\nconst sleep = async (ms: Milliseconds) => new Promise(s => setTimeout(s, ms));\n\nconst applyJitter = (delay: Milliseconds, jitter: boolean) => {\n return jitter ? delay * (1 + Math.random()) : delay;\n};\n\nconst createExponentialDelayAsyncFn = (\n opts: Required<Pick<RetryOptions, 'initialDelay' | 'maxDelayBetweenRetries' | 'factor' | 'jitter'>>,\n) => {\n let timesCalled = 0;\n\n const calculateDelayInMs = () => {\n const constant = opts.initialDelay;\n const base = opts.factor;\n let delay = constant * Math.pow(base, timesCalled);\n delay = applyJitter(delay, opts.jitter);\n return Math.min(opts.maxDelayBetweenRetries || delay, delay);\n };\n\n return async (): Promise<void> => {\n await sleep(calculateDelayInMs());\n timesCalled++;\n };\n};\n\n/**\n * Retries a callback until it succeeds or the shouldRetry function returns false.\n * See {@link RetryOptions} for the available options.\n */\nexport const retry = async <T>(callback: () => T | Promise<T>, options: RetryOptions = {}): Promise<T> => {\n let iterations = 0;\n const { shouldRetry, initialDelay, maxDelayBetweenRetries, factor, retryImmediately, jitter } = {\n ...defaultOptions,\n ...options,\n };\n\n const delay = createExponentialDelayAsyncFn({\n initialDelay,\n maxDelayBetweenRetries,\n factor,\n jitter,\n });\n\n while (true) {\n try {\n return await callback();\n } catch (e) {\n iterations++;\n if (!shouldRetry(e, iterations)) {\n throw e;\n }\n if (retryImmediately && iterations === 1) {\n await sleep(applyJitter(RETRY_IMMEDIATELY_DELAY, jitter));\n } else {\n await delay();\n }\n }\n }\n};\n","import { retry } from './retry';\n\ntype LoadScriptOptions = {\n async?: boolean;\n defer?: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n nonce?: string;\n beforeLoad?: (script: HTMLScriptElement) => void;\n};\n\nexport async function loadScript(src = '', options: LoadScriptOptions): Promise<HTMLScriptElement> {\n const { async, defer, crossOrigin, nonce, beforeLoad } = options;\n\n const load = () => {\n return new Promise<HTMLScriptElement>((resolve, reject) => {\n if (!src) {\n reject(new Error('Script src is required'));\n }\n\n if (!document || !document.body) {\n reject(new Error('Document body is not available'));\n }\n\n const script = document.createElement('script');\n\n if (crossOrigin) script.setAttribute('crossorigin', crossOrigin);\n script.async = async || false;\n script.defer = defer || false;\n\n let resolved = false;\n let timeoutId: NodeJS.Timeout | null = null;\n\n /**\n * @deprecated\n */\n const cleanup = () => {\n script.removeEventListener('load', handleLoad);\n script.removeEventListener('error', handleError);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n /**\n * @deprecated\n */\n const handleLoad = () => {\n if (resolved) return;\n\n resolved = true;\n cleanup();\n resolve(script);\n };\n /**\n * @deprecated\n */\n const handleError = (error: ErrorEvent) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n script.remove();\n reject(new Error(`Failed to load script: ${src}, Error: ${error.message}`));\n };\n\n script.addEventListener('load', () => {\n script.remove()\n resolve(script);\n });\n\n script.addEventListener('error', () => {\n script.remove()\n reject()\n });\n\n script.src = src;\n script.nonce = nonce;\n beforeLoad?.(script);\n document.body.appendChild(script)\n });\n };\n\n //return load()\n\n return retry(load, { shouldRetry: (_, iterations) => iterations <= 5 });\n}","\nexport const resolveVersion = (ternUIVersion: string | undefined, packageVersion = TERN_UI_VERSION) => {\n if (ternUIVersion) {\n return ternUIVersion\n }\n\n const prereleaseTag = getPrereleaseTag(packageVersion);\n if (prereleaseTag) {\n if (prereleaseTag === 'snapshot') {\n return TERN_UI_VERSION;\n }\n\n return prereleaseTag;\n }\n\n return getMajorVersion(packageVersion);\n}\n\nconst getPrereleaseTag = (packageVersion: string) =>\n packageVersion\n .trim()\n .replace(/^v/, '')\n .match(/-(.+?)(\\.|$)/)?.[1];\n\nexport const getMajorVersion = (packageVersion: string) => packageVersion.trim().replace(/^v/, '').split('.')[0];"],"mappings":"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","names":[]}
@@ -1,25 +1,26 @@
1
- import {
2
- loadScript
3
- } from "./chunk-33U3M4YY.mjs";
4
1
  import {
5
2
  resolveVersion
6
- } from "./chunk-PHCVLVZY.mjs";
3
+ } from "./chunk-B2SN66XE.mjs";
4
+ import {
5
+ loadScript
6
+ } from "./chunk-IGYBIQYE.mjs";
7
+ import "./chunk-N2V3PKFE.mjs";
7
8
 
8
9
  // src/loadTernUIScript.ts
10
+ var FAILED_TO_LOAD_ERROR = "TernUI: Failed to load TernSecure";
9
11
  var loadTernUIScript = async (options) => {
10
12
  const existingScript = document.querySelector("script[data-ternui-script]");
11
- console.log("[TernSecure-shared] Existing script:", existingScript);
12
13
  if (existingScript) {
13
14
  return new Promise((resolve, reject) => {
14
15
  existingScript.addEventListener("load", () => {
15
16
  resolve(existingScript);
16
17
  });
17
18
  existingScript.addEventListener("error", (error) => {
18
- reject(error);
19
+ reject(FAILED_TO_LOAD_ERROR);
19
20
  });
20
21
  });
21
22
  }
22
- if (!(options == null ? void 0 : options.customDomain)) {
23
+ if (!(options == null ? void 0 : options.authDomain)) {
23
24
  throw new Error(
24
25
  "TernUI script requires a custom domain or proxy URL to be specified in options."
25
26
  );
@@ -27,39 +28,58 @@ var loadTernUIScript = async (options) => {
27
28
  return loadScript(ternUIgetScriptUrl(options), {
28
29
  async: true,
29
30
  //crossOrigin: undefined,
30
- beforeLoad: beforeLoadWithOptions(options)
31
- }).catch((error) => {
32
- console.error("[TernSecure] Failed to load TernUI script:", error);
31
+ beforeLoad: applyLoadWithOptions(options)
32
+ }).catch(() => {
33
33
  throw new Error("Failed to load TernUI script");
34
34
  });
35
35
  };
36
36
  var ternUIgetScriptUrl = (options) => {
37
- const { ternUIVersion, isTernSecureDev } = options;
37
+ const { ternUIUrl, ternUIVersion } = options;
38
38
  const version = resolveVersion(ternUIVersion);
39
- if (isTernSecureDev) {
40
- const localHost = process.env.TERN_UI_HOST || "localhost";
41
- const localPort = (options == null ? void 0 : options.localPort) || process.env.TERN_UI_PORT || "4000";
42
- return `http://${localHost}:${localPort}/ternsecure.browser.js`;
39
+ if (ternUIUrl) {
40
+ return ternUIUrl;
43
41
  }
44
- return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;
45
- };
46
- var beforeLoadWithOptions = (options) => (script) => {
47
- const attributes = constructScriptAttributes(options);
48
- Object.entries(attributes).forEach(([key, value]) => {
49
- if (value) script.setAttribute(key, String(value));
50
- });
51
- console.log("[TernSecure-shared] Script attributes set:", attributes);
42
+ const ternsecureCDN = (options == null ? void 0 : options.authDomain) || (options == null ? void 0 : options.proxyUrl) && new URL(options.proxyUrl).host;
43
+ return `${ternsecureCDN}/${version}/ternsecure.browser.js`;
52
44
  };
53
45
  var constructScriptAttributes = (options) => {
54
46
  return {
55
- "data-domain": (options == null ? void 0 : options.customDomain) || "",
47
+ "data-auth-domain": (options == null ? void 0 : options.authDomain) || "",
56
48
  "data-apikey": (options == null ? void 0 : options.apiKey) || "",
57
- "data-proxyUrl": (options == null ? void 0 : options.proxyUrl) || "",
49
+ "data-api-url": (options == null ? void 0 : options.apiUrl) || "",
50
+ "data-proxy-url": (options == null ? void 0 : options.proxyUrl) || "",
58
51
  ...(options == null ? void 0 : options.nonce) ? { nonce: options.nonce } : {}
59
52
  };
60
53
  };
54
+ var constructTernUIScriptAttributes = (options) => {
55
+ const obj = {};
56
+ if (options.authDomain) {
57
+ obj["data-auth-domain"] = options.authDomain;
58
+ }
59
+ if (options.apiKey) {
60
+ obj["data-apikey"] = options.apiKey;
61
+ }
62
+ if (options.apiUrl) {
63
+ obj["data-api-url"] = options.apiUrl;
64
+ }
65
+ if (options.proxyUrl) {
66
+ obj["data-proxy-url"] = options.proxyUrl;
67
+ }
68
+ if (options.nonce) {
69
+ obj.nonce = options.nonce;
70
+ }
71
+ return obj;
72
+ };
73
+ var applyLoadWithOptions = (options) => (script) => {
74
+ const attributes = constructTernUIScriptAttributes(options);
75
+ for (const attribute in attributes) {
76
+ script.setAttribute(attribute, attributes[attribute]);
77
+ }
78
+ };
61
79
  export {
80
+ applyLoadWithOptions,
62
81
  constructScriptAttributes,
82
+ constructTernUIScriptAttributes,
63
83
  loadTernUIScript,
64
84
  ternUIgetScriptUrl
65
85
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadTernUIScript.ts"],"sourcesContent":["import type { TernSecureInstanceTreeOptions, TernSecureSDK } from '@tern-secure/types';\n\nimport { loadScript } from './loadScript';\nimport { resolveVersion } from './resolveVersion';\n\nexport type LoadTernUISCriptOptions = TernSecureInstanceTreeOptions & {\n apiKey?: string;\n customDomain?: string;\n proxyUrl?: string;\n ternUIVersion?: string;\n sdkMetadata?: TernSecureSDK;\n scriptHost?: string;\n localPort?: string;\n nonce?: string;\n};\n\nexport const loadTernUIScript = async (options?: LoadTernUISCriptOptions) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-ternui-script]');\n console.log('[TernSecure-shared] Existing script:', existingScript);\n\n if (existingScript) {\n return new Promise((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n resolve(existingScript);\n });\n\n existingScript.addEventListener('error', error => {\n reject(error);\n });\n });\n }\n\n if (!options?.customDomain) {\n throw new Error(\n 'TernUI script requires a custom domain or proxy URL to be specified in options.',\n );\n }\n\n return loadScript(ternUIgetScriptUrl(options), {\n async: true,\n //crossOrigin: undefined,\n beforeLoad: beforeLoadWithOptions(options),\n }).catch(error => {\n console.error('[TernSecure] Failed to load TernUI script:', error);\n throw new Error('Failed to load TernUI script');\n });\n};\n\nexport const ternUIgetScriptUrl = (options: LoadTernUISCriptOptions) => {\n const { ternUIVersion, isTernSecureDev } = options;\n const version = resolveVersion(ternUIVersion);\n\n if (isTernSecureDev) {\n const localHost = process.env.TERN_UI_HOST || 'localhost';\n const localPort = options?.localPort || process.env.TERN_UI_PORT || '4000';\n return `http://${localHost}:${localPort}/ternsecure.browser.js`;\n //return `http://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n }\n //return `https://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;\n\n //const ternsecureCDN = options?.customDomain ||\n //(options?.proxyUrl && new URL(options.proxyUrl).host) || 'cdn.tern-secure.com';\n //return `${ternsecureCDN}/ternsecure.browser.js`;\n //return `https://${ternsecureCDN}/npm/@ternsecure/tern-ui@${version}/dist/ternsecure.browser.js`;\n};\n\nconst beforeLoadWithOptions =\n (options?: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructScriptAttributes(options);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value) script.setAttribute(key, String(value));\n });\n console.log('[TernSecure-shared] Script attributes set:', attributes);\n };\n\nexport const constructScriptAttributes = (options?: LoadTernUISCriptOptions) => {\n return {\n 'data-domain': options?.customDomain || '',\n 'data-apikey': options?.apiKey || '',\n 'data-proxyUrl': options?.proxyUrl || '',\n ...(options?.nonce ? { nonce: options.nonce } : {}),\n };\n};\n"],"mappings":";;;;;;;;AAgBO,IAAM,mBAAmB,OAAO,YAAsC;AAC3E,QAAM,iBAAiB,SAAS,cAAiC,4BAA4B;AAC7F,UAAQ,IAAI,wCAAwC,cAAc;AAElE,MAAI,gBAAgB;AAClB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,qBAAe,iBAAiB,QAAQ,MAAM;AAC5C,gBAAQ,cAAc;AAAA,MACxB,CAAC;AAED,qBAAe,iBAAiB,SAAS,WAAS;AAChD,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,EAAC,mCAAS,eAAc;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,mBAAmB,OAAO,GAAG;AAAA,IAC7C,OAAO;AAAA;AAAA,IAEP,YAAY,sBAAsB,OAAO;AAAA,EAC3C,CAAC,EAAE,MAAM,WAAS;AAChB,YAAQ,MAAM,8CAA8C,KAAK;AACjE,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD,CAAC;AACH;AAEO,IAAM,qBAAqB,CAAC,YAAqC;AACtE,QAAM,EAAE,eAAe,gBAAgB,IAAI;AAC3C,QAAM,UAAU,eAAe,aAAa;AAE5C,MAAI,iBAAiB;AACnB,UAAM,YAAY,QAAQ,IAAI,gBAAgB;AAC9C,UAAM,aAAY,mCAAS,cAAa,QAAQ,IAAI,gBAAgB;AACpE,WAAO,UAAU,SAAS,IAAI,SAAS;AAAA,EAEzC;AAEA,SAAO,gDAAgD,OAAO;AAMhE;AAEA,IAAM,wBACJ,CAAC,YAAsC,CAAC,WAA8B;AACpE,QAAM,aAAa,0BAA0B,OAAO;AACpD,SAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,QAAI,MAAO,QAAO,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,EACnD,CAAC;AACD,UAAQ,IAAI,8CAA8C,UAAU;AACtE;AAEK,IAAM,4BAA4B,CAAC,YAAsC;AAC9E,SAAO;AAAA,IACL,gBAAe,mCAAS,iBAAgB;AAAA,IACxC,gBAAe,mCAAS,WAAU;AAAA,IAClC,kBAAiB,mCAAS,aAAY;AAAA,IACtC,IAAI,mCAAS,SAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/loadTernUIScript.ts"],"sourcesContent":["import type { TernSecureAuthOptions, TernSecureSDK } from '@tern-secure/types';\n\nimport { loadScript } from './loadScript';\nimport { resolveVersion } from './resolveVersion';\n\nconst FAILED_TO_LOAD_ERROR = 'TernUI: Failed to load TernSecure';\n\nexport type LoadTernUISCriptOptions = TernSecureAuthOptions & {\n apiKey?: string;\n apiUrl?: string;\n authDomain?: string;\n proxyUrl?: string;\n ternUIUrl?: string;\n ternUIVersion?: string;\n sdkMetadata?: TernSecureSDK;\n scriptHost?: string;\n localPort?: string;\n nonce?: string;\n};\n\nexport const loadTernUIScript = async (options?: LoadTernUISCriptOptions) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-ternui-script]');\n\n if (existingScript) {\n return new Promise((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n resolve(existingScript);\n });\n\n existingScript.addEventListener('error', error => {\n reject(FAILED_TO_LOAD_ERROR);\n });\n });\n }\n\n if (!options?.authDomain) {\n throw new Error(\n 'TernUI script requires a custom domain or proxy URL to be specified in options.',\n );\n }\n\n return loadScript(ternUIgetScriptUrl(options), {\n async: true,\n //crossOrigin: undefined,\n beforeLoad: applyLoadWithOptions(options),\n }).catch(() => {\n throw new Error('Failed to load TernUI script');\n });\n};\n\nexport const ternUIgetScriptUrl = (options: LoadTernUISCriptOptions) => {\n const { ternUIUrl, ternUIVersion } = options;\n const version = resolveVersion(ternUIVersion);\n\n if (ternUIUrl) {\n return ternUIUrl;\n }\n\n //return `https://cdn.lifesprintcare.ca/dist/ternsecure.browser.js`\n //return `https://cdn.jsdelivr.net/npm/@tern-secure/ui@${version}/dist/ternsecure.browser.js`;\n\n const ternsecureCDN = options?.authDomain ||\n (options?.proxyUrl && new URL(options.proxyUrl).host);\n return `${ternsecureCDN}/${version}/ternsecure.browser.js`;\n //return `https://${ternsecureCDN}/npm/@ternsecure/tern-ui@${version}/dist/ternsecure.browser.js`;\n};\n\n/**\n * @deprecated Use applyLoadWithOptions instead\n */\nconst beforeLoadWithOptions =\n (options?: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructScriptAttributes(options);\n Object.entries(attributes).forEach(([key, value]) => {\n if (value) script.setAttribute(key, String(value));\n });\n console.log('[TernSecure-shared] Script attributes set:', attributes);\n };\n\n/**\n * @deprecated Use constructTernUIScriptAttributes instead\n */\nexport const constructScriptAttributes = (options?: LoadTernUISCriptOptions) => {\n return {\n 'data-auth-domain': options?.authDomain || '',\n 'data-apikey': options?.apiKey || '',\n 'data-api-url': options?.apiUrl || '',\n 'data-proxy-url': options?.proxyUrl || '',\n ...(options?.nonce ? { nonce: options.nonce } : {}),\n };\n};\n\n\nconst constructTernUIScriptAttributes = (options: LoadTernUISCriptOptions) => {\n const obj: Record<string, string> = {};\n\n if (options.authDomain) {\n obj['data-auth-domain'] = options.authDomain;\n }\n if (options.apiKey) {\n obj['data-apikey'] = options.apiKey;\n }\n if (options.apiUrl) {\n obj['data-api-url'] = options.apiUrl;\n }\n if (options.proxyUrl) {\n obj['data-proxy-url'] = options.proxyUrl;\n }\n\n if (options.nonce) {\n obj.nonce = options.nonce;\n }\n\n return obj;\n}\n\nconst applyLoadWithOptions =\n (options: LoadTernUISCriptOptions) => (script: HTMLScriptElement) => {\n const attributes = constructTernUIScriptAttributes(options);\n for (const attribute in attributes) {\n script.setAttribute(attribute, attributes[attribute]);\n }\n };\n\n\nexport { constructTernUIScriptAttributes, applyLoadWithOptions };\n\n"],"mappings":";;;;;;;;;AAKA,IAAM,uBAAuB;AAetB,IAAM,mBAAmB,OAAO,YAAsC;AAC3E,QAAM,iBAAiB,SAAS,cAAiC,4BAA4B;AAE7F,MAAI,gBAAgB;AAClB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,qBAAe,iBAAiB,QAAQ,MAAM;AAC5C,gBAAQ,cAAc;AAAA,MACxB,CAAC;AAED,qBAAe,iBAAiB,SAAS,WAAS;AAChD,eAAO,oBAAoB;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,EAAC,mCAAS,aAAY;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,mBAAmB,OAAO,GAAG;AAAA,IAC7C,OAAO;AAAA;AAAA,IAEP,YAAY,qBAAqB,OAAO;AAAA,EAC1C,CAAC,EAAE,MAAM,MAAM;AACb,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD,CAAC;AACH;AAEO,IAAM,qBAAqB,CAAC,YAAqC;AACtE,QAAM,EAAE,WAAW,cAAc,IAAI;AACrC,QAAM,UAAU,eAAe,aAAa;AAE5C,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAKA,QAAM,iBAAgB,mCAAS,gBAC5B,mCAAS,aAAY,IAAI,IAAI,QAAQ,QAAQ,EAAE;AAClD,SAAO,GAAG,aAAa,IAAI,OAAO;AAEpC;AAiBO,IAAM,4BAA4B,CAAC,YAAsC;AAC9E,SAAO;AAAA,IACL,qBAAoB,mCAAS,eAAc;AAAA,IAC3C,gBAAe,mCAAS,WAAU;AAAA,IAClC,iBAAgB,mCAAS,WAAU;AAAA,IACnC,mBAAkB,mCAAS,aAAY;AAAA,IACvC,IAAI,mCAAS,SAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EACnD;AACF;AAGA,IAAM,kCAAkC,CAAC,YAAqC;AAC5E,QAAM,MAA8B,CAAC;AAErC,MAAI,QAAQ,YAAY;AACtB,QAAI,kBAAkB,IAAI,QAAQ;AAAA,EACpC;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,aAAa,IAAI,QAAQ;AAAA,EAC/B;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,cAAc,IAAI,QAAQ;AAAA,EAChC;AACA,MAAI,QAAQ,UAAU;AACpB,QAAI,gBAAgB,IAAI,QAAQ;AAAA,EAClC;AAEA,MAAI,QAAQ,OAAO;AACjB,QAAI,QAAQ,QAAQ;AAAA,EACtB;AAEA,SAAO;AACT;AAEA,IAAM,uBACJ,CAAC,YAAqC,CAAC,WAA8B;AACnE,QAAM,aAAa,gCAAgC,OAAO;AAC1D,aAAW,aAAa,YAAY;AAClC,WAAO,aAAa,WAAW,WAAW,SAAS,CAAC;AAAA,EACtD;AACF;","names":[]}
package/dist/ms.d.mts ADDED
@@ -0,0 +1,52 @@
1
+ type Years = 'years' | 'year' | 'yrs' | 'yr' | 'y';
2
+ type Months = 'months' | 'month' | 'mo';
3
+ type Weeks = 'weeks' | 'week' | 'w';
4
+ type Days = 'days' | 'day' | 'd';
5
+ type Hours = 'hours' | 'hour' | 'hrs' | 'hr' | 'h';
6
+ type Minutes = 'minutes' | 'minute' | 'mins' | 'min' | 'm';
7
+ type Seconds = 'seconds' | 'second' | 'secs' | 'sec' | 's';
8
+ type Milliseconds = 'milliseconds' | 'millisecond' | 'msecs' | 'msec' | 'ms';
9
+ type Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Milliseconds;
10
+ type UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Unit;
11
+ type StringValue = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;
12
+ interface Options {
13
+ /**
14
+ * Set to `true` to use verbose formatting. Defaults to `false`.
15
+ */
16
+ long?: boolean;
17
+ }
18
+ /**
19
+ * Parse or format the given value.
20
+ *
21
+ * @param value - The string or number to convert
22
+ * @param options - Options for the conversion
23
+ * @throws Error if `value` is not a non-empty string or a number
24
+ */
25
+ declare function ms(value: StringValue, options?: Options): number;
26
+ declare function ms(value: number, options?: Options): string;
27
+ /**
28
+ * Parse the given string and return milliseconds.
29
+ *
30
+ * @param str - A string to parse to milliseconds
31
+ * @returns The parsed value in milliseconds, or `NaN` if the string can't be
32
+ * parsed
33
+ */
34
+ declare function parse(str: string): number;
35
+ /**
36
+ * Parse the given StringValue and return milliseconds.
37
+ *
38
+ * @param value - A typesafe StringValue to parse to milliseconds
39
+ * @returns The parsed value in milliseconds, or `NaN` if the string can't be
40
+ * parsed
41
+ */
42
+ declare function parseStrict(value: StringValue): number;
43
+ /**
44
+ * Format the given integer as a string.
45
+ *
46
+ * @param ms - milliseconds
47
+ * @param options - Options for the conversion
48
+ * @returns The formatted string
49
+ */
50
+ declare function format(ms: number, options?: Options): string;
51
+
52
+ export { type StringValue, format, ms, parse, parseStrict };
package/dist/ms.d.ts ADDED
@@ -0,0 +1,52 @@
1
+ type Years = 'years' | 'year' | 'yrs' | 'yr' | 'y';
2
+ type Months = 'months' | 'month' | 'mo';
3
+ type Weeks = 'weeks' | 'week' | 'w';
4
+ type Days = 'days' | 'day' | 'd';
5
+ type Hours = 'hours' | 'hour' | 'hrs' | 'hr' | 'h';
6
+ type Minutes = 'minutes' | 'minute' | 'mins' | 'min' | 'm';
7
+ type Seconds = 'seconds' | 'second' | 'secs' | 'sec' | 's';
8
+ type Milliseconds = 'milliseconds' | 'millisecond' | 'msecs' | 'msec' | 'ms';
9
+ type Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Milliseconds;
10
+ type UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Unit;
11
+ type StringValue = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;
12
+ interface Options {
13
+ /**
14
+ * Set to `true` to use verbose formatting. Defaults to `false`.
15
+ */
16
+ long?: boolean;
17
+ }
18
+ /**
19
+ * Parse or format the given value.
20
+ *
21
+ * @param value - The string or number to convert
22
+ * @param options - Options for the conversion
23
+ * @throws Error if `value` is not a non-empty string or a number
24
+ */
25
+ declare function ms(value: StringValue, options?: Options): number;
26
+ declare function ms(value: number, options?: Options): string;
27
+ /**
28
+ * Parse the given string and return milliseconds.
29
+ *
30
+ * @param str - A string to parse to milliseconds
31
+ * @returns The parsed value in milliseconds, or `NaN` if the string can't be
32
+ * parsed
33
+ */
34
+ declare function parse(str: string): number;
35
+ /**
36
+ * Parse the given StringValue and return milliseconds.
37
+ *
38
+ * @param value - A typesafe StringValue to parse to milliseconds
39
+ * @returns The parsed value in milliseconds, or `NaN` if the string can't be
40
+ * parsed
41
+ */
42
+ declare function parseStrict(value: StringValue): number;
43
+ /**
44
+ * Format the given integer as a string.
45
+ *
46
+ * @param ms - milliseconds
47
+ * @param options - Options for the conversion
48
+ * @returns The formatted string
49
+ */
50
+ declare function format(ms: number, options?: Options): string;
51
+
52
+ export { type StringValue, format, ms, parse, parseStrict };