mirror of
https://github.com/nolanlawson/pinafore
synced 2024-12-13 02:37:20 +01:00
f2d752bfc2
* fix: add country flag emoji on windows * fix: missing file * fix: cache font file on-demand * fix: attempt to fix * fix: working * fix: ordering * fix: ordering * fix: ordering * fix: fixup * fix: fixup * fix: add comment * fix: fix vercel * fix: fix vercel.json * fix: vercel * refactor: refactor
88 lines
2.3 KiB
JavaScript
88 lines
2.3 KiB
JavaScript
import path from 'path'
|
|
import fs from 'fs'
|
|
import { promisify } from 'util'
|
|
import { LOCALE } from '../src/routes/_static/intl.js'
|
|
import { getIntl, trimWhitespace } from './getIntl.js'
|
|
|
|
const __dirname = path.dirname(new URL(import.meta.url).pathname)
|
|
const readFile = promisify(fs.readFile)
|
|
const writeFile = promisify(fs.writeFile)
|
|
const copyFile = promisify(fs.copyFile)
|
|
|
|
// Try 'en-US' first, then 'en' if that doesn't exist
|
|
const PREFERRED_LOCALES = [LOCALE, LOCALE.split('-')[0]]
|
|
|
|
// emojibase seems like the most "neutral" shortcodes, but cldr is available in every language
|
|
const PREFERRED_SHORTCODES = ['emojibase', 'cldr']
|
|
|
|
async function getEmojiI18nFile (locale, shortcode) {
|
|
const filename = path.resolve(__dirname,
|
|
'../node_modules/emoji-picker-element-data',
|
|
locale,
|
|
shortcode,
|
|
'data.json')
|
|
try {
|
|
return JSON.parse(await readFile(filename, 'utf8'))
|
|
} catch (err) { /* ignore */ }
|
|
}
|
|
|
|
async function getFirstExistingEmojiI18nFile () {
|
|
for (const locale of PREFERRED_LOCALES) {
|
|
for (const shortcode of PREFERRED_SHORTCODES) {
|
|
const json = await getEmojiI18nFile(locale, shortcode)
|
|
if (json) {
|
|
return json
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async function buildEmojiI18nFile () {
|
|
const json = await getFirstExistingEmojiI18nFile()
|
|
|
|
if (!json) {
|
|
throw new Error(`Couldn't find i18n data for locale ${LOCALE}. Is it supported in emoji-picker-element-data?`)
|
|
}
|
|
|
|
await writeFile(
|
|
path.resolve(__dirname, `../static/emoji-${LOCALE}.json`),
|
|
JSON.stringify(json),
|
|
'utf8'
|
|
)
|
|
}
|
|
|
|
async function buildManifestJson () {
|
|
const template = await readFile(path.resolve(__dirname, '../src/build/manifest.json'), 'utf8')
|
|
// replace {@intl.foo}
|
|
const output = template
|
|
.replace(/{intl\.([^}]+)}/g, (match, p1) => trimWhitespace(getIntl(p1)))
|
|
|
|
await writeFile(
|
|
path.resolve(__dirname, '../static/manifest.json'),
|
|
JSON.stringify(JSON.parse(output)), // minify json
|
|
'utf8'
|
|
)
|
|
}
|
|
|
|
async function buildFlagEmojiFile () {
|
|
await copyFile(path.resolve(
|
|
__dirname,
|
|
'../node_modules/country-flag-emoji-polyfill/dist/TwemojiCountryFlags.woff2'
|
|
), path.resolve(
|
|
__dirname, '../static/TwemojiCountryFlags.woff2'
|
|
))
|
|
}
|
|
|
|
async function main () {
|
|
await Promise.all([
|
|
buildEmojiI18nFile(),
|
|
buildManifestJson(),
|
|
buildFlagEmojiFile()
|
|
])
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error(err)
|
|
process.exit(1)
|
|
})
|