diff --git a/.changeset/twelve-seals-know.md b/.changeset/twelve-seals-know.md new file mode 100644 index 0000000..760af89 --- /dev/null +++ b/.changeset/twelve-seals-know.md @@ -0,0 +1,5 @@ +--- +"ts-ics": patch +--- + +Dont fold lines twice on generateCalendar #141 diff --git a/packages/ts-ics/src/lib/generate/calendar.ts b/packages/ts-ics/src/lib/generate/calendar.ts index fd296de..2b44481 100644 --- a/packages/ts-ics/src/lib/generate/calendar.ts +++ b/packages/ts-ics/src/lib/generate/calendar.ts @@ -38,7 +38,7 @@ export const generateIcsCalendar = (calendar: VCalendar) => { if (calendar.events && calendar.events.length > 0) { calendar.events.forEach((event) => { - icsString += generateIcsEvent(event); + icsString += generateIcsEvent(event, { skipFormatLines: true }); }); } diff --git a/packages/ts-ics/src/lib/generate/event.ts b/packages/ts-ics/src/lib/generate/event.ts index 2b97e82..11dd78b 100644 --- a/packages/ts-ics/src/lib/generate/event.ts +++ b/packages/ts-ics/src/lib/generate/event.ts @@ -28,7 +28,12 @@ import { getKeys } from "./utils/getKeys"; import { formatLines } from "./utils/formatLines"; import { escapeTextString } from "./utils/escapeText"; -export const generateIcsEvent = (event: VEvent) => { +type GenerateIcsEventOptions = { skipFormatLines?: boolean }; + +export const generateIcsEvent = ( + event: VEvent, + options?: GenerateIcsEventOptions +) => { const eventKeys = getKeys(event); let icsString = ""; @@ -108,5 +113,7 @@ export const generateIcsEvent = (event: VEvent) => { icsString += getIcsEndLine("VEVENT"); + if (options?.skipFormatLines) return icsString; + return formatLines(icsString); }; diff --git a/packages/ts-ics/tests/generate/calendar.test.ts b/packages/ts-ics/tests/generate/calendar.test.ts new file mode 100644 index 0000000..f0e4513 --- /dev/null +++ b/packages/ts-ics/tests/generate/calendar.test.ts @@ -0,0 +1,32 @@ +import { CRLF_BREAK } from "@/constants"; +import { generateIcsCalendar } from "@/lib"; +import type { VCalendar, VEvent } from "@/types"; + +it("Long descriptions are correctly folded - gh#141", async () => { + const date = new Date(2025, 0, 19); + + const event: VEvent = { + start: { date }, + stamp: { date }, + end: { date }, + summary: "Title", + uid: "1", + description: + "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", + }; + + const calendar: VCalendar = { + prodId: "1", + version: "2.0", + events: [event], + }; + + const icsCalendar = generateIcsCalendar(calendar); + + expect(icsCalendar.includes(` W${CRLF_BREAK}`)).toBeFalsy(); // Calendar should not be folded again after it was folded already in generateEvent + expect( + icsCalendar.includes( + `DESCRIPTION:WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW${CRLF_BREAK} WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW${CRLF_BREAK} WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW${CRLF_BREAK}` + ) + ).toBeTruthy(); +});