@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141

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 (220) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/devices/bodyComposition.js +116 -0
  12. package/lib/features/devices/bodyComposition.js.map +1 -0
  13. package/lib/features/devices/readings.js.map +1 -1
  14. package/lib/features/devices/session.js +22 -2
  15. package/lib/features/devices/session.js.map +1 -1
  16. package/lib/features/discover/DiscoverArticle.js +105 -92
  17. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  18. package/lib/features/discover/DiscoverFeed.js +97 -48
  19. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  20. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  21. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  22. package/lib/features/discover/DiscoverSidebar.js +555 -0
  23. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  24. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  25. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  26. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  27. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  28. package/lib/features/discover/followUpQuery.js +42 -0
  29. package/lib/features/discover/followUpQuery.js.map +1 -0
  30. package/lib/features/discover/markets.js +37 -0
  31. package/lib/features/discover/markets.js.map +1 -0
  32. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  33. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  34. package/lib/features/discover/weather.js +42 -0
  35. package/lib/features/discover/weather.js.map +1 -0
  36. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  37. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  38. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  39. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  40. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  41. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  42. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  43. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  44. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  45. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  46. package/lib/features/notion/NotionBlockSheets.js +206 -0
  47. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  48. package/lib/features/notion/NotionBlockView.js +36 -0
  49. package/lib/features/notion/NotionBlockView.js.map +1 -0
  50. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  51. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  52. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  53. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  54. package/lib/features/notion/NotionHistorySheet.js +439 -0
  55. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  56. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  57. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  58. package/lib/features/notion/NotionMentionSheet.js +279 -0
  59. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  60. package/lib/features/notion/NotionPageMenu.js +585 -0
  61. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  62. package/lib/features/notion/NotionPageTree.js +220 -0
  63. package/lib/features/notion/NotionPageTree.js.map +1 -0
  64. package/lib/features/notion/NotionPageView.js +1253 -152
  65. package/lib/features/notion/NotionPageView.js.map +1 -1
  66. package/lib/features/notion/NotionShareSheet.js +606 -0
  67. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  68. package/lib/features/notion/NotionSheets.js +87 -15
  69. package/lib/features/notion/NotionSheets.js.map +1 -1
  70. package/lib/features/notion/NotionSidebarSections.js +492 -0
  71. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  72. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  73. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  74. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  75. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  76. package/lib/features/notion/database/DatabaseCells.js +554 -0
  77. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  78. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  79. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  80. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  81. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  82. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  83. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  84. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  85. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  86. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  87. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  88. package/lib/features/notion/database/chartData.js +89 -0
  89. package/lib/features/notion/database/chartData.js.map +1 -0
  90. package/lib/features/notion/database/chartView.js +112 -0
  91. package/lib/features/notion/database/chartView.js.map +1 -0
  92. package/lib/features/notion/database/connectorButton.js +33 -0
  93. package/lib/features/notion/database/connectorButton.js.map +1 -0
  94. package/lib/features/notion/database/databaseCalc.js +208 -0
  95. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  96. package/lib/features/notion/database/databaseCalendar.js +157 -0
  97. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  98. package/lib/features/notion/database/databaseCsv.js +98 -0
  99. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  100. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  101. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  102. package/lib/features/notion/database/databaseFilter.js +473 -0
  103. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  104. package/lib/features/notion/database/databaseFormula.js +1072 -0
  105. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  106. package/lib/features/notion/database/databaseGroup.js +151 -0
  107. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  108. package/lib/features/notion/database/databaseRollup.js +58 -0
  109. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  110. package/lib/features/notion/database/databaseTimeline.js +156 -0
  111. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  112. package/lib/features/notion/database/databaseView.js +1188 -0
  113. package/lib/features/notion/database/databaseView.js.map +1 -0
  114. package/lib/features/notion/database/databaseViews.js +310 -0
  115. package/lib/features/notion/database/databaseViews.js.map +1 -0
  116. package/lib/features/notion/database/relationSource.js +92 -0
  117. package/lib/features/notion/database/relationSource.js.map +1 -0
  118. package/lib/features/notion/database/uniqueId.js +17 -0
  119. package/lib/features/notion/database/uniqueId.js.map +1 -0
  120. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  121. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  122. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  123. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  124. package/lib/features/notion/notionCodeLanguages.js +112 -0
  125. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  126. package/lib/features/notion/notionComments.js +86 -0
  127. package/lib/features/notion/notionComments.js.map +1 -0
  128. package/lib/features/notion/notionConnections.js +74 -0
  129. package/lib/features/notion/notionConnections.js.map +1 -0
  130. package/lib/features/notion/notionDocuments.js +453 -1
  131. package/lib/features/notion/notionDocuments.js.map +1 -1
  132. package/lib/features/notion/notionEditorModel.js +142 -7
  133. package/lib/features/notion/notionEditorModel.js.map +1 -1
  134. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  135. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  136. package/lib/features/notion/notionMedia.js +119 -0
  137. package/lib/features/notion/notionMedia.js.map +1 -0
  138. package/lib/features/notion/notionMentionDate.js +32 -0
  139. package/lib/features/notion/notionMentionDate.js.map +1 -0
  140. package/lib/features/notion/notionMentionOptions.js +162 -0
  141. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  142. package/lib/features/notion/notionNotesAgent.js +445 -0
  143. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  144. package/lib/features/notion/notionPageAccess.js +168 -0
  145. package/lib/features/notion/notionPageAccess.js.map +1 -0
  146. package/lib/features/notion/notionPageActions.js +138 -0
  147. package/lib/features/notion/notionPageActions.js.map +1 -0
  148. package/lib/features/notion/notionPageHistory.js +154 -0
  149. package/lib/features/notion/notionPageHistory.js.map +1 -0
  150. package/lib/features/notion/notionPageKinds.js +200 -0
  151. package/lib/features/notion/notionPageKinds.js.map +1 -0
  152. package/lib/features/notion/notionRecents.js +48 -0
  153. package/lib/features/notion/notionRecents.js.map +1 -0
  154. package/lib/features/notion/notionRichText.js +177 -0
  155. package/lib/features/notion/notionRichText.js.map +1 -0
  156. package/lib/features/notion/notionRichTitle.js +336 -0
  157. package/lib/features/notion/notionRichTitle.js.map +1 -0
  158. package/lib/features/notion/useNotionWorkspace.js +272 -13
  159. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  160. package/lib/features/notion/usePageActions.js +155 -0
  161. package/lib/features/notion/usePageActions.js.map +1 -0
  162. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  163. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  164. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  165. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  166. package/lib/features/study/StudyAgentChatPane.js +1 -1
  167. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  168. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  169. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  170. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  171. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  172. package/lib/features/webbuilder/buildFragments.js +1 -1
  173. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  174. package/lib/features/webbuilder/codeFiles.js +302 -0
  175. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  176. package/lib/features/webbuilder/codeHighlight.js +209 -0
  177. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  178. package/lib/features/webbuilder/components/CodeView.js +682 -52
  179. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  180. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  181. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  182. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  183. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  184. package/lib/features/webbuilder/stepLabels.js +68 -0
  185. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  186. package/lib/hooks/useHostChatSteering.js +45 -0
  187. package/lib/hooks/useHostChatSteering.js.map +1 -0
  188. package/lib/screens/Chat/index.js +2 -12
  189. package/lib/screens/Chat/index.js.map +1 -1
  190. package/lib/screens/Devices/index.js +205 -3
  191. package/lib/screens/Devices/index.js.map +1 -1
  192. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  193. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  194. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  195. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  196. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  197. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  198. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  199. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  200. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  201. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  202. package/lib/screens/NotionPage/index.js +2 -2
  203. package/lib/screens/NotionPage/index.js.map +1 -1
  204. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  205. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  206. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  207. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  208. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  209. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  210. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  211. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  212. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  213. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  214. package/lib/screens/WebBuilderNative/index.js +1 -1
  215. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  216. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  217. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  218. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  219. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  220. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseFormula.js","sources":["../../../../src/features/notion/database/databaseFormula.ts"],"sourcesContent":["/**\n * databaseFormula — a small, safe expression language for formula properties.\n *\n * No `eval` / `Function`: the source is tokenized, parsed into an AST (a Pratt parser) and walked\n * by an interpreter that only knows the operators and functions below. Errors are values, never\n * exceptions that escape: `compileFormula` reports syntax / unknown function / unknown property\n * errors, `evaluateFormula` reports runtime errors (division by zero, comparing a date with text…).\n *\n * Syntax\n * literals 12, 3.5, .5, 1e3, \"text\", 'text' (\\\" \\' \\\\ \\n escapes), true, false\n * properties prop(\"Name\")\n * arithmetic + - * / % ^ and unary - (`+` concatenates when either side is text;\n * an empty number reads as 0)\n * comparison == != > < >= <=\n * logic and or not (also && || !)\n * grouping ( … )\n *\n * Functions\n * if(cond, then, else) concat(a, b, …) length(text) lower(text) upper(text)\n * contains(text, part) empty(value) format(value) toNumber(value)\n * round(n[, digits]) floor(n) ceil(n) abs(n) sqrt(n) min(a, b, …) max(a, b, …)\n * now() today() dateBetween(a, b, unit) dateAdd(date, n, unit)\n * (units: \"years\" \"quarters\" \"months\" \"weeks\" \"days\" \"hours\" \"minutes\")\n *\n * Formula 2.0 (Notion)\n * variables let(x, 2, x * x) lets(a, 1, b, 2, a + b)\n * conditions ifs(c1, v1, c2, v2, …, else)\n * lists [1, 2, 3]; multi-select / person values are lists\n * map(list, current * 2) filter(list, current > 1) find / some / every(list, cond)\n * (`current` = the item, `index` = its position from 0)\n * join(list, \", \") at(list, i) first last sum average median sort reverse\n * unique includes(list, x) slice(list or text, start[, end]) split(text, sep)\n * text trim replace(text, find, with) replaceAll substring(text, start[, end])\n * repeat(text, n) startsWith endsWith padStart(text, n, fill)\n * dates formatDate(date, \"YYYY-MM-DD HH:mm\") parseDate(text) year month date (day\n * of month) day (weekday, Mon = 1) week hour minute timestamp\n * chains prop(\"Name\").upper() prop(\"Tags\").map(current.upper()).join(\" · \")\n * (`x.f(a)` is `f(x, a)`)\n *\n * Values are number | string | boolean | Date | null | lists of these.\n */\nimport {\n baseCellValue,\n connectorCellValue,\n cellDisplayText,\n dateString,\n multiSelectNames,\n numberValue,\n richTextToPlain,\n type CellGetter,\n type ColumnLike,\n type RowLike,\n} from './databaseView';\n\nexport type FormulaValue = number | string | boolean | Date | null | FormulaValue[];\n\n// ============================================================================\n// TOKENIZER\n// ============================================================================\n\ntype Token =\n | { t: 'num'; v: number; pos: number }\n | { t: 'str'; v: string; pos: number }\n | { t: 'id'; v: string; pos: number }\n | { t: 'op'; v: string; pos: number }\n | { t: '('; pos: number }\n | { t: ')'; pos: number }\n | { t: ','; pos: number }\n | { t: '['; pos: number }\n | { t: ']'; pos: number }\n | { t: '.'; pos: number }\n | { t: 'eof'; pos: number };\n\nclass FormulaError extends Error {}\n\n/** Thrown through every nesting level of a formula cycle; only the outermost row lookup catches it. */\nclass FormulaCycleError extends Error {}\n\nconst MAX_SOURCE = 2000;\nconst MAX_NESTING = 64;\n\nconst OPERATORS = ['==', '!=', '>=', '<=', '&&', '||', '+', '-', '*', '/', '%', '^', '>', '<', '!', '='];\n\nfunction tokenize(src: string): Token[] {\n const out: Token[] = [];\n let i = 0;\n while (i < src.length) {\n const ch = src[i];\n if (/\\s/.test(ch)) {\n i += 1;\n continue;\n }\n if (/[0-9]/.test(ch) || (ch === '.' && /[0-9]/.test(src[i + 1] ?? ''))) {\n const m = /^(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?/.exec(src.slice(i));\n if (!m) throw new FormulaError(`Unexpected \"${ch}\" at ${i + 1}`);\n out.push({ t: 'num', v: Number(m[0]), pos: i });\n i += m[0].length;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n let j = i + 1;\n let text = '';\n while (j < src.length && src[j] !== ch) {\n if (src[j] === '\\\\' && j + 1 < src.length) {\n const next = src[j + 1];\n text += next === 'n' ? '\\n' : next === 't' ? '\\t' : next;\n j += 2;\n } else {\n text += src[j];\n j += 1;\n }\n }\n if (j >= src.length) throw new FormulaError('Missing closing quote');\n out.push({ t: 'str', v: text, pos: i });\n i = j + 1;\n continue;\n }\n if (/[A-Za-z_]/.test(ch)) {\n const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(src.slice(i)) as RegExpExecArray;\n out.push({ t: 'id', v: m[0], pos: i });\n i += m[0].length;\n continue;\n }\n if (ch === '(' || ch === ')' || ch === ',' || ch === '[' || ch === ']' || ch === '.') {\n out.push({ t: ch, pos: i });\n i += 1;\n continue;\n }\n const op = OPERATORS.find((o) => src.startsWith(o, i));\n if (op) {\n // A lone `=` is a common slip for `==`; accept it as equality.\n out.push({ t: 'op', v: op === '=' ? '==' : op, pos: i });\n i += op.length;\n continue;\n }\n throw new FormulaError(`Unexpected \"${ch}\" at ${i + 1}`);\n }\n out.push({ t: 'eof', pos: src.length });\n return out;\n}\n\n// ============================================================================\n// PARSER (Pratt)\n// ============================================================================\n\nexport type FormulaNode =\n | { k: 'lit'; v: FormulaValue }\n | { k: 'prop'; name: string }\n | { k: 'var'; name: string }\n | { k: 'list'; items: FormulaNode[] }\n | { k: 'let'; names: string[]; values: FormulaNode[]; body: FormulaNode }\n | { k: 'call'; name: string; args: FormulaNode[] }\n | { k: 'unary'; op: '-' | 'not'; arg: FormulaNode }\n | { k: 'bin'; op: string; l: FormulaNode; r: FormulaNode };\n\n/** Left binding power of binary operators (higher binds tighter). */\nconst BINARY_BP: Record<string, number> = {\n or: 1,\n and: 2,\n '==': 3,\n '!=': 3,\n '>': 4,\n '<': 4,\n '>=': 4,\n '<=': 4,\n '+': 5,\n '-': 5,\n '*': 6,\n '/': 6,\n '%': 6,\n '^': 7,\n};\n\n/** Function name → [min args, max args]. `prop` is parsed specially. */\nconst FUNCTIONS: Record<string, [number, number]> = {\n if: [3, 3],\n concat: [1, 50],\n length: [1, 1],\n lower: [1, 1],\n upper: [1, 1],\n contains: [2, 2],\n empty: [1, 1],\n format: [1, 1],\n tonumber: [1, 1],\n round: [1, 2],\n floor: [1, 1],\n ceil: [1, 1],\n abs: [1, 1],\n sqrt: [1, 1],\n min: [1, 50],\n max: [1, 50],\n now: [0, 0],\n today: [0, 0],\n datebetween: [3, 3],\n dateadd: [3, 3],\n not: [1, 1],\n and: [2, 50],\n or: [2, 50],\n // Formula 2.0\n ifs: [3, 51],\n map: [2, 2],\n filter: [2, 2],\n find: [2, 2],\n some: [2, 2],\n every: [2, 2],\n join: [1, 2],\n at: [2, 2],\n first: [1, 1],\n last: [1, 1],\n sum: [1, 50],\n average: [1, 50],\n median: [1, 50],\n sort: [1, 1],\n reverse: [1, 1],\n unique: [1, 1],\n includes: [2, 2],\n slice: [2, 3],\n split: [2, 2],\n trim: [1, 1],\n replace: [3, 3],\n replaceall: [3, 3],\n substring: [2, 3],\n repeat: [2, 2],\n startswith: [2, 2],\n endswith: [2, 2],\n padstart: [2, 3],\n formatdate: [2, 2],\n parsedate: [1, 1],\n year: [1, 1],\n month: [1, 1],\n date: [1, 1],\n day: [1, 1],\n week: [1, 1],\n hour: [1, 1],\n minute: [1, 1],\n timestamp: [1, 1],\n tostring: [1, 1],\n};\n\n/** Functions whose second argument is evaluated per list item (`current`, `index`). */\nconst LIST_LAMBDAS = new Set(['map', 'filter', 'find', 'some', 'every']);\n\nexport const FORMULA_FUNCTIONS = [\n 'if',\n 'prop',\n 'concat',\n 'length',\n 'lower',\n 'upper',\n 'contains',\n 'empty',\n 'format',\n 'toNumber',\n 'round',\n 'floor',\n 'ceil',\n 'abs',\n 'sqrt',\n 'min',\n 'max',\n 'now',\n 'today',\n 'dateBetween',\n 'dateAdd',\n 'let',\n 'lets',\n 'ifs',\n 'map',\n 'filter',\n 'find',\n 'some',\n 'every',\n 'join',\n 'at',\n 'first',\n 'last',\n 'sum',\n 'average',\n 'median',\n 'sort',\n 'reverse',\n 'unique',\n 'includes',\n 'slice',\n 'split',\n 'trim',\n 'replace',\n 'replaceAll',\n 'substring',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'padStart',\n 'formatDate',\n 'parseDate',\n 'year',\n 'month',\n 'date',\n 'day',\n 'week',\n 'hour',\n 'minute',\n 'timestamp',\n 'toString',\n];\n\nclass Parser {\n private i = 0;\n private depth = 0;\n readonly refs = new Set<string>();\n /** Names in scope: let / lets variables, `current` / `index` inside map() & co. */\n private scopes: string[][] = [];\n\n private inScope(name: string): boolean {\n return this.scopes.some((s) => s.includes(name));\n }\n\n private withScope<T>(names: string[], fn: () => T): T {\n this.scopes.push(names);\n try {\n return fn();\n } finally {\n this.scopes.pop();\n }\n }\n\n private peekAt(offset: number): Token {\n return this.tokens[Math.min(this.i + offset, this.tokens.length - 1)];\n }\n\n /** `x.f(a)` → f(x, a); repeated for chains. */\n private parsePostfix(node: FormulaNode): FormulaNode {\n let out = node;\n while (this.peek().t === '.') {\n const dot = this.next();\n const name = this.next();\n if (name.t !== 'id') throw new FormulaError(`Expected a function name after \".\" at ${dot.pos + 1}`);\n this.expect('(', `\"(\" after .${name.v}`);\n out = this.parseCallRest(name.v, out);\n }\n return out;\n }\n\n private parseArgList(): FormulaNode[] {\n const args: FormulaNode[] = [];\n if (this.peek().t !== ')') {\n for (;;) {\n args.push(this.parseExpr(0));\n if (this.peek().t === ',') {\n this.next();\n continue;\n }\n break;\n }\n }\n return args;\n }\n\n /** After `name(` (and an optional receiver from `x.name(`): the arguments and `)`. */\n private parseCallRest(word: string, receiver?: FormulaNode): FormulaNode {\n const lower = word.toLowerCase();\n if (lower === 'let' || lower === 'lets') {\n if (receiver) throw new FormulaError(`${word}() can't be chained`);\n const names: string[] = [];\n const values: FormulaNode[] = [];\n for (;;) {\n const id = this.next();\n if (id.t !== 'id') throw new FormulaError(`${word}() needs a variable name, e.g. let(x, 1, x + 1)`);\n this.expect(',', `\",\" after ${id.v}`);\n // Earlier variables are visible in later values (lets(a, 1, b, a + 1, …)).\n values.push(this.withScope(names.slice(), () => this.parseExpr(0)));\n names.push(id.v);\n this.expect(',', `\",\" in ${word}()`);\n const more =\n lower === 'lets' &&\n this.peek().t === 'id' &&\n this.peekAt(1).t === ',' &&\n this.peekAt(1) !== undefined;\n if (!more) break;\n }\n const body = this.withScope(names, () => this.parseExpr(0));\n this.expect(')', `\")\" to close ${word}(`);\n return { k: 'let', names, values, body };\n }\n let args: FormulaNode[];\n if (LIST_LAMBDAS.has(lower)) {\n const list = receiver ?? this.parseExpr(0);\n if (!receiver) this.expect(',', `\",\" in ${word}()`);\n const fn = this.withScope(['current', 'index'], () => this.parseExpr(0));\n args = [list, fn];\n } else {\n args = this.parseArgList();\n if (receiver) args = [receiver, ...args];\n }\n this.expect(')', `\")\" to close ${word}(`);\n if (lower === 'prop') {\n const a = args[0];\n if (receiver || args.length !== 1 || a.k !== 'lit' || typeof a.v !== 'string') {\n throw new FormulaError('prop() takes one property name in quotes, e.g. prop(\"Price\")');\n }\n this.refs.add(a.v);\n return { k: 'prop', name: a.v };\n }\n const arity = FUNCTIONS[lower];\n if (!arity) throw new FormulaError(`Unknown function \"${word}\"`);\n if (args.length < arity[0] || args.length > arity[1]) {\n const want = arity[0] === arity[1] ? `${arity[0]}` : `${arity[0]}–${arity[1]}`;\n throw new FormulaError(`${word}() takes ${want} argument${arity[1] === 1 ? '' : 's'}`);\n }\n return { k: 'call', name: lower, args };\n }\n\n constructor(private readonly tokens: Token[]) {}\n\n private peek(): Token {\n return this.tokens[this.i];\n }\n\n private next(): Token {\n return this.tokens[this.i++];\n }\n\n private expect(t: Token['t'], what: string): Token {\n const tok = this.next();\n if (tok.t !== t) throw new FormulaError(`Expected ${what} at ${tok.pos + 1}`);\n return tok;\n }\n\n /** Binary operator name of a token (`&&` → and), or null. */\n private binaryOp(tok: Token): string | null {\n if (tok.t === 'op') {\n if (tok.v === '&&') return 'and';\n if (tok.v === '||') return 'or';\n return tok.v in BINARY_BP ? tok.v : null;\n }\n if (tok.t === 'id' && (tok.v === 'and' || tok.v === 'or')) return tok.v;\n return null;\n }\n\n parseAll(): FormulaNode {\n if (this.peek().t === 'eof') throw new FormulaError('Formula is empty');\n const node = this.parseExpr(0);\n const tok = this.peek();\n if (tok.t !== 'eof') throw new FormulaError(`Unexpected ${describe(tok)} at ${tok.pos + 1}`);\n return node;\n }\n\n parseExpr(minBp: number): FormulaNode {\n if (++this.depth > MAX_NESTING) throw new FormulaError('Formula is nested too deeply');\n let left = this.parsePrefix();\n for (;;) {\n const op = this.binaryOp(this.peek());\n if (!op) break;\n const bp = BINARY_BP[op];\n if (bp <= minBp) break;\n this.next();\n // `^` is right-associative; everything else is left-associative.\n const right = this.parseExpr(op === '^' ? bp - 1 : bp);\n left = { k: 'bin', op, l: left, r: right };\n }\n this.depth -= 1;\n return left;\n }\n\n private parsePrefix(): FormulaNode {\n return this.parsePostfix(this.parsePrimary());\n }\n\n private parsePrimary(): FormulaNode {\n const tok = this.next();\n switch (tok.t) {\n case 'num':\n return { k: 'lit', v: tok.v };\n case 'str':\n return { k: 'lit', v: tok.v };\n case '(': {\n const inner = this.parseExpr(0);\n this.expect(')', '\")\"');\n return inner;\n }\n case '[': {\n const items: FormulaNode[] = [];\n if (this.peek().t !== ']') {\n for (;;) {\n items.push(this.parseExpr(0));\n if (this.peek().t === ',') {\n this.next();\n continue;\n }\n break;\n }\n }\n this.expect(']', '\"]\" to close the list');\n return { k: 'list', items };\n }\n case 'op':\n // Unary minus binds looser than `^` (-2^2 = -4) but tighter than `*`.\n if (tok.v === '-') return { k: 'unary', op: '-', arg: this.parseExpr(6) };\n if (tok.v === '+') return this.parseExpr(6);\n if (tok.v === '!') return { k: 'unary', op: 'not', arg: this.parseExpr(2) };\n throw new FormulaError(`Unexpected \"${tok.v}\" at ${tok.pos + 1}`);\n case 'id': {\n const word = tok.v;\n const lower = word.toLowerCase();\n if (lower === 'true' || lower === 'false') return { k: 'lit', v: lower === 'true' };\n if (lower === 'not' && this.peek().t !== '(') {\n return { k: 'unary', op: 'not', arg: this.parseExpr(2) };\n }\n if (this.peek().t !== '(') {\n if (this.inScope(word)) return { k: 'var', name: word };\n throw new FormulaError(`Unknown name \"${word}\" — use prop(\"${word}\")`);\n }\n this.next();\n return this.parseCallRest(word);\n }\n case ')':\n throw new FormulaError(`Unexpected \")\" at ${tok.pos + 1}`);\n case ',':\n throw new FormulaError(`Unexpected \",\" at ${tok.pos + 1}`);\n case ']':\n case '.':\n throw new FormulaError(`Unexpected \"${tok.t}\" at ${tok.pos + 1}`);\n default:\n throw new FormulaError('Formula ended unexpectedly');\n }\n }\n}\n\nfunction describe(tok: Token): string {\n if (tok.t === 'num' || tok.t === 'id') return `\"${tok.v}\"`;\n if (tok.t === 'str') return 'text';\n if (tok.t === 'op') return `\"${tok.v}\"`;\n if (tok.t === 'eof') return 'end';\n return `\"${tok.t}\"`;\n}\n\nexport type CompileResult =\n | { ok: true; ast: FormulaNode; refs: string[]; error?: undefined }\n | { ok: false; error: string; ast?: undefined; refs?: undefined };\n\n/**\n * Parse a formula. With `properties`, every prop(\"…\") must name one of them; with `self`, a\n * formula may not reference its own property.\n */\nexport function compileFormula(source: string, opts: { properties?: string[]; self?: string } = {}): CompileResult {\n try {\n if ((source ?? '').length > MAX_SOURCE) throw new FormulaError('Formula is too long');\n const parser = new Parser(tokenize(source ?? ''));\n const ast = parser.parseAll();\n const refs = [...parser.refs];\n if (opts.self && refs.includes(opts.self)) throw new FormulaError('A formula cannot reference itself');\n if (opts.properties) {\n const missing = refs.find((r) => !opts.properties!.includes(r));\n if (missing) throw new FormulaError(`Unknown property \"${missing}\"`);\n }\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, error: e.message };\n throw e;\n }\n}\n\nconst compileCache = new Map<string, CompileResult>();\n\n/** `compileFormula` without property checks, memoised per source (cells evaluate it per row). */\nexport function compileCached(source: string): CompileResult {\n let hit = compileCache.get(source);\n if (!hit) {\n if (compileCache.size > 500) compileCache.clear();\n hit = compileFormula(source);\n compileCache.set(source, hit);\n }\n return hit;\n}\n\n// ============================================================================\n// INTERPRETER\n// ============================================================================\n\nexport interface FormulaContext {\n /** Value of prop(\"name\") already converted with `toFormulaValue`. Throw for unknown names. */\n getProp: (name: string) => FormulaValue;\n now: Date;\n /** let / lets variables and `current` / `index` (set by the interpreter). */\n vars?: Record<string, FormulaValue>;\n /** Steps left for this evaluation (shared by nested scopes; set by evaluateFormula). */\n budget?: { left: number };\n}\n\n/** Most interpreter steps one formula may take for one row (nested map()s can explode). */\nconst MAX_STEPS = 100_000;\n\n/** Longest list / text a formula may build (map over huge lists, repeat()). */\nconst MAX_LIST = 10_000;\nconst MAX_TEXT = 100_000;\n\nexport type EvalResult =\n | { ok: true; value: FormulaValue; error?: undefined }\n | { ok: false; error: string; value?: undefined };\n\nconst isDate = (v: unknown): v is Date => v instanceof Date;\n\n/** Text form of a value (used by `+` concatenation, concat(), format()). */\nexport function formatFormulaValue(v: FormulaValue): string {\n if (v === null) return '';\n if (Array.isArray(v)) return v.map(formatFormulaValue).join(', ');\n if (isDate(v)) {\n const midnight = v.getHours() === 0 && v.getMinutes() === 0 && v.getSeconds() === 0;\n return midnight\n ? v.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' })\n : v.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n }\n if (typeof v === 'number') return String(Number(v.toPrecision(12)));\n return String(v);\n}\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (Array.isArray(v)) return v.length > 0;\n if (typeof v === 'boolean') return v;\n if (typeof v === 'number') return v !== 0;\n if (typeof v === 'string') return v.length > 0;\n return true;\n}\n\nfunction num(v: FormulaValue, what: string): number {\n if (v === null) return 0;\n if (typeof v === 'number') return v;\n if (typeof v === 'boolean') return v ? 1 : 0;\n throw new FormulaError(`${what} needs a number, got ${kind(v)}`);\n}\n\nfunction date(v: FormulaValue, what: string): Date {\n if (isDate(v)) return v;\n throw new FormulaError(`${what} needs a date`);\n}\n\nfunction text(v: FormulaValue): string {\n return formatFormulaValue(v);\n}\n\nconst DAY = 86_400_000;\n\n/** Wall-clock milliseconds between two dates (DST shifts don't eat an hour of a day). */\nfunction wallClockDiff(a: Date, b: Date): number {\n return a.getTime() - b.getTime() - (a.getTimezoneOffset() - b.getTimezoneOffset()) * 60_000;\n}\n\n/** Add months, clamping the day to the target month's length (Jan 31 + 1 month = Feb 28/29). */\nexport function addMonthsClamped(d: Date, months: number): Date {\n const out = new Date(d.getTime());\n const day = d.getDate();\n out.setDate(1);\n out.setMonth(out.getMonth() + months);\n const last = new Date(out.getFullYear(), out.getMonth() + 1, 0).getDate();\n out.setDate(Math.min(day, last));\n return out;\n}\n\n/** Whole months from b to a (a − b), truncated toward zero. */\nfunction monthsBetween(a: Date, b: Date): number {\n let m = (a.getFullYear() - b.getFullYear()) * 12 + (a.getMonth() - b.getMonth());\n const anchor = addMonthsClamped(b, m);\n if (m > 0 && anchor.getTime() > a.getTime()) m -= 1;\n else if (m < 0 && anchor.getTime() < a.getTime()) m += 1;\n return m;\n}\n\nfunction normUnit(u: FormulaValue): string {\n const s = String(u ?? '')\n .toLowerCase()\n .trim();\n const unit = s.endsWith('s') ? s : `${s}s`;\n if (!['years', 'quarters', 'months', 'weeks', 'days', 'hours', 'minutes'].includes(unit)) {\n throw new FormulaError(`Unknown unit \"${String(u)}\" (use \"days\", \"weeks\", \"months\", …)`);\n }\n return unit;\n}\n\nexport function dateBetween(a: Date, b: Date, unitIn: string): number {\n const unit = normUnit(unitIn);\n switch (unit) {\n case 'years':\n return Math.trunc(monthsBetween(a, b) / 12);\n case 'quarters':\n return Math.trunc(monthsBetween(a, b) / 3);\n case 'months':\n return monthsBetween(a, b);\n case 'weeks':\n return Math.trunc(wallClockDiff(a, b) / (7 * DAY));\n case 'days':\n return Math.trunc(wallClockDiff(a, b) / DAY);\n case 'hours':\n return Math.trunc((a.getTime() - b.getTime()) / 3_600_000);\n default:\n return Math.trunc((a.getTime() - b.getTime()) / 60_000);\n }\n}\n\nexport function dateAdd(d: Date, n: number, unitIn: string): Date {\n const unit = normUnit(unitIn);\n const whole = Math.trunc(n);\n switch (unit) {\n case 'years':\n return addMonthsClamped(d, whole * 12);\n case 'quarters':\n return addMonthsClamped(d, whole * 3);\n case 'months':\n return addMonthsClamped(d, whole);\n case 'weeks':\n case 'days': {\n const out = new Date(d.getTime());\n out.setDate(out.getDate() + whole * (unit === 'weeks' ? 7 : 1));\n return out;\n }\n case 'hours':\n return new Date(d.getTime() + n * 3_600_000);\n default:\n return new Date(d.getTime() + n * 60_000);\n }\n}\n\nfunction sameValue(l: FormulaValue, r: FormulaValue): boolean {\n if (isDate(l) && isDate(r)) return l.getTime() === r.getTime();\n if (Array.isArray(l) && Array.isArray(r)) return l.length === r.length && l.every((x, i) => sameValue(x, r[i]));\n return l === r;\n}\n\nfunction compare(op: string, l: FormulaValue, r: FormulaValue): boolean {\n if (op === '==' || op === '!=') {\n const eq = sameValue(l, r);\n return op === '==' ? eq : !eq;\n }\n let a: number | string;\n let b: number | string;\n if (isDate(l) && isDate(r)) {\n a = l.getTime();\n b = r.getTime();\n } else if (typeof l === 'string' && typeof r === 'string') {\n const c = l.localeCompare(r, undefined, { numeric: true, sensitivity: 'base' });\n a = c;\n b = 0;\n } else if (\n (typeof l === 'number' || l === null || typeof l === 'boolean') &&\n (typeof r === 'number' || r === null || typeof r === 'boolean')\n ) {\n a = num(l, op);\n b = num(r, op);\n } else {\n throw new FormulaError(`Can't compare ${kind(l)} with ${kind(r)}`);\n }\n switch (op) {\n case '>':\n return a > b;\n case '<':\n return a < b;\n case '>=':\n return a >= b;\n default:\n return a <= b;\n }\n}\n\nfunction kind(v: FormulaValue): string {\n if (v === null) return 'empty';\n if (Array.isArray(v)) return 'a list';\n if (isDate(v)) return 'a date';\n if (typeof v === 'string') return 'text';\n if (typeof v === 'boolean') return 'a checkbox';\n return 'a number';\n}\n\nfunction evalNode(node: FormulaNode, ctx: FormulaContext): FormulaValue {\n if (ctx.budget && --ctx.budget.left < 0) throw new FormulaError('Formula is too complex');\n switch (node.k) {\n case 'lit':\n return node.v;\n case 'prop':\n return ctx.getProp(node.name);\n case 'var': {\n const vars = ctx.vars ?? {};\n if (!(node.name in vars)) throw new FormulaError(`\"${node.name}\" has no value here`);\n return vars[node.name];\n }\n case 'list':\n return node.items.map((n) => evalNode(n, ctx));\n case 'let': {\n let scope = ctx;\n node.names.forEach((name, i) => {\n const v = evalNode(node.values[i], scope);\n scope = { ...scope, vars: { ...(scope.vars ?? {}), [name]: v } };\n });\n return evalNode(node.body, scope);\n }\n case 'unary': {\n const v = evalNode(node.arg, ctx);\n return node.op === '-' ? -num(v, 'Minus') : !truthy(v);\n }\n case 'bin': {\n if (node.op === 'and') return truthy(evalNode(node.l, ctx)) && truthy(evalNode(node.r, ctx));\n if (node.op === 'or') return truthy(evalNode(node.l, ctx)) || truthy(evalNode(node.r, ctx));\n const l = evalNode(node.l, ctx);\n const r = evalNode(node.r, ctx);\n switch (node.op) {\n case '+':\n if (typeof l === 'string' || typeof r === 'string') return text(l) + text(r);\n if (isDate(l) || isDate(r)) throw new FormulaError('Use dateAdd() to add to a date');\n return num(l, '+') + num(r, '+');\n case '-':\n if (isDate(l) || isDate(r)) throw new FormulaError('Use dateBetween() to subtract dates');\n return num(l, '-') - num(r, '-');\n case '*':\n return num(l, '*') * num(r, '*');\n case '/': {\n const d = num(r, '/');\n if (d === 0) throw new FormulaError('Division by zero');\n return num(l, '/') / d;\n }\n case '%': {\n const d = num(r, '%');\n if (d === 0) throw new FormulaError('Division by zero');\n return num(l, '%') % d;\n }\n case '^':\n return num(l, '^') ** num(r, '^');\n default:\n return compare(node.op, l, r);\n }\n }\n case 'call':\n return callFunction(node.name, node.args, ctx);\n default:\n return null;\n }\n}\n\n/** The list a list function works on (a single value counts as a one-item list; empty → []). */\nfunction list(v: FormulaValue): FormulaValue[] {\n if (Array.isArray(v)) return v;\n return v === null ? [] : [v];\n}\n\n/** All the numbers in some arguments (lists are flattened; empty values skipped). */\nfunction numbers(args: FormulaValue[], what: string): number[] {\n const out: number[] = [];\n for (const a of args) for (const x of list(a)) if (x !== null) out.push(num(x, what));\n return out;\n}\n\nfunction capList(v: FormulaValue[]): FormulaValue[] {\n if (v.length > MAX_LIST) throw new FormulaError('List is too long');\n return v;\n}\n\nfunction capText(t: string): string {\n if (t.length > MAX_TEXT) throw new FormulaError('Text is too long');\n return t;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\n/** ISO week number (weeks start Monday; week 1 holds the year's first Thursday). */\nfunction isoWeek(d: Date): number {\n const t = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = t.getUTCDay() || 7;\n t.setUTCDate(t.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(t.getUTCFullYear(), 0, 1));\n return Math.ceil(((t.getTime() - yearStart.getTime()) / DAY + 1) / 7);\n}\n\n/** formatDate tokens: YYYY YY MMMM MMM MM M DD D dddd ddd HH H hh h mm ss A a; [text] is literal. */\nexport function formatDatePattern(d: Date, pattern: string): string {\n const month = (style: 'long' | 'short') => d.toLocaleDateString('en-US', { month: style });\n const weekday = (style: 'long' | 'short') => d.toLocaleDateString('en-US', { weekday: style });\n const h12 = d.getHours() % 12 || 12;\n const tokens: Record<string, () => string> = {\n YYYY: () => String(d.getFullYear()),\n YY: () => String(d.getFullYear()).slice(-2),\n MMMM: () => month('long'),\n MMM: () => month('short'),\n MM: () => pad2(d.getMonth() + 1),\n M: () => String(d.getMonth() + 1),\n DD: () => pad2(d.getDate()),\n D: () => String(d.getDate()),\n dddd: () => weekday('long'),\n ddd: () => weekday('short'),\n HH: () => pad2(d.getHours()),\n H: () => String(d.getHours()),\n hh: () => pad2(h12),\n h: () => String(h12),\n mm: () => pad2(d.getMinutes()),\n ss: () => pad2(d.getSeconds()),\n A: () => (d.getHours() < 12 ? 'AM' : 'PM'),\n a: () => (d.getHours() < 12 ? 'am' : 'pm'),\n };\n return pattern.replace(/\\[([^\\]]*)\\]|YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|ss|A|a/g, (m, lit) =>\n lit !== undefined ? lit : tokens[m](),\n );\n}\n\nfunction callFunction(name: string, argNodes: FormulaNode[], ctx: FormulaContext): FormulaValue {\n // Lazy functions first (only the taken branch is evaluated).\n if (name === 'if')\n return truthy(evalNode(argNodes[0], ctx)) ? evalNode(argNodes[1], ctx) : evalNode(argNodes[2], ctx);\n if (name === 'ifs') {\n let i = 0;\n for (; i + 1 < argNodes.length; i += 2)\n if (truthy(evalNode(argNodes[i], ctx))) return evalNode(argNodes[i + 1], ctx);\n return i < argNodes.length ? evalNode(argNodes[i], ctx) : null;\n }\n if (LIST_LAMBDAS.has(name)) {\n const items = list(evalNode(argNodes[0], ctx));\n const each = (x: FormulaValue, i: number) =>\n evalNode(argNodes[1], { ...ctx, vars: { ...(ctx.vars ?? {}), current: x, index: i } });\n switch (name) {\n case 'map':\n return capList(items.map(each));\n case 'filter':\n return items.filter((x, i) => truthy(each(x, i)));\n case 'find':\n return items.find((x, i) => truthy(each(x, i))) ?? null;\n case 'some':\n return items.some((x, i) => truthy(each(x, i)));\n default:\n return items.every((x, i) => truthy(each(x, i)));\n }\n }\n if (name === 'and') return argNodes.every((a) => truthy(evalNode(a, ctx)));\n if (name === 'or') return argNodes.some((a) => truthy(evalNode(a, ctx)));\n const args = argNodes.map((a) => evalNode(a, ctx));\n const [a, b, c] = args;\n switch (name) {\n case 'concat':\n // Lists concatenate into one list; otherwise text.\n if (args.some(Array.isArray)) return capList(args.flatMap((x) => list(x)));\n return capText(args.map(text).join(''));\n case 'length':\n return Array.isArray(a) ? a.length : text(a).length;\n case 'lower':\n return text(a).toLowerCase();\n case 'upper':\n return text(a).toUpperCase();\n case 'contains':\n if (Array.isArray(a)) return a.some((x) => text(x).toLowerCase().includes(text(b).toLowerCase()));\n return text(a).toLowerCase().includes(text(b).toLowerCase());\n case 'empty':\n return (\n a === null ||\n a === '' ||\n (Array.isArray(a) && a.length === 0) ||\n (typeof a === 'number' && Number.isNaN(a))\n );\n case 'format':\n return text(a);\n case 'not':\n return !truthy(a);\n case 'tonumber': {\n if (a === null) return null;\n if (isDate(a)) return a.getTime();\n if (typeof a === 'boolean') return a ? 1 : 0;\n if (typeof a === 'number') return a;\n const n = Number(String(a).trim().replace(/,/g, ''));\n return String(a).trim() && Number.isFinite(n) ? n : null;\n }\n case 'round': {\n const digits = b === undefined ? 0 : Math.max(0, Math.min(10, Math.trunc(num(b, 'round'))));\n const f = 10 ** digits;\n return Math.round(num(a, 'round') * f) / f;\n }\n case 'floor':\n return Math.floor(num(a, 'floor'));\n case 'ceil':\n return Math.ceil(num(a, 'ceil'));\n case 'abs':\n return Math.abs(num(a, 'abs'));\n case 'sqrt': {\n const n = num(a, 'sqrt');\n if (n < 0) throw new FormulaError('sqrt() of a negative number');\n return Math.sqrt(n);\n }\n case 'min': {\n const ns = numbers(args, 'min');\n return ns.length ? Math.min(...ns) : null;\n }\n case 'max': {\n const ns = numbers(args, 'max');\n return ns.length ? Math.max(...ns) : null;\n }\n case 'sum':\n return numbers(args, 'sum').reduce((x, y) => x + y, 0);\n case 'average': {\n const ns = numbers(args, 'average');\n return ns.length ? ns.reduce((x, y) => x + y, 0) / ns.length : null;\n }\n case 'median': {\n const ns = numbers(args, 'median').sort((x, y) => x - y);\n if (!ns.length) return null;\n const m = Math.floor(ns.length / 2);\n return ns.length % 2 ? ns[m] : (ns[m - 1] + ns[m]) / 2;\n }\n case 'join':\n return capText(\n list(a)\n .map(text)\n .join(b === undefined ? ', ' : text(b)),\n );\n case 'at': {\n const items = list(a);\n const i = Math.trunc(num(b, 'at()'));\n return items[i < 0 ? items.length + i : i] ?? null;\n }\n case 'first':\n return list(a)[0] ?? null;\n case 'last': {\n const items = list(a);\n return items[items.length - 1] ?? null;\n }\n case 'sort':\n return [...list(a)].sort((x, y) => {\n if (x === null) return 1;\n if (y === null) return -1;\n if (typeof x === 'number' && typeof y === 'number') return x - y;\n if (isDate(x) && isDate(y)) return x.getTime() - y.getTime();\n return text(x).localeCompare(text(y), undefined, { numeric: true, sensitivity: 'base' });\n });\n case 'reverse':\n return Array.isArray(a) ? [...a].reverse() : [...text(a)].reverse().join('');\n case 'unique': {\n const out: FormulaValue[] = [];\n const seen = new Set<unknown>();\n for (const x of list(a)) {\n // Primitives by value in O(1); dates / lists by deep comparison.\n const key =\n x === null\n ? 'null'\n : typeof x !== 'object'\n ? `${typeof x}:${String(x)}`\n : isDate(x)\n ? `date:${x.getTime()}`\n : undefined;\n if (key !== undefined) {\n if (seen.has(key)) continue;\n seen.add(key);\n } else if (out.some((y) => sameValue(x, y))) continue;\n out.push(x);\n }\n return out;\n }\n case 'includes':\n return list(a).some(\n (x) =>\n sameValue(x, b) ||\n (typeof x === 'string' && typeof b === 'string' && x.toLowerCase() === b.toLowerCase()),\n );\n case 'slice': {\n const start = Math.trunc(num(b, 'slice()'));\n const end = c === undefined ? undefined : Math.trunc(num(c, 'slice()'));\n return Array.isArray(a) ? a.slice(start, end) : text(a).slice(start, end);\n }\n case 'split':\n return capList(text(a).split(text(b)));\n case 'trim':\n return text(a).trim();\n case 'replace':\n return text(a).replace(text(b), () => text(c));\n case 'replaceall':\n return capText(text(b) ? text(a).split(text(b)).join(text(c)) : text(a));\n case 'substring': {\n const start = Math.trunc(num(b, 'substring()'));\n return c === undefined\n ? text(a).substring(start)\n : text(a).substring(start, Math.trunc(num(c, 'substring()')));\n }\n case 'repeat': {\n const n = Math.max(0, Math.trunc(num(b, 'repeat()')));\n if (text(a).length * n > MAX_TEXT) throw new FormulaError('Text is too long');\n return text(a).repeat(n);\n }\n case 'startswith':\n return text(a).startsWith(text(b));\n case 'endswith':\n return text(a).endsWith(text(b));\n case 'padstart': {\n const n = Math.min(1000, Math.max(0, Math.trunc(num(b, 'padStart()'))));\n return text(a).padStart(n, c === undefined ? ' ' : text(c) || ' ');\n }\n case 'formatdate':\n if (a === null) return null;\n return formatDatePattern(date(a, 'formatDate()'), text(b));\n case 'parsedate': {\n if (a === null || text(a).trim() === '') return null;\n const d = parseDateValue(text(a).trim());\n if (!d) throw new FormulaError(`parseDate() can't read \"${text(a)}\"`);\n return d;\n }\n case 'year':\n return a === null ? null : date(a, 'year()').getFullYear();\n case 'month':\n return a === null ? null : date(a, 'month()').getMonth() + 1;\n case 'date':\n return a === null ? null : date(a, 'date()').getDate();\n case 'day':\n return a === null ? null : date(a, 'day()').getDay() || 7;\n case 'week':\n return a === null ? null : isoWeek(date(a, 'week()'));\n case 'hour':\n return a === null ? null : date(a, 'hour()').getHours();\n case 'minute':\n return a === null ? null : date(a, 'minute()').getMinutes();\n case 'timestamp':\n return a === null ? null : date(a, 'timestamp()').getTime();\n case 'tostring':\n return text(a);\n case 'now':\n return new Date(ctx.now.getTime());\n case 'today':\n return new Date(ctx.now.getFullYear(), ctx.now.getMonth(), ctx.now.getDate());\n case 'datebetween':\n if (a === null || b === null) return null;\n return dateBetween(date(a, 'dateBetween()'), date(b, 'dateBetween()'), String(c));\n case 'dateadd':\n if (a === null) return null;\n return dateAdd(date(a, 'dateAdd()'), num(b, 'dateAdd()'), String(c));\n default:\n throw new FormulaError(`Unknown function \"${name}\"`);\n }\n}\n\nexport function evaluateFormula(ast: FormulaNode, ctx: FormulaContext): EvalResult {\n try {\n const value = evalNode(ast, { ...ctx, budget: ctx.budget ?? { left: MAX_STEPS } });\n if (typeof value === 'number' && !Number.isFinite(value)) return { ok: false, error: 'Result is not a number' };\n return { ok: true, value };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, error: e.message };\n if (e instanceof RangeError) return { ok: false, error: 'Formula is too complex' };\n throw e;\n }\n}\n\n// ============================================================================\n// ROWS\n// ============================================================================\n\n/** Parse a date cell value: date-only strings are local midnight, full ISO is the instant. */\nfunction parseDateValue(value: unknown): Date | null {\n const s = dateString(value);\n if (!s) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (m) return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** A cell value as a formula value, per property type. */\nexport function toFormulaValue(value: unknown, type: string): FormulaValue {\n switch (type) {\n case 'number':\n return numberValue(value);\n case 'checkbox':\n return value === true || value === 'true';\n case 'date':\n case 'created_time':\n case 'last_edited_time':\n return parseDateValue(value);\n case 'formula':\n return value === undefined ? null : (value as FormulaValue);\n case 'connector':\n // The refreshed result (`.value`): text / number / boolean; null when not fetched yet.\n return connectorCellValue(value);\n case 'multi_select':\n case 'person':\n // Formula 2.0: lists (join(…), map(…), length(…) = count).\n return multiSelectNames(value);\n case 'rollup':\n if (Array.isArray(value))\n return value.map((v) =>\n v instanceof Date || typeof v !== 'object' ? (v as FormulaValue) : richTextToPlain(v),\n );\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) return value as FormulaValue;\n if (value instanceof Date) return value;\n return richTextToPlain(value);\n case 'select':\n case 'status':\n case 'files':\n case 'relation':\n return cellDisplayText(value, type);\n default:\n return richTextToPlain(value);\n }\n}\n\n/** Formulas referencing formulas nest; past this depth (a cycle) the value is empty. */\nconst MAX_FORMULA_DEPTH = 8;\n\n/**\n * A row's value for any column, formulas included (`baseCellValue` for the rest). A formula that\n * fails to compile or evaluate reads as null (empty).\n */\nexport function rowCellValue(\n row: RowLike,\n column: ColumnLike,\n columns: ColumnLike[],\n now: Date = new Date(),\n depth = 0,\n /** Columns computed elsewhere (rollups), so formulas can read them too. */\n extra?: (row: RowLike, column: ColumnLike) => unknown,\n): unknown {\n if (column.type !== 'formula') {\n const v = extra?.(row, column);\n return v !== undefined ? v : baseCellValue(row, column);\n }\n const compiled = compileCached(column.expression ?? '');\n if (!compiled.ok) return null;\n if (depth === 0) {\n try {\n return rowCellValue(row, column, columns, now, 1, extra);\n } catch (e) {\n if (e instanceof FormulaCycleError) return null;\n throw e;\n }\n }\n const r = evaluateFormula(compiled.ast, {\n now,\n getProp: (name) => {\n const c = columns.find((x) => x.name === name);\n if (!c) throw new FormulaError(`Unknown property \"${name}\"`);\n // A cycle (A → B → A) would nest forever: fail the whole formula instead.\n if (c.type === 'formula' && depth + 1 > MAX_FORMULA_DEPTH)\n throw new FormulaCycleError('Circular reference');\n return toFormulaValue(rowCellValue(row, c, columns, now, depth + 1, extra), c.type);\n },\n });\n return r.ok ? r.value : null;\n}\n\n/** The runtime error of a formula for a row (null when it evaluates), for tooltips. */\nexport function rowFormulaError(\n row: RowLike,\n column: ColumnLike,\n columns: ColumnLike[],\n now = new Date(),\n): string | null {\n if (column.type !== 'formula') return null;\n // Called per empty formula cell on every render: reuse the cached parse, then apply the\n // same checks `compileFormula(…, { properties, self })` would.\n const compiled = compileCached(column.expression ?? '');\n if (!compiled.ok) return compiled.error;\n if (compiled.refs.includes(column.name)) return 'A formula cannot reference itself';\n const missing = compiled.refs.find((r) => !columns.some((c) => c.name === r));\n if (missing) return `Unknown property \"${missing}\"`;\n const cycle = findFormulaCycle(column.name, columns);\n if (cycle) return `Circular reference: ${cycle.join(' → ')}`;\n const r = evaluateFormula(compiled.ast, {\n now,\n getProp: (name) => {\n const c = columns.find((x) => x.name === name) as ColumnLike;\n return toFormulaValue(rowCellValue(row, c, columns, now, 1), c.type);\n },\n });\n return r.ok ? null : r.error;\n}\n\n/** A getter for views: formulas evaluated against `columns` at a fixed `now`. */\nexport function makeCellGetter(\n columns: ColumnLike[],\n now: Date = new Date(),\n /** Columns computed elsewhere (rollups): return `undefined` to fall through. */\n extra?: (row: RowLike, column: ColumnLike) => unknown,\n): CellGetter {\n const hasFormula = columns.some((c) => c.type === 'formula');\n if (!hasFormula && !extra) return baseCellValue;\n return (row, column) => {\n if (extra) {\n const v = extra(row, column);\n if (v !== undefined) return v;\n }\n return hasFormula ? rowCellValue(row, column, columns, now, 0, extra) : baseCellValue(row, column);\n };\n}\n\n/**\n * The first formula reference cycle reachable from `start` (e.g. [\"A\", \"B\", \"A\"]), or null.\n * Only formula columns can be part of a cycle.\n */\nexport function findFormulaCycle(start: string, columns: ColumnLike[]): string[] | null {\n const refsOf = (name: string): string[] => {\n const c = columns.find((x) => x.name === name);\n if (!c || c.type !== 'formula') return [];\n const r = compileCached(c.expression ?? '');\n return r.ok ? r.refs : [];\n };\n const path: string[] = [];\n const onPath = new Set<string>();\n const done = new Set<string>();\n const visit = (name: string): string[] | null => {\n if (onPath.has(name)) return [...path.slice(path.indexOf(name)), name];\n if (done.has(name)) return null;\n path.push(name);\n onPath.add(name);\n for (const ref of refsOf(name)) {\n const found = visit(ref);\n if (found) return found;\n }\n path.pop();\n onPath.delete(name);\n done.add(name);\n return null;\n };\n return visit(start);\n}\n\n/**\n * Validate a formula for the property editor: syntax, known properties, no self / cycle.\n * Returns an error message or null.\n */\nexport function validateFormula(expression: string, self: string, columns: ColumnLike[]): string | null {\n const r = compileFormula(expression, { properties: columns.map((c) => c.name), self });\n if (!r.ok) return r.error;\n const withThis = [\n ...columns.filter((c) => c.name !== self),\n { name: self, type: 'formula', expression } as ColumnLike,\n ];\n const cycle = findFormulaCycle(self, withThis);\n return cycle ? `Circular reference: ${cycle.join(' → ')}` : null;\n}\n\nconst escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Point `prop(\"from\")` references at a renamed property (either quote style; other text — even an\n * identical string literal outside prop() — is left alone). Same string when nothing changes.\n */\nexport function renameFormulaReferences(expression: string, from: string, to: string): string {\n if (!expression || from === to) return expression;\n const quoted = (q: string) => escapeRegExp(from.replace(/\\\\/g, '\\\\\\\\').replace(new RegExp(q, 'g'), `\\\\${q}`));\n // `prop` is case-insensitive like every function name; the property name itself is not.\n const re = new RegExp(`(\\\\b[pP][rR][oO][pP]\\\\s*\\\\(\\\\s*)(?:\"${quoted('\"')}\"|'${quoted(\"'\")}')(\\\\s*\\\\))`, 'g');\n const target = `\"${to.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n return expression.replace(re, (_m, open: string, close: string) => `${open}${target}${close}`);\n}\n"],"names":["text","list","_a","a"],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import {numberValue,groupRows,normalizeStatusOptions,multiSelectNames,cellDisplayText}from'./databaseView.js';import {dayKeyOf,localDayKey,shiftDayKey}from'./databaseFilter.js';const DATE_TYPES = /* @__PURE__ */ new Set(["date", "created_time", "last_edited_time"]);
2
+ const TEXT_TYPES = /* @__PURE__ */ new Set(["text", "url", "email", "phone", "number", "formula"]);
3
+ function isTableGroupable(column) {
4
+ var _a;
5
+ const t = column.type;
6
+ if (t === "select" || t === "status") return true;
7
+ if (t === "connector") return ((_a = column.connector) == null ? void 0 : _a.resultType) === "select";
8
+ return t === "checkbox" || t === "multi_select" || t === "person" || DATE_TYPES.has(t) || TEXT_TYPES.has(t);
9
+ }
10
+ const DATE_BUCKETS = [{
11
+ value: "earlier",
12
+ name: "Earlier"
13
+ }, {
14
+ value: "yesterday",
15
+ name: "Yesterday"
16
+ }, {
17
+ value: "today",
18
+ name: "Today"
19
+ }, {
20
+ value: "tomorrow",
21
+ name: "Tomorrow"
22
+ }, {
23
+ value: "next_7",
24
+ name: "Next 7 days"
25
+ }, {
26
+ value: "next_30",
27
+ name: "Next 30 days"
28
+ }, {
29
+ value: "later",
30
+ name: "Later"
31
+ }];
32
+ function dateBucket(day, now) {
33
+ const today = localDayKey(now);
34
+ if (day === today) return "today";
35
+ if (day === shiftDayKey(today, -1)) return "yesterday";
36
+ if (day === shiftDayKey(today, 1)) return "tomorrow";
37
+ if (day < today) return "earlier";
38
+ if (day <= shiftDayKey(today, 7)) return "next_7";
39
+ if (day <= shiftDayKey(today, 30)) return "next_30";
40
+ return "later";
41
+ }
42
+ const NO_VALUE = (column) => `No ${column.name === "title" ? "Name" : column.name}`;
43
+ function groupRowsByColumn(rows, column, getValue, now = /* @__PURE__ */ new Date()) {
44
+ var _a, _b, _c, _d, _e;
45
+ const t = column.type;
46
+ if (t === "select" || t === "status" || t === "connector") {
47
+ return groupRows(rows, column.name, t === "status" ? normalizeStatusOptions(column.options) : (_a = column.options) != null ? _a : []);
48
+ }
49
+ const empty = {
50
+ name: NO_VALUE(column),
51
+ value: null,
52
+ rows: []
53
+ };
54
+ if (t === "checkbox") {
55
+ const on = {
56
+ name: "Checked",
57
+ value: "true",
58
+ rows: []
59
+ };
60
+ const off = {
61
+ name: "Unchecked",
62
+ value: "false",
63
+ rows: []
64
+ };
65
+ for (const r of rows) {
66
+ const v = getValue(r, column);
67
+ (v === true || v === "true" ? on : off).rows.push(r);
68
+ }
69
+ return [on, off];
70
+ }
71
+ if (DATE_TYPES.has(t)) {
72
+ const buckets = new Map(DATE_BUCKETS.map((b) => [b.value, {
73
+ name: b.name,
74
+ value: b.value,
75
+ rows: []
76
+ }]));
77
+ for (const r of rows) {
78
+ const day = dayKeyOf(getValue(r, column));
79
+ if (!day) empty.rows.push(r);
80
+ else buckets.get(dateBucket(day, now)).rows.push(r);
81
+ }
82
+ return [...buckets.values(), empty];
83
+ }
84
+ const byKey = /* @__PURE__ */ new Map();
85
+ for (const r of rows) {
86
+ const v = getValue(r, column);
87
+ let key;
88
+ if (t === "multi_select" || t === "person") key = (_b = multiSelectNames(v)[0]) != null ? _b : null;
89
+ else key = cellDisplayText(v, t).trim() || null;
90
+ if (!key) {
91
+ empty.rows.push(r);
92
+ continue;
93
+ }
94
+ let g = byKey.get(key);
95
+ if (!g) {
96
+ const color = t === "multi_select" ? (_d = (_c = column.options) == null ? void 0 : _c.find((o) => o.name === key)) == null ? void 0 : _d.color : void 0;
97
+ g = {
98
+ name: key,
99
+ value: key,
100
+ color,
101
+ rows: []
102
+ };
103
+ byKey.set(key, g);
104
+ }
105
+ g.rows.push(r);
106
+ }
107
+ let ordered = [...byKey.values()];
108
+ if (t === "multi_select" && ((_e = column.options) == null ? void 0 : _e.length)) {
109
+ const order = new Map(column.options.map((o, i) => [o.name, i]));
110
+ ordered.sort((a, b) => {
111
+ var _a2, _b2;
112
+ return ((_a2 = order.get(a.name)) != null ? _a2 : 1e9) - ((_b2 = order.get(b.name)) != null ? _b2 : 1e9);
113
+ });
114
+ } else if (t === "number") {
115
+ ordered.sort((a, b) => {
116
+ var _a2, _b2;
117
+ return ((_a2 = numberValue(a.value)) != null ? _a2 : 0) - ((_b2 = numberValue(b.value)) != null ? _b2 : 0);
118
+ });
119
+ } else {
120
+ ordered = ordered.sort((a, b) => a.name.localeCompare(b.name));
121
+ }
122
+ return [...ordered, empty];
123
+ }
124
+ function prefillForGroup(column, value) {
125
+ if (value === null) return void 0;
126
+ switch (column.type) {
127
+ case "select":
128
+ case "status":
129
+ return {
130
+ name: value
131
+ };
132
+ case "multi_select":
133
+ case "person":
134
+ return [{
135
+ name: value
136
+ }];
137
+ case "checkbox":
138
+ return value === "true";
139
+ case "number": {
140
+ const n = numberValue(value);
141
+ return n === null ? void 0 : n;
142
+ }
143
+ case "text":
144
+ case "url":
145
+ case "email":
146
+ case "phone":
147
+ return value;
148
+ default:
149
+ return void 0;
150
+ }
151
+ }export{groupRowsByColumn,isTableGroupable,prefillForGroup};//# sourceMappingURL=databaseGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseGroup.js","sources":["../../../../src/features/notion/database/databaseGroup.ts"],"sourcesContent":["/**\n * Table grouping beyond select / status (Notion: group by checkbox, person, multi-select, date,\n * text, number …). Select / status keep `groupRows` (option order, status groups).\n *\n * checkbox Checked / Unchecked\n * date-like Earlier · Yesterday · Today · Tomorrow · Next 7 days · Next 30 days · Later · No date\n * multi_select/person the row's first value (a row sits in one group in the grid)\n * text-like / number the shown value, A→Z (numbers ascending)\n *\n * `prefillForGroup` gives the cell value a row created in a group starts with.\n */\nimport {\n cellDisplayText,\n groupRows,\n multiSelectNames,\n normalizeStatusOptions,\n numberValue,\n type CellGetter,\n type ColumnLike,\n type RowGroup,\n type RowLike,\n} from './databaseView';\nimport { dayKeyOf, localDayKey, shiftDayKey } from './databaseFilter';\n\nconst DATE_TYPES = new Set(['date', 'created_time', 'last_edited_time']);\nconst TEXT_TYPES = new Set(['text', 'url', 'email', 'phone', 'number', 'formula']);\n\n/** Can the table group by this column? */\nexport function isTableGroupable(column: ColumnLike): boolean {\n const t = column.type;\n if (t === 'select' || t === 'status') return true;\n if (t === 'connector') return column.connector?.resultType === 'select';\n return t === 'checkbox' || t === 'multi_select' || t === 'person' || DATE_TYPES.has(t) || TEXT_TYPES.has(t);\n}\n\nconst DATE_BUCKETS = [\n { value: 'earlier', name: 'Earlier' },\n { value: 'yesterday', name: 'Yesterday' },\n { value: 'today', name: 'Today' },\n { value: 'tomorrow', name: 'Tomorrow' },\n { value: 'next_7', name: 'Next 7 days' },\n { value: 'next_30', name: 'Next 30 days' },\n { value: 'later', name: 'Later' },\n] as const;\n\nfunction dateBucket(day: string, now: Date): string {\n const today = localDayKey(now);\n if (day === today) return 'today';\n if (day === shiftDayKey(today, -1)) return 'yesterday';\n if (day === shiftDayKey(today, 1)) return 'tomorrow';\n if (day < today) return 'earlier';\n if (day <= shiftDayKey(today, 7)) return 'next_7';\n if (day <= shiftDayKey(today, 30)) return 'next_30';\n return 'later';\n}\n\nconst NO_VALUE = (column: ColumnLike) => `No ${column.name === 'title' ? 'Name' : column.name}`;\n\nexport function groupRowsByColumn<R extends RowLike>(\n rows: R[],\n column: ColumnLike,\n getValue: CellGetter,\n now: Date = new Date(),\n): RowGroup<R>[] {\n const t = column.type;\n if (t === 'select' || t === 'status' || t === 'connector') {\n return groupRows(\n rows,\n column.name,\n t === 'status' ? normalizeStatusOptions(column.options) : (column.options ?? []),\n );\n }\n const empty: RowGroup<R> = { name: NO_VALUE(column), value: null, rows: [] };\n if (t === 'checkbox') {\n const on: RowGroup<R> = { name: 'Checked', value: 'true', rows: [] };\n const off: RowGroup<R> = { name: 'Unchecked', value: 'false', rows: [] };\n for (const r of rows) {\n const v = getValue(r, column);\n (v === true || v === 'true' ? on : off).rows.push(r);\n }\n return [on, off];\n }\n if (DATE_TYPES.has(t)) {\n const buckets = new Map<string, RowGroup<R>>(\n DATE_BUCKETS.map((b) => [b.value, { name: b.name, value: b.value, rows: [] as R[] }]),\n );\n for (const r of rows) {\n const day = dayKeyOf(getValue(r, column));\n if (!day) empty.rows.push(r);\n else buckets.get(dateBucket(day, now))!.rows.push(r);\n }\n return [...buckets.values(), empty];\n }\n const byKey = new Map<string, RowGroup<R>>();\n for (const r of rows) {\n const v = getValue(r, column);\n let key: string | null;\n if (t === 'multi_select' || t === 'person') key = multiSelectNames(v)[0] ?? null;\n else key = cellDisplayText(v, t).trim() || null;\n if (!key) {\n empty.rows.push(r);\n continue;\n }\n let g = byKey.get(key);\n if (!g) {\n const color = t === 'multi_select' ? column.options?.find((o) => o.name === key)?.color : undefined;\n g = { name: key, value: key, color, rows: [] };\n byKey.set(key, g);\n }\n g.rows.push(r);\n }\n let ordered = [...byKey.values()];\n if (t === 'multi_select' && column.options?.length) {\n const order = new Map(column.options.map((o, i) => [o.name, i]));\n ordered.sort((a, b) => (order.get(a.name) ?? 1e9) - (order.get(b.name) ?? 1e9));\n } else if (t === 'number') {\n ordered.sort((a, b) => (numberValue(a.value) ?? 0) - (numberValue(b.value) ?? 0));\n } else {\n ordered = ordered.sort((a, b) => a.name.localeCompare(b.name));\n }\n return [...ordered, empty];\n}\n\n/** The value a row created inside a group starts with (undefined = leave the property empty). */\nexport function prefillForGroup(column: ColumnLike, value: string | null): unknown {\n if (value === null) return undefined;\n switch (column.type) {\n case 'select':\n case 'status':\n return { name: value };\n case 'multi_select':\n case 'person':\n return [{ name: value }];\n case 'checkbox':\n return value === 'true';\n case 'number': {\n const n = numberValue(value);\n return n === null ? undefined : n;\n }\n case 'text':\n case 'url':\n case 'email':\n case 'phone':\n return value;\n default:\n return undefined;\n }\n}\n"],"names":["_a","_b"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import {computeCalculation}from'./databaseCalc.js';import {relationIds,baseCellValue,cellDisplayText,numberValue}from'./databaseView.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ function computeRollup(row, config, relationColumn, source) {
21
+ var _a, _b, _c, _d;
22
+ if (!relationColumn || relationColumn.type !== "relation" || !relationColumn.databaseId) return null;
23
+ const targetDb = relationColumn.databaseId;
24
+ const ids = relationIds((_a = row.properties) == null ? void 0 : _a[config.relation]);
25
+ if (config.fn === "count") return ids.length;
26
+ const targetType = String((_d = (_c = (_b = source.schemaOf(targetDb)) == null ? void 0 : _b[config.target]) == null ? void 0 : _c.type) != null ? _d : "text");
27
+ const targetColumn = {
28
+ name: config.target,
29
+ type: targetType
30
+ };
31
+ const related = ids.map((id) => source.rowOf(targetDb, id)).filter((r) => !!r).map((r) => {
32
+ var _a2;
33
+ return __spreadProps(__spreadValues({}, r), {
34
+ properties: (_a2 = r.properties) != null ? _a2 : {}
35
+ });
36
+ });
37
+ const values = related.map((r) => baseCellValue(r, targetColumn));
38
+ if (config.fn === "show_original") {
39
+ const parts = values.map((v) => cellDisplayText(v, targetType).trim()).filter(Boolean);
40
+ return parts.length ? parts.join(", ") : null;
41
+ }
42
+ const result = computeCalculation(values, targetType, config.fn);
43
+ if (!result || result.value === "\u2014") return null;
44
+ const raw = result.value.replace(/,/g, "");
45
+ const n = /%$/.test(raw) ? null : numberValue(raw);
46
+ return n !== null && /^-?[\d.]+$/.test(raw) ? n : result.value;
47
+ }
48
+ function rollupResolver(columns, source) {
49
+ if (!source || !columns.some((c) => c.type === "rollup")) return void 0;
50
+ return (row, column) => {
51
+ var _a;
52
+ if (column.type !== "rollup") return void 0;
53
+ const config = (_a = column.rollup) != null ? _a : null;
54
+ if (!config) return null;
55
+ const relation = columns.find((c) => c.name === config.relation);
56
+ return computeRollup(row, config, relation, source);
57
+ };
58
+ }export{computeRollup,rollupResolver};//# sourceMappingURL=databaseRollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseRollup.js","sources":["../../../../src/features/notion/database/databaseRollup.ts"],"sourcesContent":["/**\n * Rollup property: `{ type: 'rollup', rollup: { relation, target, fn } }` — aggregate a property\n * of the rows a relation points at (Notion: \"Rollup\"). Computed in the browser from the related\n * database's loaded rows (components/DatabaseRelation `useRelationSource`).\n *\n * show_original the related values, comma-joined (\"Done, In progress\")\n * count number of related rows\n * anything else a footer-calculation kind over the related values (utils/databaseCalc):\n * count_values, count_unique, count_empty, percent_empty, sum, average, median,\n * min, max, range, checked, percent_checked, earliest, latest, date_range …\n */\nimport { computeCalculation, kindsFor, CALC_LABELS, type CalcKind } from './databaseCalc';\nimport {\n baseCellValue,\n cellDisplayText,\n numberValue,\n relationIds,\n type ColumnLike,\n type RowLike,\n} from './databaseView';\n\nexport interface RollupConfig {\n /** The relation property on this database. */\n relation: string;\n /** The property of the related database to aggregate. */\n target: string;\n fn: string;\n}\n\nexport interface RollupSource {\n rowOf: (\n databaseId: string,\n rowId: string,\n ) => { id: string; properties?: Record<string, any>; createdTime?: string; lastEditedTime?: string } | undefined;\n schemaOf: (databaseId: string) => Record<string, { type?: string; [k: string]: unknown }> | undefined;\n}\n\n/** Functions offered for a target property type (Notion's \"Calculate\" list). */\nexport function rollupFunctionsFor(targetType: string): Array<{ value: string; label: string }> {\n const calc = kindsFor(targetType).filter((k) => k !== 'none' && k !== 'count_all');\n return [\n { value: 'show_original', label: 'Show original' },\n { value: 'count', label: 'Count all' },\n ...calc.map((k) => ({ value: k, label: CALC_LABELS[k as CalcKind].menu })),\n ];\n}\n\nexport function readRollupConfig(def: unknown): RollupConfig | null {\n const r = (def as { rollup?: Partial<RollupConfig> } | null)?.rollup;\n if (!r || typeof r.relation !== 'string' || typeof r.target !== 'string') return null;\n return { relation: r.relation, target: r.target, fn: typeof r.fn === 'string' ? r.fn : 'show_original' };\n}\n\n/**\n * A row's rollup value: a number for numeric results (count, sum, %…), else text.\n * `relationColumn` is the relation column of this database (its `databaseId` is the target).\n */\nexport function computeRollup(\n row: RowLike,\n config: RollupConfig,\n relationColumn: ColumnLike | undefined,\n source: RollupSource,\n): string | number | null {\n if (!relationColumn || relationColumn.type !== 'relation' || !relationColumn.databaseId) return null;\n const targetDb = relationColumn.databaseId;\n const ids = relationIds(row.properties?.[config.relation]);\n if (config.fn === 'count') return ids.length;\n const targetType = String(source.schemaOf(targetDb)?.[config.target]?.type ?? 'text');\n const targetColumn: ColumnLike = { name: config.target, type: targetType };\n const related: RowLike[] = ids\n .map((id) => source.rowOf(targetDb, id))\n .filter((r): r is NonNullable<typeof r> => !!r)\n .map((r) => ({ ...r, properties: r.properties ?? {} }));\n const values = related.map((r) => baseCellValue(r, targetColumn));\n if (config.fn === 'show_original') {\n const parts = values.map((v) => cellDisplayText(v, targetType).trim()).filter(Boolean);\n return parts.length ? parts.join(', ') : null;\n }\n const result = computeCalculation(values, targetType, config.fn as CalcKind);\n if (!result || result.value === '—') return null;\n const raw = result.value.replace(/,/g, '');\n const n = /%$/.test(raw) ? null : numberValue(raw);\n return n !== null && /^-?[\\d.]+$/.test(raw) ? n : result.value;\n}\n\n/**\n * A `makeCellGetter` extra resolver for rollup columns (`undefined` = not a rollup, fall through).\n * `source` is the relation source (components/DatabaseRelation) — null when none is mounted.\n */\nexport function rollupResolver(\n columns: ColumnLike[],\n source: RollupSource | null | undefined,\n): ((row: RowLike, column: ColumnLike) => unknown) | undefined {\n if (!source || !columns.some((c) => c.type === 'rollup')) return undefined;\n return (row, column) => {\n if (column.type !== 'rollup') return undefined;\n const config = column.rollup ?? null;\n if (!config) return null;\n const relation = columns.find((c) => c.name === config.relation);\n return computeRollup(row, config, relation, source);\n };\n}\n"],"names":["_a"],"mappings":"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"}