@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.
- package/dist/{chunk-36TVNR7V.mjs → chunk-S7M7375H.mjs} +47 -16
- package/dist/chunk-S7M7375H.mjs.map +1 -0
- package/dist/hooks/index.mjs +1 -1
- package/dist/index.cjs +48 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +18 -9
- package/dist/index.d.ts +18 -9
- package/dist/index.mjs +45 -14
- package/dist/index.mjs.map +1 -1
- package/dist/sharing/index.cjs +48 -14
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.d.mts +18 -9
- package/dist/sharing/index.d.ts +18 -9
- package/dist/sharing/index.mjs +7 -1
- package/package.json +1 -1
- package/dist/chunk-36TVNR7V.mjs.map +0 -1
|
@@ -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(
|
|
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
|
|
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) =>
|
|
151
|
+
return trimmed.split(/\n\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
|
|
144
152
|
}
|
|
145
|
-
|
|
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 (
|
|
153
|
-
return
|
|
176
|
+
if (/\n\n/.test(trimmed) || trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
|
|
177
|
+
return formatShareSectionsForCompactDisplay(trimmed);
|
|
154
178
|
}
|
|
155
|
-
return trimmed.
|
|
179
|
+
return trimmed.replace(/\s+/g, " ").trim();
|
|
156
180
|
}
|
|
157
|
-
function buildFacebookShareQuote(
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
227
|
+
formatShareSectionsForMultilineDisplay,
|
|
199
228
|
formatShareSectionsForCompactDisplay,
|
|
229
|
+
normalizeShareOgDescription,
|
|
200
230
|
buildFacebookShareQuote,
|
|
231
|
+
buildShareOgDescription,
|
|
201
232
|
normalizeShareRouteId,
|
|
202
233
|
buildSharePagePath
|
|
203
234
|
};
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
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":[]}
|
package/dist/hooks/index.mjs
CHANGED
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(
|
|
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
|
|
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) =>
|
|
8982
|
+
return trimmed.split(/\n\n+/).map((section) => stripLegacyBulletPrefix(normalizeShareSection(section))).filter((section) => section.length > 0);
|
|
8972
8983
|
}
|
|
8973
|
-
|
|
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 (
|
|
8981
|
-
return
|
|
9007
|
+
if (/\n\n/.test(trimmed) || trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {
|
|
9008
|
+
return formatShareSectionsForCompactDisplay(trimmed);
|
|
8982
9009
|
}
|
|
8983
|
-
return trimmed.
|
|
9010
|
+
return trimmed.replace(/\s+/g, " ").trim();
|
|
8984
9011
|
}
|
|
8985
|
-
function buildFacebookShareQuote(
|
|
8986
|
-
const
|
|
8987
|
-
|
|
8988
|
-
|
|
8989
|
-
|
|
8990
|
-
|
|
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,
|