UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

154 lines (153 loc) 4.9 kB
// @ts-strict-ignore import { execSync } from 'child_process'; import ciInfo from 'ci-info'; import { randomBytes } from 'crypto'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { findUp } from '../findUp.js'; import { Conf } from './conf/index.js'; import { oneWayHash } from './oneWayHash.js'; let baseEvent = null; export const sendEvent = async ({ event, payload })=>{ try { const { packageJSON, packageJSONPath } = await getPackageJSON(); // Only generate the base event once if (!baseEvent) { const { projectID, source: projectIDSource } = getProjectID(payload, packageJSON); baseEvent = { ciName: ciInfo.isCI ? ciInfo.name : null, envID: getEnvID(), isCI: ciInfo.isCI, nodeEnv: process.env.NODE_ENV || 'development', nodeVersion: process.version, payloadVersion: getPayloadVersion(packageJSON), projectID, projectIDSource, ...getLocalizationInfo(payload), dbAdapter: payload.db.name, emailAdapter: payload.email?.name || null, uploadAdapters: payload.config.upload.adapters }; } if (process.env.PAYLOAD_TELEMETRY_DEBUG) { payload.logger.info({ event: { ...baseEvent, ...event, packageJSONPath }, msg: 'Telemetry Event' }); return; } if (payload.config.telemetry !== false) { await fetch('https://telemetry.payloadcms.com/events', { body: JSON.stringify({ ...baseEvent, ...event }), headers: { 'Content-Type': 'application/json' }, method: 'post' }); } } catch (_) { // Eat any errors in sending telemetry event } }; /** * This is a quasi-persistent identifier used to dedupe recurring events. It's * generated from random data and completely anonymous. */ const getEnvID = ()=>{ const conf = new Conf(); const ENV_ID = 'envID'; const val = conf.get(ENV_ID); if (val) { return val; } const generated = randomBytes(32).toString('hex'); conf.set(ENV_ID, generated); return generated; }; const getProjectID = (payload, packageJSON)=>{ const gitID = getGitID(payload); if (gitID) { return { projectID: oneWayHash(gitID, payload.secret), source: 'git' }; } const packageJSONID = getPackageJSONID(payload, packageJSON); if (packageJSONID) { return { projectID: oneWayHash(packageJSONID, payload.secret), source: 'packageJSON' }; } const serverURL = payload.config.serverURL; if (serverURL) { return { projectID: oneWayHash(serverURL, payload.secret), source: 'serverURL' }; } const cwd = process.cwd(); return { projectID: oneWayHash(cwd, payload.secret), source: 'cwd' }; }; const getGitID = (payload)=>{ try { const originBuffer = execSync('git config --local --get remote.origin.url', { stdio: 'pipe', timeout: 1000 }); return oneWayHash(String(originBuffer).trim(), payload.secret); } catch (_) { return null; } }; const getPackageJSON = async ()=>{ let packageJSONPath = path.resolve(process.cwd(), 'package.json'); if (!fs.existsSync(packageJSONPath)) { // Old logic const filename = fileURLToPath(import.meta.url); const dirname = path.dirname(filename); packageJSONPath = await findUp({ dir: dirname, fileNames: [ 'package.json' ] }); } const jsonContentString = await fs.promises.readFile(packageJSONPath, 'utf-8'); const jsonContent = JSON.parse(jsonContentString); return { packageJSON: jsonContent, packageJSONPath }; }; const getPackageJSONID = (payload, packageJSON)=>{ return oneWayHash(packageJSON.name, payload.secret); }; export const getPayloadVersion = (packageJSON)=>{ return packageJSON?.dependencies?.payload ?? ''; }; export const getLocalizationInfo = (payload)=>{ if (!payload.config.localization) { return { locales: [], localizationDefaultLocale: null, localizationEnabled: false }; } return { locales: payload.config.localization.localeCodes, localizationDefaultLocale: payload.config.localization.defaultLocale, localizationEnabled: true }; }; //# sourceMappingURL=index.js.map