@@ -7,8 +7,14 @@ let resolveDiscordComponentEntry: typeof import("./components-registry.js").reso
77let resolveDiscordComponentEntryWithPersistence : typeof import ( "./components-registry.js" ) . resolveDiscordComponentEntryWithPersistence ;
88let resolveDiscordModalEntry : typeof import ( "./components-registry.js" ) . resolveDiscordModalEntry ;
99let resolveDiscordModalEntryWithPersistence : typeof import ( "./components-registry.js" ) . resolveDiscordModalEntryWithPersistence ;
10+ let buildDiscordComponentCustomId : typeof import ( "./components.js" ) . buildDiscordComponentCustomId ;
1011let buildDiscordComponentMessage : typeof import ( "./components.js" ) . buildDiscordComponentMessage ;
1112let buildDiscordComponentMessageFlags : typeof import ( "./components.js" ) . buildDiscordComponentMessageFlags ;
13+ let buildDiscordModalCustomId : typeof import ( "./components.js" ) . buildDiscordModalCustomId ;
14+ let parseDiscordComponentCustomId : typeof import ( "./components.js" ) . parseDiscordComponentCustomId ;
15+ let parseDiscordComponentCustomIdForInteraction : typeof import ( "./components.js" ) . parseDiscordComponentCustomIdForInteraction ;
16+ let parseDiscordModalCustomId : typeof import ( "./components.js" ) . parseDiscordModalCustomId ;
17+ let parseDiscordModalCustomIdForInteraction : typeof import ( "./components.js" ) . parseDiscordModalCustomIdForInteraction ;
1218let readDiscordComponentSpec : typeof import ( "./components.js" ) . readDiscordComponentSpec ;
1319
1420beforeAll ( async ( ) => {
@@ -20,11 +26,57 @@ beforeAll(async () => {
2026 resolveDiscordModalEntry,
2127 resolveDiscordModalEntryWithPersistence,
2228 } = await import ( "./components-registry.js" ) ) ;
23- ( { buildDiscordComponentMessage, buildDiscordComponentMessageFlags, readDiscordComponentSpec } =
24- await import ( "./components.js" ) ) ;
29+ ( {
30+ buildDiscordComponentCustomId,
31+ buildDiscordComponentMessage,
32+ buildDiscordComponentMessageFlags,
33+ buildDiscordModalCustomId,
34+ parseDiscordComponentCustomId,
35+ parseDiscordComponentCustomIdForInteraction,
36+ parseDiscordModalCustomId,
37+ parseDiscordModalCustomIdForInteraction,
38+ readDiscordComponentSpec,
39+ } = await import ( "./components.js" ) ) ;
2540} ) ;
2641
2742describe ( "discord components" , ( ) => {
43+ it ( "round-trips custom id values that contain separators" , ( ) => {
44+ const componentId = "button=a;two space%3B" ;
45+ const modalId = "modal=x;y space%3D" ;
46+
47+ const componentCustomId = buildDiscordComponentCustomId ( { componentId, modalId } ) ;
48+ expect ( componentCustomId ) . not . toContain ( componentId ) ;
49+ expect ( componentCustomId ) . toContain ( "space" ) ;
50+ expect ( parseDiscordComponentCustomId ( componentCustomId ) ) . toEqual ( { componentId, modalId } ) ;
51+ expect ( parseDiscordComponentCustomIdForInteraction ( componentCustomId ) . data ) . toMatchObject ( {
52+ cid : componentId ,
53+ mid : modalId ,
54+ } ) ;
55+
56+ const modalCustomId = buildDiscordModalCustomId ( modalId ) ;
57+ expect ( modalCustomId ) . not . toContain ( modalId ) ;
58+ expect ( modalCustomId ) . toContain ( "space" ) ;
59+ expect ( parseDiscordModalCustomId ( modalCustomId ) ) . toBe ( modalId ) ;
60+ expect ( parseDiscordModalCustomIdForInteraction ( modalCustomId ) . data ) . toMatchObject ( {
61+ mid : modalId ,
62+ } ) ;
63+ } ) ;
64+
65+ it ( "keeps legacy percent-like custom id values raw" , ( ) => {
66+ expect ( buildDiscordComponentCustomId ( { componentId : "button_v1" } ) ) . toBe (
67+ "occomp:cid=button_v1" ,
68+ ) ;
69+ expect ( buildDiscordComponentCustomId ( { componentId : "button=v1" } ) ) . toBe (
70+ "occomp:cid=button=v1" ,
71+ ) ;
72+ expect ( buildDiscordModalCustomId ( "modal_v1" ) ) . toBe ( "ocmodal:mid=modal_v1" ) ;
73+ expect ( buildDiscordModalCustomId ( "modal=v1" ) ) . toBe ( "ocmodal:mid=modal=v1" ) ;
74+ expect ( parseDiscordComponentCustomId ( "occomp:cid=button%3Bv1" ) ) . toEqual ( {
75+ componentId : "button%3Bv1" ,
76+ } ) ;
77+ expect ( parseDiscordModalCustomId ( "ocmodal:mid=modal%3Dv1" ) ) . toBe ( "modal%3Dv1" ) ;
78+ } ) ;
79+
2880 it ( "builds v2 containers with modal trigger" , ( ) => {
2981 const spec = readDiscordComponentSpec ( {
3082 text : "Choose a path" ,
0 commit comments