@sanity/cli
Version:
Sanity CLI tool for managing Sanity installations, managing plugins, schemas and datasets
102 lines (89 loc) • 3.48 kB
text/typescript
import {type ConsentStatus} from '@sanity/telemetry'
import {
telemetryLearnMoreMessage,
telemetryStatusMessage,
} from '../../commands/telemetry/telemetryStatusCommand'
import {debug} from '../../debug'
import {type CliCommandAction} from '../../types'
import {
type ConsentInformation,
resolveConsent,
TELEMETRY_CONSENT_CONFIG_KEY,
} from '../../util/createTelemetryStore'
import {getUserConfig} from '../../util/getUserConfig'
type SettableConsentStatus = Extract<ConsentStatus, 'granted' | 'denied'>
interface ResultMessage {
success: () => string
failure: (message?: string) => string
unchanged: (consentInformation: ConsentInformation) => string
}
const resultMessages: Record<SettableConsentStatus, ResultMessage> = {
granted: {
success: () => `You've now enabled telemetry data collection to help us improve Sanity.`,
unchanged: () => `You've already enabled telemetry data collection to help us improve Sanity.`,
failure: (message) => {
if (message) {
return `Failed to enable telemetry: ${message}`
}
return 'Failed to enable telemetry'
},
},
denied: {
success: () =>
`You've opted out of telemetry data collection.\nNo data will be collected from your Sanity account.`,
unchanged: ({reason}) => {
if (reason === 'localOverride') {
return `You've already opted out of telemetry data collection.\nNo data is collected from your machine.\n\nUsing DO_NOT_TRACK environment variable.`
}
return `You've already opted out of telemetry data collection.\nNo data is collected from your Sanity account.`
},
failure: () => 'Failed to disable telemetry',
},
}
export function createSetTelemetryConsentAction(status: SettableConsentStatus): CliCommandAction {
return async function setTelemetryConsentAction(_, context) {
const {apiClient, output} = context
const config = getUserConfig()
const client = apiClient({
requireUser: true,
requireProject: false,
}).withConfig({
apiVersion: '2023-12-18',
useProjectHostname: false,
})
// eslint-disable-next-line no-process-env
const currentInformation = await resolveConsent({env: process.env})
const isChanged = currentInformation.status !== status
if (!isChanged) {
debug('Telemetry consent is already "%s"', status)
output.print(`${telemetryStatusMessage(status, context)}\n`)
output.print(resultMessages[status].unchanged(currentInformation))
}
if (isChanged) {
debug('Setting telemetry consent to "%s"', status)
try {
const uri = `/users/me/consents/telemetry/status/${status}`
debug('Sending telemetry consent status to %s', uri)
await client.request({
method: 'PUT',
uri,
})
// Clear cached telemetry consent
config.delete(TELEMETRY_CONSENT_CONFIG_KEY)
output.print(`${telemetryStatusMessage(status, context)}\n`)
output.print(resultMessages[status].success())
} catch (err) {
const errorMessage = resultMessages[status].failure(err.response?.body?.message)
if (err.statusCode === 403) {
// throw without stack trace from original error
throw new Error(errorMessage)
} else {
// if not 403, throw original error
err.message = errorMessage
throw err
}
}
}
output.print(`\n${telemetryLearnMoreMessage(status)}`)
}
}