Bin
2025-12-17 dcf780a91c16b6be28635b6e2e0e702060ee19f2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { flow, types } from "mobx-state-tree";
import Papa from "papaparse";
 
import { parseTypeAndOption, parseValue } from "../utils/data";
 
const resolvers = {
  // @todo comments/types
  csv(content, options = {}) {
    const header = !options.headless;
    const {
      data,
      meta: { fields },
    } = Papa.parse(content, { delimiter: options.separator, header });
    const { column = header ? fields[0] : 0 } = options;
    const row = data[0];
    let cell = row[column];
 
    if (cell === undefined) {
      // if `column` is a number even if csv has header
      cell = row[fields[column] ?? fields[0]];
    }
 
    return String(cell ?? "");
  },
};
 
const ProcessAttrsMixin = types
  .model({
    resolver: types.maybeNull(types.string),
  })
  .actions((self) => ({
    updateLocalValue(value) {
      self._value = value;
    },
 
    updateValue(store) {
      self._value = parseValue(self.value, store?.task?.dataObj ?? {});
    },
 
    /**
     * Use `resolver` param for data retrieval from remote resource
     * format: <type>(<separator>option=value)*
     * currently only csv type supported, separator is | by default
     */
    resolveValue: flow(function* (value) {
      if (!self.resolver) return value;
 
      const { type, options } = parseTypeAndOption(self.resolver);
 
      if (!Object.prototype.hasOwnProperty.call(resolvers, type)) {
        console.error(`Resolver "${type ?? self.resolver}" looks unfamiliar`);
        return value;
      }
 
      // @todo checks for url
      // @todo error handling
      const response = yield fetch(value);
      const text = yield response.text();
 
      return resolvers[type](text, options);
    }),
  }));
 
export default ProcessAttrsMixin;