@rowsncolumns/functions 14.0.29

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 (149) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +5 -0
  3. package/dist/cjs/formulas/array-formula.d.ts +4 -0
  4. package/dist/cjs/formulas/array-formula.d.ts.map +1 -0
  5. package/dist/cjs/formulas/array-formula.js +7 -0
  6. package/dist/cjs/formulas/crypto-price.d.ts +4 -0
  7. package/dist/cjs/formulas/crypto-price.d.ts.map +1 -0
  8. package/dist/cjs/formulas/crypto-price.js +63 -0
  9. package/dist/cjs/formulas/datasource.d.ts +4 -0
  10. package/dist/cjs/formulas/datasource.d.ts.map +1 -0
  11. package/dist/cjs/formulas/datasource.js +21 -0
  12. package/dist/cjs/formulas/formula-text.d.ts +5 -0
  13. package/dist/cjs/formulas/formula-text.d.ts.map +1 -0
  14. package/dist/cjs/formulas/formula-text.js +17 -0
  15. package/dist/cjs/formulas/get-pivot-data.d.ts +32 -0
  16. package/dist/cjs/formulas/get-pivot-data.d.ts.map +1 -0
  17. package/dist/cjs/formulas/get-pivot-data.js +188 -0
  18. package/dist/cjs/formulas/hyperlink.d.ts +5 -0
  19. package/dist/cjs/formulas/hyperlink.d.ts.map +1 -0
  20. package/dist/cjs/formulas/hyperlink.js +22 -0
  21. package/dist/cjs/formulas/image.d.ts +5 -0
  22. package/dist/cjs/formulas/image.d.ts.map +1 -0
  23. package/dist/cjs/formulas/image.js +17 -0
  24. package/dist/cjs/formulas/import-data.d.ts +11 -0
  25. package/dist/cjs/formulas/import-data.d.ts.map +1 -0
  26. package/dist/cjs/formulas/import-data.js +46 -0
  27. package/dist/cjs/formulas/index.d.ts +18 -0
  28. package/dist/cjs/formulas/index.d.ts.map +1 -0
  29. package/dist/cjs/formulas/index.js +37 -0
  30. package/dist/cjs/formulas/join.d.ts +4 -0
  31. package/dist/cjs/formulas/join.d.ts.map +1 -0
  32. package/dist/cjs/formulas/join.js +34 -0
  33. package/dist/cjs/formulas/multiply.d.ts +4 -0
  34. package/dist/cjs/formulas/multiply.d.ts.map +1 -0
  35. package/dist/cjs/formulas/multiply.js +15 -0
  36. package/dist/cjs/formulas/real-time.d.ts +4 -0
  37. package/dist/cjs/formulas/real-time.d.ts.map +1 -0
  38. package/dist/cjs/formulas/real-time.js +18 -0
  39. package/dist/cjs/formulas/selection-status.d.ts +4 -0
  40. package/dist/cjs/formulas/selection-status.d.ts.map +1 -0
  41. package/dist/cjs/formulas/selection-status.js +65 -0
  42. package/dist/cjs/formulas/sequence.d.ts +5 -0
  43. package/dist/cjs/formulas/sequence.d.ts.map +1 -0
  44. package/dist/cjs/formulas/sequence.js +29 -0
  45. package/dist/cjs/formulas/server.d.ts +22 -0
  46. package/dist/cjs/formulas/server.d.ts.map +1 -0
  47. package/dist/cjs/formulas/server.js +44 -0
  48. package/dist/cjs/formulas/sparkline.d.ts +5 -0
  49. package/dist/cjs/formulas/sparkline.d.ts.map +1 -0
  50. package/dist/cjs/formulas/sparkline.js +58 -0
  51. package/dist/cjs/formulas/split.d.ts +12 -0
  52. package/dist/cjs/formulas/split.d.ts.map +1 -0
  53. package/dist/cjs/formulas/split.js +48 -0
  54. package/dist/cjs/formulas/star-rating.d.ts +5 -0
  55. package/dist/cjs/formulas/star-rating.d.ts.map +1 -0
  56. package/dist/cjs/formulas/star-rating.js +13 -0
  57. package/dist/cjs/formulas/unique.d.ts +12 -0
  58. package/dist/cjs/formulas/unique.d.ts.map +1 -0
  59. package/dist/cjs/formulas/unique.js +78 -0
  60. package/dist/cjs/function-descriptions.d.ts +3 -0
  61. package/dist/cjs/function-descriptions.d.ts.map +1 -0
  62. package/dist/cjs/function-descriptions.js +8724 -0
  63. package/dist/cjs/index.d.ts +4 -0
  64. package/dist/cjs/index.d.ts.map +1 -0
  65. package/dist/cjs/index.js +7 -0
  66. package/dist/cjs/server.d.ts +4 -0
  67. package/dist/cjs/server.d.ts.map +1 -0
  68. package/dist/cjs/server.js +8 -0
  69. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  70. package/dist/cjs/types.d.ts +2 -0
  71. package/dist/cjs/types.d.ts.map +1 -0
  72. package/dist/cjs/types.js +2 -0
  73. package/dist/cjs/vitest.config.d.ts +3 -0
  74. package/dist/cjs/vitest.config.d.ts.map +1 -0
  75. package/dist/cjs/vitest.config.js +18 -0
  76. package/dist/esm/formulas/array-formula.d.ts +4 -0
  77. package/dist/esm/formulas/array-formula.d.ts.map +1 -0
  78. package/dist/esm/formulas/array-formula.js +3 -0
  79. package/dist/esm/formulas/crypto-price.d.ts +4 -0
  80. package/dist/esm/formulas/crypto-price.d.ts.map +1 -0
  81. package/dist/esm/formulas/crypto-price.js +33 -0
  82. package/dist/esm/formulas/datasource.d.ts +4 -0
  83. package/dist/esm/formulas/datasource.d.ts.map +1 -0
  84. package/dist/esm/formulas/datasource.js +17 -0
  85. package/dist/esm/formulas/formula-text.d.ts +5 -0
  86. package/dist/esm/formulas/formula-text.d.ts.map +1 -0
  87. package/dist/esm/formulas/formula-text.js +12 -0
  88. package/dist/esm/formulas/get-pivot-data.d.ts +32 -0
  89. package/dist/esm/formulas/get-pivot-data.d.ts.map +1 -0
  90. package/dist/esm/formulas/get-pivot-data.js +144 -0
  91. package/dist/esm/formulas/hyperlink.d.ts +5 -0
  92. package/dist/esm/formulas/hyperlink.d.ts.map +1 -0
  93. package/dist/esm/formulas/hyperlink.js +17 -0
  94. package/dist/esm/formulas/image.d.ts +5 -0
  95. package/dist/esm/formulas/image.d.ts.map +1 -0
  96. package/dist/esm/formulas/image.js +13 -0
  97. package/dist/esm/formulas/import-data.d.ts +11 -0
  98. package/dist/esm/formulas/import-data.d.ts.map +1 -0
  99. package/dist/esm/formulas/import-data.js +28 -0
  100. package/dist/esm/formulas/index.d.ts +18 -0
  101. package/dist/esm/formulas/index.d.ts.map +1 -0
  102. package/dist/esm/formulas/index.js +17 -0
  103. package/dist/esm/formulas/join.d.ts +4 -0
  104. package/dist/esm/formulas/join.d.ts.map +1 -0
  105. package/dist/esm/formulas/join.js +25 -0
  106. package/dist/esm/formulas/multiply.d.ts +4 -0
  107. package/dist/esm/formulas/multiply.d.ts.map +1 -0
  108. package/dist/esm/formulas/multiply.js +11 -0
  109. package/dist/esm/formulas/real-time.d.ts +4 -0
  110. package/dist/esm/formulas/real-time.d.ts.map +1 -0
  111. package/dist/esm/formulas/real-time.js +14 -0
  112. package/dist/esm/formulas/selection-status.d.ts +4 -0
  113. package/dist/esm/formulas/selection-status.d.ts.map +1 -0
  114. package/dist/esm/formulas/selection-status.js +39 -0
  115. package/dist/esm/formulas/sequence.d.ts +5 -0
  116. package/dist/esm/formulas/sequence.d.ts.map +1 -0
  117. package/dist/esm/formulas/sequence.js +24 -0
  118. package/dist/esm/formulas/server.d.ts +22 -0
  119. package/dist/esm/formulas/server.d.ts.map +1 -0
  120. package/dist/esm/formulas/server.js +37 -0
  121. package/dist/esm/formulas/sparkline.d.ts +5 -0
  122. package/dist/esm/formulas/sparkline.d.ts.map +1 -0
  123. package/dist/esm/formulas/sparkline.js +52 -0
  124. package/dist/esm/formulas/split.d.ts +12 -0
  125. package/dist/esm/formulas/split.d.ts.map +1 -0
  126. package/dist/esm/formulas/split.js +44 -0
  127. package/dist/esm/formulas/star-rating.d.ts +5 -0
  128. package/dist/esm/formulas/star-rating.d.ts.map +1 -0
  129. package/dist/esm/formulas/star-rating.js +9 -0
  130. package/dist/esm/formulas/unique.d.ts +12 -0
  131. package/dist/esm/formulas/unique.d.ts.map +1 -0
  132. package/dist/esm/formulas/unique.js +58 -0
  133. package/dist/esm/function-descriptions.d.ts +3 -0
  134. package/dist/esm/function-descriptions.d.ts.map +1 -0
  135. package/dist/esm/function-descriptions.js +8721 -0
  136. package/dist/esm/index.d.ts +4 -0
  137. package/dist/esm/index.d.ts.map +1 -0
  138. package/dist/esm/index.js +3 -0
  139. package/dist/esm/server.d.ts +4 -0
  140. package/dist/esm/server.d.ts.map +1 -0
  141. package/dist/esm/server.js +3 -0
  142. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  143. package/dist/esm/types.d.ts +2 -0
  144. package/dist/esm/types.d.ts.map +1 -0
  145. package/dist/esm/types.js +1 -0
  146. package/dist/esm/vitest.config.d.ts +3 -0
  147. package/dist/esm/vitest.config.d.ts.map +1 -0
  148. package/dist/esm/vitest.config.js +15 -0
  149. package/package.json +51 -0
@@ -0,0 +1,39 @@
1
+ import { isNil } from "@rowsncolumns/utils";
2
+ export const SELECTION_STATUS = (_, arg) => {
3
+ let sum = 0;
4
+ let count = 0;
5
+ let numCount = 0;
6
+ let min;
7
+ let max;
8
+ if (Array.isArray(arg.value)) {
9
+ for (const row of arg.value) {
10
+ for (const value of row) {
11
+ if (typeof value === "number") {
12
+ sum += value;
13
+ numCount++;
14
+ if (min === undefined || value < min) {
15
+ min = value;
16
+ }
17
+ if (max === undefined || value > max) {
18
+ max = value;
19
+ }
20
+ }
21
+ if (!isNil(value)) {
22
+ count++;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ // [sum, count, average, min, max, numericalCount]
28
+ // `numericalCount` is the count of cells holding numbers — distinct
29
+ // from `count` which counts any non-empty cell. Matches Excel and
30
+ // Sheets status-bar semantics.
31
+ return [
32
+ numCount === 0 ? undefined : sum,
33
+ count,
34
+ numCount === 0 ? undefined : sum / numCount,
35
+ min,
36
+ max,
37
+ numCount,
38
+ ];
39
+ };
@@ -0,0 +1,5 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
3
+ import { FormulaResultArray } from "@rowsncolumns/fast-formula-parser";
4
+ export declare const SEQUENCE: (_: FormulaParser, rows: FunctionArgument, columns: FunctionArgument, start: FunctionArgument | undefined, step: FunctionArgument | undefined) => FormulaResultArray;
5
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../../formulas/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAEL,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAG3C,eAAO,MAAM,QAAQ,GACnB,GAAG,aAAa,EAChB,MAAM,gBAAgB,EACtB,SAAS,gBAAgB,EACzB,OAAO,gBAAgB,GAAG,SAAS,EACnC,MAAM,gBAAgB,GAAG,SAAS,uBA8BnC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { FormulaError, } from "@rowsncolumns/fast-formula-parser";
2
+ import { isNil } from "@rowsncolumns/utils";
3
+ export const SEQUENCE = (_, rows, columns, start, step) => {
4
+ if (!rows.value || typeof rows?.value !== "number") {
5
+ throw new FormulaError("#NUM!", "Function SEQUENCE parameter 1 should be greater than or equal to 1.");
6
+ }
7
+ if (!isNil(columns) && typeof columns?.value !== "number") {
8
+ throw new FormulaError("#NUM!", "Function SEQUENCE parameter 2 should be greater than or equal to 1.");
9
+ }
10
+ const rowValue = rows.value;
11
+ const columnValue = columns?.value ?? 1;
12
+ let startValue = start?.value ?? 1;
13
+ const stepValue = step?.value ?? 1;
14
+ const results = [];
15
+ for (let i = 0; i < rowValue; i++) {
16
+ const rows = [];
17
+ for (let j = 0; j < columnValue; j++) {
18
+ rows.push(startValue);
19
+ startValue += stepValue;
20
+ }
21
+ results.push(rows);
22
+ }
23
+ return results;
24
+ };
@@ -0,0 +1,22 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
3
+ export declare const IMPORTDATA: (_parser: FormulaParser, _url: FunctionArgument) => Promise<never>;
4
+ export declare const functions: {
5
+ IMPORTDATA: (_parser: FormulaParser, _url: FunctionArgument) => Promise<never>;
6
+ ARRAYFORMULA: (_: FormulaParser, arg: FunctionArgument) => import("@rowsncolumns/fast-formula-parser").FormulaResult;
7
+ STARRATING: (_: FormulaParser, arg: FunctionArgument) => import("@rowsncolumns/fast-formula-parser").RecursiveFormula;
8
+ HYPERLINK: (_: FormulaParser, url: FunctionArgument, title?: FunctionArgument) => import("@rowsncolumns/common-types").HyperlinkResult | undefined;
9
+ REALTIME: (parser: FormulaParser, arg: FunctionArgument) => string;
10
+ CRYPTOPRICE: (parser: FormulaParser, arg: FunctionArgument) => Promise<number[][]>;
11
+ IMAGE: (_: FormulaParser, url: FunctionArgument) => import("@rowsncolumns/common-types").ImageResult;
12
+ SELECTION_STATUS: (_: FormulaParser, arg: FunctionArgument) => (number | undefined)[];
13
+ MULTIPLY: (_: FormulaParser, factor1: FunctionArgument, factor2: FunctionArgument) => number;
14
+ UNIQUE: (_: FormulaParser, range: FunctionArgument, byColumnArg?: FunctionArgument, exactlyOnceArg?: FunctionArgument) => import("@rowsncolumns/fast-formula-parser").FormulaResult;
15
+ SEQUENCE: (_: FormulaParser, rows: FunctionArgument, columns: FunctionArgument, start: FunctionArgument | undefined, step: FunctionArgument | undefined) => import("@rowsncolumns/fast-formula-parser").FormulaResultArray;
16
+ JOIN: (_: FormulaParser, delimiter: FunctionArgument, ...args: FunctionArgument[]) => string;
17
+ SPLIT: (_: FormulaParser, text: FunctionArgument, delimiter: FunctionArgument, splitByEach?: FunctionArgument, removeEmptyText?: FunctionArgument) => string[][];
18
+ DATASOURCE: (parser: FormulaParser, data: FunctionArgument, limit: FunctionArgument) => import("@rowsncolumns/calculator").DataSource | undefined;
19
+ FORMULATEXT: (parser: FormulaParser<import("@rowsncolumns/common-types").CellData>, arg: FunctionArgument) => string;
20
+ SPARKLINE: (parser: FormulaParser, dataArg: FunctionArgument, optionsArg: FunctionArgument) => import("@rowsncolumns/common-types").SparkLineResult | undefined;
21
+ };
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../formulas/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AAsBnE,eAAO,MAAM,UAAU,GACrB,SAAS,aAAa,EACtB,MAAM,gBAAgB,mBAMvB,CAAC;AAEF,eAAO,MAAM,SAAS;0BATX,aAAa,QAChB,gBAAgB;;;;;;;;;;;;;;;;CAyB+B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { FormulaError, } from "@rowsncolumns/fast-formula-parser";
2
+ import { ARRAYFORMULA } from "./array-formula";
3
+ import { CRYPTOPRICE } from "./crypto-price";
4
+ import { DATASOURCE } from "./datasource";
5
+ import { FORMULATEXT } from "./formula-text";
6
+ import { HYPERLINK } from "./hyperlink";
7
+ import { IMAGE } from "./image";
8
+ import { JOIN } from "./join";
9
+ import { MULTIPLY } from "./multiply";
10
+ import { REALTIME } from "./real-time";
11
+ import { SELECTION_STATUS } from "./selection-status";
12
+ import { SEQUENCE } from "./sequence";
13
+ import { SPARKLINE } from "./sparkline";
14
+ import { SPLIT } from "./split";
15
+ import { STARRATING } from "./star-rating";
16
+ import { UNIQUE } from "./unique";
17
+ export const IMPORTDATA = async (_parser, _url) => {
18
+ throw new FormulaError("#N/A", "IMPORTDATA is not available in the server calculation worker.");
19
+ };
20
+ export const functions = {
21
+ IMPORTDATA,
22
+ ARRAYFORMULA,
23
+ STARRATING,
24
+ HYPERLINK,
25
+ REALTIME,
26
+ CRYPTOPRICE,
27
+ IMAGE,
28
+ SELECTION_STATUS,
29
+ MULTIPLY,
30
+ UNIQUE,
31
+ SEQUENCE,
32
+ JOIN,
33
+ SPLIT,
34
+ DATASOURCE,
35
+ FORMULATEXT,
36
+ SPARKLINE,
37
+ };
@@ -0,0 +1,5 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import { SparkLineResult } from "@rowsncolumns/common-types";
3
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
4
+ export declare const SPARKLINE: (parser: FormulaParser, dataArg: FunctionArgument, optionsArg: FunctionArgument) => SparkLineResult | undefined;
5
+ //# sourceMappingURL=sparkline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../../formulas/sparkline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AAGnE,eAAO,MAAM,SAAS,GACpB,QAAQ,aAAa,EACrB,SAAS,gBAAgB,EACzB,YAAY,gBAAgB,KAC3B,eAAe,GAAG,SA6DpB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { FormulaError } from "@rowsncolumns/fast-formula-parser";
2
+ export const SPARKLINE = (parser, dataArg, optionsArg) => {
3
+ if (parser.isPreview) {
4
+ return;
5
+ }
6
+ if (!dataArg) {
7
+ throw new FormulaError("#N/A", "Wrong number of arguments to SPARKLINE. Expected between 1 and 2 arguments, but got 0 arguments.");
8
+ }
9
+ // The options literal can arrive in either shape from
10
+ // fast-formula-parser:
11
+ // - row form: {"k1","v1","k2","v2"} → [["k1","v1","k2","v2"]]
12
+ // - pair form: {"k1","v1";"k2","v2"} → [["k1","v1"],["k2","v2"]]
13
+ // `Object.fromEntries` only works correctly for the pair form — for
14
+ // the row form it iterates the inner array and reads positions 0/1
15
+ // as the single [key, value] pair, silently dropping everything
16
+ // else (which is how `color`, `colorHigh`/`colorLow` and the high/
17
+ // low flags vanish before the renderer sees them). Flatten and walk
18
+ // in stride 2 so both shapes round-trip every pair.
19
+ const options = {};
20
+ if (Array.isArray(optionsArg?.value)) {
21
+ const flat = optionsArg.value.flat(Infinity);
22
+ for (let i = 0; i + 1 < flat.length; i += 2) {
23
+ const key = flat[i];
24
+ if (key == null)
25
+ continue;
26
+ options[String(key)] = flat[i + 1];
27
+ }
28
+ }
29
+ const isNumber = (item) => typeof item === "number" && !isNaN(item);
30
+ const rawData = Array.isArray(dataArg.value)
31
+ ? dataArg.value.flat()
32
+ : [dataArg.value];
33
+ // Empty-cell handling: when the `emptycells` option is present
34
+ // (gap/zero/span — Excel's displayEmptyCellsAs) the renderer needs
35
+ // to know WHERE the empty cells were, so keep them as nulls.
36
+ // Without the option, compact them out — the legacy shape — so
37
+ // existing sparklines render byte-identical.
38
+ const preserveGaps = options.emptycells === "gap" ||
39
+ options.emptycells === "zero" ||
40
+ options.emptycells === "span";
41
+ const data = preserveGaps
42
+ ? rawData.map((item) => (isNumber(item) ? item : null))
43
+ : rawData.filter(isNumber);
44
+ if (data.filter(isNumber).length < 2) {
45
+ throw new FormulaError("#N/A", "SPARKLINE requires more data points. Expected: 2, found: 0.");
46
+ }
47
+ return {
48
+ kind: "sparkline",
49
+ data,
50
+ options,
51
+ };
52
+ };
@@ -0,0 +1,12 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
3
+ /**
4
+ * SPLIT(text, delimiter, [split_by_each], [remove_empty_text])
5
+ *
6
+ * Google Sheets semantics:
7
+ * - split_by_each (default TRUE): treat each character in `delimiter` as a
8
+ * separate delimiter; when FALSE, split on the whole delimiter string.
9
+ * - remove_empty_text (default TRUE): drop empty results.
10
+ */
11
+ export declare const SPLIT: (_: FormulaParser, text: FunctionArgument, delimiter: FunctionArgument, splitByEach?: FunctionArgument, removeEmptyText?: FunctionArgument) => string[][];
12
+ //# sourceMappingURL=split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../../formulas/split.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AAOnE;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,GAChB,GAAG,aAAa,EAChB,MAAM,gBAAgB,EACtB,WAAW,gBAAgB,EAC3B,cAAc,gBAAgB,EAC9B,kBAAkB,gBAAgB,eAqCnC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { FormulaError } from "@rowsncolumns/fast-formula-parser";
2
+ import { isNil } from "@rowsncolumns/utils";
3
+ /** Escape a character so it is literal inside a regex character class. */
4
+ const escapeForCharClass = (s) => s.replace(/[\]\\^-]/g, "\\$&");
5
+ /**
6
+ * SPLIT(text, delimiter, [split_by_each], [remove_empty_text])
7
+ *
8
+ * Google Sheets semantics:
9
+ * - split_by_each (default TRUE): treat each character in `delimiter` as a
10
+ * separate delimiter; when FALSE, split on the whole delimiter string.
11
+ * - remove_empty_text (default TRUE): drop empty results.
12
+ */
13
+ export const SPLIT = (_, text, delimiter, splitByEach, removeEmptyText) => {
14
+ if (!text || isNil(text.value)) {
15
+ throw new FormulaError("#NA!", "Invalid text");
16
+ }
17
+ if (!delimiter || isNil(delimiter.value)) {
18
+ throw new FormulaError("#NA!", "Invalid delimiter");
19
+ }
20
+ const textValue = String(text.value);
21
+ const delim = String(delimiter.value);
22
+ const byEach = splitByEach && !isNil(splitByEach.value)
23
+ ? Boolean(splitByEach.value)
24
+ : true;
25
+ const removeEmpty = removeEmptyText && !isNil(removeEmptyText.value)
26
+ ? Boolean(removeEmptyText.value)
27
+ : true;
28
+ let parts;
29
+ if (byEach) {
30
+ // Split on ANY single character present in `delim`.
31
+ parts =
32
+ delim.length === 0
33
+ ? [textValue]
34
+ : textValue.split(new RegExp(`[${escapeForCharClass(delim)}]`));
35
+ }
36
+ else {
37
+ // Split on the whole delimiter string.
38
+ parts = delim.length === 0 ? [textValue] : textValue.split(delim);
39
+ }
40
+ if (removeEmpty) {
41
+ parts = parts.filter((part) => part !== "");
42
+ }
43
+ return [parts];
44
+ };
@@ -0,0 +1,5 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
3
+ import { RecursiveFormula } from "@rowsncolumns/fast-formula-parser";
4
+ export declare const STARRATING: (_: FormulaParser, arg: FunctionArgument) => RecursiveFormula;
5
+ //# sourceMappingURL=star-rating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-rating.d.ts","sourceRoot":"","sources":["../../../formulas/star-rating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAEL,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,UAAU,GACrB,GAAG,aAAa,EAChB,KAAK,gBAAgB,KACpB,gBAOF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { FormulaError, } from "@rowsncolumns/fast-formula-parser";
2
+ export const STARRATING = (_, arg) => {
3
+ if (!arg?.value || typeof arg?.value === "string") {
4
+ throw new FormulaError("#VALUE!", "Required argument not provided");
5
+ }
6
+ return {
7
+ _formulaResult: `=REPT(CHAR(11088),${arg.value})`,
8
+ };
9
+ };
@@ -0,0 +1,12 @@
1
+ import type { FunctionArgument } from "@rowsncolumns/calculator";
2
+ import type FormulaParser from "@rowsncolumns/fast-formula-parser";
3
+ /**
4
+ * UNIQUE(range, [by_column], [exactly_once])
5
+ *
6
+ * Google Sheets semantics:
7
+ * - by_column (default FALSE): dedupe rows; when TRUE, dedupe columns.
8
+ * - exactly_once (default FALSE): return distinct records; when TRUE, return
9
+ * only records that appear exactly once.
10
+ */
11
+ export declare const UNIQUE: (_: FormulaParser, range: FunctionArgument, byColumnArg?: FunctionArgument, exactlyOnceArg?: FunctionArgument) => import("@rowsncolumns/fast-formula-parser").FormulaResult;
12
+ //# sourceMappingURL=unique.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unique.d.ts","sourceRoot":"","sources":["../../../formulas/unique.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AAgBnE;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,aAAa,EAChB,OAAO,gBAAgB,EACvB,cAAc,gBAAgB,EAC9B,iBAAiB,gBAAgB,8DAgDlC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { FormulaError } from "@rowsncolumns/fast-formula-parser";
2
+ import { isNil } from "@rowsncolumns/utils";
3
+ /** Transpose a rectangular 2D array. */
4
+ const transpose = (matrix) => {
5
+ if (matrix.length === 0)
6
+ return [];
7
+ const cols = matrix[0].length;
8
+ const out = [];
9
+ for (let c = 0; c < cols; c++) {
10
+ out.push(matrix.map((row) => row[c]));
11
+ }
12
+ return out;
13
+ };
14
+ /**
15
+ * UNIQUE(range, [by_column], [exactly_once])
16
+ *
17
+ * Google Sheets semantics:
18
+ * - by_column (default FALSE): dedupe rows; when TRUE, dedupe columns.
19
+ * - exactly_once (default FALSE): return distinct records; when TRUE, return
20
+ * only records that appear exactly once.
21
+ */
22
+ export const UNIQUE = (_, range, byColumnArg, exactlyOnceArg) => {
23
+ if (!range) {
24
+ throw new FormulaError("#NA!", "Wrong number of arguments to UNIQUE. Expected atleast 1 arguments, but got 0 arguments.");
25
+ }
26
+ // If the argument is not a cell or range ref
27
+ if (!range.isCellRef && !range.isRangeRef) {
28
+ return range.value;
29
+ }
30
+ if (range.isCellRef) {
31
+ return range.value;
32
+ }
33
+ const byColumn = byColumnArg && !isNil(byColumnArg.value)
34
+ ? Boolean(byColumnArg.value)
35
+ : false;
36
+ const exactlyOnce = exactlyOnceArg && !isNil(exactlyOnceArg.value)
37
+ ? Boolean(exactlyOnceArg.value)
38
+ : false;
39
+ const matrix = range.value;
40
+ // Records are the units we dedupe over: rows by default, columns when
41
+ // by_column is TRUE (transpose so the dedupe loop is uniform).
42
+ const records = byColumn ? transpose(matrix) : matrix;
43
+ const order = [];
44
+ const countByKey = new Map();
45
+ const firstByKey = new Map();
46
+ for (const record of records) {
47
+ const key = JSON.stringify(record);
48
+ if (!countByKey.has(key)) {
49
+ order.push(key);
50
+ firstByKey.set(key, record);
51
+ }
52
+ countByKey.set(key, (countByKey.get(key) ?? 0) + 1);
53
+ }
54
+ const resultRecords = order
55
+ .filter((key) => (exactlyOnce ? countByKey.get(key) === 1 : true))
56
+ .map((key) => firstByKey.get(key));
57
+ return byColumn ? transpose(resultRecords) : resultRecords;
58
+ };
@@ -0,0 +1,3 @@
1
+ import type { CalculatorFunction } from "@rowsncolumns/common-types";
2
+ export declare const functionDescriptions: CalculatorFunction[];
3
+ //# sourceMappingURL=function-descriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-descriptions.d.ts","sourceRoot":"","sources":["../../function-descriptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EA23SpD,CAAC"}