86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-disable no-undef, no-unused-vars, no-native-reassign */
 | 
						|
// the $ on the iframe window object is the same
 | 
						|
// as the one used on the main site, but
 | 
						|
// uses the iframe document as the context
 | 
						|
window.$(document).ready(function() {
 | 
						|
  var _ = parent._;
 | 
						|
  var Rx = parent.Rx;
 | 
						|
  var chai = parent.chai;
 | 
						|
  var assert = chai.assert;
 | 
						|
  var tests = parent.tests;
 | 
						|
  var common = parent.common;
 | 
						|
 | 
						|
  common.getJsOutput = function evalJs(code = '') {
 | 
						|
    if (window.__err || !common.shouldRun()) {
 | 
						|
      return window.__err || 'code disabled';
 | 
						|
    }
 | 
						|
    let output;
 | 
						|
    try {
 | 
						|
      /* eslint-disable no-eval */
 | 
						|
      output = eval(code);
 | 
						|
      /* eslint-enable no-eval */
 | 
						|
    } catch (e) {
 | 
						|
      window.__err = e;
 | 
						|
    }
 | 
						|
    return output;
 | 
						|
  };
 | 
						|
 | 
						|
  common.runPreviewTests$ =
 | 
						|
    function runPreviewTests$({
 | 
						|
    tests = [],
 | 
						|
    originalCode,
 | 
						|
    ...rest
 | 
						|
  }) {
 | 
						|
      const code = originalCode;
 | 
						|
      const editor = { getValue() { return originalCode; } };
 | 
						|
      if (window.__err) {
 | 
						|
        return Rx.Observable.throw(window.__err);
 | 
						|
      }
 | 
						|
 | 
						|
      // Iterate throught the test one at a time
 | 
						|
      // on new stacks
 | 
						|
      return Rx.Observable.from(tests, null, null, Rx.Scheduler.default)
 | 
						|
        // add delay here for firefox to catch up
 | 
						|
        .delay(100)
 | 
						|
        .map(test => {
 | 
						|
          const userTest = {};
 | 
						|
          try {
 | 
						|
            /* eslint-disable no-eval */
 | 
						|
            eval(test);
 | 
						|
            /* eslint-enable no-eval */
 | 
						|
          } catch (e) {
 | 
						|
            userTest.err = e.message.split(':').shift();
 | 
						|
          } finally {
 | 
						|
            if (!test.match(/message: /g)) {
 | 
						|
              // assumes test does not contain arrays
 | 
						|
              // This is a patch until all test fall into this pattern
 | 
						|
              userTest.text = test
 | 
						|
                .split(',')
 | 
						|
                .pop();
 | 
						|
              userTest.text = 'message: ' + userTest.text + '\');';
 | 
						|
            } else {
 | 
						|
              userTest.text = test;
 | 
						|
            }
 | 
						|
          }
 | 
						|
          return userTest;
 | 
						|
        })
 | 
						|
        // gather tests back into an array
 | 
						|
        .toArray()
 | 
						|
        .map(tests => ({ ...rest, tests, originalCode }));
 | 
						|
    };
 | 
						|
 | 
						|
  // used when updating preview without running tests
 | 
						|
  common.checkPreview$ = function checkPreview$(args) {
 | 
						|
    if (window.__err) {
 | 
						|
      return Rx.Observable.throw(window.__err);
 | 
						|
    }
 | 
						|
    return Rx.Observable.just(args);
 | 
						|
  };
 | 
						|
 | 
						|
  // now that the runPreviewTest$ is defined
 | 
						|
  // we set the subject to true
 | 
						|
  // this will let the updatePreview
 | 
						|
  // script now that we are ready.
 | 
						|
  common.previewReady$.onNext(true);
 | 
						|
});
 |