@bash-app/bash-common 30.432.0 → 30.434.0

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.
Files changed (164) hide show
  1. package/dist/__tests__/appleIapProducts.test.js +1 -0
  2. package/dist/__tests__/appleIapProducts.test.js.map +1 -1
  3. package/dist/__tests__/bashSectionTitleForBashType.test.js +2 -0
  4. package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
  5. package/dist/__tests__/discoveryScope.test.js +9 -1
  6. package/dist/__tests__/discoveryScope.test.js.map +1 -1
  7. package/dist/__tests__/promoCartEngine.test.d.ts +2 -0
  8. package/dist/__tests__/promoCartEngine.test.d.ts.map +1 -0
  9. package/dist/__tests__/promoCartEngine.test.js +174 -0
  10. package/dist/__tests__/promoCartEngine.test.js.map +1 -0
  11. package/dist/__tests__/promoCodeRedemption.test.d.ts +2 -0
  12. package/dist/__tests__/promoCodeRedemption.test.d.ts.map +1 -0
  13. package/dist/__tests__/promoCodeRedemption.test.js +103 -0
  14. package/dist/__tests__/promoCodeRedemption.test.js.map +1 -0
  15. package/dist/__tests__/promoCodeScope.test.d.ts +2 -0
  16. package/dist/__tests__/promoCodeScope.test.d.ts.map +1 -0
  17. package/dist/__tests__/promoCodeScope.test.js +84 -0
  18. package/dist/__tests__/promoCodeScope.test.js.map +1 -0
  19. package/dist/__tests__/statusEnums.test.js +1 -0
  20. package/dist/__tests__/statusEnums.test.js.map +1 -1
  21. package/dist/appleIapProducts.d.ts +12 -2
  22. package/dist/appleIapProducts.d.ts.map +1 -1
  23. package/dist/appleIapProducts.js +13 -0
  24. package/dist/appleIapProducts.js.map +1 -1
  25. package/dist/definitions.d.ts +3 -1
  26. package/dist/definitions.d.ts.map +1 -1
  27. package/dist/definitions.js +4 -2
  28. package/dist/definitions.js.map +1 -1
  29. package/dist/discoveryScope.d.ts +6 -6
  30. package/dist/discoveryScope.d.ts.map +1 -1
  31. package/dist/discoveryScope.js +25 -16
  32. package/dist/discoveryScope.js.map +1 -1
  33. package/dist/extendedSchemas.d.ts +1 -0
  34. package/dist/extendedSchemas.d.ts.map +1 -1
  35. package/dist/extendedSchemas.js.map +1 -1
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +4 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/intros/__tests__/introsReleaseGates.test.d.ts +2 -0
  41. package/dist/intros/__tests__/introsReleaseGates.test.d.ts.map +1 -0
  42. package/dist/intros/__tests__/introsReleaseGates.test.js +140 -0
  43. package/dist/intros/__tests__/introsReleaseGates.test.js.map +1 -0
  44. package/dist/intros/__tests__/psychExperiment.test.d.ts +2 -0
  45. package/dist/intros/__tests__/psychExperiment.test.d.ts.map +1 -0
  46. package/dist/intros/__tests__/psychExperiment.test.js +63 -0
  47. package/dist/intros/__tests__/psychExperiment.test.js.map +1 -0
  48. package/dist/intros/__tests__/reasons.test.d.ts +2 -0
  49. package/dist/intros/__tests__/reasons.test.d.ts.map +1 -0
  50. package/dist/intros/__tests__/reasons.test.js +72 -0
  51. package/dist/intros/__tests__/reasons.test.js.map +1 -0
  52. package/dist/intros/__tests__/sharedNotes.test.d.ts +2 -0
  53. package/dist/intros/__tests__/sharedNotes.test.d.ts.map +1 -0
  54. package/dist/intros/__tests__/sharedNotes.test.js +19 -0
  55. package/dist/intros/__tests__/sharedNotes.test.js.map +1 -0
  56. package/dist/intros/__tests__/transitions.test.d.ts +2 -0
  57. package/dist/intros/__tests__/transitions.test.d.ts.map +1 -0
  58. package/dist/intros/__tests__/transitions.test.js +43 -0
  59. package/dist/intros/__tests__/transitions.test.js.map +1 -0
  60. package/dist/intros/__tests__/warmDisclosure.test.d.ts +2 -0
  61. package/dist/intros/__tests__/warmDisclosure.test.d.ts.map +1 -0
  62. package/dist/intros/__tests__/warmDisclosure.test.js +10 -0
  63. package/dist/intros/__tests__/warmDisclosure.test.js.map +1 -0
  64. package/dist/intros/age.d.ts +4 -0
  65. package/dist/intros/age.d.ts.map +1 -0
  66. package/dist/intros/age.js +14 -0
  67. package/dist/intros/age.js.map +1 -0
  68. package/dist/intros/attendance.d.ts +11 -0
  69. package/dist/intros/attendance.d.ts.map +1 -0
  70. package/dist/intros/attendance.js +27 -0
  71. package/dist/intros/attendance.js.map +1 -0
  72. package/dist/intros/attributeCatalog.d.ts +17 -0
  73. package/dist/intros/attributeCatalog.d.ts.map +1 -0
  74. package/dist/intros/attributeCatalog.js +96 -0
  75. package/dist/intros/attributeCatalog.js.map +1 -0
  76. package/dist/intros/index.d.ts +10 -0
  77. package/dist/intros/index.d.ts.map +1 -0
  78. package/dist/intros/index.js +10 -0
  79. package/dist/intros/index.js.map +1 -0
  80. package/dist/intros/intents.d.ts +8 -0
  81. package/dist/intros/intents.d.ts.map +1 -0
  82. package/dist/intros/intents.js +44 -0
  83. package/dist/intros/intents.js.map +1 -0
  84. package/dist/intros/psychExperiment.d.ts +29 -0
  85. package/dist/intros/psychExperiment.d.ts.map +1 -0
  86. package/dist/intros/psychExperiment.js +82 -0
  87. package/dist/intros/psychExperiment.js.map +1 -0
  88. package/dist/intros/reasons.d.ts +38 -0
  89. package/dist/intros/reasons.d.ts.map +1 -0
  90. package/dist/intros/reasons.js +162 -0
  91. package/dist/intros/reasons.js.map +1 -0
  92. package/dist/intros/sharedNotes.d.ts +10 -0
  93. package/dist/intros/sharedNotes.d.ts.map +1 -0
  94. package/dist/intros/sharedNotes.js +56 -0
  95. package/dist/intros/sharedNotes.js.map +1 -0
  96. package/dist/intros/transitions.d.ts +29 -0
  97. package/dist/intros/transitions.d.ts.map +1 -0
  98. package/dist/intros/transitions.js +128 -0
  99. package/dist/intros/transitions.js.map +1 -0
  100. package/dist/intros/validation.d.ts +50 -0
  101. package/dist/intros/validation.d.ts.map +1 -0
  102. package/dist/intros/validation.js +212 -0
  103. package/dist/intros/validation.js.map +1 -0
  104. package/dist/mirroredPrismaEnums.d.ts +1 -0
  105. package/dist/mirroredPrismaEnums.d.ts.map +1 -1
  106. package/dist/mirroredPrismaEnums.js +1 -0
  107. package/dist/mirroredPrismaEnums.js.map +1 -1
  108. package/dist/promoCartEngine.d.ts +55 -0
  109. package/dist/promoCartEngine.d.ts.map +1 -0
  110. package/dist/promoCartEngine.js +135 -0
  111. package/dist/promoCartEngine.js.map +1 -0
  112. package/dist/promoCodeRedemption.d.ts +44 -0
  113. package/dist/promoCodeRedemption.d.ts.map +1 -0
  114. package/dist/promoCodeRedemption.js +81 -0
  115. package/dist/promoCodeRedemption.js.map +1 -0
  116. package/dist/promoCodeScope.d.ts +91 -0
  117. package/dist/promoCodeScope.d.ts.map +1 -0
  118. package/dist/promoCodeScope.js +102 -0
  119. package/dist/promoCodeScope.js.map +1 -0
  120. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js +8 -1
  121. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js.map +1 -1
  122. package/dist/utils/__tests__/paymentUtils.test.js +87 -4
  123. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  124. package/dist/utils/paymentUtils.d.ts +30 -5
  125. package/dist/utils/paymentUtils.d.ts.map +1 -1
  126. package/dist/utils/paymentUtils.js +43 -11
  127. package/dist/utils/paymentUtils.js.map +1 -1
  128. package/package.json +1 -1
  129. package/prisma/schema.prisma +427 -6
  130. package/src/__tests__/appleIapProducts.test.ts +3 -0
  131. package/src/__tests__/bashSectionTitleForBashType.test.ts +4 -0
  132. package/src/__tests__/discoveryScope.test.ts +22 -1
  133. package/src/__tests__/promoCartEngine.test.ts +201 -0
  134. package/src/__tests__/promoCodeRedemption.test.ts +134 -0
  135. package/src/__tests__/promoCodeScope.test.ts +119 -0
  136. package/src/__tests__/statusEnums.test.ts +1 -0
  137. package/src/appleIapProducts.ts +29 -2
  138. package/src/definitions.ts +4 -2
  139. package/src/discoveryScope.ts +30 -20
  140. package/src/extendedSchemas.ts +1 -0
  141. package/src/index.ts +4 -0
  142. package/src/intros/__tests__/introsReleaseGates.test.ts +181 -0
  143. package/src/intros/__tests__/psychExperiment.test.ts +99 -0
  144. package/src/intros/__tests__/reasons.test.ts +122 -0
  145. package/src/intros/__tests__/sharedNotes.test.ts +20 -0
  146. package/src/intros/__tests__/transitions.test.ts +61 -0
  147. package/src/intros/__tests__/warmDisclosure.test.ts +10 -0
  148. package/src/intros/age.ts +13 -0
  149. package/src/intros/attendance.ts +33 -0
  150. package/src/intros/attributeCatalog.ts +113 -0
  151. package/src/intros/index.ts +9 -0
  152. package/src/intros/intents.ts +49 -0
  153. package/src/intros/psychExperiment.ts +130 -0
  154. package/src/intros/reasons.ts +187 -0
  155. package/src/intros/sharedNotes.ts +59 -0
  156. package/src/intros/transitions.ts +172 -0
  157. package/src/intros/validation.ts +248 -0
  158. package/src/mirroredPrismaEnums.ts +1 -0
  159. package/src/promoCartEngine.ts +193 -0
  160. package/src/promoCodeRedemption.ts +123 -0
  161. package/src/promoCodeScope.ts +180 -0
  162. package/src/utils/__tests__/discountEngine/discountCalculator.test.ts +8 -0
  163. package/src/utils/__tests__/paymentUtils.test.ts +100 -6
  164. package/src/utils/paymentUtils.ts +56 -13
@@ -0,0 +1,63 @@
1
+ import { introHint } from "../reasons.js";
2
+ import { appendPsychExperiment, experimentContribution, psychExperimentCode, rankWithExperiment, } from "../psychExperiment.js";
3
+ const closeEnergy = {
4
+ kind: "BigFive",
5
+ allowExperimentalMatching: true,
6
+ value: { extraversion: 80, openness: 10, conscientiousness: 10, agreeableness: 10, neuroticism: 10 },
7
+ };
8
+ describe("experimental psychology matching", () => {
9
+ it("adds no signal without both people's experiment consent", () => {
10
+ const other = { experimentConsent: true, attributes: [closeEnergy] };
11
+ expect(experimentContribution({ experimentConsent: false, attributes: [closeEnergy] }, other)).toEqual({ codes: [], rankBoost: 0 });
12
+ expect(psychExperimentCode({ experimentConsent: false, attributes: [closeEnergy] }, other)).toBeNull();
13
+ });
14
+ it("ignores an attribute the person did not allow, including Human Design", () => {
15
+ const design = {
16
+ kind: "HumanDesign",
17
+ allowExperimentalMatching: true,
18
+ value: "Generator",
19
+ };
20
+ const withheld = { ...closeEnergy, allowExperimentalMatching: false };
21
+ expect(experimentContribution({ experimentConsent: true, attributes: [design, withheld] }, { experimentConsent: true, attributes: [design, closeEnergy] }).rankBoost).toBe(0);
22
+ });
23
+ it("reorders on a consented social-energy note and does not expose the score", () => {
24
+ const contribution = experimentContribution({ experimentConsent: true, attributes: [closeEnergy] }, {
25
+ experimentConsent: true,
26
+ attributes: [{ ...closeEnergy, value: { ...closeEnergy.value, extraversion: 70 } }],
27
+ });
28
+ expect(contribution.rankBoost).toBe(1);
29
+ expect(contribution.codes).toContain("PSYCH_SIGNAL:similar_social_energy");
30
+ const codes = appendPsychExperiment(["INTENT:Friends"], { experimentConsent: true, attributes: [closeEnergy] }, { experimentConsent: true, attributes: [closeEnergy] }, true);
31
+ expect(introHint(codes)).toMatch(/social energy/i);
32
+ expect(introHint(codes)).toMatch(/not a compatibility score/i);
33
+ expect(JSON.stringify(codes)).not.toMatch(/80|ENFP|Generator|Achiever/);
34
+ });
35
+ it("leaves baseline order and codes unchanged when the experiment flag is off", () => {
36
+ const people = ["first", "second"];
37
+ const ranker = jest.fn(() => ({ codes: ["PSYCH_SHARED"], rankBoost: 2 }));
38
+ expect(rankWithExperiment(people, ranker, false).map((row) => row.item)).toEqual(people);
39
+ expect(ranker).not.toHaveBeenCalled();
40
+ expect(appendPsychExperiment(["INTENT:Friends"], { experimentConsent: true, attributes: [closeEnergy] }, { experimentConsent: true, attributes: [closeEnergy] }, false)).toEqual(["INTENT:Friends"]);
41
+ });
42
+ it("puts the stronger consented overlap ahead without replacing the baseline reason", () => {
43
+ const ranked = rankWithExperiment([
44
+ { id: "plain", boost: 0 },
45
+ { id: "closer", boost: 2 },
46
+ ], (item) => ({ codes: item.boost ? ["PSYCH_SHARED"] : [], rankBoost: item.boost }), true);
47
+ expect(ranked.map((row) => row.item.id)).toEqual(["closer", "plain"]);
48
+ expect(ranked[1]?.contribution.codes).toEqual([]);
49
+ });
50
+ it("caps the reorder boost at 2", () => {
51
+ const shared = {
52
+ experimentConsent: true,
53
+ attributes: [
54
+ closeEnergy,
55
+ { kind: "LocusOfControl", allowExperimentalMatching: true, value: "internal" },
56
+ { kind: "CliftonStrengths", allowExperimentalMatching: true, value: ["Learner"] },
57
+ { kind: "MyersBriggs", allowExperimentalMatching: true, value: "ENFP" },
58
+ ],
59
+ };
60
+ expect(experimentContribution(shared, shared).rankBoost).toBe(2);
61
+ });
62
+ });
63
+ //# sourceMappingURL=psychExperiment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psychExperiment.test.js","sourceRoot":"","sources":["../../../src/intros/__tests__/psychExperiment.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reasons.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasons.test.d.ts","sourceRoot":"","sources":["../../../src/intros/__tests__/reasons.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { eventScopedReason, introHint, pairMatchReason, rankEventForPair, eventReasonSpecificity, romancePairFits, } from "../reasons.js";
2
+ describe("matching reasons", () => {
3
+ it("does not globally match two people who only both want friends", () => {
4
+ expect(pairMatchReason({ intents: ["Friends"], topics: ["jazz"], work: [] }, { intents: ["Friends"], topics: ["photography"], work: [] })).toBeNull();
5
+ });
6
+ it("matches friends who share a topic and explains it without a name", () => {
7
+ const reason = pairMatchReason({ intents: ["Friends"], topics: ["photography"], work: [] }, { intents: ["Friends"], topics: ["Photography"], work: [] });
8
+ expect(reason?.intent).toBe("Friends");
9
+ expect(introHint(reason?.codes ?? [])).toMatch(/photography/i);
10
+ expect(introHint(reason?.codes ?? [])).not.toMatch(/Alex|Jordan/);
11
+ });
12
+ it("matches a mentor with someone looking for one", () => {
13
+ expect(pairMatchReason({ intents: ["MentorSeek"], topics: [], work: [] }, { intents: ["MentorOffer"], topics: [], work: [] })?.intent).toBe("MentorSeek");
14
+ });
15
+ it("allows romance only at an event that permits it", () => {
16
+ const people = {
17
+ a: { intents: ["Romance"], topics: [], work: [] },
18
+ b: { intents: ["Romance"], topics: [], work: [] },
19
+ };
20
+ expect(eventScopedReason(people.a, people.b, false)).toBeNull();
21
+ expect(eventScopedReason(people.a, people.b, true)?.intent).toBe("Romance");
22
+ });
23
+ it("rejects a romance pair that misses an age or gender limit and accepts an empty seeking list", () => {
24
+ const older = {
25
+ consented: true,
26
+ dob: new Date("1980-01-01T00:00:00Z"),
27
+ gender: "Female",
28
+ seekingGenders: ["Male"],
29
+ ageMin: 30,
30
+ ageMax: 45,
31
+ };
32
+ const youngerMale = {
33
+ consented: true,
34
+ dob: new Date("2000-06-01T00:00:00Z"),
35
+ gender: "Male",
36
+ seekingGenders: [],
37
+ ageMin: null,
38
+ ageMax: null,
39
+ };
40
+ const fittingMale = {
41
+ ...youngerMale,
42
+ dob: new Date("1990-06-01T00:00:00Z"),
43
+ };
44
+ const now = new Date("2026-10-20T00:00:00Z");
45
+ const profiles = {
46
+ a: { intents: ["Romance"], topics: [], work: [] },
47
+ b: { intents: ["Romance"], topics: [], work: [] },
48
+ };
49
+ expect(romancePairFits(older, youngerMale, now)).toBe(false);
50
+ expect(romancePairFits(older, fittingMale, now)).toBe(true);
51
+ expect(romancePairFits(older, { ...fittingMale, gender: "Female" }, now)).toBe(false);
52
+ expect(eventScopedReason(profiles.a, profiles.b, true, { a: older, b: youngerMale }, now)).toBeNull();
53
+ expect(pairMatchReason(profiles.a, profiles.b, { a: older, b: fittingMale }, now)?.intent).toBe("Romance");
54
+ expect(eventScopedReason(profiles.a, profiles.b, true, { a: older, b: { ...fittingMale, gender: "Female" } }, now)).toBeNull();
55
+ expect(eventScopedReason(profiles.a, profiles.b, true, { a: { ...older, seekingGenders: [] }, b: { ...fittingMale, seekingGenders: [] } }, now)?.intent).toBe("Romance");
56
+ });
57
+ it("still matches two people who only both want friends at an event, behind a shared interest", () => {
58
+ const broad = eventScopedReason({ intents: ["Friends"], topics: ["jazz"], work: [] }, { intents: ["Friends"], topics: ["photography"], work: [] }, false);
59
+ const specific = eventScopedReason({ intents: ["Friends"], topics: ["photography"], work: [] }, { intents: ["Friends"], topics: ["Photography"], work: [] }, false);
60
+ expect(broad?.intent).toBe("Friends");
61
+ expect(specific && eventReasonSpecificity(specific)).toBeGreaterThan(broad ? eventReasonSpecificity(broad) : 0);
62
+ expect(eventReasonSpecificity({ intent: "MentorSeek", codes: ["INTENT:MentorSeek"] })).toBeGreaterThan(specific ? eventReasonSpecificity(specific) : 0);
63
+ });
64
+ it("prefers a bash whose type matches a shared interest", () => {
65
+ const id = rankEventForPair([
66
+ { id: "concert", eventType: "Music", city: "Salt Lake City" },
67
+ { id: "mixer", eventType: "photography workshop", city: "Provo" },
68
+ ], ["SHARED_TOPIC:photography"]);
69
+ expect(id).toBe("mixer");
70
+ });
71
+ });
72
+ //# sourceMappingURL=reasons.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasons.test.js","sourceRoot":"","sources":["../../../src/intros/__tests__/reasons.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sharedNotes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedNotes.test.d.ts","sourceRoot":"","sources":["../../../src/intros/__tests__/sharedNotes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { describeSharedNote } from "../sharedNotes.js";
2
+ describe("notes visible after reveal", () => {
3
+ it("describes an allowed note without turning it into a score", () => {
4
+ const note = describeSharedNote("BigFive", {
5
+ openness: 10,
6
+ conscientiousness: 20,
7
+ extraversion: 80,
8
+ agreeableness: 40,
9
+ neuroticism: 50,
10
+ });
11
+ expect(note?.tier).toBe("Research-backed construct");
12
+ expect(note?.text).toMatch(/Extraversion 80/);
13
+ expect(JSON.stringify(note)).not.toMatch(/compatibility/);
14
+ });
15
+ it("ignores a kind this catalog does not support", () => {
16
+ expect(describeSharedNote("Enneagram", "4")).toBeNull();
17
+ });
18
+ });
19
+ //# sourceMappingURL=sharedNotes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedNotes.test.js","sourceRoot":"","sources":["../../../src/intros/__tests__/sharedNotes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,EAAE;YACzC,QAAQ,EAAE,EAAE;YACZ,iBAAiB,EAAE,EAAE;YACrB,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transitions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.test.d.ts","sourceRoot":"","sources":["../../../src/intros/__tests__/transitions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { applyIntroductionAction } from "../transitions.js";
2
+ const openMystery = {
3
+ source: "BashSuggested",
4
+ mode: "Mystery",
5
+ state: "Open",
6
+ closedReason: null,
7
+ interestLow: "Pending",
8
+ interestHigh: "Pending",
9
+ };
10
+ describe("introduction transitions", () => {
11
+ it("treats mutual interest as the reveal consent without revealing yet", () => {
12
+ const one = applyIntroductionAction(openMystery, "low", "interested");
13
+ expect(one.ok && one.state).toBe("Open");
14
+ if (!one.ok)
15
+ return;
16
+ const both = applyIntroductionAction({ ...openMystery, interestLow: one.interestLow, interestHigh: one.interestHigh }, "high", "interested");
17
+ expect(both.ok && both.state).toBe("Mutual");
18
+ expect(both.ok && both.revealNow).toBe(false);
19
+ });
20
+ it("reveals a warm intro only when both accept", () => {
21
+ const one = applyIntroductionAction({ ...openMystery, source: "Warm" }, "low", "sounds_good");
22
+ expect(one.ok && one.state).toBe("Open");
23
+ if (!one.ok)
24
+ return;
25
+ const both = applyIntroductionAction({
26
+ ...openMystery,
27
+ source: "Warm",
28
+ interestLow: one.interestLow,
29
+ interestHigh: one.interestHigh,
30
+ }, "high", "sounds_good");
31
+ expect(both.ok && both.revealNow).toBe(true);
32
+ });
33
+ it("lets a withdrawal close an intro before reveal", () => {
34
+ const result = applyIntroductionAction({ ...openMystery, state: "Mutual", interestLow: "Interested", interestHigh: "Interested" }, "low", "withdraw");
35
+ expect(result.ok && result.state).toBe("Closed");
36
+ expect(result.ok && result.closedReason).toBe("Withdrawn");
37
+ });
38
+ it("rejects say hi before reveal", () => {
39
+ const result = applyIntroductionAction(openMystery, "low", "say_hi");
40
+ expect(result.ok).toBe(false);
41
+ });
42
+ });
43
+ //# sourceMappingURL=transitions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.test.js","sourceRoot":"","sources":["../../../src/intros/__tests__/transitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,eAAwB;IAChC,IAAI,EAAE,SAAkB;IACxB,KAAK,EAAE,MAAe;IACtB,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;CACxB,CAAC;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,GAAG,GAAG,uBAAuB,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,uBAAuB,CAClC,EAAE,GAAG,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,EAChF,MAAM,EACN,YAAY,CACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,uBAAuB,CACjC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,EAClC,KAAK,EACL,aAAa,CACd,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,uBAAuB,CAClC;YACE,GAAG,WAAW;YACd,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,EACD,MAAM,EACN,aAAa,CACd,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,uBAAuB,CACpC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,EAC1F,KAAK,EACL,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=warmDisclosure.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warmDisclosure.test.d.ts","sourceRoot":"","sources":["../../../src/intros/__tests__/warmDisclosure.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { warmInviteNamesOtherPerson } from "../validation.js";
2
+ describe("warm intro disclosure", () => {
3
+ it("hides the other person's name unless both chose named intros", () => {
4
+ expect(warmInviteNamesOtherPerson("Named", "Named")).toBe(true);
5
+ expect(warmInviteNamesOtherPerson("Named", "Anonymous")).toBe(false);
6
+ expect(warmInviteNamesOtherPerson(null, "Named")).toBe(false);
7
+ expect(warmInviteNamesOtherPerson("Off", "Off")).toBe(false);
8
+ });
9
+ });
10
+ //# sourceMappingURL=warmDisclosure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warmDisclosure.test.js","sourceRoot":"","sources":["../../../src/intros/__tests__/warmDisclosure.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const INTROS_MINIMUM_AGE = 18;
2
+ export declare function ageInYears(dob: Date, now?: Date): number;
3
+ export declare function isIntrosAdult(dob: Date | null | undefined, now?: Date): boolean;
4
+ //# sourceMappingURL=age.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age.d.ts","sourceRoot":"","sources":["../../src/intros/age.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,OAAa,GAAG,MAAM,CAK9D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,OAAa,GAAG,OAAO,CAGrF"}
@@ -0,0 +1,14 @@
1
+ export const INTROS_MINIMUM_AGE = 18;
2
+ export function ageInYears(dob, now = new Date()) {
3
+ let age = now.getUTCFullYear() - dob.getUTCFullYear();
4
+ const month = now.getUTCMonth() - dob.getUTCMonth();
5
+ if (month < 0 || (month === 0 && now.getUTCDate() < dob.getUTCDate()))
6
+ age -= 1;
7
+ return age;
8
+ }
9
+ export function isIntrosAdult(dob, now = new Date()) {
10
+ if (!dob)
11
+ return false;
12
+ return ageInYears(dob, now) >= INTROS_MINIMUM_AGE;
13
+ }
14
+ //# sourceMappingURL=age.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age.js","sourceRoot":"","sources":["../../src/intros/age.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,UAAU,UAAU,CAAC,GAAS,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACpD,IAAI,GAAG,GAAG,GAAG,CAAC,cAAc,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAAE,GAAG,IAAI,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAA4B,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAC1E,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,kBAAkB,CAAC;AACpD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const CONFIRMED_TICKET_STATUSES: readonly ["Pending", "P2PConfirmed", "CheckedIn", "Attended"];
2
+ export declare function isConfirmedTicketStatus(status: string | null | undefined): boolean;
3
+ export type AttendanceTier = "Recommended" | "Interested" | "Registered" | "CheckedIn";
4
+ /** Strongest public wording without evidence and disclosure consent. */
5
+ export declare function attendanceCopy(tier: AttendanceTier, shareRegistration: boolean): string;
6
+ export declare function visibleAttendanceTier(args: {
7
+ checkedIn: boolean;
8
+ registered: boolean;
9
+ shareRegistration: boolean;
10
+ }): AttendanceTier;
11
+ //# sourceMappingURL=attendance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/intros/attendance.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,+DAK5B,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAElF;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEvF,wEAAwE;AACxE,wBAAgB,cAAc,CAC5B,IAAI,EAAE,cAAc,EACpB,iBAAiB,EAAE,OAAO,GACzB,MAAM,CAIR;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,cAAc,CAKjB"}
@@ -0,0 +1,27 @@
1
+ export const CONFIRMED_TICKET_STATUSES = [
2
+ "Pending",
3
+ "P2PConfirmed",
4
+ "CheckedIn",
5
+ "Attended",
6
+ ];
7
+ export function isConfirmedTicketStatus(status) {
8
+ return CONFIRMED_TICKET_STATUSES.includes(status ?? "");
9
+ }
10
+ /** Strongest public wording without evidence and disclosure consent. */
11
+ export function attendanceCopy(tier, shareRegistration) {
12
+ if (tier === "CheckedIn" && shareRegistration)
13
+ return "Checked in.";
14
+ if (tier === "Registered" && shareRegistration)
15
+ return "Your match has a spot.";
16
+ return "Could be a good night to meet someone new.";
17
+ }
18
+ export function visibleAttendanceTier(args) {
19
+ if (!args.shareRegistration)
20
+ return "Recommended";
21
+ if (args.checkedIn)
22
+ return "CheckedIn";
23
+ if (args.registered)
24
+ return "Registered";
25
+ return "Recommended";
26
+ }
27
+ //# sourceMappingURL=attendance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.js","sourceRoot":"","sources":["../../src/intros/attendance.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,SAAS;IACT,cAAc;IACd,WAAW;IACX,UAAU;CACF,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,MAAiC;IACvE,OAAQ,yBAA+C,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC;AAID,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAC5B,IAAoB,EACpB,iBAA0B;IAE1B,IAAI,IAAI,KAAK,WAAW,IAAI,iBAAiB;QAAE,OAAO,aAAa,CAAC;IACpE,IAAI,IAAI,KAAK,YAAY,IAAI,iBAAiB;QAAE,OAAO,wBAAwB,CAAC;IAChF,OAAO,4CAA4C,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAIrC;IACC,IAAI,CAAC,IAAI,CAAC,iBAAiB;QAAE,OAAO,aAAa,CAAC;IAClD,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,YAAY,CAAC;IACzC,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const INTROS_ATTRIBUTE_KINDS: readonly ["BigFive", "MyersBriggs", "LocusOfControl", "CliftonStrengths", "EmotionalIntelligence", "HumanDesign"];
2
+ export type IntrosAttributeKind = (typeof INTROS_ATTRIBUTE_KINDS)[number];
3
+ export type IntrosEvidenceTier = "ResearchBackedConstruct" | "SelfReportedTypology" | "Exploratory";
4
+ export declare const CLIFTON_THEMES: readonly ["Achiever", "Learner", "Relator", "Strategic", "Woo", "Empathy", "Focus", "Ideation"];
5
+ export declare const HUMAN_DESIGN_TYPES: readonly ["Manifestor", "Generator", "ManifestingGenerator", "Projector", "Reflector"];
6
+ export declare function isIntrosAttributeKind(value: string): value is IntrosAttributeKind;
7
+ export declare function attributeEvidenceTier(kind: IntrosAttributeKind): IntrosEvidenceTier;
8
+ export declare function attributeMayBeUsedInExperiments(kind: IntrosAttributeKind): boolean;
9
+ export type AttributeValidation = {
10
+ ok: true;
11
+ value: unknown;
12
+ } | {
13
+ ok: false;
14
+ error: string;
15
+ };
16
+ export declare function validateAttributeValue(kind: IntrosAttributeKind, raw: unknown): AttributeValidation;
17
+ //# sourceMappingURL=attributeCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributeCatalog.d.ts","sourceRoot":"","sources":["../../src/intros/attributeCatalog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,mHAOzB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,sBAAsB,GACtB,aAAa,CAAC;AAElB,eAAO,MAAM,cAAc,iGASjB,CAAC;AAEX,eAAO,MAAM,kBAAkB,wFAMrB,CAAC;AAEX,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,mBAAmB,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAInF;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAElF;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,OAAO,GACX,mBAAmB,CA0DrB"}
@@ -0,0 +1,96 @@
1
+ export const INTROS_ATTRIBUTE_KINDS = [
2
+ "BigFive",
3
+ "MyersBriggs",
4
+ "LocusOfControl",
5
+ "CliftonStrengths",
6
+ "EmotionalIntelligence",
7
+ "HumanDesign",
8
+ ];
9
+ export const CLIFTON_THEMES = [
10
+ "Achiever",
11
+ "Learner",
12
+ "Relator",
13
+ "Strategic",
14
+ "Woo",
15
+ "Empathy",
16
+ "Focus",
17
+ "Ideation",
18
+ ];
19
+ export const HUMAN_DESIGN_TYPES = [
20
+ "Manifestor",
21
+ "Generator",
22
+ "ManifestingGenerator",
23
+ "Projector",
24
+ "Reflector",
25
+ ];
26
+ export function isIntrosAttributeKind(value) {
27
+ return INTROS_ATTRIBUTE_KINDS.includes(value);
28
+ }
29
+ export function attributeEvidenceTier(kind) {
30
+ if (kind === "BigFive" || kind === "LocusOfControl")
31
+ return "ResearchBackedConstruct";
32
+ if (kind === "HumanDesign")
33
+ return "Exploratory";
34
+ return "SelfReportedTypology";
35
+ }
36
+ export function attributeMayBeUsedInExperiments(kind) {
37
+ return attributeEvidenceTier(kind) !== "Exploratory";
38
+ }
39
+ export function validateAttributeValue(kind, raw) {
40
+ if (kind === "MyersBriggs") {
41
+ if (typeof raw !== "string" || !/^[EI][SN][TF][JP]$/i.test(raw)) {
42
+ return { ok: false, error: "Enter a 4-letter type such as ENFP" };
43
+ }
44
+ return { ok: true, value: raw.toUpperCase() };
45
+ }
46
+ if (kind === "LocusOfControl") {
47
+ if (raw !== "internal" && raw !== "external" && raw !== "mixed") {
48
+ return { ok: false, error: "Choose internal, external, or mixed" };
49
+ }
50
+ return { ok: true, value: raw };
51
+ }
52
+ if (kind === "EmotionalIntelligence") {
53
+ if (typeof raw !== "number" || !Number.isInteger(raw) || raw < 1 || raw > 5) {
54
+ return { ok: false, error: "Choose a number from 1 to 5" };
55
+ }
56
+ return { ok: true, value: raw };
57
+ }
58
+ if (kind === "HumanDesign") {
59
+ if (typeof raw !== "string" || !HUMAN_DESIGN_TYPES.includes(raw)) {
60
+ return { ok: false, error: "Choose a Human Design type" };
61
+ }
62
+ return { ok: true, value: raw };
63
+ }
64
+ if (kind === "CliftonStrengths") {
65
+ if (!Array.isArray(raw) || raw.length < 1 || raw.length > 5) {
66
+ return { ok: false, error: "Choose up to 5 themes" };
67
+ }
68
+ const themes = raw.filter((item) => typeof item === "string");
69
+ if (themes.length !== raw.length ||
70
+ themes.some((theme) => !CLIFTON_THEMES.includes(theme))) {
71
+ return { ok: false, error: "Use theme names only" };
72
+ }
73
+ return { ok: true, value: themes };
74
+ }
75
+ if (raw == null || typeof raw !== "object" || Array.isArray(raw)) {
76
+ return { ok: false, error: "Big Five needs five scores" };
77
+ }
78
+ const record = raw;
79
+ const keys = [
80
+ "openness",
81
+ "conscientiousness",
82
+ "extraversion",
83
+ "agreeableness",
84
+ "neuroticism",
85
+ ];
86
+ const next = {};
87
+ for (const key of keys) {
88
+ const n = record[key];
89
+ if (typeof n !== "number" || !Number.isInteger(n) || n < 0 || n > 100) {
90
+ return { ok: false, error: "Each Big Five score is a whole number from 0 to 100" };
91
+ }
92
+ next[key] = n;
93
+ }
94
+ return { ok: true, value: next };
95
+ }
96
+ //# sourceMappingURL=attributeCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributeCatalog.js","sourceRoot":"","sources":["../../src/intros/attributeCatalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from "./age.js";
2
+ export * from "./attendance.js";
3
+ export * from "./attributeCatalog.js";
4
+ export * from "./intents.js";
5
+ export * from "./psychExperiment.js";
6
+ export * from "./reasons.js";
7
+ export * from "./sharedNotes.js";
8
+ export * from "./transitions.js";
9
+ export * from "./validation.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/intros/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from "./age.js";
2
+ export * from "./attendance.js";
3
+ export * from "./attributeCatalog.js";
4
+ export * from "./intents.js";
5
+ export * from "./psychExperiment.js";
6
+ export * from "./reasons.js";
7
+ export * from "./sharedNotes.js";
8
+ export * from "./transitions.js";
9
+ export * from "./validation.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intros/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const INTROS_INTENTS: readonly ["Friends", "Professional", "MentorSeek", "MentorOffer", "Collaborator", "Romance"];
2
+ export type IntrosIntent = (typeof INTROS_INTENTS)[number];
3
+ export declare const INTROS_INTENT_LABELS: Record<IntrosIntent, string>;
4
+ export declare function isIntrosIntent(value: string): value is IntrosIntent;
5
+ /** Complementary intents. Romance only matches Romance. */
6
+ export declare function intentsComplement(a: readonly string[], b: readonly string[]): IntrosIntent | null;
7
+ export declare function isRomanceIntent(intent: string | null | undefined): boolean;
8
+ //# sourceMappingURL=intents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intents.d.ts","sourceRoot":"","sources":["../../src/intros/intents.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,8FAOjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAO7D,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,GACnB,YAAY,GAAG,IAAI,CAgBrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,44 @@
1
+ export const INTROS_INTENTS = [
2
+ "Friends",
3
+ "Professional",
4
+ "MentorSeek",
5
+ "MentorOffer",
6
+ "Collaborator",
7
+ "Romance",
8
+ ];
9
+ export const INTROS_INTENT_LABELS = {
10
+ Friends: "Making friends",
11
+ Professional: "Professional networking",
12
+ MentorSeek: "Finding a mentor",
13
+ MentorOffer: "Offering mentorship",
14
+ Collaborator: "Finding collaborators",
15
+ Romance: "Romance",
16
+ };
17
+ export function isIntrosIntent(value) {
18
+ return INTROS_INTENTS.includes(value);
19
+ }
20
+ /** Complementary intents. Romance only matches Romance. */
21
+ export function intentsComplement(a, b) {
22
+ const left = new Set(a.filter(isIntrosIntent));
23
+ const right = new Set(b.filter(isIntrosIntent));
24
+ if (left.has("Romance") && right.has("Romance"))
25
+ return "Romance";
26
+ if (left.has("MentorSeek") && right.has("MentorOffer"))
27
+ return "MentorSeek";
28
+ if (left.has("MentorOffer") && right.has("MentorSeek"))
29
+ return "MentorOffer";
30
+ if ((left.has("Collaborator") &&
31
+ (right.has("Collaborator") || right.has("Professional"))) ||
32
+ (left.has("Professional") && right.has("Collaborator"))) {
33
+ return "Collaborator";
34
+ }
35
+ if (left.has("Professional") && right.has("Professional"))
36
+ return "Professional";
37
+ if (left.has("Friends") && right.has("Friends"))
38
+ return "Friends";
39
+ return null;
40
+ }
41
+ export function isRomanceIntent(intent) {
42
+ return intent === "Romance";
43
+ }
44
+ //# sourceMappingURL=intents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intents.js","sourceRoot":"","sources":["../../src/intros/intents.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS;IACT,cAAc;IACd,YAAY;IACZ,aAAa;IACb,cAAc;IACd,SAAS;CACD,CAAC;AAIX,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,yBAAyB;IACvC,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,qBAAqB;IAClC,YAAY,EAAE,uBAAuB;IACrC,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAC/B,CAAoB,EACpB,CAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5E,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO,aAAa,CAAC;IAC7E,IACE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QACvB,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3D,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EACvD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAC;IACjF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiC;IAC/D,OAAO,MAAM,KAAK,SAAS,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type PsychAttributeConsent = {
2
+ kind: string;
3
+ allowExperimentalMatching: boolean;
4
+ value?: unknown;
5
+ };
6
+ export type PsychExperimentInput = {
7
+ experimentConsent: boolean;
8
+ attributes: readonly PsychAttributeConsent[];
9
+ };
10
+ export type ExperimentContribution = {
11
+ /** Privacy-safe codes. Never a score, type name, or theme name. */
12
+ codes: string[];
13
+ /** 0–2. Reorders people who already matched. It is not a compatibility score. */
14
+ rankBoost: number;
15
+ };
16
+ /**
17
+ * Separate from baseline intent and topic matching.
18
+ * Uses only attributes both people explicitly allowed, and only as a small reorder.
19
+ * Human Design is ignored. No score is returned.
20
+ */
21
+ export declare function experimentContribution(a: PsychExperimentInput, b: PsychExperimentInput): ExperimentContribution;
22
+ /** A shared experimental note. Never includes scores, types, or names. */
23
+ export declare function psychExperimentCode(a: PsychExperimentInput, b: PsychExperimentInput): "PSYCH_SHARED" | null;
24
+ export declare function appendPsychExperiment(codes: readonly string[], a: PsychExperimentInput, b: PsychExperimentInput, enabled: boolean): string[];
25
+ export declare function rankWithExperiment<T>(candidates: readonly T[], contributionFor: (item: T) => ExperimentContribution, enabled: boolean): Array<{
26
+ item: T;
27
+ contribution: ExperimentContribution;
28
+ }>;
29
+ //# sourceMappingURL=psychExperiment.d.ts.map