Skip to content

sweet.js

Geza Kovacs edited this page Feb 4, 2017 · 3 revisions

sweet.js allows us to write macros that implement functionality such as require_package or require_css (the below is designed for sweet.js 2.2.1)

syntax require_css = function(ctx) {
  let delim = ctx.next().value;
  let arr = []
  let dummy = #`dummy`.get(0)
  let remap = {
    'bar': '/path/to/bar.css',
    'foo': '/even/longer/path/to/foo.css'
  };
  let item_val;
  for (let item of delim.inner()) {
    item_val = item.val()
    if (remap[item_val]) {
      item_val = remap[item_val]
    }
    arr.push(dummy.fromString(item_val))
    break
  }
  return #`
    require('libs_common/content_script_utils').load_css_file(${arr})
  `
}

syntax require_package = function(ctx) {
  let delim = ctx.next().value;
  let arr = []
  let dummy = #`dummy`.get(0)
  let remap = {
    'bar': 'bazz'
  };
  for (let item of delim.inner()) {
    arr.push(dummy.fromString(item.val()))
  	break
  }
  return #`
    require(${arr});
    require_css(${arr})
  `
}

var x = require_package('bar');
var y = require_package('foo');
var y = require_package('buz');

If we run the above code with the command sjs foo.js, it compiles to the following

var x_14 = require("bar");
require("libs_common/content_script_utils").load_css_file("/path/to/bar.css");
var y_15 = require("foo");
require("libs_common/content_script_utils").load_css_file("/even/longer/path/to/foo.css");
var y_15 = require("buz");
require("libs_common/content_script_utils").load_css_file("buz");

Clone this wiki locally