@timardex/cluemart-shared 1.5.590 → 1.5.595

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,9 +9,10 @@ function formatCategoryLabel(category) {
9
9
 
10
10
  // src/sharing/joinShareDescriptionSections.ts
11
11
  var SHARE_DESCRIPTION_SECTION_SEPARATOR = " \xB7 ";
12
+ var SHARE_DESCRIPTION_SECTION_BREAK = "\n\n";
12
13
  var SHARE_COMPACT_SECTION_SEPARATOR = SHARE_DESCRIPTION_SECTION_SEPARATOR;
13
14
  function joinShareDescriptionSections(sections) {
14
- return sections.filter((section) => Boolean(section)).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
15
+ return sections.filter((section) => Boolean(section)).join(SHARE_DESCRIPTION_SECTION_BREAK);
15
16
  }
16
17
 
17
18
  // src/sharing/buildRelationShareDescription.ts
@@ -128,38 +129,65 @@ function buildShareUrl(type, id) {
128
129
  }
129
130
 
130
131
  // src/sharing/normalizeShareDescription.ts
132
+ var LEGACY_BULLET_PREFIX = "\u2022 ";
131
133
  function normalizeShareSection(value) {
132
134
  if (value == null) {
133
135
  return "";
134
136
  }
135
137
  return value.trim().split("\n").map((line) => line.trim().replace(/[ \t]+/g, " ")).join("\n").replace(/\n{3,}/g, "\n\n");
136
138
  }
137
- function normalizeShareOgDescription(value) {
139
+ function stripLegacyBulletPrefix(section) {
140
+ return section.startsWith(LEGACY_BULLET_PREFIX) ? section.slice(LEGACY_BULLET_PREFIX.length) : section;
141
+ }
142
+ function splitShareDescriptionSections(value) {
138
143
  const trimmed = value.trim();
139
144
  if (!trimmed) {
140
- return "";
145
+ return [];
146
+ }
147
+ if (trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
148
+ return trimmed.split(SHARE_DESCRIPTION_SECTION_SEPARATOR).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
141
149
  }
142
150
  if (/\n\n/.test(trimmed)) {
143
- return trimmed.split(/\n\n+/).map((section) => section.replace(/\s+/g, " ").trim()).filter(Boolean).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
151
+ return trimmed.split(/\n\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
144
152
  }
145
- return trimmed.replace(/\s+/g, " ").trim();
153
+ if (/\n/.test(trimmed)) {
154
+ return trimmed.split(/\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
155
+ }
156
+ return [stripLegacyBulletPrefix(normalizeShareSection(trimmed))];
157
+ }
158
+ function collapseExcessiveBlankLines(value) {
159
+ return value.replace(/\n{4,}/g, "\n\n\n").trim();
160
+ }
161
+ function formatShareSectionsForMultilineDisplay(value) {
162
+ return collapseExcessiveBlankLines(
163
+ splitShareDescriptionSections(value).join(SHARE_DESCRIPTION_SECTION_BREAK)
164
+ );
146
165
  }
147
166
  function formatShareSectionsForCompactDisplay(value) {
167
+ return splitShareDescriptionSections(value).join(
168
+ SHARE_DESCRIPTION_SECTION_SEPARATOR
169
+ );
170
+ }
171
+ function normalizeShareOgDescription(value) {
148
172
  const trimmed = value.trim();
149
173
  if (!trimmed) {
150
174
  return "";
151
175
  }
152
- if (!/\n\n/.test(trimmed)) {
153
- return normalizeShareSection(trimmed);
176
+ if (/\n\n/.test(trimmed) || trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
177
+ return formatShareSectionsForCompactDisplay(trimmed);
154
178
  }
155
- return trimmed.split(/\n\n+/).map((section) => normalizeShareSection(section)).filter((section) => section.length > 0).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
179
+ return trimmed.replace(/\s+/g, " ").trim();
156
180
  }
157
- function buildFacebookShareQuote(title, description) {
158
- const titlePart = normalizeShareSection(title);
159
- const descriptionPart = normalizeShareSection(description);
160
- const bodyPart = descriptionPart ? formatShareSectionsForCompactDisplay(descriptionPart) : "";
161
- const parts = [titlePart, bodyPart].filter((part) => part.length > 0);
162
- return parts.length > 0 ? parts.join(SHARE_DESCRIPTION_SECTION_SEPARATOR) : void 0;
181
+ function buildFacebookShareQuote(_title, description) {
182
+ const body = formatShareSectionsForMultilineDisplay(description);
183
+ return body.length > 0 ? body : void 0;
184
+ }
185
+ function buildShareOgDescription(_title, description) {
186
+ const multiline = formatShareSectionsForMultilineDisplay(description);
187
+ if (multiline) {
188
+ return multiline;
189
+ }
190
+ return normalizeShareOgDescription(description);
163
191
  }
164
192
 
165
193
  // src/sharing/normalizeShareRouteId.ts
@@ -177,6 +205,7 @@ function buildSharePagePath(resourceType, rawId) {
177
205
  export {
178
206
  formatCategoryLabel,
179
207
  SHARE_DESCRIPTION_SECTION_SEPARATOR,
208
+ SHARE_DESCRIPTION_SECTION_BREAK,
180
209
  SHARE_COMPACT_SECTION_SEPARATOR,
181
210
  joinShareDescriptionSections,
182
211
  buildInvitationShareDescription,
@@ -195,10 +224,12 @@ export {
195
224
  RESOURCE_SHARE_TYPES_FOR_URL,
196
225
  SHARE_TYPE_PATH_REGEX,
197
226
  buildShareUrl,
198
- normalizeShareOgDescription,
227
+ formatShareSectionsForMultilineDisplay,
199
228
  formatShareSectionsForCompactDisplay,
229
+ normalizeShareOgDescription,
200
230
  buildFacebookShareQuote,
231
+ buildShareOgDescription,
201
232
  normalizeShareRouteId,
202
233
  buildSharePagePath
203
234
  };
204
- //# sourceMappingURL=chunk-36TVNR7V.mjs.map
235
+ //# sourceMappingURL=chunk-S7M7375H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sharing/formatCategoryLabel.ts","../src/sharing/joinShareDescriptionSections.ts","../src/sharing/buildRelationShareDescription.ts","../src/sharing/relationShareTypes.ts","../src/sharing/constants.ts","../src/sharing/buildShareUrl.ts","../src/sharing/normalizeShareDescription.ts","../src/sharing/normalizeShareRouteId.ts"],"sourcesContent":["import type { ShareVendorCategory } from \"./shareRelationTypes\";\n\nexport function formatCategoryLabel(category: ShareVendorCategory): string {\n const subcategoryNames = category.subcategories\n .map((subcategory) => subcategory.name)\n .filter(Boolean);\n\n if (subcategoryNames.length === 0) {\n return category.name;\n }\n\n return `${category.name} (${subcategoryNames.join(\", \")})`;\n}\n","/** Visible separator for multi-block share text when line breaks are stripped (legacy OG). */\nexport const SHARE_DESCRIPTION_SECTION_SEPARATOR = \" · \";\n\n/** Blank line between share sections — title, address, dates, URL, etc. */\nexport const SHARE_DESCRIPTION_SECTION_BREAK = \"\\n\\n\";\n\n/** @deprecated Use {@link SHARE_DESCRIPTION_SECTION_SEPARATOR}. */\nexport const SHARE_COMPACT_SECTION_SEPARATOR =\n SHARE_DESCRIPTION_SECTION_SEPARATOR;\n\nexport function joinShareDescriptionSections(\n sections: ReadonlyArray<string | false | null | undefined>,\n): string {\n return sections\n .filter((section): section is string => Boolean(section))\n .join(SHARE_DESCRIPTION_SECTION_BREAK);\n}\n","import { formatCategoryLabel } from \"./formatCategoryLabel\";\nimport { joinShareDescriptionSections } from \"./joinShareDescriptionSections\";\nimport type {\n ShareEventForInvitation,\n ShareEventInfoForInvitation,\n ShareVendorForApplication,\n ShareVendorInfoForApplication,\n} from \"./shareRelationTypes\";\n\nexport type {\n ShareEventDateTime,\n ShareEventForInvitation,\n ShareEventInfoForInvitation,\n ShareStallType,\n ShareVendorCategory,\n ShareVendorForApplication,\n ShareVendorInfoForApplication,\n} from \"./shareRelationTypes\";\n\nfunction formatShareDate(isoDate: string): string {\n try {\n return new Intl.DateTimeFormat(\"en-NZ\", {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n }).format(new Date(isoDate));\n } catch {\n return isoDate;\n }\n}\n\nexport function buildInvitationShareDescription(\n event: ShareEventForInvitation,\n eventInfo: ShareEventInfoForInvitation | null | undefined,\n): string {\n const stallTypes =\n eventInfo?.dateTime?.flatMap((date) => date.stallTypes) ?? [];\n\n if (!eventInfo || stallTypes.length === 0) {\n return event.description?.trim() || \"\";\n }\n\n const requirementLabels = (eventInfo.requirements ?? [])\n .filter((item) => item.value)\n .map((item) => item.label);\n\n const sections = [\n event.location.fullAddress,\n ...event.dateTime.map((date) => {\n const start = formatShareDate(date.startDate);\n const end = date.endDate ? ` – ${formatShareDate(date.endDate)}` : \"\";\n return `Market date: ${start}${end}`;\n }),\n `Application deadline: vendors must apply at least ${eventInfo.applicationDeadlineHours} hours before each market date.`,\n ...stallTypes.map(\n (stall) =>\n `Stall: ${stall.label} — $${stall.price} (${stall.stallCapacity} spaces)`,\n ),\n requirementLabels.length > 0 &&\n `Requirements: ${requirementLabels.join(\", \")}`,\n ];\n\n return joinShareDescriptionSections(sections);\n}\n\nexport function buildApplicationShareDescription(\n vendor: ShareVendorForApplication,\n vendorInfo: ShareVendorInfoForApplication | null | undefined,\n): string {\n const categoryLabels = vendor.categories.map((category) =>\n formatCategoryLabel(category),\n );\n\n if (!vendorInfo) {\n return vendor.description?.trim() || \"\";\n }\n\n const compliance = vendorInfo.compliance;\n const complianceLabels = [\n compliance?.liabilityInsurance && \"Liability insurance\",\n compliance?.foodBeverageLicense && \"Food & beverage licence\",\n ].filter(Boolean);\n\n const profileDescription = vendor.description?.trim();\n\n const sections = [\n categoryLabels.length > 0 && `Categories: ${categoryLabels.join(\", \")}`,\n `Stall size: ${vendorInfo.stallInfo.size.width}m × ${vendorInfo.stallInfo.size.depth}m`,\n `Compliance: ${complianceLabels.length > 0 ? complianceLabels.join(\", \") : \"Not specified\"}`,\n `Price range: $${vendorInfo.product.priceRange.min} – $${vendorInfo.product.priceRange.max}`,\n profileDescription,\n ];\n\n return joinShareDescriptionSections(sections);\n}\n","/** Path segments for relation share URLs — must match mobile `RelationTitle` values. */\nexport const RELATION_SHARE_INVITATION = \"invitation\" as const;\nexport const RELATION_SHARE_APPLICATION = \"application\" as const;\n\nexport const RELATION_SHARE_RESOURCE_TYPES = [\n RELATION_SHARE_INVITATION,\n RELATION_SHARE_APPLICATION,\n] as const;\n\nexport type RelationShareResourceType =\n (typeof RELATION_SHARE_RESOURCE_TYPES)[number];\n\nexport function isRelationShareResourceType(\n resourceType: string,\n): resourceType is RelationShareResourceType {\n return (RELATION_SHARE_RESOURCE_TYPES as readonly string[]).includes(\n resourceType,\n );\n}\n","import {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n type RelationShareResourceType,\n} from \"./relationShareTypes\";\n\nexport {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n RELATION_SHARE_RESOURCE_TYPES,\n isRelationShareResourceType,\n type RelationShareResourceType,\n} from \"./relationShareTypes\";\n\nexport const SHARE_SITE_URL = \"https://cluemart.co.nz\";\n\nexport const DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;\n\nexport const RESOURCE_SHARE_TYPES = [\n \"market\",\n \"stallholder\",\n \"partner\",\n] as const;\n\nexport type ResourceShareType = (typeof RESOURCE_SHARE_TYPES)[number];\n\nexport const POST_SHARE_RESOURCE_TYPES = [\n \"daily_meets\",\n \"daily_tips\",\n \"daily_games\",\n] as const;\n\nexport type PostShareResourceType = (typeof POST_SHARE_RESOURCE_TYPES)[number];\n\nexport type ShareResourceType =\n | ResourceShareType\n | PostShareResourceType\n | RelationShareResourceType;\n\nexport const SHARE_RESOURCE_LABEL: Record<ShareResourceType, string> = {\n [RELATION_SHARE_APPLICATION]: \"Application\",\n [RELATION_SHARE_INVITATION]: \"Invitation\",\n daily_games: \"Daily Game\",\n daily_meets: \"Daily Meet\",\n daily_tips: \"Daily Tip\",\n market: \"Market\",\n partner: \"Partner\",\n stallholder: \"Stallholder\",\n};\n\nexport function isPostShareResourceType(\n resourceType: ShareResourceType,\n): resourceType is PostShareResourceType {\n return (POST_SHARE_RESOURCE_TYPES as readonly string[]).includes(\n resourceType,\n );\n}\n","import {\n POST_SHARE_RESOURCE_TYPES,\n RESOURCE_SHARE_TYPES,\n SHARE_SITE_URL,\n} from \"./constants\";\nimport {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n} from \"./relationShareTypes\";\n\n/** Path segments for public resource share URLs (markets, posts, etc.). */\nexport const PUBLIC_SHARE_PATH_TYPES = [\n ...RESOURCE_SHARE_TYPES,\n ...POST_SHARE_RESOURCE_TYPES,\n] as const;\n\nexport type PublicSharePathType = (typeof PUBLIC_SHARE_PATH_TYPES)[number];\n\n/** @deprecated Use {@link PUBLIC_SHARE_PATH_TYPES} — kept for mobile deep-link helpers. */\nexport const RESOURCE_SHARE_TYPES_FOR_URL = PUBLIC_SHARE_PATH_TYPES;\n\nexport type RelationSharePathType =\n | typeof RELATION_SHARE_INVITATION\n | typeof RELATION_SHARE_APPLICATION;\n\nexport type ShareType = PublicSharePathType | RelationSharePathType;\n\n/** Alternation for deep-link regexes — keep in sync with {@link ShareType}. */\nexport const SHARE_TYPE_PATH_REGEX = [\n ...PUBLIC_SHARE_PATH_TYPES,\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n].join(\"|\");\n\nexport function buildShareUrl(type: ShareType, id: string): string {\n return `${SHARE_SITE_URL}/share/${type}/${encodeURIComponent(id)}`;\n}\n","import {\n SHARE_DESCRIPTION_SECTION_BREAK,\n SHARE_DESCRIPTION_SECTION_SEPARATOR,\n} from \"./joinShareDescriptionSections\";\n\nconst LEGACY_BULLET_PREFIX = \"• \";\n\n/** Trims a share section and collapses spaces per line; preserves line breaks. */\nfunction normalizeShareSection(value: string | null | undefined): string {\n if (value == null) {\n return \"\";\n }\n return value\n .trim()\n .split(\"\\n\")\n .map((line) => line.trim().replace(/[ \\t]+/g, \" \"))\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\nfunction stripLegacyBulletPrefix(section: string): string {\n return section.startsWith(LEGACY_BULLET_PREFIX)\n ? section.slice(LEGACY_BULLET_PREFIX.length)\n : section;\n}\n\nfunction splitShareDescriptionSections(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed) {\n return [];\n }\n\n if (trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {\n return trimmed\n .split(SHARE_DESCRIPTION_SECTION_SEPARATOR)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n if (/\\n\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n\\n+/)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n if (/\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n+/)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n return [stripLegacyBulletPrefix(normalizeShareSection(trimmed))];\n}\n\nfunction collapseExcessiveBlankLines(value: string): string {\n return value.replace(/\\n{4,}/g, \"\\n\\n\\n\").trim();\n}\n\n/**\n * Share copy with a blank line between each section (all apps, Facebook quote, OG body).\n */\nexport function formatShareSectionsForMultilineDisplay(value: string): string {\n return collapseExcessiveBlankLines(\n splitShareDescriptionSections(value).join(SHARE_DESCRIPTION_SECTION_BREAK),\n );\n}\n\n/**\n * Formats multiline share copy for UIs that strip line breaks (legacy OG one-liners).\n */\nexport function formatShareSectionsForCompactDisplay(value: string): string {\n return splitShareDescriptionSections(value).join(\n SHARE_DESCRIPTION_SECTION_SEPARATOR,\n );\n}\n\n/**\n * Formats share descriptions for Open Graph / Twitter meta tags when crawlers\n * collapse line breaks.\n */\nexport function normalizeShareOgDescription(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (/\\n\\n/.test(trimmed) || trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {\n return formatShareSectionsForCompactDisplay(trimmed);\n }\n\n return trimmed.replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Quote text for Facebook ShareDialog. Body only — the link card shows the title.\n */\nexport function buildFacebookShareQuote(\n _title: string,\n description: string,\n): string | undefined {\n const body = formatShareSectionsForMultilineDisplay(description);\n return body.length > 0 ? body : undefined;\n}\n\n/**\n * Open Graph / Twitter description — multiline body without repeating `og:title`.\n */\nexport function buildShareOgDescription(\n _title: string,\n description: string,\n): string {\n const multiline = formatShareSectionsForMultilineDisplay(description);\n if (multiline) {\n return multiline;\n }\n return normalizeShareOgDescription(description);\n}\n","import type { ShareResourceType } from \"./constants\";\n\nexport function normalizeShareRouteId(id: string): string {\n try {\n return decodeURIComponent(id);\n } catch {\n return id;\n }\n}\n\nexport function buildSharePagePath(\n resourceType: ShareResourceType,\n rawId: string,\n): string {\n return `/share/${resourceType}/${encodeURIComponent(normalizeShareRouteId(rawId))}`;\n}\n"],"mappings":"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","names":[]}
@@ -28,7 +28,7 @@ import {
28
28
  EnumVendorType
29
29
  } from "../chunk-ZR4TGWTS.mjs";
30
30
  import "../chunk-S2VBOUOO.mjs";
31
- import "../chunk-36TVNR7V.mjs";
31
+ import "../chunk-S7M7375H.mjs";
32
32
  import "../chunk-DWO35OY4.mjs";
33
33
  import "../chunk-VA5YN2K3.mjs";
34
34
 
package/dist/index.cjs CHANGED
@@ -81,6 +81,7 @@ __export(index_exports, {
81
81
  SCHOOL_MAX_STUDENT_COUNT: () => SCHOOL_MAX_STUDENT_COUNT,
82
82
  SCHOOL_MIN_STUDENT_COUNT: () => SCHOOL_MIN_STUDENT_COUNT,
83
83
  SHARE_COMPACT_SECTION_SEPARATOR: () => SHARE_COMPACT_SECTION_SEPARATOR,
84
+ SHARE_DESCRIPTION_SECTION_BREAK: () => SHARE_DESCRIPTION_SECTION_BREAK,
84
85
  SHARE_DESCRIPTION_SECTION_SEPARATOR: () => SHARE_DESCRIPTION_SECTION_SEPARATOR,
85
86
  SHARE_RESOURCE_LABEL: () => SHARE_RESOURCE_LABEL,
86
87
  SHARE_SITE_URL: () => SHARE_SITE_URL,
@@ -96,6 +97,7 @@ __export(index_exports, {
96
97
  buildApplicationShareDescription: () => buildApplicationShareDescription,
97
98
  buildFacebookShareQuote: () => buildFacebookShareQuote,
98
99
  buildInvitationShareDescription: () => buildInvitationShareDescription,
100
+ buildShareOgDescription: () => buildShareOgDescription,
99
101
  buildSharePagePath: () => buildSharePagePath,
100
102
  buildShareUrl: () => buildShareUrl,
101
103
  capitalizeFirstLetter: () => capitalizeFirstLetter,
@@ -127,6 +129,7 @@ __export(index_exports, {
127
129
  formatCategoryLabel: () => formatCategoryLabel,
128
130
  formatDate: () => formatDate,
129
131
  formatShareSectionsForCompactDisplay: () => formatShareSectionsForCompactDisplay,
132
+ formatShareSectionsForMultilineDisplay: () => formatShareSectionsForMultilineDisplay,
130
133
  formatTimestamp: () => formatTimestamp,
131
134
  gameScreenIdentifierList: () => gameScreenIdentifierList,
132
135
  gameTypeToDisplayName: () => gameTypeToDisplayName,
@@ -8837,9 +8840,10 @@ function formatCategoryLabel(category) {
8837
8840
 
8838
8841
  // src/sharing/joinShareDescriptionSections.ts
8839
8842
  var SHARE_DESCRIPTION_SECTION_SEPARATOR = " \xB7 ";
8843
+ var SHARE_DESCRIPTION_SECTION_BREAK = "\n\n";
8840
8844
  var SHARE_COMPACT_SECTION_SEPARATOR = SHARE_DESCRIPTION_SECTION_SEPARATOR;
8841
8845
  function joinShareDescriptionSections(sections) {
8842
- return sections.filter((section) => Boolean(section)).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
8846
+ return sections.filter((section) => Boolean(section)).join(SHARE_DESCRIPTION_SECTION_BREAK);
8843
8847
  }
8844
8848
 
8845
8849
  // src/sharing/buildRelationShareDescription.ts
@@ -8956,38 +8960,65 @@ function buildShareUrl(type, id) {
8956
8960
  }
8957
8961
 
8958
8962
  // src/sharing/normalizeShareDescription.ts
8963
+ var LEGACY_BULLET_PREFIX = "\u2022 ";
8959
8964
  function normalizeShareSection(value) {
8960
8965
  if (value == null) {
8961
8966
  return "";
8962
8967
  }
8963
8968
  return value.trim().split("\n").map((line) => line.trim().replace(/[ \t]+/g, " ")).join("\n").replace(/\n{3,}/g, "\n\n");
8964
8969
  }
8965
- function normalizeShareOgDescription(value) {
8970
+ function stripLegacyBulletPrefix(section) {
8971
+ return section.startsWith(LEGACY_BULLET_PREFIX) ? section.slice(LEGACY_BULLET_PREFIX.length) : section;
8972
+ }
8973
+ function splitShareDescriptionSections(value) {
8966
8974
  const trimmed = value.trim();
8967
8975
  if (!trimmed) {
8968
- return "";
8976
+ return [];
8977
+ }
8978
+ if (trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
8979
+ return trimmed.split(SHARE_DESCRIPTION_SECTION_SEPARATOR).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
8969
8980
  }
8970
8981
  if (/\n\n/.test(trimmed)) {
8971
- return trimmed.split(/\n\n+/).map((section) => section.replace(/\s+/g, " ").trim()).filter(Boolean).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
8982
+ return trimmed.split(/\n\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
8972
8983
  }
8973
- return trimmed.replace(/\s+/g, " ").trim();
8984
+ if (/\n/.test(trimmed)) {
8985
+ return trimmed.split(/\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
8986
+ }
8987
+ return [stripLegacyBulletPrefix(normalizeShareSection(trimmed))];
8988
+ }
8989
+ function collapseExcessiveBlankLines(value) {
8990
+ return value.replace(/\n{4,}/g, "\n\n\n").trim();
8991
+ }
8992
+ function formatShareSectionsForMultilineDisplay(value) {
8993
+ return collapseExcessiveBlankLines(
8994
+ splitShareDescriptionSections(value).join(SHARE_DESCRIPTION_SECTION_BREAK)
8995
+ );
8974
8996
  }
8975
8997
  function formatShareSectionsForCompactDisplay(value) {
8998
+ return splitShareDescriptionSections(value).join(
8999
+ SHARE_DESCRIPTION_SECTION_SEPARATOR
9000
+ );
9001
+ }
9002
+ function normalizeShareOgDescription(value) {
8976
9003
  const trimmed = value.trim();
8977
9004
  if (!trimmed) {
8978
9005
  return "";
8979
9006
  }
8980
- if (!/\n\n/.test(trimmed)) {
8981
- return normalizeShareSection(trimmed);
9007
+ if (/\n\n/.test(trimmed) || trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
9008
+ return formatShareSectionsForCompactDisplay(trimmed);
8982
9009
  }
8983
- return trimmed.split(/\n\n+/).map((section) => normalizeShareSection(section)).filter((section) => section.length > 0).join(SHARE_DESCRIPTION_SECTION_SEPARATOR);
9010
+ return trimmed.replace(/\s+/g, " ").trim();
8984
9011
  }
8985
- function buildFacebookShareQuote(title, description) {
8986
- const titlePart = normalizeShareSection(title);
8987
- const descriptionPart = normalizeShareSection(description);
8988
- const bodyPart = descriptionPart ? formatShareSectionsForCompactDisplay(descriptionPart) : "";
8989
- const parts = [titlePart, bodyPart].filter((part) => part.length > 0);
8990
- return parts.length > 0 ? parts.join(SHARE_DESCRIPTION_SECTION_SEPARATOR) : void 0;
9012
+ function buildFacebookShareQuote(_title, description) {
9013
+ const body = formatShareSectionsForMultilineDisplay(description);
9014
+ return body.length > 0 ? body : void 0;
9015
+ }
9016
+ function buildShareOgDescription(_title, description) {
9017
+ const multiline = formatShareSectionsForMultilineDisplay(description);
9018
+ if (multiline) {
9019
+ return multiline;
9020
+ }
9021
+ return normalizeShareOgDescription(description);
8991
9022
  }
8992
9023
 
8993
9024
  // src/sharing/normalizeShareRouteId.ts
@@ -9143,6 +9174,7 @@ var gameTypeToDisplayName = {
9143
9174
  SCHOOL_MAX_STUDENT_COUNT,
9144
9175
  SCHOOL_MIN_STUDENT_COUNT,
9145
9176
  SHARE_COMPACT_SECTION_SEPARATOR,
9177
+ SHARE_DESCRIPTION_SECTION_BREAK,
9146
9178
  SHARE_DESCRIPTION_SECTION_SEPARATOR,
9147
9179
  SHARE_RESOURCE_LABEL,
9148
9180
  SHARE_SITE_URL,
@@ -9158,6 +9190,7 @@ var gameTypeToDisplayName = {
9158
9190
  buildApplicationShareDescription,
9159
9191
  buildFacebookShareQuote,
9160
9192
  buildInvitationShareDescription,
9193
+ buildShareOgDescription,
9161
9194
  buildSharePagePath,
9162
9195
  buildShareUrl,
9163
9196
  capitalizeFirstLetter,
@@ -9189,6 +9222,7 @@ var gameTypeToDisplayName = {
9189
9222
  formatCategoryLabel,
9190
9223
  formatDate,
9191
9224
  formatShareSectionsForCompactDisplay,
9225
+ formatShareSectionsForMultilineDisplay,
9192
9226
  formatTimestamp,
9193
9227
  gameScreenIdentifierList,
9194
9228
  gameTypeToDisplayName,