docs: public static String escapeJsValue(SoyValue value) {
      // We surround values with spaces so that they can't be interpolated into identifiers
      // by accident.  We could use parentheses but those might be interpreted as a function call.
      if (NullData.INSTANCE == value || value == null) {
        // The JS counterpart of this code in soyutils.js emits " null " for both null and the special
        // JS value undefined.
        return " null ";
      } else if (value instanceof NumberData) {
        // This will emit references to NaN and Infinity.  Client code should not redefine those
        // to store sensitive data.
        return " " + value.numberValue() + " ";
      } else if (value instanceof BooleanData) {
        return " " + value.booleanValue() + " ";
      } else if (isSanitizedContentOfKind(value, SanitizedContent.ContentKind.JS)) {
        String jsCode = value.coerceToString();
        // This value may not be embeddable if it contains the substring "</script".
        // TODO(msamuel): Fixup.  We need to be careful because mucking with '<' can
        // break code like
        //    while (i</foo/.exec(str).length)
        // and mucking with / can break
        //    return untrustedHTML.replace(/</g, '&lt;');
        return jsCode;
      } else {
        return escapeJsValue(value.coerceToString());
      }
    }