validate-reql
Version:
allows validation of rethinkdb reql queries using a whitelist of reql validators. this was specifically designed to work w/ rethinkdb-primus.
204 lines (197 loc) • 5.54 kB
JavaScript
// NOTE: Thank you Mike Mintz!! - code yanked from https://github.com/mikemintz/rethinkdb-websocket-server
// only slightly modified
var assign = require('101/assign')
var exists = require('101/exists')
var filter = require('object-loops/filter')
var map = require('object-loops/map')
var r = require('rethinkdb')
// The exported object here maps from reql term type name (keys in
// protodef.Term.TermType) to an example AST term instance.
//
// This is necessary because the JavaScript rethinkdb driver does not export
// its AST classes, but we need to reconstruct the AST in order to run
// toString() on the query.
var instances = {
DATUM: r(1),
MAKE_ARRAY: r([]),
MAKE_OBJ: r({}),
VAR: r(function (x) { return x }).args[1],
JAVASCRIPT: r.js(''),
UUID: r.uuid(),
HTTP: r.http(''),
ERROR: r.error(),
IMPLICIT_VAR: r.row,
DB: r.db(''),
TABLE: r.table(''),
GET: r({}).get(''),
GET_ALL: r({}).getAll(''),
EQ: r.eq(),
NE: r.ne(),
LT: r.lt(),
LE: r.le(),
GT: r.gt(),
GE: r.ge(),
NOT: r.not(),
ADD: r.add(),
SUB: r.sub(),
MUL: r.mul(),
DIV: r.div(),
MOD: r.mod(),
FLOOR: r.floor(),
CEIL: r.ceil(),
ROUND: r.round(),
APPEND: r([]).append(),
PREPEND: r([]).prepend(),
DIFFERENCE: r([]).difference(),
SET_INSERT: r([]).setInsert(),
SET_INTERSECTION: r([]).setIntersection(),
SET_UNION: r([]).setUnion(),
SET_DIFFERENCE: r([]).setDifference(),
SLICE: r([]).slice(0),
SKIP: r([]).skip(),
LIMIT: r([]).limit(),
OFFSETS_OF: r([]).offsetsOf(),
CONTAINS: r([]).contains(),
GET_FIELD: r({}).getField(),
KEYS: r({}).keys(),
OBJECT: r.object(),
HAS_FIELDS: r([]).hasFields(),
WITH_FIELDS: r([]).withFields(),
PLUCK: r([]).pluck(''),
WITHOUT: r([]).without(),
MERGE: r({}).merge(),
BETWEEN: r([]).between(0, 1),
REDUCE: r([]).reduce(),
MAP: r([]).map({}),
FILTER: r([]).filter({}),
CONCAT_MAP: r([]).concatMap({}),
ORDER_BY: r([]).orderBy(),
DISTINCT: r([]).distinct(),
COUNT: r([]).count(),
IS_EMPTY: r([]).isEmpty(),
UNION: r([]).union(),
NTH: r([]).nth(),
BRACKET: r([]).bracket(0),
INNER_JOIN: r([]).innerJoin(),
OUTER_JOIN: r([]).outerJoin(),
EQ_JOIN: r([]).eqJoin('', ''),
ZIP: r([]).zip(),
RANGE: r.range(),
INSERT_AT: r([]).insertAt(),
DELETE_AT: r([]).deleteAt(),
CHANGE_AT: r([]).changeAt(),
SPLICE_AT: r([]).spliceAt(),
COERCE_TO: r([]).coerceTo(),
TYPE_OF: r([]).typeOf(),
UPDATE: r([]).update({}),
DELETE: r([]).delete(),
REPLACE: r([]).replace({}),
INSERT: r([]).insert({}),
DB_CREATE: r.dbCreate(),
DB_DROP: r.dbDrop(),
DB_LIST: r.dbList(),
TABLE_CREATE: r.tableCreate(''),
TABLE_DROP: r.tableDrop(''),
TABLE_LIST: r.tableList(),
CONFIG: r([]).config(),
STATUS: r([]).status(),
WAIT: r.table('superheroes').wait(),
RECONFIGURE: r.table('superheroes').reconfigure(),
REBALANCE: r.table('superheroes').rebalance(),
SYNC: r([]).sync(),
INDEX_CREATE: r([]).indexCreate(''),
INDEX_DROP: r([]).indexDrop(''),
INDEX_LIST: r([]).indexList(),
INDEX_STATUS: r([]).indexStatus(),
INDEX_WAIT: r([]).indexWait(),
INDEX_RENAME: r([]).indexRename('', ''),
FUNCALL: r.do(function () { return 0 }),
BRANCH: r.branch(0, 0, 0),
OR: r(0).or(0),
AND: r(0).and(0),
FOR_EACH: r([]).forEach(function () { return 0 }),
FUNC: r(function () { return 0 }),
ASC: r.asc(),
DESC: r.desc(),
INFO: r.info(),
MATCH: r('').match(''),
UPCASE: r('').upcase(),
DOWNCASE: r('').downcase(),
SAMPLE: r([]).sample(0),
DEFAULT: r({}).default(0),
JSON: r.json(''),
TO_JSON_STRING: r('').toJsonString(),
ISO8601: r.ISO8601(''),
TO_ISO8601: r.now().toISO8601(),
EPOCH_TIME: r.epochTime(0),
TO_EPOCH_TIME: r.now().toEpochTime(),
NOW: r.now(),
IN_TIMEZONE: r.now().inTimezone(''),
DURING: r('').during(r.now(), r.now()),
DATE: r.now().date(),
TIME_OF_DAY: r.now().timeOfDay(),
TIMEZONE: r.now().timezone(),
YEAR: r.now().year(),
MONTH: r.now().month(),
DAY: r.now().day(),
DAY_OF_WEEK: r.now().dayOfWeek(),
DAY_OF_YEAR: r.now().dayOfYear(),
HOURS: r.now().hours(),
MINUTES: r.now().minutes(),
SECONDS: r.now().seconds(),
TIME: r.time(),
MONDAY: r.monday,
TUESDAY: r.tuesday,
WEDNESDAY: r.wednesday,
THURSDAY: r.thursday,
FRIDAY: r.friday,
SATURDAY: r.saturday,
SUNDAY: r.sunday,
JANUARY: r.january,
FEBRUARY: r.february,
MARCH: r.march,
APRIL: r.april,
MAY: r.may,
JUNE: r.june,
JULY: r.july,
AUGUST: r.august,
SEPTEMBER: r.september,
OCTOBER: r.october,
NOVEMBER: r.november,
DECEMBER: r.december,
LITERAL: r.literal({}),
GROUP: r([]).group(''),
SUM: r([]).sum(),
AVG: r([]).avg(),
MIN: r([]).min(),
MAX: r([]).max(),
SPLIT: r([]).split(),
UNGROUP: r([]).ungroup(),
RANDOM: r.random(),
CHANGES: r([]).changes(),
ARGS: r.args([]),
BINARY: r.binary(new Buffer(0)),
GEOJSON: r.geojson({}),
TO_GEOJSON: r({}).toGeojson(),
POINT: r.point(0, 0),
LINE: r.line([], []),
POLYGON: r.polygon([], [], []),
DISTANCE: r.distance([], []),
INTERSECTS: r.intersects(),
INCLUDES: r([]).includes([]),
CIRCLE: r.circle([], 0),
GET_INTERSECTING: r([]).getIntersecting([]),
FILL: r.line([], []).fill(),
GET_NEAREST: r([]).getNearest([]),
POLYGON_SUB: r.polygon([], [], []).polygonSub([]),
MINVAL: r.minval,
MAXVAL: r.maxval
}
/* istanbul ignore next */
var extended = filter({
FOLD: r([]).fold && r([]).fold('', function () { return true })
}, exists)
assign(instances, extended)
module.exports = map(instances, function (val) {
return val.constructor
})