One Calendar is a privacy-first calendar web app built with Next.js. It has modern security features, including e2ee, password-protected sharing, and self-destructing share links ๐Ÿ“… calendar.xyehr.cn
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: add share route to proxy public matcher and bump version

+79 -55
-3
.gitignore
··· 42 42 43 43 # turbo 44 44 .turbo 45 - 46 - # generated locale map 47 - /lib/locales.ts
-48
lib/gen-locales.mjs
··· 1 - import { promises as fs } from "node:fs" 2 - import path from "node:path" 3 - import { fileURLToPath } from "node:url" 4 - 5 - const __filename = fileURLToPath(import.meta.url) 6 - const __dirname = path.dirname(__filename) 7 - const projectRoot = path.resolve(__dirname, "..") 8 - const localesDir = path.join(projectRoot, "locales") 9 - const outputFile = path.join(projectRoot, "lib", "locales.ts") 10 - 11 - const toIdentifier = (value) => 12 - `locale${value.replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase()).replace(/^[a-z]/, (chr) => chr.toUpperCase())}` 13 - 14 - const run = async () => { 15 - const localeFiles = (await fs.readdir(localesDir)) 16 - .filter((file) => file.endsWith(".json")) 17 - .sort((a, b) => a.localeCompare(b)) 18 - 19 - if (localeFiles.length === 0) { 20 - throw new Error("No locale json files found in /locales") 21 - } 22 - 23 - const imports = localeFiles 24 - .map((file) => { 25 - const lang = file.replace(/\.json$/, "") 26 - const identifier = toIdentifier(lang) 27 - return `import ${identifier} from "@/locales/${file}"` 28 - }) 29 - .join("\n") 30 - 31 - const entries = localeFiles 32 - .map((file) => { 33 - const lang = file.replace(/\.json$/, "") 34 - const identifier = toIdentifier(lang) 35 - return ` "${lang}": ${identifier},` 36 - }) 37 - .join("\n") 38 - 39 - const content = `/* eslint-disable */\n// This file is auto-generated by lib/gen-locales.mjs\n// Do not edit manually.\n\n${imports}\n\nexport const translations = {\n${entries}\n} as const\n\nexport type Language = keyof typeof translations\n` 40 - 41 - await fs.writeFile(outputFile, content, "utf8") 42 - console.log(`Generated ${path.relative(projectRoot, outputFile)} with ${localeFiles.length} locale(s).`) 43 - } 44 - 45 - run().catch((error) => { 46 - console.error(error) 47 - process.exit(1) 48 - })
+75
lib/locales.ts
··· 1 + import localeBn from "@/locales/bn.json"; 2 + import localeDe from "@/locales/de.json"; 3 + import localeEl from "@/locales/el.json"; 4 + import localeEnGb from "@/locales/en-GB.json"; 5 + import localeEn from "@/locales/en.json"; 6 + import localeEs from "@/locales/es.json"; 7 + import localeFi from "@/locales/fi.json"; 8 + import localeFr from "@/locales/fr.json"; 9 + import localeHi from "@/locales/hi.json"; 10 + import localeIs from "@/locales/is.json"; 11 + import localeIt from "@/locales/it.json"; 12 + import localeJa from "@/locales/ja.json"; 13 + import localeKo from "@/locales/ko.json"; 14 + import localeLt from "@/locales/lt.json"; 15 + import localeLv from "@/locales/lv.json"; 16 + import localeMk from "@/locales/mk.json"; 17 + import localeNb from "@/locales/nb.json"; 18 + import localeNl from "@/locales/nl.json"; 19 + import localePl from "@/locales/pl.json"; 20 + import localePt from "@/locales/pt.json"; 21 + import localeRo from "@/locales/ro.json"; 22 + import localeRu from "@/locales/ru.json"; 23 + import localeSl from "@/locales/sl.json"; 24 + import localeSq from "@/locales/sq.json"; 25 + import localeSr from "@/locales/sr.json"; 26 + import localeSv from "@/locales/sv.json"; 27 + import localeSw from "@/locales/sw.json"; 28 + import localeTh from "@/locales/th.json"; 29 + import localeTr from "@/locales/tr.json"; 30 + import localeUk from "@/locales/uk.json"; 31 + import localeVi from "@/locales/vi.json"; 32 + import localeYue from "@/locales/yue.json"; 33 + import localeZhCn from "@/locales/zh-CN.json"; 34 + import localeZhHk from "@/locales/zh-HK.json"; 35 + import localeZhTw from "@/locales/zh-TW.json"; 36 + 37 + export const translations = { 38 + bn: localeBn, 39 + de: localeDe, 40 + el: localeEl, 41 + "en-GB": localeEnGb, 42 + en: localeEn, 43 + es: localeEs, 44 + fi: localeFi, 45 + fr: localeFr, 46 + hi: localeHi, 47 + is: localeIs, 48 + it: localeIt, 49 + ja: localeJa, 50 + ko: localeKo, 51 + lt: localeLt, 52 + lv: localeLv, 53 + mk: localeMk, 54 + nb: localeNb, 55 + nl: localeNl, 56 + pl: localePl, 57 + pt: localePt, 58 + ro: localeRo, 59 + ru: localeRu, 60 + sl: localeSl, 61 + sq: localeSq, 62 + sr: localeSr, 63 + sv: localeSv, 64 + sw: localeSw, 65 + th: localeTh, 66 + tr: localeTr, 67 + uk: localeUk, 68 + vi: localeVi, 69 + yue: localeYue, 70 + "zh-CN": localeZhCn, 71 + "zh-HK": localeZhHk, 72 + "zh-TW": localeZhTw, 73 + } as const; 74 + 75 + export type Language = keyof typeof translations;
+3 -4
package.json
··· 1 1 { 2 2 "name": "one-calendar", 3 - "version": "2.2.9", 3 + "version": "2.2.10", 4 4 "private": true, 5 5 "packageManager": "bun@1.3.8", 6 6 "scripts": { 7 - "dev": "bun run generate:locales && next dev", 8 - "build": "bun run generate:locales && next build", 7 + "dev": "next dev", 8 + "build": "next build", 9 9 "start": "next start", 10 - "generate:locales": "bun lib/gen-locales.mjs", 11 10 "generate:oauth-metadata": "bun lib/gen-oauth-metadata.mjs" 12 11 }, 13 12 "dependencies": {
+1
proxy.ts
··· 12 12 "/api/atproto/(.*)", 13 13 "/oauth-client-metadata.json", 14 14 "/api/share/public", 15 + "/share/(.*)", 15 16 "/privacy", 16 17 "/terms", 17 18 ])