@tosspayments/tosspayments-sdk 2.7.0 → 2.7.1

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/dist/index.cjs.js CHANGED
@@ -2,18 +2,6 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var SCRIPT_URL = 'https://js.tosspayments.com/v2/standard';
6
-
7
- function clearTossPayments() {
8
- var _script$parentElement;
9
-
10
- var script = document.querySelector("script[src=\"".concat(SCRIPT_URL, "\"]"));
11
- script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.removeChild(script); // TODO: public interface에서 TossPayments의 global declaration 추가한 뒤 제거 예정입니다
12
- // @ts-ignore
13
-
14
- window.TossPayments = undefined;
15
- }
16
-
17
5
  function _classCallCheck(instance, Constructor) {
18
6
  if (!(instance instanceof Constructor)) {
19
7
  throw new TypeError("Cannot call a class as a function");
@@ -156,13 +144,23 @@ function _createSuper(Derived) {
156
144
  };
157
145
  }
158
146
 
159
- var cachedPromise = null;
147
+ // `${src}::${namespace}` 조합으로 캐싱하여 서로 다른 src/namespace 가 같은 캐시를 공유하지 않도록 합니다.
148
+ // (이전 구현은 module-level 단일 promise라 첫 호출만 기억되어, 두 번째 호출이 다른 src 를 전달해도
149
+ // 기존 promise 가 반환되던 문제가 있었습니다.)
150
+ var cache = new Map();
151
+
152
+ function cacheKey(src, namespace) {
153
+ return "".concat(src, "::").concat(namespace);
154
+ }
155
+
160
156
  function loadScript(src, namespace) {
161
157
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
158
+ var key = cacheKey(src, namespace); // Return the cached Promise if it exists for this src/namespace combination
159
+
160
+ var hit = cache.get(key);
162
161
 
163
- // Return the cached Promise if it exists
164
- if (cachedPromise != null) {
165
- return cachedPromise;
162
+ if (hit != null) {
163
+ return hit;
166
164
  }
167
165
 
168
166
  var promise = new Promise(function (resolve, reject) {
@@ -215,13 +213,32 @@ function loadScript(src, namespace) {
215
213
  reject(error);
216
214
  return;
217
215
  }
218
- }); // Reset the cache if the Promise is rejected
216
+ }); // Reset the cache entry if the Promise is rejected so the next call can retry
219
217
 
220
- cachedPromise = promise["catch"](function (error) {
221
- cachedPromise = null;
218
+ var cached = promise["catch"](function (error) {
219
+ cache["delete"](key);
222
220
  return Promise.reject(error);
223
221
  });
224
- return cachedPromise;
222
+ cache.set(key, cached);
223
+ return cached;
224
+ }
225
+ /**
226
+ * 캐싱된 loadScript Promise 를 비웁니다.
227
+ *
228
+ * - 인자 없이 호출하면 전체 캐시를 비웁니다.
229
+ * - src 와 namespace 를 모두 전달하면 해당 조합의 캐시만 제거합니다.
230
+ *
231
+ * 외부 SDK 의 reset/cleanup 로직에서 namespace 와 script 를 함께 정리할 때 호출하여
232
+ * 다음 loadScript 호출이 stale promise 를 반환하지 않도록 합니다.
233
+ */
234
+
235
+ function clearCache(src, namespace) {
236
+ if (src != null && namespace != null) {
237
+ cache["delete"](cacheKey(src, namespace));
238
+ return;
239
+ }
240
+
241
+ cache.clear();
225
242
  }
226
243
 
227
244
  function getNamespace(name) {
@@ -264,6 +281,13 @@ var ScriptLoadFailedError = /*#__PURE__*/function (_Error2) {
264
281
  return ScriptLoadFailedError;
265
282
  }( /*#__PURE__*/_wrapNativeSuper(Error));
266
283
 
284
+ var SCRIPT_URL = 'https://js.tosspayments.com/v2/standard';
285
+
286
+ var NAMESPACE = 'TossPayments'; // loadTossPayments 가 시도한 (src, namespace) 를 모듈 내부에 추적하여, clearTossPayments 가
287
+ // 호출 시점에 정확히 동일한 스크립트와 sdk-loader 의 cache entry 를 정리할 수 있도록 합니다.
288
+ // key 는 src 만 사용 (namespace 는 현재 고정), 같은 src 의 중복 load 는 자연스럽게 dedupe 됩니다.
289
+
290
+ var loadedRequests = new Map();
267
291
  function loadTossPayments(clientKey) {
268
292
  var loadOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
269
293
  var _loadOptions$src = loadOptions.src,
@@ -272,14 +296,44 @@ function loadTossPayments(clientKey) {
272
296
  if (typeof window === 'undefined') {
273
297
  // XXX(@HyunSeob): SSR할 때 생성자가 사용되는 경우 에러를 발생시키지 않는대신 정상적인 인스턴스를 반환하지 않는다.
274
298
  return Promise.resolve({});
275
- } // regenerator-runtime 의존성을 없애기 위해 `async` 키워드를 사용하지 않는다
299
+ }
276
300
 
301
+ loadedRequests.set(src, {
302
+ src: src,
303
+ namespace: NAMESPACE
304
+ }); // regenerator-runtime 의존성을 없애기 위해 `async` 키워드를 사용하지 않는다
277
305
 
278
- return loadScript(src, 'TossPayments').then(function (TossPayments) {
306
+ return loadScript(src, NAMESPACE).then(function (TossPayments) {
279
307
  return TossPayments(clientKey);
280
308
  });
281
309
  }
282
310
 
311
+ function clearTossPayments() {
312
+ var _defaultScript$parent;
313
+
314
+ if (typeof document === 'undefined' || typeof window === 'undefined') {
315
+ return;
316
+ }
317
+
318
+ loadedRequests.forEach(function (_ref) {
319
+ var _script$parentElement;
320
+
321
+ var src = _ref.src,
322
+ namespace = _ref.namespace;
323
+ var script = document.querySelector("script[src=\"".concat(src, "\"]"));
324
+ script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.removeChild(script);
325
+ clearCache(src, namespace);
326
+ });
327
+ loadedRequests.clear(); // fallback: loadTossPayments 를 거치지 않고 HTML inline / SSR / 다른 코드 경로로 직접 inject 된
328
+ // default SCRIPT_URL 스크립트도 함께 정리합니다. (기존 동작 호환)
329
+
330
+ var defaultScript = document.querySelector("script[src=\"".concat(SCRIPT_URL, "\"]"));
331
+ defaultScript === null || defaultScript === void 0 ? void 0 : (_defaultScript$parent = defaultScript.parentElement) === null || _defaultScript$parent === void 0 ? void 0 : _defaultScript$parent.removeChild(defaultScript); // TODO: public interface에서 TossPayments의 global declaration 추가한 뒤 제거 예정입니다
332
+ // @ts-ignore
333
+
334
+ delete window.TossPayments;
335
+ }
336
+
283
337
  var ANONYMOUS = '@@ANONYMOUS';
284
338
 
285
339
  exports.ANONYMOUS = ANONYMOUS;
package/dist/index.esm.js CHANGED
@@ -1,15 +1,3 @@
1
- var SCRIPT_URL = 'https://js.tosspayments.com/v2/standard';
2
-
3
- function clearTossPayments() {
4
- var _script$parentElement;
5
-
6
- var script = document.querySelector("script[src=\"".concat(SCRIPT_URL, "\"]"));
7
- script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.removeChild(script); // TODO: public interface에서 TossPayments의 global declaration 추가한 뒤 제거 예정입니다
8
- // @ts-ignore
9
-
10
- window.TossPayments = undefined;
11
- }
12
-
13
1
  function _classCallCheck(instance, Constructor) {
14
2
  if (!(instance instanceof Constructor)) {
15
3
  throw new TypeError("Cannot call a class as a function");
@@ -152,13 +140,23 @@ function _createSuper(Derived) {
152
140
  };
153
141
  }
154
142
 
155
- var cachedPromise = null;
143
+ // `${src}::${namespace}` 조합으로 캐싱하여 서로 다른 src/namespace 가 같은 캐시를 공유하지 않도록 합니다.
144
+ // (이전 구현은 module-level 단일 promise라 첫 호출만 기억되어, 두 번째 호출이 다른 src 를 전달해도
145
+ // 기존 promise 가 반환되던 문제가 있었습니다.)
146
+ var cache = new Map();
147
+
148
+ function cacheKey(src, namespace) {
149
+ return "".concat(src, "::").concat(namespace);
150
+ }
151
+
156
152
  function loadScript(src, namespace) {
157
153
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
154
+ var key = cacheKey(src, namespace); // Return the cached Promise if it exists for this src/namespace combination
155
+
156
+ var hit = cache.get(key);
158
157
 
159
- // Return the cached Promise if it exists
160
- if (cachedPromise != null) {
161
- return cachedPromise;
158
+ if (hit != null) {
159
+ return hit;
162
160
  }
163
161
 
164
162
  var promise = new Promise(function (resolve, reject) {
@@ -211,13 +209,32 @@ function loadScript(src, namespace) {
211
209
  reject(error);
212
210
  return;
213
211
  }
214
- }); // Reset the cache if the Promise is rejected
212
+ }); // Reset the cache entry if the Promise is rejected so the next call can retry
215
213
 
216
- cachedPromise = promise["catch"](function (error) {
217
- cachedPromise = null;
214
+ var cached = promise["catch"](function (error) {
215
+ cache["delete"](key);
218
216
  return Promise.reject(error);
219
217
  });
220
- return cachedPromise;
218
+ cache.set(key, cached);
219
+ return cached;
220
+ }
221
+ /**
222
+ * 캐싱된 loadScript Promise 를 비웁니다.
223
+ *
224
+ * - 인자 없이 호출하면 전체 캐시를 비웁니다.
225
+ * - src 와 namespace 를 모두 전달하면 해당 조합의 캐시만 제거합니다.
226
+ *
227
+ * 외부 SDK 의 reset/cleanup 로직에서 namespace 와 script 를 함께 정리할 때 호출하여
228
+ * 다음 loadScript 호출이 stale promise 를 반환하지 않도록 합니다.
229
+ */
230
+
231
+ function clearCache(src, namespace) {
232
+ if (src != null && namespace != null) {
233
+ cache["delete"](cacheKey(src, namespace));
234
+ return;
235
+ }
236
+
237
+ cache.clear();
221
238
  }
222
239
 
223
240
  function getNamespace(name) {
@@ -260,6 +277,13 @@ var ScriptLoadFailedError = /*#__PURE__*/function (_Error2) {
260
277
  return ScriptLoadFailedError;
261
278
  }( /*#__PURE__*/_wrapNativeSuper(Error));
262
279
 
280
+ var SCRIPT_URL = 'https://js.tosspayments.com/v2/standard';
281
+
282
+ var NAMESPACE = 'TossPayments'; // loadTossPayments 가 시도한 (src, namespace) 를 모듈 내부에 추적하여, clearTossPayments 가
283
+ // 호출 시점에 정확히 동일한 스크립트와 sdk-loader 의 cache entry 를 정리할 수 있도록 합니다.
284
+ // key 는 src 만 사용 (namespace 는 현재 고정), 같은 src 의 중복 load 는 자연스럽게 dedupe 됩니다.
285
+
286
+ var loadedRequests = new Map();
263
287
  function loadTossPayments(clientKey) {
264
288
  var loadOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
265
289
  var _loadOptions$src = loadOptions.src,
@@ -268,14 +292,44 @@ function loadTossPayments(clientKey) {
268
292
  if (typeof window === 'undefined') {
269
293
  // XXX(@HyunSeob): SSR할 때 생성자가 사용되는 경우 에러를 발생시키지 않는대신 정상적인 인스턴스를 반환하지 않는다.
270
294
  return Promise.resolve({});
271
- } // regenerator-runtime 의존성을 없애기 위해 `async` 키워드를 사용하지 않는다
295
+ }
272
296
 
297
+ loadedRequests.set(src, {
298
+ src: src,
299
+ namespace: NAMESPACE
300
+ }); // regenerator-runtime 의존성을 없애기 위해 `async` 키워드를 사용하지 않는다
273
301
 
274
- return loadScript(src, 'TossPayments').then(function (TossPayments) {
302
+ return loadScript(src, NAMESPACE).then(function (TossPayments) {
275
303
  return TossPayments(clientKey);
276
304
  });
277
305
  }
278
306
 
307
+ function clearTossPayments() {
308
+ var _defaultScript$parent;
309
+
310
+ if (typeof document === 'undefined' || typeof window === 'undefined') {
311
+ return;
312
+ }
313
+
314
+ loadedRequests.forEach(function (_ref) {
315
+ var _script$parentElement;
316
+
317
+ var src = _ref.src,
318
+ namespace = _ref.namespace;
319
+ var script = document.querySelector("script[src=\"".concat(src, "\"]"));
320
+ script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.removeChild(script);
321
+ clearCache(src, namespace);
322
+ });
323
+ loadedRequests.clear(); // fallback: loadTossPayments 를 거치지 않고 HTML inline / SSR / 다른 코드 경로로 직접 inject 된
324
+ // default SCRIPT_URL 스크립트도 함께 정리합니다. (기존 동작 호환)
325
+
326
+ var defaultScript = document.querySelector("script[src=\"".concat(SCRIPT_URL, "\"]"));
327
+ defaultScript === null || defaultScript === void 0 ? void 0 : (_defaultScript$parent = defaultScript.parentElement) === null || _defaultScript$parent === void 0 ? void 0 : _defaultScript$parent.removeChild(defaultScript); // TODO: public interface에서 TossPayments의 global declaration 추가한 뒤 제거 예정입니다
328
+ // @ts-ignore
329
+
330
+ delete window.TossPayments;
331
+ }
332
+
279
333
  var ANONYMOUS = '@@ANONYMOUS';
280
334
 
281
335
  export { ANONYMOUS, clearTossPayments, loadTossPayments };
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "@tosspayments/tosspayments-sdk",
3
3
  "description": "TossPayments.js Tosspayments SDK.",
4
- "version": "2.7.0",
4
+ "version": "2.7.1",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "types": "types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./types/index.d.ts",
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.cjs.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
8
16
  "author": "Toss Payments",
9
17
  "repository": {
10
18
  "type": "git",
@@ -25,7 +33,7 @@
25
33
  "@rollup/plugin-babel": "^5.3.0",
26
34
  "@rollup/plugin-commonjs": "^21.0.1",
27
35
  "@rollup/plugin-typescript": "^8.3.0",
28
- "@tosspayments/sdk-loader": "workspace:packages/sdk-loader",
36
+ "@tosspayments/sdk-loader": "workspace:^",
29
37
  "@tosspayments/standard-public-interfaces": "2.9.0",
30
38
  "happy-dom": "^14.12.3",
31
39
  "prettier": "^2.0.2",