@enhanced-inc/corede-i-sdk 1.0.0 → 1.0.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.global.js +1 -1
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var CoredeISdk=(()=>{var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var C=(e,n)=>{for(var t in n)c(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of m(n))!x.call(e,o)&&o!==t&&c(e,o,{get:()=>n[o],enumerable:!(r=g(n,o))||r.enumerable});return e};var E=e=>y(c({},"__esModule",{value:!0}),e);var k={};C(k,{acceptAnalytics:()=>A,declineAnalytics:()=>v,init:()=>D});var h=process.env.ENHANCED_PORTAL_BASE_URL||"enhanced-portal-web-gylronoezvgom.azurewebsites.net",p="corede-i-gtag",b=/^G-[A-Z0-9]+$/,f="corede-i-ga-consent",u="corede-i-consent-banner";async function w(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function d(e){if(document.getElementById(p))return;if(!b.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=p,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
1
|
+
"use strict";var CoredeISdk=(()=>{var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var C=(e,n)=>{for(var t in n)c(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of m(n))!x.call(e,o)&&o!==t&&c(e,o,{get:()=>n[o],enumerable:!(r=g(n,o))||r.enumerable});return e};var E=e=>y(c({},"__esModule",{value:!0}),e);var k={};C(k,{acceptAnalytics:()=>A,declineAnalytics:()=>v,init:()=>D});var h=process.env.ENHANCED_PORTAL_BASE_URL||"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net",p="corede-i-gtag",b=/^G-[A-Z0-9]+$/,f="corede-i-ga-consent",u="corede-i-consent-banner";async function w(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function d(e){if(document.getElementById(p))return;if(!b.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=p,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
2
2
|
window.dataLayer = window.dataLayer || [];
|
|
3
3
|
function gtag(){dataLayer.push(arguments);}
|
|
4
4
|
gtag('js', new Date());
|
package/dist/index.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"8bAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,qBAAAC,EAAA,SAAAC,IAIA,IAAMC,EAAmB,QAAQ,IAAI,0BACnC,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"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","names":["index_exports","__export","acceptAnalytics","declineAnalytics","init","DEFAULT_BASE_URL","GA_SCRIPT_ID","GA_ID_PATTERN","CONSENT_KEY","BANNER_ID","fetchConfig","apiKey","baseUrl","res","err","injectGtag","gaId","script","initScript","getConsent","value","setConsent","accepted","showConsentBanner","onAccept","banner","text","btnGroup","acceptBtn","declineBtn","removeBanner","pendingGaId","config","showBanner","sdkConfig","consent"]}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var C=(e,n)=>{for(var t in n)c(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of m(n))!x.call(e,o)&&o!==t&&c(e,o,{get:()=>n[o],enumerable:!(r=g(n,o))||r.enumerable});return e};var E=e=>y(c({},"__esModule",{value:!0}),e);var k={};C(k,{acceptAnalytics:()=>A,declineAnalytics:()=>v,init:()=>D});module.exports=E(k);var h=process.env.ENHANCED_PORTAL_BASE_URL||"enhanced-portal-web-gylronoezvgom.azurewebsites.net",p="corede-i-gtag",b=/^G-[A-Z0-9]+$/,f="corede-i-ga-consent",u="corede-i-consent-banner";async function w(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function d(e){if(document.getElementById(p))return;if(!b.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=p,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
1
|
+
"use strict";var c=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var C=(e,n)=>{for(var t in n)c(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of m(n))!x.call(e,o)&&o!==t&&c(e,o,{get:()=>n[o],enumerable:!(r=g(n,o))||r.enumerable});return e};var E=e=>y(c({},"__esModule",{value:!0}),e);var k={};C(k,{acceptAnalytics:()=>A,declineAnalytics:()=>v,init:()=>D});module.exports=E(k);var h=process.env.ENHANCED_PORTAL_BASE_URL||"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net",p="corede-i-gtag",b=/^G-[A-Z0-9]+$/,f="corede-i-ga-consent",u="corede-i-consent-banner";async function w(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function d(e){if(document.getElementById(p))return;if(!b.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=p,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
2
2
|
window.dataLayer = window.dataLayer || [];
|
|
3
3
|
function gtag(){dataLayer.push(arguments);}
|
|
4
4
|
gtag('js', new Date());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,qBAAAC,EAAA,SAAAC,IAAA,eAAAC,EAAAL,GAIA,IAAMM,EAAmB,QAAQ,IAAI,0BACnC,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"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","names":["index_exports","__export","acceptAnalytics","declineAnalytics","init","__toCommonJS","DEFAULT_BASE_URL","GA_SCRIPT_ID","GA_ID_PATTERN","CONSENT_KEY","BANNER_ID","fetchConfig","apiKey","baseUrl","res","err","injectGtag","gaId","script","initScript","getConsent","value","setConsent","accepted","showConsentBanner","onAccept","banner","text","btnGroup","acceptBtn","declineBtn","removeBanner","pendingGaId","config","showBanner","sdkConfig","consent"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var f=process.env.ENHANCED_PORTAL_BASE_URL||"enhanced-portal-web-gylronoezvgom.azurewebsites.net",l="corede-i-gtag",g=/^G-[A-Z0-9]+$/,u="corede-i-ga-consent",p="corede-i-consent-banner";async function m(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function c(e){if(document.getElementById(l))return;if(!g.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=l,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
1
|
+
var f=process.env.ENHANCED_PORTAL_BASE_URL||"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net",l="corede-i-gtag",g=/^G-[A-Z0-9]+$/,u="corede-i-ga-consent",p="corede-i-consent-banner";async function m(e,n){try{let t=await fetch(`${n}/api/sdk/config`,{headers:{"X-Api-Key":e}});return t.ok?await t.json():(console.warn(`[COREDE-I SDK] Config fetch failed: ${t.status}`),null)}catch(t){return console.warn("[COREDE-I SDK] Config fetch error:",t),null}}function c(e){if(document.getElementById(l))return;if(!g.test(e)){console.warn(`[COREDE-I SDK] Invalid GA ID format: ${e}`);return}let n=document.createElement("script");n.id=l,n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${e}`,document.head.appendChild(n);let t=document.createElement("script");t.textContent=`
|
|
2
2
|
window.dataLayer = window.dataLayer || [];
|
|
3
3
|
function gtag(){dataLayer.push(arguments);}
|
|
4
4
|
gtag('js', new Date());
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"AAIA,IAAMA,EAAmB,QAAQ,IAAI,0BACnC,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CoredeISdkConfig, SdkConfigResponse } from \"./types\";\n\nexport type { CoredeISdkConfig, SdkConfigResponse };\n\nconst DEFAULT_BASE_URL = process.env.ENHANCED_PORTAL_BASE_URL ||\n \"https://enhanced-portal-web-gylronoezvgom.azurewebsites.net\";\nconst GA_SCRIPT_ID = \"corede-i-gtag\";\nconst GA_ID_PATTERN = /^G-[A-Z0-9]+$/;\nconst CONSENT_KEY = \"corede-i-ga-consent\";\nconst BANNER_ID = \"corede-i-consent-banner\";\n\nasync function fetchConfig(\n apiKey: string,\n baseUrl: string\n): Promise<SdkConfigResponse | null> {\n try {\n const res = await fetch(`${baseUrl}/api/sdk/config`, {\n headers: { \"X-Api-Key\": apiKey },\n });\n if (!res.ok) {\n console.warn(`[COREDE-I SDK] Config fetch failed: ${res.status}`);\n return null;\n }\n return (await res.json()) as SdkConfigResponse;\n } catch (err) {\n console.warn(\"[COREDE-I SDK] Config fetch error:\", err);\n return null;\n }\n}\n\nfunction injectGtag(gaId: string): void {\n if (document.getElementById(GA_SCRIPT_ID)) {\n return;\n }\n\n if (!GA_ID_PATTERN.test(gaId)) {\n console.warn(`[COREDE-I SDK] Invalid GA ID format: ${gaId}`);\n return;\n }\n\n const script = document.createElement(\"script\");\n script.id = GA_SCRIPT_ID;\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaId}`;\n document.head.appendChild(script);\n\n const initScript = document.createElement(\"script\");\n initScript.textContent = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}');\n `;\n document.head.appendChild(initScript);\n}\n\nfunction getConsent(): boolean | null {\n const value = localStorage.getItem(CONSENT_KEY);\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return null;\n}\n\nfunction setConsent(accepted: boolean): void {\n localStorage.setItem(CONSENT_KEY, String(accepted));\n}\n\nfunction showConsentBanner(onAccept: () => void): void {\n if (document.getElementById(BANNER_ID)) return;\n\n const banner = document.createElement(\"div\");\n banner.id = BANNER_ID;\n banner.style.cssText = [\n \"position:fixed\",\n \"bottom:0\",\n \"left:0\",\n \"right:0\",\n \"background:#1a1a2e\",\n \"color:#eee\",\n \"padding:16px 20px\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:space-between\",\n \"gap:16px\",\n \"font-family:sans-serif\",\n \"font-size:14px\",\n \"z-index:2147483647\",\n \"box-shadow:0 -2px 8px rgba(0,0,0,0.3)\",\n ].join(\";\");\n\n const text = document.createElement(\"span\");\n text.textContent =\n \"当サイトでは、アクセス解析のためにGoogle Analyticsを使用しています。Cookieの使用に同意いただけますか?\";\n\n const btnGroup = document.createElement(\"span\");\n btnGroup.style.cssText = \"display:flex;gap:8px;flex-shrink:0\";\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.textContent = \"同意する\";\n acceptBtn.style.cssText =\n \"background:#4caf50;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const declineBtn = document.createElement(\"button\");\n declineBtn.textContent = \"拒否する\";\n declineBtn.style.cssText =\n \"background:transparent;color:#ccc;border:1px solid #555;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px\";\n\n const removeBanner = () => banner.remove();\n\n acceptBtn.addEventListener(\"click\", () => {\n setConsent(true);\n removeBanner();\n onAccept();\n });\n\n declineBtn.addEventListener(\"click\", () => {\n setConsent(false);\n removeBanner();\n });\n\n btnGroup.appendChild(acceptBtn);\n btnGroup.appendChild(declineBtn);\n banner.appendChild(text);\n banner.appendChild(btnGroup);\n document.body.appendChild(banner);\n}\n\nlet pendingGaId: string | null = null;\n\nexport function acceptAnalytics(): void {\n setConsent(true);\n if (pendingGaId) {\n injectGtag(pendingGaId);\n }\n}\n\nexport function declineAnalytics(): void {\n setConsent(false);\n pendingGaId = null;\n}\n\nexport function init(config: CoredeISdkConfig): void {\n if (!config.apiKey) {\n console.warn(\"[COREDE-I SDK] Missing apiKey\");\n return;\n }\n\n const showBanner = config.consentBanner !== false;\n const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\n fetchConfig(config.apiKey, baseUrl).then((sdkConfig) => {\n if (!sdkConfig) return;\n if (!sdkConfig.googleAnalyticsId) return;\n\n const gaId = sdkConfig.googleAnalyticsId;\n pendingGaId = gaId;\n const consent = getConsent();\n\n if (consent === true) {\n injectGtag(gaId);\n } else if (consent === null && showBanner) {\n showConsentBanner(() => injectGtag(gaId));\n }\n // consent === false or (null + no banner): wait for manual acceptAnalytics()\n });\n}\n"],"mappings":"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","names":["DEFAULT_BASE_URL","GA_SCRIPT_ID","GA_ID_PATTERN","CONSENT_KEY","BANNER_ID","fetchConfig","apiKey","baseUrl","res","err","injectGtag","gaId","script","initScript","getConsent","value","setConsent","accepted","showConsentBanner","onAccept","banner","text","btnGroup","acceptBtn","declineBtn","removeBanner","pendingGaId","acceptAnalytics","declineAnalytics","init","config","showBanner","sdkConfig","consent"]}
|