@schibsted/sourcepoint
Version:
Package containing scripts used by Schibsteds' sites to integrate with Sourcepoint CMP
53 lines (45 loc) • 2.13 kB
JavaScript
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import {version} from './version.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootPath = path.resolve(__dirname, '..', '..');
const templateDir = path.resolve(rootPath, 'dist', 'templates');
const pkgVersion = version;
export function psi(config, asHtml = true) {
return createModule(config, asHtml, 'psi');
}
export function scc(config, asHtml = true) {
return createModule(config, asHtml, 'scc');
}
export function tcf(config, asHtml = true) {
return createModule(config, asHtml, 'tcf');
}
function createModule(config, asHtml, type) {
const snippet = fs.readFileSync(path.resolve(templateDir, `${type}.js`), 'utf8');
const messagingSnippet = fs.readFileSync(
path.resolve(templateDir, `${type}-with-messaging.js`),
'utf8'
);
const configObject = type === 'psi' ? ({...config, jsSdkVersion: pkgVersion}) : config;
const code = addBanner(injectConfig(asHtml ? snippet : messagingSnippet, configObject));
return asHtml ? addJsTag(code, config) : code;
}
function injectConfig(content, config) {
const configAsStr = JSON.stringify(config);
return content.replace(/['"]__CONFIGURATION_PLACEHOLDER__['"]/, configAsStr);
}
function addBanner(code) {
const date = new Date().toISOString();
return `/*! Copyright © ${new Date().getFullYear()} Schibsted. Generated by @schibsted/sourcepoint ${pkgVersion} (${date}) */\n${code}`;
}
function addJsTag(code, { baseEndpoint }) {
if (!baseEndpoint) {
throw new Error('"baseEndpoint" is not configured');
}
const codeScript = `<script>\n${code}</script>`;
const preloadLink = `<link rel="preload" href="${baseEndpoint}/unified/wrapperMessagingWithoutDetection.js" as="script" crossorigin="crossorigin" fetchpriority="high">`;
const script = `<script async src="${baseEndpoint}/unified/wrapperMessagingWithoutDetection.js" onload="document.dispatchEvent(new Event('cmp:loaded'))"></script>`;
return `${codeScript}\n${preloadLink}\n${script}`;
}