@paynext/sdk 1.0.2 → 1.0.4

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.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { ApplePayOptions } from '@evervault/react';
2
- import { GooglePayOptions } from '@evervault/react';
3
1
  import { PayPalButtonStyle } from '@paypal/paypal-js';
4
2
 
5
3
  export declare interface AttemptResult {
@@ -145,11 +143,11 @@ export declare type HTMLStyles = {
145
143
  };
146
144
 
147
145
  export declare interface IApplePayButtonStyles {
148
- styles?: Partial<Pick<ApplePayOptions, 'type' | 'style' | 'padding' | 'borderRadius' | 'size'>>;
146
+ styles?: Partial<Pick<any, 'type' | 'style' | 'padding' | 'borderRadius' | 'size'>>;
149
147
  }
150
148
 
151
149
  export declare interface IGooglePayButtonStyles {
152
- styles?: Partial<Pick<GooglePayOptions, 'type' | 'color' | 'borderRadius' | 'size'>>;
150
+ styles?: Partial<Pick<any, 'type' | 'color' | 'borderRadius' | 'size'>>;
153
151
  }
154
152
 
155
153
  export declare interface InputStyles {
@@ -357,9 +355,13 @@ declare enum PaymentStatus {
357
355
  export declare class PayNextCheckout {
358
356
  private cdnInstance;
359
357
  private initPromise;
358
+ private isDestroyed;
359
+ private errorBoundary;
360
360
  constructor();
361
+ setErrorHandler(handler: (error: Error) => void): void;
362
+ private handleError;
361
363
  private initialize;
362
- private waitForReady;
364
+ private assertReady;
363
365
  mount(containerId: string, config: PayNextConfig): Promise<void>;
364
366
  unmount(): Promise<void>;
365
367
  static preload(envType: 'develop' | 'staging' | 'sandbox' | 'production'): Promise<void>;
package/dist/index.es.js CHANGED
@@ -1,78 +1,195 @@
1
- var l = Object.defineProperty;
2
- var u = (n, e, t) => e in n ? l(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t;
3
- var d = (n, e, t) => u(n, typeof e != "symbol" ? e + "" : e, t);
4
- const P = "https://cdn-sdk-dev.paynext.com/index.cdn.js", w = "https://cdn-sdk.paynext.com/index.cdn.js";
5
- let r = null, a = null;
6
- async function c(n) {
7
- if (a)
8
- return a;
9
- if (r)
10
- return r;
11
- const e = n?.toLowerCase()?.includes("develop") || n?.toLowerCase()?.includes("staging") ? "develop" : "production";
12
- return r = new Promise((t, s) => {
13
- if (typeof window > "u") {
14
- s(new Error("PayNext SDK can only be loaded in browser environment"));
15
- return;
16
- }
17
- if (window.PayNextSDK) {
18
- console.log("[PayNext CDN] SDK already loaded from cache"), a = window.PayNextSDK, t(a);
19
- return;
20
- }
21
- const o = document.createElement("script");
22
- o.src = e === "develop" ? P : w, o.crossOrigin = "*", o.async = !0, o.onload = () => {
23
- const i = window.PayNextSDK;
24
- if (!i) {
25
- console.error("[PayNext CDN] PayNextSDK not found in window after load"), r = null, document.head.removeChild(o), s(new Error("PayNextSDK not found in global scope after loading"));
1
+ var E = Object.defineProperty;
2
+ var x = (n, e, t) => e in n ? E(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t;
3
+ var a = (n, e, t) => x(n, typeof e != "symbol" ? e + "" : e, t);
4
+ const p = "https://cdn-sdk-dev.paynext.com/index.cdn.js", C = "https://cdn-sdk.paynext.com/index.cdn.js";
5
+ let c = null, l = null;
6
+ class r extends Error {
7
+ constructor(e, t = !0) {
8
+ super(e), this.retryable = t, this.name = "SDKLoadError";
9
+ }
10
+ }
11
+ const P = "PayNextSDK";
12
+ function w() {
13
+ return typeof window > "u" ? null : window[P];
14
+ }
15
+ function K(n) {
16
+ typeof window > "u" || (window[P] = n);
17
+ }
18
+ function g(n) {
19
+ return new Promise((e) => setTimeout(e, n));
20
+ }
21
+ async function S(n, e = 1) {
22
+ const o = (n?.toLowerCase()?.includes("develop") || n?.toLowerCase()?.includes("staging") ? "develop" : "production") === "develop" ? p : C;
23
+ try {
24
+ console.log(`[PayNext CDN] Loading SDK (attempt ${e}/3)...`);
25
+ const s = w();
26
+ if (s)
27
+ return console.log("[PayNext CDN] SDK already loaded"), s;
28
+ await new Promise((y, h) => {
29
+ if (document.querySelector(`script[src="${o}"]`)) {
30
+ console.log("[PayNext CDN] Script exists, waiting for SDK..."), y();
26
31
  return;
27
32
  }
28
- a = i, t(i);
29
- }, o.onerror = (i) => {
30
- console.error("[PayNext CDN] Failed to load script:", i), r = null, document.head.removeChild(o), s(new Error("Failed to load PayNext SDK script from CDN"));
31
- }, document.head.appendChild(o);
32
- }), r;
33
+ const m = setTimeout(() => {
34
+ d(), h(new r("SDK script loading timeout", !0));
35
+ }, 1e4), i = document.createElement("script");
36
+ i.src = o, i.crossOrigin = "anonymous", i.async = !0, i.setAttribute("data-paynext-sdk", "true");
37
+ const d = () => {
38
+ clearTimeout(m), i.onload = null, i.onerror = null;
39
+ };
40
+ i.onload = () => {
41
+ console.log("[PayNext CDN] Script loaded successfully"), d(), y();
42
+ }, i.onerror = (f) => {
43
+ console.error("[PayNext CDN] Script load error:", f), d();
44
+ try {
45
+ i.parentNode && i.parentNode.removeChild(i);
46
+ } catch (N) {
47
+ console.warn("[PayNext CDN] Failed to remove script:", N);
48
+ }
49
+ h(new r("Failed to load SDK script from CDN", !0));
50
+ };
51
+ try {
52
+ document.head.appendChild(i);
53
+ } catch {
54
+ d(), h(new r("Failed to append script to document", !1));
55
+ }
56
+ });
57
+ const u = w();
58
+ if (!u)
59
+ throw new r("PayNextSDK not found in window after load", !0);
60
+ return console.log("[PayNext CDN] SDK loaded successfully"), u;
61
+ } catch (s) {
62
+ if ((s instanceof r ? s.retryable : !0) && e < 3)
63
+ return console.warn(`[PayNext CDN] Load attempt ${e} failed, retrying in 1000ms...`, s), await g(1e3 * e), S(n, e + 1);
64
+ throw console.error(`[PayNext CDN] Failed to load SDK after ${e} attempts:`, s), s;
65
+ }
66
+ }
67
+ async function D(n) {
68
+ if (l)
69
+ return console.log("[PayNext CDN] Returning cached SDK module"), l;
70
+ if (c)
71
+ return console.log("[PayNext CDN] Load already in progress, waiting..."), c;
72
+ if (typeof window > "u")
73
+ throw new r("PayNext SDK can only be loaded in browser environment", !1);
74
+ const e = w();
75
+ return e ? (console.log("[PayNext CDN] SDK already loaded in isolated namespace"), l = e, l) : (c = (async () => {
76
+ try {
77
+ const t = await S(n);
78
+ return l = t, K(t), t;
79
+ } catch (t) {
80
+ throw c = null, t;
81
+ }
82
+ })(), c);
33
83
  }
34
- class N {
84
+ class A {
35
85
  constructor() {
36
- d(this, "cdnInstance", null);
37
- d(this, "initPromise", null);
86
+ a(this, "cdnInstance", null);
87
+ a(this, "initPromise", null);
88
+ a(this, "isDestroyed", !1);
89
+ a(this, "errorBoundary", null);
90
+ }
91
+ // set error handler
92
+ setErrorHandler(e) {
93
+ this.errorBoundary = e;
94
+ }
95
+ // handle error
96
+ handleError(e, t) {
97
+ const o = `[PayNext SDK Error - ${t}]: ${e.message}`;
98
+ if (console.error(o, e), this.errorBoundary)
99
+ try {
100
+ this.errorBoundary(e);
101
+ } catch (s) {
102
+ console.error("[PayNext SDK] Error in custom error handler:", s);
103
+ }
38
104
  }
39
105
  // initialize
40
106
  async initialize(e) {
41
- try {
42
- if (this.initPromise = await c(e), !this.initPromise.PayNextCheckout)
43
- throw new Error("PayNextCheckout not found in CDN module");
44
- this.cdnInstance = new this.initPromise.PayNextCheckout();
45
- } catch (t) {
46
- throw console.error("[PayNext CDN] Failed to initialize:", t), t;
47
- }
107
+ if (this.isDestroyed)
108
+ throw new r("Cannot initialize destroyed SDK instance", !1);
109
+ return this.initPromise ? this.initPromise : (this.initPromise = (async () => {
110
+ try {
111
+ const t = await D(e);
112
+ if (!t || !t.PayNextCheckout)
113
+ throw new r("PayNextCheckout not found in loaded SDK module", !1);
114
+ try {
115
+ this.cdnInstance = new t.PayNextCheckout();
116
+ } catch (o) {
117
+ throw new r(
118
+ `Failed to instantiate PayNextCheckout: ${o instanceof Error ? o.message : "Unknown error"}`,
119
+ !1
120
+ );
121
+ }
122
+ console.log("[PayNext SDK] Initialized successfully");
123
+ } catch (t) {
124
+ throw this.initPromise = null, t;
125
+ }
126
+ })(), this.initPromise);
48
127
  }
49
- // wait for ready
50
- waitForReady() {
128
+ // assert ready
129
+ assertReady() {
130
+ if (this.isDestroyed)
131
+ throw new r("SDK instance has been destroyed", !1);
51
132
  if (!this.initPromise)
52
- throw new Error("SDK initialization not started");
133
+ throw new r("SDK initialization not started", !1);
53
134
  if (!this.cdnInstance)
54
- throw new Error("SDK instance not created");
135
+ throw new r("SDK instance not created", !1);
55
136
  }
56
137
  // mount
57
138
  async mount(e, t) {
58
- return await this.initialize(t.environment), this.waitForReady(), this.cdnInstance?.mount(e, t);
139
+ try {
140
+ if (!e || typeof e != "string")
141
+ throw new r("Invalid containerId provided", !1);
142
+ if (!t || !t.environment)
143
+ throw new r("Invalid config provided", !1);
144
+ if (!document.getElementById(e))
145
+ throw new r(`Container element with id "${e}" not found`, !1);
146
+ await this.initialize(t.environment), this.assertReady(), await this.cdnInstance.mount(e, t);
147
+ } catch (o) {
148
+ const s = o instanceof r ? o : new r(
149
+ o instanceof Error ? o.message : "Unknown mount error",
150
+ !0
151
+ );
152
+ throw this.handleError(s, "mount"), s;
153
+ }
59
154
  }
60
155
  // unmount
61
156
  async unmount() {
62
- if (this.waitForReady(), this.cdnInstance?.unmount)
63
- return this.cdnInstance.unmount();
157
+ try {
158
+ if (this.isDestroyed) {
159
+ console.warn("[PayNext SDK] Instance already destroyed");
160
+ return;
161
+ }
162
+ if (!this.cdnInstance) {
163
+ console.warn("[PayNext SDK] No instance to unmount");
164
+ return;
165
+ }
166
+ try {
167
+ typeof this.cdnInstance.unmount == "function" && await this.cdnInstance.unmount();
168
+ } catch (e) {
169
+ const t = e instanceof Error ? e : new Error(String(e));
170
+ this.handleError(t, "unmount");
171
+ }
172
+ this.cdnInstance = null, this.initPromise = null;
173
+ } catch (e) {
174
+ const t = e instanceof Error ? e : new Error(String(e));
175
+ this.handleError(t, "unmount");
176
+ }
64
177
  }
65
- // preload (optional optimization)
178
+ // preload SDK
66
179
  static async preload(e) {
67
- await c(e);
180
+ try {
181
+ await D(e), console.log("[PayNext SDK] Preload successful");
182
+ } catch (t) {
183
+ throw console.error("[PayNext SDK] Preload failed:", t), t;
184
+ }
68
185
  }
69
186
  }
70
- const D = {
71
- preload: N.preload
187
+ const L = {
188
+ preload: A.preload
72
189
  };
73
- var h = /* @__PURE__ */ ((n) => (n.PAYPAL = "PAYPAL", n.APPLE_PAY = "APPLEPAY", n.GOOGLE_PAY = "GPAY", n.CARD = "CARD", n.VENMO = "VENMO", n.CASHAPP = "CASHAPP", n))(h || {});
190
+ var R = /* @__PURE__ */ ((n) => (n.PAYPAL = "PAYPAL", n.APPLE_PAY = "APPLEPAY", n.GOOGLE_PAY = "GPAY", n.CARD = "CARD", n.VENMO = "VENMO", n.CASHAPP = "CASHAPP", n))(R || {});
74
191
  export {
75
- N as PayNextCheckout,
76
- D as PayNextSDK,
77
- h as PaymentMethod
192
+ A as PayNextCheckout,
193
+ L as PayNextSDK,
194
+ R as PaymentMethod
78
195
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(e,n){typeof exports=="object"&&typeof module<"u"?n(exports):typeof define=="function"&&define.amd?define(["exports"],n):(e=typeof globalThis<"u"?globalThis:e||self,n(e["PayNext SDK"]={}))})(this,(function(e){"use strict";var h=Object.defineProperty;var N=(e,n,a)=>n in e?h(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a;var u=(e,n,a)=>N(e,typeof n!="symbol"?n+"":n,a);const n="https://cdn-sdk-dev.paynext.com/index.cdn.js",a="https://cdn-sdk.paynext.com/index.cdn.js";let d=null,s=null;async function P(t){if(s)return s;if(d)return d;const r=t?.toLowerCase()?.includes("develop")||t?.toLowerCase()?.includes("staging")?"develop":"production";return d=new Promise((o,l)=>{if(typeof window>"u"){l(new Error("PayNext SDK can only be loaded in browser environment"));return}if(window.PayNextSDK){console.log("[PayNext CDN] SDK already loaded from cache"),s=window.PayNextSDK,o(s);return}const i=document.createElement("script");i.src=r==="develop"?n:a,i.crossOrigin="*",i.async=!0,i.onload=()=>{const c=window.PayNextSDK;if(!c){console.error("[PayNext CDN] PayNextSDK not found in window after load"),d=null,document.head.removeChild(i),l(new Error("PayNextSDK not found in global scope after loading"));return}s=c,o(c)},i.onerror=c=>{console.error("[PayNext CDN] Failed to load script:",c),d=null,document.head.removeChild(i),l(new Error("Failed to load PayNext SDK script from CDN"))},document.head.appendChild(i)}),d}class y{constructor(){u(this,"cdnInstance",null);u(this,"initPromise",null)}async initialize(r){try{if(this.initPromise=await P(r),!this.initPromise.PayNextCheckout)throw new Error("PayNextCheckout not found in CDN module");this.cdnInstance=new this.initPromise.PayNextCheckout}catch(o){throw console.error("[PayNext CDN] Failed to initialize:",o),o}}waitForReady(){if(!this.initPromise)throw new Error("SDK initialization not started");if(!this.cdnInstance)throw new Error("SDK instance not created")}async mount(r,o){return await this.initialize(o.environment),this.waitForReady(),this.cdnInstance?.mount(r,o)}async unmount(){if(this.waitForReady(),this.cdnInstance?.unmount)return this.cdnInstance.unmount()}static async preload(r){await P(r)}}const f={preload:y.preload};var w=(t=>(t.PAYPAL="PAYPAL",t.APPLE_PAY="APPLEPAY",t.GOOGLE_PAY="GPAY",t.CARD="CARD",t.VENMO="VENMO",t.CASHAPP="CASHAPP",t))(w||{});e.PayNextCheckout=y,e.PayNextSDK=f,e.PaymentMethod=w,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(r,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(r=typeof globalThis<"u"?globalThis:r||self,s(r["PayNext SDK"]={}))})(this,(function(r){"use strict";var T=Object.defineProperty;var _=(r,s,l)=>s in r?T(r,s,{enumerable:!0,configurable:!0,writable:!0,value:l}):r[s]=l;var y=(r,s,l)=>_(r,typeof s!="symbol"?s+"":s,l);const s="https://cdn-sdk-dev.paynext.com/index.cdn.js",l="https://cdn-sdk.paynext.com/index.cdn.js";let d=null,u=null;class o extends Error{constructor(e,t=!0){super(e),this.retryable=t,this.name="SDKLoadError"}}const S="PayNextSDK";function h(){return typeof window>"u"?null:window[S]}function K(n){typeof window>"u"||(window[S]=n)}function g(n){return new Promise(e=>setTimeout(e,n))}async function m(n,e=1){const i=(n?.toLowerCase()?.includes("develop")||n?.toLowerCase()?.includes("staging")?"develop":"production")==="develop"?s:l;try{console.log(`[PayNext CDN] Loading SDK (attempt ${e}/3)...`);const a=h();if(a)return console.log("[PayNext CDN] SDK already loaded"),a;await new Promise((D,P)=>{if(document.querySelector(`script[src="${i}"]`)){console.log("[PayNext CDN] Script exists, waiting for SDK..."),D();return}const A=setTimeout(()=>{f(),P(new o("SDK script loading timeout",!0))},1e4),c=document.createElement("script");c.src=i,c.crossOrigin="anonymous",c.async=!0,c.setAttribute("data-paynext-sdk","true");const f=()=>{clearTimeout(A),c.onload=null,c.onerror=null};c.onload=()=>{console.log("[PayNext CDN] Script loaded successfully"),f(),D()},c.onerror=x=>{console.error("[PayNext CDN] Script load error:",x),f();try{c.parentNode&&c.parentNode.removeChild(c)}catch(R){console.warn("[PayNext CDN] Failed to remove script:",R)}P(new o("Failed to load SDK script from CDN",!0))};try{document.head.appendChild(c)}catch{f(),P(new o("Failed to append script to document",!1))}});const w=h();if(!w)throw new o("PayNextSDK not found in window after load",!0);return console.log("[PayNext CDN] SDK loaded successfully"),w}catch(a){if((a instanceof o?a.retryable:!0)&&e<3)return console.warn(`[PayNext CDN] Load attempt ${e} failed, retrying in 1000ms...`,a),await g(1e3*e),m(n,e+1);throw console.error(`[PayNext CDN] Failed to load SDK after ${e} attempts:`,a),a}}async function N(n){if(u)return console.log("[PayNext CDN] Returning cached SDK module"),u;if(d)return console.log("[PayNext CDN] Load already in progress, waiting..."),d;if(typeof window>"u")throw new o("PayNext SDK can only be loaded in browser environment",!1);const e=h();return e?(console.log("[PayNext CDN] SDK already loaded in isolated namespace"),u=e,u):(d=(async()=>{try{const t=await m(n);return u=t,K(t),t}catch(t){throw d=null,t}})(),d)}class E{constructor(){y(this,"cdnInstance",null);y(this,"initPromise",null);y(this,"isDestroyed",!1);y(this,"errorBoundary",null)}setErrorHandler(e){this.errorBoundary=e}handleError(e,t){const i=`[PayNext SDK Error - ${t}]: ${e.message}`;if(console.error(i,e),this.errorBoundary)try{this.errorBoundary(e)}catch(a){console.error("[PayNext SDK] Error in custom error handler:",a)}}async initialize(e){if(this.isDestroyed)throw new o("Cannot initialize destroyed SDK instance",!1);return this.initPromise?this.initPromise:(this.initPromise=(async()=>{try{const t=await N(e);if(!t||!t.PayNextCheckout)throw new o("PayNextCheckout not found in loaded SDK module",!1);try{this.cdnInstance=new t.PayNextCheckout}catch(i){throw new o(`Failed to instantiate PayNextCheckout: ${i instanceof Error?i.message:"Unknown error"}`,!1)}console.log("[PayNext SDK] Initialized successfully")}catch(t){throw this.initPromise=null,t}})(),this.initPromise)}assertReady(){if(this.isDestroyed)throw new o("SDK instance has been destroyed",!1);if(!this.initPromise)throw new o("SDK initialization not started",!1);if(!this.cdnInstance)throw new o("SDK instance not created",!1)}async mount(e,t){try{if(!e||typeof e!="string")throw new o("Invalid containerId provided",!1);if(!t||!t.environment)throw new o("Invalid config provided",!1);if(!document.getElementById(e))throw new o(`Container element with id "${e}" not found`,!1);await this.initialize(t.environment),this.assertReady(),await this.cdnInstance.mount(e,t)}catch(i){const a=i instanceof o?i:new o(i instanceof Error?i.message:"Unknown mount error",!0);throw this.handleError(a,"mount"),a}}async unmount(){try{if(this.isDestroyed){console.warn("[PayNext SDK] Instance already destroyed");return}if(!this.cdnInstance){console.warn("[PayNext SDK] No instance to unmount");return}try{typeof this.cdnInstance.unmount=="function"&&await this.cdnInstance.unmount()}catch(e){const t=e instanceof Error?e:new Error(String(e));this.handleError(t,"unmount")}this.cdnInstance=null,this.initPromise=null}catch(e){const t=e instanceof Error?e:new Error(String(e));this.handleError(t,"unmount")}}static async preload(e){try{await N(e),console.log("[PayNext SDK] Preload successful")}catch(t){throw console.error("[PayNext SDK] Preload failed:",t),t}}}const C={preload:E.preload};var p=(n=>(n.PAYPAL="PAYPAL",n.APPLE_PAY="APPLEPAY",n.GOOGLE_PAY="GPAY",n.CARD="CARD",n.VENMO="VENMO",n.CASHAPP="CASHAPP",n))(p||{});r.PayNextCheckout=E,r.PayNextSDK=C,r.PaymentMethod=p,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paynext/sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "PayNext SDK - Payment processing with automatic CDN loading",
5
5
  "type": "module",
6
6
  "main": "dist/index.es.js",
@@ -62,7 +62,6 @@
62
62
  "devDependencies": {
63
63
  "@eslint/js": "^9.39.1",
64
64
  "@evervault/js": "^2.6.0",
65
- "@evervault/react": "^2.22.0",
66
65
  "@heroui/react": "^2.8.5",
67
66
  "@paypal/paypal-js": "^8.4.2",
68
67
  "@paypal/react-paypal-js": "^8.9.2",
package/dist/_headers DELETED
@@ -1,65 +0,0 @@
1
- /*
2
- Access-Control-Allow-Origin: *
3
- # Access-Control-Allow-Methods: GET, HEAD, OPTIONS
4
- # Access-Control-Allow-Headers: Content-Type, Authorization
5
- Vary: Accept-Encoding
6
- X-Content-Type-Options: nosniff
7
- Content-Encoding: gzip
8
- X-Xss-Protection: 1; mode=block
9
-
10
- /*.js
11
- Content-Type: application/javascript
12
- Cache-Control: public, max-age=0, s-maxage=60, must-revalidate
13
- # Cache-Control: no-cache
14
-
15
- /*.css
16
- Content-Type: text/css; charset=utf-8
17
- Cache-Control: public, max-age=1800, s-maxage=86400, stale-while-revalidate=3600
18
-
19
- /*.html
20
- Content-Type: text/html; charset=utf-8
21
- Cache-Control: no-cache
22
- Pragma: no-cache
23
- Expires: 0
24
-
25
- /*.map
26
- Content-Type: application/json
27
- Cache-Control: public, max-age=300, s-maxage=60
28
-
29
- /*.json
30
- Content-Type: application/json
31
- Cache-Control: public, max-age=3600
32
-
33
- /*.png
34
- Cache-Control: public, max-age=31536000, immutable
35
-
36
- /*.jpg
37
- Cache-Control: public, max-age=31536000, immutable
38
-
39
- /*.jpeg
40
- Cache-Control: public, max-age=31536000, immutable
41
-
42
- /*.gif
43
- Cache-Control: public, max-age=31536000, immutable
44
-
45
- /*.svg
46
- Cache-Control: public, max-age=31536000, immutable
47
-
48
- /*.webp
49
- Cache-Control: public, max-age=31536000, immutable
50
-
51
- /*.ico
52
- Cache-Control: public, max-age=31536000, immutable
53
-
54
- /*.woff
55
- Cache-Control: public, max-age=31536000, immutable
56
-
57
- /*.woff2
58
- Cache-Control: public, max-age=31536000, immutable
59
-
60
- /*.ttf
61
- Cache-Control: public, max-age=31536000, immutable
62
-
63
- /*.eot
64
- Cache-Control: public, max-age=31536000, immutable
65
-