tools/scripts/deno/generate-newsletters.js (168 lines of code) (raw):
import { faker } from 'https://cdn.skypack.dev/@faker-js/faker@v7.6.0';
const YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365;
/** Capitalises the first character and lowercases the rest */
const initCap = (text) =>
text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
/** Converts slug (or kebab-case) into camelCase or PascalCase ID */
const slugConverter = (text, resultCase) => {
if (!['snake', 'pascal', 'camel', 'kebab'].includes(resultCase)) {
return text;
} else {
return resultCase === 'snake'
? text.replaceAll('-', '_')
: text
.split('-')
.map((t, i) =>
resultCase === 'camel' && i === 0 ? t.toLowerCase() : initCap(t),
)
.join('');
}
};
const generateRenderingOptions = () => {
return {
displayDate: faker.datatype.boolean(),
displayStandfirst: faker.datatype.boolean(),
contactEmail: `${faker.lorem.word()}@example.com`,
displayImageCaptions: faker.datatype.boolean(),
mainBannerUrl: faker.helpers.arrayElement([
'https://assets.guim.co.uk/images/email/banners/3aaee2fd94b67953a15b4e7a795c09b8/generic.png',
'https://i.guim.co.uk/img/uploads/2022/10/21/default-newsletter-main-banner.png?dpr=2&quality=100&width=600&s=618cf82b457a343bf56650ad7acaad59',
]),
subheadingBannerUrl: faker.helpers.arrayElement([
undefined,
'https://i.guim.co.uk/img/uploads/2023/06/02/moving-the-goalposts-sub-heading.png?quality=100&dpr=2&width=650&s=f3bbf75a71f4a16c22d0dd6e12b5188d',
'https://i.guim.co.uk/img/uploads/2022/10/21/default-template-sub-banner.png?dpr=2&quality=100&width=600&s=41c1744d1559a535e7b7cc77f8c6e037',
]),
darkSubheadingBannerUrl: faker.helpers.arrayElement([
undefined,
'https://i.guim.co.uk/img/uploads/2022/10/21/default-template-sub-banner.png?dpr=2&quality=100&width=600&s=41c1744d1559a535e7b7cc77f8c6e037',
]),
};
};
const generateNewsletter = () => {
const name = `${initCap(faker.random.word())} ${initCap(
faker.random.word(),
)}`;
const status = faker.helpers.arrayElement([
'paused',
'cancelled',
'pending',
'live',
'live',
]);
const frequency = faker.helpers.arrayElement([
'Weekly',
'Fortnightly',
'Monthly',
]);
const regionFocus = faker.helpers.arrayElement([
'UK',
'AU',
'US',
'EUR',
undefined,
]);
const category = faker.helpers.arrayElement([
'article-based',
'article-based-legacy',
'fronts-based',
'manual-send',
'other',
]);
const newsletterId = faker.helpers.slugify(name).toLowerCase();
const idWithRegion = regionFocus
? `${newsletterId}-${regionFocus}`
: newsletterId;
const timeStampForOneToTwoYearsAgo =
Date.now() - YEAR_IN_MS - Math.floor(Math.random() * YEAR_IN_MS);
const timeStampForZeroToOneYearsAgo =
Date.now() - Math.floor(Math.random() * YEAR_IN_MS);
const illustrationCard = faker.helpers.arrayElement([
undefined,
undefined,
undefined,
undefined,
undefined,
'https://i.guim.co.uk/img/media/28ffd9cfbf7125265a79a664afacea6444c19cf1/0_0_2560_1536/500.jpg?width=250&quality=45&s=58da4319f10510a0b374324a928b766b',
'https://i.guim.co.uk/img/media/aa8b0d33b6d0c2ff8fa26f15cd42632d8a251a66/0_151_3000_1800/500.jpg?width=250&quality=45&s=e5d8298adae28ef97fbae18cde3f548b',
'https://i.guim.co.uk/img/media/dc41d329183de03943d483df5e68f91a0f263a4e/0_0_5000_3000/500.jpg?width=250&quality=45&s=419ffb0a03b5f5c9cef62cd80c52053e',
'https://i.guim.co.uk/img/media/0f029b430f0ce52d3e675b66dcfd7e9b86bf2b9b/0_1_1250_750/500.jpg?width=250&quality=45&s=971ab7ce3906642fa0582864443d3b06',
'https://i.guim.co.uk/img/media/3cf73e88fb6102bd5dae53f58916e758817070cb/62_784_5052_3032/500.jpg?width=250&quality=45&s=3c6e7b89bdeea41918e9881c821260a3',
'https://i.guim.co.uk/img/media/4ef30ca444a6980ad09f9c651b620000ede91d68/3623_5_3289_1976/500.png?width=250&quality=45&s=698ab2c29ad2f9163683dbeeb7990f18',
'https://i.guim.co.uk/img/media/8b426d79fd6bcd67008b93835a38c8082c03c918/1355_0_3890_2336/500.jpg?width=250&quality=45&s=c42a70edf8e37c41b35574abf1c8905a',
]);
const newsletter = {
identityName: newsletterId,
name,
category,
description: initCap(faker.lorem.text()),
signUpDescription: faker.lorem.sentence(),
frequency,
status,
restricted: false,
emailConfirmation: false,
brazeNewsletterName: `Editorial_${slugConverter(idWithRegion, 'pascal')}`,
brazeSubscribeAttributeName: `${slugConverter(
idWithRegion,
'pascal',
)}_Subscribe_Email`,
brazeSubscribeEventNamePrefix: slugConverter(
idWithRegion,
'snake',
).toLowerCase(),
theme: faker.helpers.arrayElement([
'news',
'opinion',
'features',
'culture',
'lifestyle',
'sport',
'from the papers',
]),
group: faker.helpers.arrayElement([
'News in depth',
'News in brief',
'Opinion',
'Features',
'Culture',
'Lifestyle',
'Sport',
'Work',
'From the papers',
]),
regionFocus,
listIdV1: faker.datatype.number({ max: 4000 }),
listId: faker.datatype.number({ max: 6000 }),
exampleUrl: `/world/series/series-${newsletterId}/latest/email`,
signupPage: `/global/sign-up-for-the-${newsletterId}-newsletter-our-free-email`,
signUpEmbedDescription: `We'll send you ${name} ${frequency.toLowerCase()}`,
campaignName: slugConverter(idWithRegion, 'pascal'),
campaignCode: `${idWithRegion.replaceAll('-', '')}_email`,
brazeSubscribeAttributeNameAlternate: [
`email_subscribe_${slugConverter(idWithRegion, 'snake')}`,
],
creationTimeStamp: timeStampForOneToTwoYearsAgo,
cancellationTimeStamp:
status === 'cancelled' ? timeStampForZeroToOneYearsAgo : undefined,
figmaIncludesThrashers: false,
launchDate: new Date(87678876),
signUpPageDate: new Date(87678876),
thrasherDate: new Date(87678876),
privateUntilLaunch: false,
onlineArticle: 'Web for all sends',
illustrationCard,
renderingOptions:
category === 'article-based' ? generateRenderingOptions() : undefined,
};
return newsletter;
};
const numNewsletters = prompt(
'How many newsletters do you want to generate?',
5,
);
const data = new Array(parseInt(numNewsletters)).fill().map(generateNewsletter);
const filename = prompt(
'What should the filename be called?',
'newsletters.local.json',
);
const filepath = `./apps/newsletters-api/static/${filename}`;
Deno.writeTextFile(filepath, JSON.stringify(data));
console.log(`Written ${numNewsletters} newsletters to ${filepath}`);