File size: 1,386 Bytes
7aec436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
const isPromise = (v) => !!v && typeof v.then === 'function';

const jsValueToScratchValue = (v) => {
  if (typeof v === 'boolean' || typeof v === 'number' || typeof v === 'string') {
    return v;
  }
  return '' + v;
};

class UnsafeCloudBehaviorsProvider {
  enable () {

  }

  setEvalValue (value) {
    this.manager.setVariable(this, '☁ eval output', jsValueToScratchValue(value));
  }

  setEvalError (error) {
    console.error('Error evaluating ☁ eval', error);
    this.manager.setVariable(this, '☁ eval error', jsValueToScratchValue(error));
  }

  evaluateAsync (js) {
    try {
      const value = eval(js);
      if (isPromise(value)) {
        value
          .then((v) => this.setEvalValue(v))
          .catch((e) => this.setEvalError(e));
      } else {
        this.setEvalValue(value)
      }
    } catch (e) {
      this.setEvalError(e);
    }
  }

  handleUpdateVariable (name, value) {
    if (name === '☁ eval') {
      this.evaluateAsync(value);
    }
  }
}

export default function ({ scaffolding }) {
  const provider = new UnsafeCloudBehaviorsProvider();
  scaffolding.addCloudProvider(provider);
  scaffolding.addCloudProviderOverride('☁ eval', provider);
  scaffolding.addCloudProviderOverride('☁ eval output', provider);
  scaffolding.addCloudProviderOverride('☁ eval error', provider);
}