@bash-app/bash-common 30.386.0 → 30.393.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 (126) hide show
  1. package/dist/__tests__/bashSectionTitleForBashType.test.js +5 -0
  2. package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
  3. package/dist/__tests__/budgetApproval.test.d.ts +2 -0
  4. package/dist/__tests__/budgetApproval.test.d.ts.map +1 -0
  5. package/dist/__tests__/budgetApproval.test.js +109 -0
  6. package/dist/__tests__/budgetApproval.test.js.map +1 -0
  7. package/dist/__tests__/crewSocialCopy.test.d.ts +2 -0
  8. package/dist/__tests__/crewSocialCopy.test.d.ts.map +1 -0
  9. package/dist/__tests__/crewSocialCopy.test.js +21 -0
  10. package/dist/__tests__/crewSocialCopy.test.js.map +1 -0
  11. package/dist/__tests__/discoveryScope.test.d.ts +2 -0
  12. package/dist/__tests__/discoveryScope.test.d.ts.map +1 -0
  13. package/dist/__tests__/discoveryScope.test.js +40 -0
  14. package/dist/__tests__/discoveryScope.test.js.map +1 -0
  15. package/dist/__tests__/scenePulse.test.d.ts +2 -0
  16. package/dist/__tests__/scenePulse.test.d.ts.map +1 -0
  17. package/dist/__tests__/scenePulse.test.js +52 -0
  18. package/dist/__tests__/scenePulse.test.js.map +1 -0
  19. package/dist/__tests__/suggestedNight.test.d.ts +2 -0
  20. package/dist/__tests__/suggestedNight.test.d.ts.map +1 -0
  21. package/dist/__tests__/suggestedNight.test.js +10 -0
  22. package/dist/__tests__/suggestedNight.test.js.map +1 -0
  23. package/dist/__tests__/suggestionScore.test.d.ts +2 -0
  24. package/dist/__tests__/suggestionScore.test.d.ts.map +1 -0
  25. package/dist/__tests__/suggestionScore.test.js +68 -0
  26. package/dist/__tests__/suggestionScore.test.js.map +1 -0
  27. package/dist/__tests__/userTaste.test.d.ts +2 -0
  28. package/dist/__tests__/userTaste.test.d.ts.map +1 -0
  29. package/dist/__tests__/userTaste.test.js +21 -0
  30. package/dist/__tests__/userTaste.test.js.map +1 -0
  31. package/dist/budgetApproval.d.ts +126 -0
  32. package/dist/budgetApproval.d.ts.map +1 -0
  33. package/dist/budgetApproval.js +161 -0
  34. package/dist/budgetApproval.js.map +1 -0
  35. package/dist/crewSocialCopy.d.ts +16 -0
  36. package/dist/crewSocialCopy.d.ts.map +1 -0
  37. package/dist/crewSocialCopy.js +23 -0
  38. package/dist/crewSocialCopy.js.map +1 -0
  39. package/dist/definitions.d.ts +6 -0
  40. package/dist/definitions.d.ts.map +1 -1
  41. package/dist/definitions.js +6 -0
  42. package/dist/definitions.js.map +1 -1
  43. package/dist/discoveryScope.d.ts +48 -0
  44. package/dist/discoveryScope.d.ts.map +1 -0
  45. package/dist/discoveryScope.js +114 -0
  46. package/dist/discoveryScope.js.map +1 -0
  47. package/dist/extendedSchemas.d.ts +7 -0
  48. package/dist/extendedSchemas.d.ts.map +1 -1
  49. package/dist/extendedSchemas.js +8 -0
  50. package/dist/extendedSchemas.js.map +1 -1
  51. package/dist/home.d.ts +6 -1
  52. package/dist/home.d.ts.map +1 -1
  53. package/dist/home.js +5 -1
  54. package/dist/home.js.map +1 -1
  55. package/dist/hostCrmCrowdPulse.d.ts +2 -0
  56. package/dist/hostCrmCrowdPulse.d.ts.map +1 -1
  57. package/dist/hostCrmCrowdPulse.js.map +1 -1
  58. package/dist/hostCrmSegments.d.ts +6 -0
  59. package/dist/hostCrmSegments.d.ts.map +1 -1
  60. package/dist/hostCrmSegments.js.map +1 -1
  61. package/dist/index.d.ts +9 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +15 -2
  64. package/dist/index.js.map +1 -1
  65. package/dist/scenePulse.d.ts +66 -0
  66. package/dist/scenePulse.d.ts.map +1 -0
  67. package/dist/scenePulse.js +54 -0
  68. package/dist/scenePulse.js.map +1 -0
  69. package/dist/sms/smsTemplates.d.ts +6 -1
  70. package/dist/sms/smsTemplates.d.ts.map +1 -1
  71. package/dist/sms/smsTemplates.js +1 -0
  72. package/dist/sms/smsTemplates.js.map +1 -1
  73. package/dist/suggestedNight.d.ts +12 -0
  74. package/dist/suggestedNight.d.ts.map +1 -0
  75. package/dist/suggestedNight.js +12 -0
  76. package/dist/suggestedNight.js.map +1 -0
  77. package/dist/suggestionScore.d.ts +42 -0
  78. package/dist/suggestionScore.d.ts.map +1 -0
  79. package/dist/suggestionScore.js +100 -0
  80. package/dist/suggestionScore.js.map +1 -0
  81. package/dist/userTaste.d.ts +40 -0
  82. package/dist/userTaste.d.ts.map +1 -0
  83. package/dist/userTaste.js +103 -0
  84. package/dist/userTaste.js.map +1 -0
  85. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js +9 -1
  86. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js.map +1 -1
  87. package/dist/utils/featuredDiscoveryGeo.d.ts +7 -0
  88. package/dist/utils/featuredDiscoveryGeo.d.ts.map +1 -1
  89. package/dist/utils/featuredDiscoveryGeo.js +11 -0
  90. package/dist/utils/featuredDiscoveryGeo.js.map +1 -1
  91. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts +2 -0
  92. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts.map +1 -0
  93. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js +353 -0
  94. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js.map +1 -0
  95. package/dist/utils/service/foodAndBeverageQuote.d.ts +171 -0
  96. package/dist/utils/service/foodAndBeverageQuote.d.ts.map +1 -0
  97. package/dist/utils/service/foodAndBeverageQuote.js +467 -0
  98. package/dist/utils/service/foodAndBeverageQuote.js.map +1 -0
  99. package/package.json +1 -1
  100. package/prisma/schema.prisma +185 -53
  101. package/src/__tests__/bashSectionTitleForBashType.test.ts +10 -0
  102. package/src/__tests__/budgetApproval.test.ts +153 -0
  103. package/src/__tests__/crewSocialCopy.test.ts +25 -0
  104. package/src/__tests__/discoveryScope.test.ts +65 -0
  105. package/src/__tests__/scenePulse.test.ts +69 -0
  106. package/src/__tests__/suggestedNight.test.ts +11 -0
  107. package/src/__tests__/suggestionScore.test.ts +81 -0
  108. package/src/__tests__/userTaste.test.ts +33 -0
  109. package/src/budgetApproval.ts +303 -0
  110. package/src/crewSocialCopy.ts +37 -0
  111. package/src/definitions.ts +11 -0
  112. package/src/discoveryScope.ts +170 -0
  113. package/src/extendedSchemas.ts +8 -0
  114. package/src/home.ts +15 -0
  115. package/src/hostCrmCrowdPulse.ts +2 -0
  116. package/src/hostCrmSegments.ts +6 -0
  117. package/src/index.ts +18 -3
  118. package/src/scenePulse.ts +113 -0
  119. package/src/sms/smsTemplates.ts +6 -0
  120. package/src/suggestedNight.ts +20 -0
  121. package/src/suggestionScore.ts +140 -0
  122. package/src/userTaste.ts +152 -0
  123. package/src/utils/__tests__/featuredDiscoveryGeo.test.ts +13 -0
  124. package/src/utils/featuredDiscoveryGeo.ts +15 -0
  125. package/src/utils/service/__tests__/foodAndBeverageQuote.test.ts +502 -0
  126. package/src/utils/service/foodAndBeverageQuote.ts +613 -0
@@ -41,6 +41,11 @@ describe("bashSectionTitleForBashType", () => {
41
41
  it("'Ideas' → 'Ideas'", () => {
42
42
  expect(bashSectionTitleForBashType("Ideas")).toBe("Ideas");
43
43
  });
44
+ it("scope rows use destination copy", () => {
45
+ expect(bashSectionTitleForBashType("National")).toBe("Across the country");
46
+ expect(bashSectionTitleForBashType("International")).toBe("Worth the flight");
47
+ expect(bashSectionTitleForBashType("CrewGoing")).toBe("The crew's going");
48
+ });
44
49
  });
45
50
  describe("BashEventType enum values get pluralized", () => {
46
51
  it("'Rave' enum → 'Raves'", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=budgetApproval.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgetApproval.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/budgetApproval.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { buildBudgetApprovalSnapshot, budgetApprovalSnapshotsMatch, eventBudgetApprovalWizardPath, formatBudgetCents, isBudgetApprovalExpired, isValidApproverEmail, normalizeApproverEmail, parseBudgetApprovalSnapshot, resolveApproverDisplayName, validateBudgetApprovalDecide, } from "../budgetApproval.js";
2
+ describe("budgetApproval helpers", () => {
3
+ it("normalizes and validates approver emails", () => {
4
+ expect(normalizeApproverEmail(" Pat@Acme.com ")).toBe("pat@acme.com");
5
+ expect(isValidApproverEmail("pat@acme.com")).toBe(true);
6
+ expect(isValidApproverEmail("not-an-email")).toBe(false);
7
+ });
8
+ it("hashes snapshots in a stable, order-independent way", () => {
9
+ const a = buildBudgetApprovalSnapshot([
10
+ { id: "b", name: "DJ", category: null, totalAllocatedCents: 20000 },
11
+ { id: "a", name: "Venue", category: "Rentals", totalAllocatedCents: 10000 },
12
+ ]);
13
+ const b = buildBudgetApprovalSnapshot([
14
+ { id: "a", name: "Venue", category: "Rentals", totalAllocatedCents: 10000 },
15
+ { id: "b", name: "DJ", category: null, totalAllocatedCents: 20000 },
16
+ ]);
17
+ expect(a.totalCents).toBe(30000);
18
+ expect(a.hash).toBe(b.hash);
19
+ expect(budgetApprovalSnapshotsMatch(a.lines, parseBudgetApprovalSnapshot(b.lines))).toBe(true);
20
+ });
21
+ it("detects drift when an amount changes", () => {
22
+ const original = buildBudgetApprovalSnapshot([
23
+ { id: "a", name: "Venue", category: null, totalAllocatedCents: 10000 },
24
+ ]);
25
+ const changed = buildBudgetApprovalSnapshot([
26
+ { id: "a", name: "Venue", category: null, totalAllocatedCents: 12000 },
27
+ ]);
28
+ expect(budgetApprovalSnapshotsMatch(original.lines, changed.lines)).toBe(false);
29
+ });
30
+ it("requires cents on cap-ask approve and a note on request-changes", () => {
31
+ expect(validateBudgetApprovalDecide({
32
+ action: "approve",
33
+ kind: "CapAsk",
34
+ authorizedCents: 0,
35
+ })).toEqual({
36
+ ok: false,
37
+ error: "Enter an authorized amount greater than zero.",
38
+ });
39
+ expect(validateBudgetApprovalDecide({
40
+ action: "approve",
41
+ kind: "CapAsk",
42
+ authorizedCents: 50000,
43
+ }).ok).toBe(true);
44
+ expect(validateBudgetApprovalDecide({
45
+ action: "changes",
46
+ kind: "PlanSignOff",
47
+ })).toEqual({
48
+ ok: false,
49
+ error: "Add an overall note or a note on at least one line.",
50
+ });
51
+ expect(validateBudgetApprovalDecide({
52
+ action: "changes",
53
+ kind: "PlanSignOff",
54
+ lineNotes: [
55
+ {
56
+ nameSnapshot: "Venue",
57
+ allocatedCentsSnapshot: 10000,
58
+ note: "Too high",
59
+ },
60
+ ],
61
+ }).ok).toBe(true);
62
+ expect(validateBudgetApprovalDecide({
63
+ action: "changes",
64
+ kind: "CapAsk",
65
+ lineNotes: [
66
+ {
67
+ nameSnapshot: "Venue",
68
+ allocatedCentsSnapshot: 10000,
69
+ note: "n/a",
70
+ },
71
+ ],
72
+ })).toEqual({
73
+ ok: false,
74
+ error: "A cap ask has no budget lines to annotate.",
75
+ });
76
+ });
77
+ it("resolves display name decided > hint > email", () => {
78
+ expect(resolveApproverDisplayName({
79
+ decidedName: "Pat Chen",
80
+ hostHintName: "Boss",
81
+ email: "pat@acme.com",
82
+ })).toBe("Pat Chen");
83
+ expect(resolveApproverDisplayName({
84
+ decidedName: " ",
85
+ hostHintName: "Boss",
86
+ email: "pat@acme.com",
87
+ })).toBe("Boss");
88
+ expect(resolveApproverDisplayName({
89
+ decidedName: null,
90
+ hostHintName: null,
91
+ email: "pat@acme.com",
92
+ })).toBe("pat@acme.com");
93
+ });
94
+ it("computes expiry from expiresAt", () => {
95
+ expect(isBudgetApprovalExpired("2020-01-01T00:00:00.000Z", new Date("2026-01-01"))).toBe(true);
96
+ expect(isBudgetApprovalExpired("2030-01-01T00:00:00.000Z", new Date("2026-01-01"))).toBe(false);
97
+ });
98
+ it("formats money and the wizard deep link", () => {
99
+ expect(formatBudgetCents(420000)).toBe("$4,200");
100
+ expect(eventBudgetApprovalWizardPath("evt-1")).toContain("/bash-event-wizard/evt-1/");
101
+ expect(eventBudgetApprovalWizardPath("evt-1")).toContain("budgetTab=lines");
102
+ });
103
+ it("parses invalid snapshot json as empty", () => {
104
+ expect(parseBudgetApprovalSnapshot(null)).toEqual([]);
105
+ expect(parseBudgetApprovalSnapshot("nope")).toEqual([]);
106
+ expect(parseBudgetApprovalSnapshot([{ id: 1 }])).toEqual([]);
107
+ });
108
+ });
109
+ //# sourceMappingURL=budgetApproval.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgetApproval.test.js","sourceRoot":"","sources":["../../src/__tests__/budgetApproval.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=crewSocialCopy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewSocialCopy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/crewSocialCopy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { crewSocialProofCopy } from "../crewSocialCopy.js";
2
+ describe("crewSocialProofCopy", () => {
3
+ it("names visible crew", () => {
4
+ expect(crewSocialProofCopy([
5
+ { displayName: "Nico", attendanceVisible: true },
6
+ { displayName: "Petra", attendanceVisible: true },
7
+ ]).line).toBe("Nico and Petra are going");
8
+ });
9
+ it("does not use a count when names are hidden", () => {
10
+ const copy = crewSocialProofCopy([
11
+ { displayName: "Sam", attendanceVisible: false },
12
+ { displayName: "Alex", attendanceVisible: false },
13
+ ]);
14
+ expect(copy.line).toBe("Your crew's on this one");
15
+ expect(copy.named).toBe(false);
16
+ });
17
+ it("omits the line when nobody is going", () => {
18
+ expect(crewSocialProofCopy([]).line).toBeNull();
19
+ });
20
+ });
21
+ //# sourceMappingURL=crewSocialCopy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewSocialCopy.test.js","sourceRoot":"","sources":["../../src/__tests__/crewSocialCopy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CACJ,mBAAmB,CAAC;YAClB,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE;YAChD,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE;SAClD,CAAC,CAAC,IAAI,CACR,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC;YAC/B,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE;YAChD,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=discoveryScope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoveryScope.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/discoveryScope.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { DiscoveryScope, inferDiscoveryScopeFromText, isHostSettableDiscoveryScope, resolveDiscoveryScopeForWrite, } from "../discoveryScope.js";
2
+ describe("discoveryScope", () => {
3
+ it("lets hosts set Local and State only", () => {
4
+ expect(isHostSettableDiscoveryScope(DiscoveryScope.Local)).toBe(true);
5
+ expect(isHostSettableDiscoveryScope(DiscoveryScope.State)).toBe(true);
6
+ expect(isHostSettableDiscoveryScope(DiscoveryScope.National)).toBe(false);
7
+ expect(isHostSettableDiscoveryScope(DiscoveryScope.International)).toBe(false);
8
+ });
9
+ it("infers State from state fair copy", () => {
10
+ expect(inferDiscoveryScopeFromText("Utah State Fair")).toBe(DiscoveryScope.State);
11
+ });
12
+ it("infers National from destination brands", () => {
13
+ expect(inferDiscoveryScopeFromText("EDC Las Vegas")).toBe(DiscoveryScope.National);
14
+ });
15
+ it("infers International from world-tour language", () => {
16
+ expect(inferDiscoveryScopeFromText("Tomorrowland world tour")).toBe(DiscoveryScope.International);
17
+ });
18
+ it("clamps host National without a hard signal", () => {
19
+ expect(resolveDiscoveryScopeForWrite({
20
+ requested: DiscoveryScope.National,
21
+ role: "host",
22
+ title: "House party in Sugar House",
23
+ })).toBe(DiscoveryScope.Unspecified);
24
+ });
25
+ it("allows host National when inference already matches", () => {
26
+ expect(resolveDiscoveryScopeForWrite({
27
+ requested: DiscoveryScope.National,
28
+ role: "host",
29
+ title: "Coachella Weekend 1",
30
+ })).toBe(DiscoveryScope.National);
31
+ });
32
+ it("lets scrapers set National", () => {
33
+ expect(resolveDiscoveryScopeForWrite({
34
+ requested: DiscoveryScope.National,
35
+ role: "scraper",
36
+ title: "Random fest",
37
+ })).toBe(DiscoveryScope.National);
38
+ });
39
+ });
40
+ //# sourceMappingURL=discoveryScope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoveryScope.test.js","sourceRoot":"","sources":["../../src/__tests__/discoveryScope.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACrE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CACzD,cAAc,CAAC,KAAK,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CACvD,cAAc,CAAC,QAAQ,CACxB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CACjE,cAAc,CAAC,aAAa,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,4BAA4B;SACpC,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,qBAAqB;SAC7B,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,aAAa;SACrB,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scenePulse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenePulse.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scenePulse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * parseScenePulseScope — city default, invalid → null.
3
+ */
4
+ import { describe, expect, test } from "@jest/globals";
5
+ import { emptyScenePulseEnergy, normalizeScenePulseGeoOverride, parseScenePulseScope, } from "../scenePulse.js";
6
+ describe("parseScenePulseScope", () => {
7
+ test("defaults missing to city", () => {
8
+ expect(parseScenePulseScope(undefined)).toBe("city");
9
+ expect(parseScenePulseScope(null)).toBe("city");
10
+ expect(parseScenePulseScope("")).toBe("city");
11
+ });
12
+ test("accepts city region world", () => {
13
+ expect(parseScenePulseScope("city")).toBe("city");
14
+ expect(parseScenePulseScope("Region")).toBe("region");
15
+ expect(parseScenePulseScope(" WORLD ")).toBe("world");
16
+ });
17
+ test("rejects unknown values", () => {
18
+ expect(parseScenePulseScope("you")).toBeNull();
19
+ expect(parseScenePulseScope(12)).toBeNull();
20
+ });
21
+ });
22
+ describe("normalizeScenePulseGeoOverride", () => {
23
+ test("returns null when city and state are blank", () => {
24
+ expect(normalizeScenePulseGeoOverride({})).toBeNull();
25
+ expect(normalizeScenePulseGeoOverride({ city: " ", state: "" })).toBeNull();
26
+ });
27
+ test("trims city and state and ignores empty sibling", () => {
28
+ expect(normalizeScenePulseGeoOverride({ city: " Denver ", state: " " })).toEqual({ city: "Denver", state: null });
29
+ expect(normalizeScenePulseGeoOverride({ city: "", state: "CO" })).toEqual({ city: null, state: "CO" });
30
+ });
31
+ test("caps overly long values", () => {
32
+ const city = "A".repeat(90);
33
+ const parsed = normalizeScenePulseGeoOverride({ city, state: "Utah" });
34
+ expect(parsed?.city).toHaveLength(80);
35
+ expect(parsed?.state).toBe("Utah");
36
+ });
37
+ });
38
+ describe("emptyScenePulseEnergy", () => {
39
+ test("zeros every energy field", () => {
40
+ expect(emptyScenePulseEnergy()).toEqual({
41
+ liveNow: 0,
42
+ going: 0,
43
+ tonightBashes: 0,
44
+ tonightGoing: 0,
45
+ weekendBashes: 0,
46
+ weekendGoing: 0,
47
+ newThisWeek: 0,
48
+ namesInTheRoom: 0,
49
+ });
50
+ });
51
+ });
52
+ //# sourceMappingURL=scenePulse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenePulse.test.js","sourceRoot":"","sources":["../../src/__tests__/scenePulse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suggestedNight.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestedNight.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/suggestedNight.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { unfavoriteSuggestedNightAction } from "../suggestedNight.js";
2
+ describe("unfavoriteSuggestedNightAction", () => {
3
+ it("deletes when never reminded", () => {
4
+ expect(unfavoriteSuggestedNightAction(null)).toBe("delete");
5
+ });
6
+ it("dismisses after a nudge", () => {
7
+ expect(unfavoriteSuggestedNightAction(new Date())).toBe("dismiss");
8
+ });
9
+ });
10
+ //# sourceMappingURL=suggestedNight.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestedNight.test.js","sourceRoot":"","sources":["../../src/__tests__/suggestedNight.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,8BAA8B,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suggestionScore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestionScore.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/suggestionScore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { DiscoveryScope } from "../discoveryScope.js";
2
+ import { scoreSuggestion, SUGGESTION_WEIGHTS } from "../suggestionScore.js";
3
+ import { UserTasteKind, UserTasteSource } from "../userTaste.js";
4
+ function base() {
5
+ return {
6
+ connectionsGoingVisible: 0,
7
+ connectionsGoingHidden: 0,
8
+ followedHost: false,
9
+ attendedHost: false,
10
+ eventType: "Festival",
11
+ causeTags: [],
12
+ musicGenre: null,
13
+ discoveryScope: DiscoveryScope.Local,
14
+ artistsToSee: [],
15
+ eventTitle: "Block party",
16
+ distanceMiles: 5,
17
+ radiusMiles: 50,
18
+ isFeatured: false,
19
+ trendingScore: 0,
20
+ paidFeatureTasteOverlap: false,
21
+ tastes: [],
22
+ };
23
+ }
24
+ describe("scoreSuggestion", () => {
25
+ it("ranks crew going above paid taste overlap", () => {
26
+ const crew = scoreSuggestion({
27
+ ...base(),
28
+ connectionsGoingVisible: 1,
29
+ });
30
+ const paid = scoreSuggestion({
31
+ ...base(),
32
+ paidFeatureTasteOverlap: true,
33
+ tastes: [
34
+ {
35
+ kind: UserTasteKind.EventType,
36
+ value: "Festival",
37
+ weight: 1,
38
+ source: UserTasteSource.Explicit,
39
+ },
40
+ ],
41
+ });
42
+ expect(crew).toBeGreaterThan(SUGGESTION_WEIGHTS.paidFeatureTaste);
43
+ expect(crew).toBeGreaterThan(paid - SUGGESTION_WEIGHTS.explicitTaste);
44
+ });
45
+ it("lets travel taste break radius for National events only", () => {
46
+ const tastes = [
47
+ {
48
+ kind: UserTasteKind.DiscoveryScope,
49
+ value: DiscoveryScope.National,
50
+ weight: 1,
51
+ source: UserTasteSource.Explicit,
52
+ },
53
+ ];
54
+ expect(scoreSuggestion({
55
+ ...base(),
56
+ discoveryScope: DiscoveryScope.National,
57
+ distanceMiles: 900,
58
+ tastes,
59
+ })).toBeGreaterThan(0);
60
+ expect(scoreSuggestion({
61
+ ...base(),
62
+ discoveryScope: DiscoveryScope.Local,
63
+ distanceMiles: 900,
64
+ tastes,
65
+ })).toBe(Number.NEGATIVE_INFINITY);
66
+ });
67
+ });
68
+ //# sourceMappingURL=suggestionScore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestionScore.test.js","sourceRoot":"","sources":["../../src/__tests__/suggestionScore.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjE,SAAS,IAAI;IACX,OAAO;QACL,uBAAuB,EAAE,CAAC;QAC1B,sBAAsB,EAAE,CAAC;QACzB,YAAY,EAAE,KAAK;QACnB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,EAAc;QACzB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,cAAc,CAAC,KAAK;QACpC,YAAY,EAAE,EAAc;QAC5B,UAAU,EAAE,aAAa;QACzB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,CAAC;QAChB,uBAAuB,EAAE,KAAK;QAC9B,MAAM,EAAE,EAKN;KACH,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,GAAG,IAAI,EAAE;YACT,uBAAuB,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,GAAG,IAAI,EAAE;YACT,uBAAuB,EAAE,IAAI;YAC7B,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,aAAa,CAAC,SAAS;oBAC7B,KAAK,EAAE,UAAU;oBACjB,MAAM,EAAE,CAAC;oBACT,MAAM,EAAE,eAAe,CAAC,QAAQ;iBACjC;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAC1B,IAAI,GAAG,kBAAkB,CAAC,aAAa,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG;YACb;gBACE,IAAI,EAAE,aAAa,CAAC,cAAc;gBAClC,KAAK,EAAE,cAAc,CAAC,QAAQ;gBAC9B,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,eAAe,CAAC,QAAQ;aACjC;SACF,CAAC;QACF,MAAM,CACJ,eAAe,CAAC;YACd,GAAG,IAAI,EAAE;YACT,cAAc,EAAE,cAAc,CAAC,QAAQ;YACvC,aAAa,EAAE,GAAG;YAClB,MAAM;SACP,CAAC,CACH,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,CACJ,eAAe,CAAC;YACd,GAAG,IAAI,EAAE;YACT,cAAc,EAAE,cAAc,CAAC,KAAK;YACpC,aAAa,EAAE,GAAG;YAClB,MAAM;SACP,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=userTaste.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userTaste.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/userTaste.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { UserTasteKind, isValidTasteValue, userHasTravelTaste } from "../userTaste.js";
2
+ import { DiscoveryScope } from "../discoveryScope.js";
3
+ describe("userTaste", () => {
4
+ it("accepts Festival event types and rejects junk", () => {
5
+ expect(isValidTasteValue(UserTasteKind.EventType, "Festival")).toBe(true);
6
+ expect(isValidTasteValue(UserTasteKind.EventType, "Networking")).toBe(false);
7
+ });
8
+ it("accepts cause tags and genres", () => {
9
+ expect(isValidTasteValue(UserTasteKind.CauseTag, "lgbtq")).toBe(true);
10
+ expect(isValidTasteValue(UserTasteKind.MusicGenre, "House")).toBe(true);
11
+ expect(isValidTasteValue(UserTasteKind.DiscoveryScope, DiscoveryScope.National)).toBe(true);
12
+ expect(isValidTasteValue(UserTasteKind.DiscoveryScope, DiscoveryScope.Unspecified)).toBe(false);
13
+ });
14
+ it("detects travel taste", () => {
15
+ expect(userHasTravelTaste([
16
+ { kind: UserTasteKind.DiscoveryScope, value: DiscoveryScope.National },
17
+ ])).toBe(true);
18
+ expect(userHasTravelTaste([{ kind: UserTasteKind.EventType, value: "Festival" }])).toBe(false);
19
+ });
20
+ });
21
+ //# sourceMappingURL=userTaste.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userTaste.test.js","sourceRoot":"","sources":["../../src/__tests__/userTaste.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CACnE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CACnF,IAAI,CACL,CAAC;QACF,MAAM,CACJ,iBAAiB,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,WAAW,CAAC,CAC5E,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CACJ,kBAAkB,CAAC;YACjB,EAAE,IAAI,EAAE,aAAa,CAAC,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE;SACvE,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CACJ,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAC3E,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Event-level budget approval requests — plan sign-off and pre-plan cap asks.
3
+ * Shared types and validation for api + bash-app.
4
+ */
5
+ export declare const BUDGET_APPROVAL_TTL_DAYS = 14;
6
+ export declare const BudgetApprovalKind: {
7
+ readonly CapAsk: "CapAsk";
8
+ readonly PlanSignOff: "PlanSignOff";
9
+ };
10
+ export type BudgetApprovalKind = (typeof BudgetApprovalKind)[keyof typeof BudgetApprovalKind];
11
+ export declare const BUDGET_APPROVAL_KINDS: readonly ["CapAsk", "PlanSignOff"];
12
+ export type BudgetApprovalKindName = BudgetApprovalKind;
13
+ export declare const BudgetApprovalStatus: {
14
+ readonly Pending: "Pending";
15
+ readonly Approved: "Approved";
16
+ readonly ChangesRequested: "ChangesRequested";
17
+ readonly Declined: "Declined";
18
+ readonly Cancelled: "Cancelled";
19
+ readonly Superseded: "Superseded";
20
+ };
21
+ export type BudgetApprovalStatus = (typeof BudgetApprovalStatus)[keyof typeof BudgetApprovalStatus];
22
+ export declare const BUDGET_APPROVAL_STATUSES: readonly ["Pending", "Approved", "ChangesRequested", "Declined", "Cancelled", "Superseded"];
23
+ export type BudgetApprovalStatusName = BudgetApprovalStatus;
24
+ export declare const BUDGET_APPROVAL_ACTIONS: readonly ["approve", "changes", "decline"];
25
+ export type BudgetApprovalAction = (typeof BUDGET_APPROVAL_ACTIONS)[number];
26
+ export type BudgetApprovalSnapshotLine = {
27
+ id: string;
28
+ name: string;
29
+ category: string | null;
30
+ totalAllocatedCents: number;
31
+ };
32
+ export type BudgetApprovalLineNoteInput = {
33
+ budgetId?: string | null;
34
+ nameSnapshot: string;
35
+ categorySnapshot?: string | null;
36
+ allocatedCentsSnapshot: number;
37
+ note: string;
38
+ };
39
+ export type BudgetApprovalDecideInput = {
40
+ action: BudgetApprovalAction;
41
+ kind: BudgetApprovalKindName;
42
+ approverName?: string | null;
43
+ decisionNote?: string | null;
44
+ authorizedCents?: number | null;
45
+ lineNotes?: BudgetApprovalLineNoteInput[] | null;
46
+ };
47
+ export declare function normalizeApproverEmail(email: string): string;
48
+ export declare function isValidApproverEmail(email: string): boolean;
49
+ export declare function isBudgetApprovalKind(value: string): value is BudgetApprovalKindName;
50
+ export declare function isBudgetApprovalAction(value: string): value is BudgetApprovalAction;
51
+ export declare function isBudgetApprovalExpired(expiresAt: Date | string, now?: Date): boolean;
52
+ export declare function buildBudgetApprovalSnapshot(lines: Array<{
53
+ id: string;
54
+ name: string;
55
+ category?: string | null;
56
+ totalAllocatedCents: number;
57
+ }>): {
58
+ lines: BudgetApprovalSnapshotLine[];
59
+ totalCents: number;
60
+ hash: string;
61
+ };
62
+ export declare function budgetApprovalSnapshotHash(lines: BudgetApprovalSnapshotLine[]): string;
63
+ export declare function parseBudgetApprovalSnapshot(json: unknown): BudgetApprovalSnapshotLine[];
64
+ export declare function budgetApprovalSnapshotsMatch(current: BudgetApprovalSnapshotLine[], snapshot: BudgetApprovalSnapshotLine[]): boolean;
65
+ export declare function validateBudgetApprovalDecide(input: BudgetApprovalDecideInput): {
66
+ ok: true;
67
+ } | {
68
+ ok: false;
69
+ error: string;
70
+ };
71
+ export declare function resolveApproverDisplayName(params: {
72
+ decidedName?: string | null;
73
+ hostHintName?: string | null;
74
+ email: string;
75
+ }): string;
76
+ export declare function formatBudgetCents(cents: number): string;
77
+ export declare function eventBudgetApprovalWizardPath(bashEventId: string): string;
78
+ export type BudgetApprovalPublicDto = {
79
+ kind: BudgetApprovalKindName;
80
+ status: BudgetApprovalStatusName;
81
+ hostNote: string | null;
82
+ hostDisplayName: string;
83
+ event: {
84
+ id: string;
85
+ title: string;
86
+ startDateTime: string | null;
87
+ slug: string | null;
88
+ };
89
+ snapshotLines: BudgetApprovalSnapshotLine[];
90
+ snapshotTotalCents: number;
91
+ expiresAt: string;
92
+ expired: boolean;
93
+ alreadyDecided: boolean;
94
+ eventIsPubliclyViewable: boolean;
95
+ };
96
+ export type BudgetApprovalHostDto = {
97
+ id: string;
98
+ kind: BudgetApprovalKindName;
99
+ status: BudgetApprovalStatusName;
100
+ approverEmail: string;
101
+ approverName: string | null;
102
+ hostNote: string | null;
103
+ decisionNote: string | null;
104
+ authorizedCents: number | null;
105
+ snapshotTotalCents: number;
106
+ staleAt: string | null;
107
+ decidedAt: string | null;
108
+ expiresAt: string;
109
+ createdAt: string;
110
+ isExpired: boolean;
111
+ emailError?: boolean;
112
+ lineNotes: Array<{
113
+ budgetId: string | null;
114
+ nameSnapshot: string;
115
+ categorySnapshot: string | null;
116
+ allocatedCentsSnapshot: number;
117
+ note: string;
118
+ }>;
119
+ };
120
+ export type BudgetApprovalHostSummary = {
121
+ latest: BudgetApprovalHostDto | null;
122
+ history: BudgetApprovalHostDto[];
123
+ planMatchesSnapshot: boolean;
124
+ currentAuthorizedCents: number | null;
125
+ };
126
+ //# sourceMappingURL=budgetApproval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgetApproval.d.ts","sourceRoot":"","sources":["../src/budgetApproval.ts"],"names":[],"mappings":"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"}