Socket
Socket
Sign inDemoInstall

vega-lite

Package Overview
Dependencies
Maintainers
2
Versions
470
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vega-lite - npm Package Compare versions

Comparing version 1.0.16 to 1.1.0

src/datetime.js

2

package.json
{
"name": "vega-lite",
"author": "Jeffrey Heer, Dominik Moritz, Kanit \"Ham\" Wongsuphasawat",
"version": "1.0.16",
"version": "1.1.0",
"collaborators": [

@@ -6,0 +6,0 @@ "Kanit Wongsuphasawat <kanitw@gmail.com> (http://kanitw.yellowpigz.com)",

"use strict";
var mark_1 = require('../mark');
var channel_1 = require('../channel');

@@ -73,2 +74,5 @@ var fielddef_1 = require('../fielddef');

}
if (!p.fill && util_1.contains([mark_1.BAR, mark_1.POINT, mark_1.CIRCLE, mark_1.SQUARE], model.mark())) {
p.fill = { value: 'transparent' };
}
if (opacityValue !== undefined) {

@@ -75,0 +79,0 @@ p.opacity = opacityValue;

@@ -0,1 +1,2 @@

import {BAR, POINT, CIRCLE, SQUARE} from '../mark';
import {COLOR, OPACITY} from '../channel';

@@ -7,3 +8,3 @@ import {Config} from '../config';

import {QUANTITATIVE, ORDINAL} from '../type';
import { union} from '../util';
import {contains, union} from '../util';

@@ -89,2 +90,8 @@ import {FacetModel} from './facet';

// If there is no fill, always fill symbols
// with transparent fills https://github.com/vega/vega-lite/issues/1316
if (!p.fill && contains([BAR, POINT, CIRCLE, SQUARE], model.mark())) {
p.fill = {value: 'transparent'};
}
if (opacityValue !== undefined) {

@@ -91,0 +98,0 @@ p.opacity = opacityValue;

"use strict";
var channel_1 = require('../channel');
var config_1 = require('../config');
var encoding_1 = require('../encoding');

@@ -29,20 +30,3 @@ var fielddef_1 = require('../fielddef');

case 'orient':
var xIsMeasure = fielddef_1.isMeasure(encoding.x) || fielddef_1.isMeasure(encoding.x2);
var yIsMeasure = fielddef_1.isMeasure(encoding.y) || fielddef_1.isMeasure(encoding.y2);
if (xIsMeasure && !yIsMeasure) {
if (mark === mark_1.TICK) {
cfg[property] = 'vertical';
}
else {
cfg[property] = 'horizontal';
}
}
else if (!xIsMeasure && yIsMeasure) {
if (mark === mark_1.TICK) {
cfg[property] = 'horizontal';
}
else {
cfg[property] = 'vertical';
}
}
cfg[property] = orient(mark, encoding, config.mark);
break;

@@ -58,2 +42,53 @@ case 'align':

exports.initMarkConfig = initMarkConfig;
function orient(mark, encoding, markConfig) {
if (markConfig === void 0) { markConfig = {}; }
switch (mark) {
case mark_1.POINT:
case mark_1.CIRCLE:
case mark_1.SQUARE:
case mark_1.TEXT:
return undefined;
}
var xIsMeasure = fielddef_1.isMeasure(encoding.x) || fielddef_1.isMeasure(encoding.x2);
var yIsMeasure = fielddef_1.isMeasure(encoding.y) || fielddef_1.isMeasure(encoding.y2);
var yIsRange = encoding.y && encoding.y2;
var xIsRange = encoding.x && encoding.x2;
switch (mark) {
case mark_1.TICK:
if (xIsMeasure && !yIsMeasure) {
return config_1.Orient.VERTICAL;
}
return config_1.Orient.HORIZONTAL;
case mark_1.RULE:
if (xIsRange) {
return config_1.Orient.HORIZONTAL;
}
if (yIsRange) {
return config_1.Orient.VERTICAL;
}
if (encoding.y) {
return config_1.Orient.HORIZONTAL;
}
if (encoding.x) {
return config_1.Orient.VERTICAL;
}
return undefined;
case mark_1.BAR:
case mark_1.AREA:
if (yIsRange) {
return config_1.Orient.VERTICAL;
}
if (xIsRange) {
return config_1.Orient.HORIZONTAL;
}
case mark_1.LINE:
if (xIsMeasure && !yIsMeasure) {
return config_1.Orient.HORIZONTAL;
}
return config_1.Orient.VERTICAL;
}
console.warn('orient unimplemented for mark', mark);
return config_1.Orient.VERTICAL;
}
exports.orient = orient;
//# sourceMappingURL=config.js.map
import {X, DETAIL} from '../channel';
import {Config} from '../config';
import {Config, Orient, MarkConfig} from '../config';
import {Encoding} from '../encoding';
import {isAggregate, has} from '../encoding';
import {isMeasure} from '../fielddef';
import {AREA, POINT, LINE, TICK, CIRCLE, SQUARE, RULE, Mark} from '../mark';
import {BAR, AREA, POINT, LINE, TICK, CIRCLE, SQUARE, RULE, TEXT, Mark} from '../mark';
import {contains, extend} from '../util';

@@ -37,22 +37,3 @@

case 'orient':
const xIsMeasure = isMeasure(encoding.x) || isMeasure(encoding.x2);
const yIsMeasure = isMeasure(encoding.y) || isMeasure(encoding.y2);
// When unambiguous, do not allow overriding
if (xIsMeasure && !yIsMeasure) {
if (mark === TICK) {
cfg[property] = 'vertical';
} else {
cfg[property] = 'horizontal';
}
} else if (!xIsMeasure && yIsMeasure) {
if (mark === TICK) {
cfg[property] = 'horizontal';
} else {
cfg[property] = 'vertical';
}
}
// In ambiguous cases (QxQ or OxO) use specified value
// (and implicitly vertical by default.)
cfg[property] = orient(mark, encoding, config.mark);
break;

@@ -70,1 +51,65 @@ // text-only

}
export function orient(mark: Mark, encoding: Encoding, markConfig: MarkConfig = {}): Orient {
switch (mark) {
case POINT:
case CIRCLE:
case SQUARE:
case TEXT:
// orient is meaningless for these marks.
return undefined;
}
const xIsMeasure = isMeasure(encoding.x) || isMeasure(encoding.x2);
const yIsMeasure = isMeasure(encoding.y) || isMeasure(encoding.y2);
const yIsRange = encoding.y && encoding.y2;
const xIsRange = encoding.x && encoding.x2;
switch (mark) {
case TICK:
// Tick is opposite to bar, line, area and never have ranged mark.
if (xIsMeasure && !yIsMeasure) {
return Orient.VERTICAL;
}
// y:Q or Ambiguous case, return horizontal
return Orient.HORIZONTAL;
case RULE:
if (xIsRange) {
return Orient.HORIZONTAL;
}
if (yIsRange) {
return Orient.VERTICAL;
}
if (encoding.y) {
return Orient.HORIZONTAL;
}
if (encoding.x) {
return Orient.VERTICAL;
}
// no x/y -- so it's undefined
return undefined;
case BAR:
case AREA:
// If there are range for both x and y, y (vertical) has higher precedence.
if (yIsRange) {
return Orient.VERTICAL;
}
if (xIsRange) {
return Orient.HORIZONTAL;
}
/* tslint:disable */
case LINE: // intentional fall through
/* tslint:enable */
if (xIsMeasure && !yIsMeasure) {
return Orient.HORIZONTAL;
}
// y:Q or Ambiguous case, return vertical
return Orient.VERTICAL;
}
/* istanbul ignore:next */
console.warn('orient unimplemented for mark', mark);
return Orient.VERTICAL;
}
"use strict";
var datetime_1 = require('../../datetime');
var fielddef_1 = require('../../fielddef');
var filter_1 = require('../../filter');
var timeunit_1 = require('../../timeunit');
var util_1 = require('../../util');
var filter;
(function (filter_1) {
(function (filter_2) {
function valueExpr(v, timeUnit) {
if (datetime_1.isDateTime(v)) {
var expr = datetime_1.dateTimeExpr(v, true);
return 'time(' + expr + ')';
}
if (timeunit_1.isSingleTimeUnit(timeUnit)) {
var datetime = {};
datetime[timeUnit] = v;
var expr = datetime_1.dateTimeExpr(datetime, true);
return 'time(' + expr + ')';
}
return JSON.stringify(v);
}
function getFilterExpression(filter) {
if (util_1.isString(filter)) {
return filter;
}
else {
var fieldExpr = filter.timeUnit ?
('time(' + timeunit_1.fieldExpr(filter.timeUnit, filter.field) + ')') :
fielddef_1.field(filter, { datum: true });
if (filter_1.isEqualFilter(filter)) {
return fieldExpr + '===' + valueExpr(filter.equal, filter.timeUnit);
}
else if (filter_1.isInFilter(filter)) {
return 'indexof([' +
filter.in.map(function (v) { return valueExpr(v, filter.timeUnit); }).join(',') +
'], ' + fieldExpr + ') !== -1';
}
else if (filter_1.isRangeFilter(filter)) {
var lower = filter.range[0];
var upper = filter.range[1];
if (lower !== null && upper !== null) {
return 'inrange(' + fieldExpr + ', ' +
valueExpr(lower, filter.timeUnit) + ', ' +
valueExpr(upper, filter.timeUnit) + ')';
}
else if (lower !== null) {
return fieldExpr + ' >= ' + lower;
}
else if (upper !== null) {
return fieldExpr + ' <= ' + upper;
}
}
}
return undefined;
}
filter_2.getFilterExpression = getFilterExpression;
function parse(model) {
return model.transform().filter;
var filter = model.transform().filter;
if (util_1.isArray(filter)) {
return '(' +
filter.map(function (f) { return getFilterExpression(f); })
.filter(function (f) { return f !== undefined; })
.join(') && (') +
')';
}
else if (filter) {
return getFilterExpression(filter);
}
return undefined;
}
filter_1.parseUnit = parse;
filter_2.parse = parse;
filter_2.parseUnit = parse;
function parseFacet(model) {

@@ -19,3 +84,3 @@ var filterComponent = parse(model);

}
filter_1.parseFacet = parseFacet;
filter_2.parseFacet = parseFacet;
function parseLayer(model) {

@@ -31,3 +96,3 @@ var filterComponent = parse(model);

}
filter_1.parseLayer = parseLayer;
filter_2.parseLayer = parseLayer;
function assemble(component) {

@@ -40,4 +105,4 @@ var filter = component.filter;

}
filter_1.assemble = assemble;
filter_2.assemble = assemble;
})(filter = exports.filter || (exports.filter = {}));
//# sourceMappingURL=filter.js.map

@@ -1,13 +0,85 @@

import {FacetModel} from './../facet';
import {LayerModel} from './../layer';
import {Model} from './../model';
import {DateTime, dateTimeExpr, isDateTime} from '../../datetime';
import {field} from '../../fielddef';
import {isEqualFilter, isInFilter, isRangeFilter, Filter} from '../../filter';
import {TimeUnit, fieldExpr as timeUnitFieldExpr, isSingleTimeUnit} from '../../timeunit';
import {isArray, isString} from '../../util';
import {FacetModel} from '../facet';
import {LayerModel} from '../layer';
import {Model} from '../model';
import {DataComponent} from './data';
export namespace filter {
function parse(model: Model): string {
return model.transform().filter;
/**
* @param v value to be converted into Vega Expression
* @param timeUnit
* @return Vega Expression of the value v. This could be one of:
* - a timestamp value of datetime object
* - a timestamp value of casted single time unit value
* - stringified value
*/
function valueExpr(v: any, timeUnit: TimeUnit) {
if (isDateTime(v)) {
const expr = dateTimeExpr(v, true);
return 'time(' + expr + ')';
}
if (isSingleTimeUnit(timeUnit)) {
const datetime: DateTime = {};
datetime[timeUnit] = v;
const expr = dateTimeExpr(datetime, true);
return 'time(' + expr + ')';
}
return JSON.stringify(v);
}
export function getFilterExpression(filter: Filter | string) {
if (isString(filter)) {
return filter as string;
} else { // Filter Object
const fieldExpr = filter.timeUnit ?
// For timeUnit, cast into integer with time() so we can use ===, inrange, indexOf to compare values directly.
// TODO: We calculate timeUnit on the fly here. Consider if we would like to consolidate this with timeUnit pipeline
// TODO: support utc
('time(' + timeUnitFieldExpr(filter.timeUnit, filter.field) + ')') :
field(filter, {datum: true});
if (isEqualFilter(filter)) {
return fieldExpr + '===' + valueExpr(filter.equal, filter.timeUnit);
} else if (isInFilter(filter)) {
return 'indexof([' +
filter.in.map((v) => valueExpr(v, filter.timeUnit)).join(',') +
'], ' + fieldExpr + ') !== -1';
} else if (isRangeFilter(filter)) {
const lower = filter.range[0];
const upper = filter.range[1];
if (lower !== null && upper !== null) {
return 'inrange(' + fieldExpr + ', ' +
valueExpr(lower, filter.timeUnit) + ', ' +
valueExpr(upper, filter.timeUnit) + ')';
} else if (lower !== null) {
return fieldExpr + ' >= ' + lower;
} else if (upper !== null) {
return fieldExpr + ' <= ' + upper;
}
}
}
return undefined;
}
export function parse(model: Model): string {
const filter = model.transform().filter;
if (isArray(filter)) {
return '(' +
filter.map((f) => getFilterExpression(f))
.filter((f) => f !==undefined)
.join(') && (') +
')';
} else if (filter) {
return getFilterExpression(filter);
}
return undefined;
}
export const parseUnit = parse;

@@ -14,0 +86,0 @@

@@ -12,6 +12,11 @@ "use strict";

function parse(model) {
var filterNull = model.transform().filterNull;
var transform = model.transform();
var filterInvalid = transform.filterInvalid;
if (filterInvalid === undefined && transform['filterNull'] !== undefined) {
filterInvalid = transform['filterNull'];
console.warn('filterNull is deprecated. Please use filterInvalid instead.');
}
return model.reduce(function (aggregator, fieldDef) {
if (filterNull ||
(filterNull === undefined && fieldDef.field && fieldDef.field !== '*' && DEFAULT_NULL_FILTERS[fieldDef.type])) {
if (filterInvalid ||
(filterInvalid === undefined && fieldDef.field && fieldDef.field !== '*' && DEFAULT_NULL_FILTERS[fieldDef.type])) {
aggregator[fieldDef.field] = true;

@@ -18,0 +23,0 @@ }

@@ -17,9 +17,17 @@ import {FieldDef} from '../../fielddef';

// TODO: rename to invalidFilter
export namespace nullFilter {
/** Return Hashset of fields for null filtering (key=field, value = true). */
function parse(model: Model): Dict<boolean> {
const filterNull = model.transform().filterNull;
const transform = model.transform();
let filterInvalid = transform.filterInvalid;
if (filterInvalid === undefined && transform['filterNull'] !== undefined) {
filterInvalid = transform['filterNull'];
console.warn('filterNull is deprecated. Please use filterInvalid instead.');
}
return model.reduce(function(aggregator, fieldDef: FieldDef) {
if (filterNull ||
(filterNull === undefined && fieldDef.field && fieldDef.field !== '*' && DEFAULT_NULL_FILTERS[fieldDef.type])) {
if (filterInvalid ||
(filterInvalid === undefined && fieldDef.field && fieldDef.field !== '*' && DEFAULT_NULL_FILTERS[fieldDef.type])) {
aggregator[fieldDef.field] = true;

@@ -26,0 +34,0 @@ } else {

"use strict";
var fielddef_1 = require('../../fielddef');
var timeunit_1 = require('../../timeunit');
var type_1 = require('../../type');
var util_1 = require('../../util');
var time_1 = require('./../time');
var timeUnit;

@@ -10,3 +10,2 @@ (function (timeUnit) {

return model.reduce(function (timeUnitComponent, fieldDef, channel) {
var ref = fielddef_1.field(fieldDef, { nofn: true, datum: true });
if (fieldDef.type === type_1.TEMPORAL && fieldDef.timeUnit) {

@@ -17,3 +16,3 @@ var hash = fielddef_1.field(fieldDef);

field: fielddef_1.field(fieldDef),
expr: time_1.parseExpression(fieldDef.timeUnit, ref)
expr: timeunit_1.fieldExpr(fieldDef.timeUnit, fieldDef.field)
};

@@ -20,0 +19,0 @@ }

import {Channel} from '../../channel';
import {field, FieldDef} from '../../fielddef';
import {fieldExpr} from '../../timeunit';
import {TEMPORAL} from '../../type';

@@ -7,14 +8,11 @@ import {extend, vals, Dict} from '../../util';

import {FacetModel} from './../facet';
import {LayerModel} from './../layer';
import {Model} from './../model';
import {parseExpression} from './../time';
import {FacetModel} from '../facet';
import {LayerModel} from '../layer';
import {Model} from '../model';
import {DataComponent} from './data';
export namespace timeUnit {
function parse(model: Model): Dict<VgTransform> {
return model.reduce(function(timeUnitComponent, fieldDef: FieldDef, channel: Channel) {
const ref = field(fieldDef, { nofn: true, datum: true });
if (fieldDef.type === TEMPORAL && fieldDef.timeUnit) {

@@ -27,3 +25,3 @@

field: field(fieldDef),
expr: parseExpression(fieldDef.timeUnit, ref)
expr: fieldExpr(fieldDef.timeUnit, fieldDef.field)
};

@@ -30,0 +28,0 @@ }

"use strict";
var datetime_1 = require('../../datetime');
var timeunit_1 = require('../../timeunit');
var util_1 = require('../../util');
var time_1 = require('./../time');
var timeUnitDomain;

@@ -9,3 +10,3 @@ (function (timeUnitDomain) {

if (fieldDef.timeUnit) {
var domain = time_1.rawDomain(fieldDef.timeUnit, channel);
var domain = timeunit_1.rawDomain(fieldDef.timeUnit, channel);
if (domain) {

@@ -32,4 +33,6 @@ timeUnitDomainMap[fieldDef.timeUnit] = true;

var timeUnit = tu;
var domain = time_1.rawDomain(timeUnit, null);
var domain = timeunit_1.rawDomain(timeUnit, null);
if (domain) {
var datetime = {};
datetime[timeUnit] = 'datum.data';
timeUnitData.push({

@@ -41,3 +44,3 @@ name: timeUnit,

field: 'date',
expr: time_1.parseExpression(timeUnit, 'datum.data', true)
expr: datetime_1.dateTimeExpr(datetime)
}]

@@ -44,0 +47,0 @@ });

import {Channel} from '../../channel';
import {dateTimeExpr, DateTimeExpr} from '../../datetime';
import {FieldDef} from '../../fielddef';
import {TimeUnit} from '../../timeunit';
import {TimeUnit, rawDomain} from '../../timeunit';
import {extend, keys, StringSet} from '../../util';

@@ -10,3 +11,2 @@ import {VgData} from '../../vega.schema';

import {Model} from './../model';
import {parseExpression, rawDomain} from './../time';

@@ -48,2 +48,5 @@ import {DataComponent} from './data';

if (domain) {
let datetime: DateTimeExpr = {};
datetime[timeUnit] = 'datum.data';
timeUnitData.push({

@@ -55,3 +58,3 @@ name: timeUnit,

field: 'date',
expr: parseExpression(timeUnit, 'datum.data', true)
expr: dateTimeExpr(datetime)
}]

@@ -58,0 +61,0 @@ });

@@ -7,3 +7,3 @@ "use strict";

var mark_1 = require('../mark');
var time_1 = require('./time');
var timeunit_1 = require('../timeunit');
function assembleLayout(model, layoutData) {

@@ -153,3 +153,3 @@ var layoutComponent = model.component.layout;

var timeUnit = model.fieldDef(channel).timeUnit;
var timeUnitDomain = timeUnit ? time_1.rawDomain(timeUnit, channel) : null;
var timeUnitDomain = timeUnit ? timeunit_1.rawDomain(timeUnit, channel) : null;
return timeUnitDomain !== null ? timeUnitDomain.length :

@@ -156,0 +156,0 @@ model.field(channel, { datum: true, prefn: 'distinct_' });

@@ -13,3 +13,3 @@

import {Model} from './model';
import {rawDomain} from './time';
import {rawDomain} from '../timeunit';
import {UnitModel} from './unit';

@@ -16,0 +16,0 @@

@@ -10,3 +10,3 @@ "use strict";

function parseLegendComponent(model) {
return [channel_1.COLOR, channel_1.SIZE, channel_1.SHAPE].reduce(function (legendComponent, channel) {
return [channel_1.COLOR, channel_1.SIZE, channel_1.SHAPE, channel_1.OPACITY].reduce(function (legendComponent, channel) {
if (model.legend(channel)) {

@@ -31,2 +31,4 @@ legendComponent[channel] = parseLegend(model, channel);

return { shape: model.scaleName(channel_1.SHAPE) };
case channel_1.OPACITY:
return { opacity: model.scaleName(channel_1.OPACITY) };
}

@@ -105,2 +107,5 @@ return null;

}
if (channel === channel_1.OPACITY) {
delete symbols.opacity;
}
var value;

@@ -107,0 +112,0 @@ if (model.has(channel_1.COLOR) && channel === channel_1.COLOR) {

@@ -1,2 +0,2 @@

import {COLOR, SIZE, SHAPE, Channel} from '../channel';
import {COLOR, SIZE, SHAPE, OPACITY, Channel} from '../channel';
import {Config} from '../config';

@@ -17,3 +17,3 @@ import {FieldDef} from '../fielddef';

export function parseLegendComponent(model: UnitModel): Dict<VgLegend> {
return [COLOR, SIZE, SHAPE].reduce(function(legendComponent, channel) {
return [COLOR, SIZE, SHAPE, OPACITY].reduce(function(legendComponent, channel) {
if (model.legend(channel)) {

@@ -44,2 +44,4 @@ legendComponent[channel] = parseLegend(model, channel);

return { shape: model.scaleName(SHAPE) };
case OPACITY:
return { opacity: model.scaleName(OPACITY) };
}

@@ -139,2 +141,7 @@ return null;

// Avoid override default mapping for opacity channel
if (channel === OPACITY) {
delete symbols.opacity;
}
let value;

@@ -141,0 +148,0 @@ if (model.has(COLOR) && channel === COLOR) {

"use strict";
var channel_1 = require('../../channel');
var config_1 = require('../../config');
var fielddef_1 = require('../../fielddef');

@@ -48,3 +49,3 @@ var common_1 = require('../common');

else if (fielddef_1.isMeasure(fieldDef)) {
if (orient === 'horizontal') {
if (orient === config_1.Orient.HORIZONTAL) {
if (fieldDef && fieldDef.field) {

@@ -81,3 +82,3 @@ return {

if (stack && channel_1.X === stack.fieldChannel) {
if (orient === 'horizontal') {
if (orient === config_1.Orient.HORIZONTAL) {
return {

@@ -90,3 +91,3 @@ scale: scaleName,

else if (fielddef_1.isMeasure(x2FieldDef)) {
if (orient === 'horizontal') {
if (orient === config_1.Orient.HORIZONTAL) {
if (x2FieldDef && x2FieldDef.field) {

@@ -117,3 +118,3 @@ return {

else if (fielddef_1.isMeasure(fieldDef)) {
if (orient !== 'horizontal') {
if (orient !== config_1.Orient.HORIZONTAL) {
if (fieldDef && fieldDef.field) {

@@ -147,3 +148,3 @@ return {

if (stack && channel_1.Y === stack.fieldChannel) {
if (orient !== 'horizontal') {
if (orient !== config_1.Orient.HORIZONTAL) {
return {

@@ -156,3 +157,3 @@ scale: scaleName,

else if (fielddef_1.isMeasure(yFieldDef)) {
if (orient !== 'horizontal') {
if (orient !== config_1.Orient.HORIZONTAL) {
if (y2FieldDef && y2FieldDef.field) {

@@ -159,0 +160,0 @@ return {

import {VgValueRef} from '../../vega.schema';
import {X, Y} from '../../channel';
import {Orient} from '../../config';
import {isDimension, isMeasure, FieldDef, field} from '../../fielddef';

@@ -51,3 +52,3 @@ import {StackProperties} from '../../stack';

export function x(fieldDef: FieldDef, scaleName: string, orient: string, stack: StackProperties): VgValueRef {
export function x(fieldDef: FieldDef, scaleName: string, orient: Orient, stack: StackProperties): VgValueRef {
if (stack && X === stack.fieldChannel) { // Stacked Measure

@@ -59,3 +60,3 @@ return {

} else if (isMeasure(fieldDef)) { // Measure
if (orient === 'horizontal') {
if (orient === Orient.HORIZONTAL) {
// x

@@ -88,6 +89,6 @@ if (fieldDef && fieldDef.field) {

export function x2(xFieldDef: FieldDef, x2FieldDef: FieldDef, scaleName: string, orient: string, stack: StackProperties): VgValueRef {
export function x2(xFieldDef: FieldDef, x2FieldDef: FieldDef, scaleName: string, orient: Orient, stack: StackProperties): VgValueRef {
// x
if (stack && X === stack.fieldChannel) { // Stacked Measure
if (orient === 'horizontal') {
if (orient === Orient.HORIZONTAL) {
return {

@@ -99,3 +100,3 @@ scale: scaleName,

} else if (isMeasure(x2FieldDef)) { // Measure
if (orient === 'horizontal') {
if (orient === Orient.HORIZONTAL) {
if (x2FieldDef && x2FieldDef.field) {

@@ -117,3 +118,3 @@ return {

export function y(fieldDef: FieldDef, scaleName: string, orient: string, stack: StackProperties): VgValueRef {
export function y(fieldDef: FieldDef, scaleName: string, orient: Orient, stack: StackProperties): VgValueRef {
if (stack && Y === stack.fieldChannel) { // Stacked Measure

@@ -125,3 +126,3 @@ return {

} else if (isMeasure(fieldDef)) {
if (orient !== 'horizontal') {
if (orient !== Orient.HORIZONTAL) {
// y

@@ -151,5 +152,5 @@ if (fieldDef && fieldDef.field) {

export function y2(yFieldDef: FieldDef, y2FieldDef: FieldDef, scaleName: string, orient: string, stack: StackProperties): VgValueRef {
export function y2(yFieldDef: FieldDef, y2FieldDef: FieldDef, scaleName: string, orient: Orient, stack: StackProperties): VgValueRef {
if (stack && Y === stack.fieldChannel) { // Stacked Measure
if (orient !== 'horizontal') {
if (orient !== Orient.HORIZONTAL) {
return {

@@ -161,3 +162,3 @@ scale: scaleName,

} else if (isMeasure(yFieldDef)) {
if (orient !== 'horizontal') {
if (orient !== Orient.HORIZONTAL) {
// y2

@@ -164,0 +165,0 @@ if (y2FieldDef && y2FieldDef.field) {

"use strict";
var channel_1 = require('../../channel');
var config_1 = require('../../config');
var fielddef_1 = require('../../fielddef');
var scale_1 = require('../../scale');
var common_1 = require('../common');

@@ -29,3 +31,3 @@ var bar;

else if (xIsMeasure) {
if (orient === 'horizontal') {
if (orient === config_1.Orient.HORIZONTAL) {
if (model.has(channel_1.X)) {

@@ -50,6 +52,11 @@ p.x = {

else {
p.x2 = {
scale: model.scaleName(channel_1.X),
value: 0
};
if (model.scale(channel_1.X).type === scale_1.ScaleType.LOG) {
p.x2 = { value: 0 };
}
else {
p.x2 = {
scale: model.scaleName(channel_1.X),
value: 0
};
}
}

@@ -66,3 +73,3 @@ }

else if (model.fieldDef(channel_1.X).bin) {
if (model.has(channel_1.SIZE) && orient !== 'horizontal') {
if (model.has(channel_1.SIZE) && orient !== config_1.Orient.HORIZONTAL) {
p.xc = {

@@ -99,3 +106,3 @@ scale: model.scaleName(channel_1.X),

}
p.width = model.has(channel_1.SIZE) && orient !== 'horizontal' ? {
p.width = model.has(channel_1.SIZE) && orient !== config_1.Orient.HORIZONTAL ? {
scale: model.scaleName(channel_1.SIZE),

@@ -121,3 +128,3 @@ field: model.field(channel_1.SIZE)

else if (yIsMeasure) {
if (orient !== 'horizontal') {
if (orient !== config_1.Orient.HORIZONTAL) {
if (model.has(channel_1.Y)) {

@@ -142,6 +149,13 @@ p.y = {

else {
p.y2 = {
scale: model.scaleName(channel_1.Y),
value: 0
};
if (model.scale(channel_1.Y).type === scale_1.ScaleType.LOG) {
p.y2 = {
field: { group: 'height' }
};
}
else {
p.y2 = {
scale: model.scaleName(channel_1.Y),
value: 0
};
}
}

@@ -158,3 +172,3 @@ }

else if (model.fieldDef(channel_1.Y).bin) {
if (model.has(channel_1.SIZE) && orient === 'horizontal') {
if (model.has(channel_1.SIZE) && orient === config_1.Orient.HORIZONTAL) {
p.yc = {

@@ -194,3 +208,3 @@ scale: model.scaleName(channel_1.Y),

}
p.height = model.has(channel_1.SIZE) && orient === 'horizontal' ? {
p.height = model.has(channel_1.SIZE) && orient === config_1.Orient.HORIZONTAL ? {
scale: model.scaleName(channel_1.SIZE),

@@ -197,0 +211,0 @@ field: model.field(channel_1.SIZE)

import {X, Y, X2, Y2, SIZE, Channel} from '../../channel';
import {Orient} from '../../config';
import {isMeasure} from '../../fielddef';
import {ScaleType} from '../../scale';

@@ -36,3 +38,3 @@ import {UnitModel} from '../unit';

} else if (xIsMeasure) {
if (orient === 'horizontal') {
if (orient === Orient.HORIZONTAL) {
if (model.has(X)) {

@@ -56,6 +58,11 @@ p.x = {

} else {
p.x2 = {
scale: model.scaleName(X),
value: 0
};
if (model.scale(X).type === ScaleType.LOG) {
p.x2 = { value: 0 };
} else {
p.x2 = {
scale: model.scaleName(X),
value: 0
};
}
}

@@ -70,3 +77,3 @@ } else { // vertical

} else if (model.fieldDef(X).bin) {
if (model.has(SIZE) && orient !== 'horizontal') {
if (model.has(SIZE) && orient !== Orient.HORIZONTAL) {
// For vertical chart that has binned X and size,

@@ -103,3 +110,3 @@ // center bar and apply size to width.

p.width = model.has(SIZE) && orient !== 'horizontal' ? {
p.width = model.has(SIZE) && orient !== Orient.HORIZONTAL ? {
// apply size scale if has size and is vertical (explicit "vertical" or undefined)

@@ -129,3 +136,3 @@ scale: model.scaleName(SIZE),

} else if (yIsMeasure) {
if (orient !== 'horizontal') { // vertical (explicit 'vertical' or undefined)
if (orient !== Orient.HORIZONTAL) { // vertical (explicit 'vertical' or undefined)
if (model.has(Y)) {

@@ -149,6 +156,13 @@ p.y = {

} else {
p.y2 = {
scale: model.scaleName(Y),
value: 0
};
if (model.scale(Y).type === ScaleType.LOG) {
// end on axis
p.y2 = {
field: {group: 'height'}
};
} else {
p.y2 = {
scale: model.scaleName(Y),
value: 0
};
}
}

@@ -163,3 +177,3 @@ } else {

} else if (model.fieldDef(Y).bin) {
if (model.has(SIZE) && orient === 'horizontal') {
if (model.has(SIZE) && orient === Orient.HORIZONTAL) {
// For horizontal chart that has binned Y and size,

@@ -201,3 +215,3 @@ // center bar and apply size to height.

p.height = model.has(SIZE) && orient === 'horizontal' ? {
p.height = model.has(SIZE) && orient === Orient.HORIZONTAL ? {
// apply size scale if has size and is horizontal

@@ -204,0 +218,0 @@ scale: model.scaleName(SIZE),

"use strict";
var channel_1 = require('../../channel');
var config_1 = require('../../config');
var encoding_1 = require('../../encoding');

@@ -128,3 +129,3 @@ var fielddef_1 = require('../../fielddef');

else {
return '-' + model.field(model.config().mark.orient === 'horizontal' ? channel_1.Y : channel_1.X, { binSuffix: '_mid' });
return '-' + model.field(model.config().mark.orient === config_1.Orient.HORIZONTAL ? channel_1.Y : channel_1.X, { binSuffix: '_mid' });
}

@@ -131,0 +132,0 @@ }

import {X, Y, COLOR, TEXT, SHAPE, PATH, ORDER, OPACITY, DETAIL, LABEL, STACK_GROUP_CHANNELS} from '../../channel';
import {Orient} from '../../config';
import {has} from '../../encoding';

@@ -199,3 +200,3 @@ import {OrderChannelDef, FieldDef, field} from '../../fielddef';

// For both line and area, we sort values based on dimension by default
return '-' + model.field(model.config().mark.orient === 'horizontal' ? Y : X, {binSuffix: '_mid'});
return '-' + model.field(model.config().mark.orient === Orient.HORIZONTAL ? Y : X, {binSuffix: '_mid'});
}

@@ -202,0 +203,0 @@ }

"use strict";
var channel_1 = require('../../channel');
var config_1 = require('../../config');
var common_1 = require('../common');

@@ -12,3 +13,3 @@ var rule;

var p = {};
if (model.config().mark.orient === 'vertical') {
if (model.config().mark.orient === config_1.Orient.VERTICAL) {
if (model.has(channel_1.X)) {

@@ -15,0 +16,0 @@ p.x = {

import {X, Y, X2, Y2, SIZE} from '../../channel';
import {Orient} from '../../config';

@@ -15,3 +16,3 @@ import {UnitModel} from '../unit';

// TODO: support explicit value
if(model.config().mark.orient === 'vertical') {
if(model.config().mark.orient === Orient.VERTICAL) {
if (model.has(X)) {

@@ -18,0 +19,0 @@ p.x = {

"use strict";
var channel_1 = require('../../channel');
var config_1 = require('../../config');
var fielddef_1 = require('../../fielddef');

@@ -16,3 +17,3 @@ var common_1 = require('../common');

p.yc = y(model.encoding().y, model.scaleName(channel_1.Y), config);
if (config.mark.orient === 'horizontal') {
if (config.mark.orient === config_1.Orient.HORIZONTAL) {
p.width = size(model.encoding().size, model.scaleName(channel_1.SIZE), config, (model.scale(channel_1.X) || {}).bandSize);

@@ -19,0 +20,0 @@ p.height = { value: config.mark.tickThickness };

import {X, Y, SIZE} from '../../channel';
import {Orient} from '../../config';
import {FieldDef, field} from '../../fielddef';

@@ -24,3 +25,3 @@ import {Config} from '../../config';

if (config.mark.orient === 'horizontal') {
if (config.mark.orient === Orient.HORIZONTAL) {
p.width = size(model.encoding().size, model.scaleName(SIZE), config, (model.scale(X) || {}).bandSize);

@@ -27,0 +28,0 @@ p.height = { value: config.mark.tickThickness };

@@ -9,2 +9,3 @@ import {Axis} from '../axis';

import {Scale, ScaleType} from '../scale';
import {SortField, SortOrder} from '../sort';
import {BaseSpec} from '../spec';

@@ -302,3 +303,3 @@ import {Transform} from '../transform';

public sort(channel: Channel) {
public sort(channel: Channel): SortField | SortOrder {
return (this.mapping()[channel] || {}).sort;

@@ -305,0 +306,0 @@ }

"use strict";
var aggregate_1 = require('../aggregate');
var channel_1 = require('../channel');
var config_1 = require('../config');
var data_1 = require('../data');

@@ -8,7 +9,7 @@ var fielddef_1 = require('../fielddef');

var scale_1 = require('../scale');
var sort_1 = require('../sort');
var stack_1 = require('../stack');
var timeunit_1 = require('../timeunit');
var type_1 = require('../type');
var util_1 = require('../util');
var time_1 = require('./time');
var timeunit_1 = require('../timeunit');
exports.COLOR_LEGEND = 'color_legend';

@@ -62,3 +63,3 @@ exports.COLOR_LEGEND_LABEL = 'color_legend_label';

util_1.extend(scaleDef, rangeMixins(scale, model, channel));
if (sort && (typeof sort === 'string' ? sort : sort.order) === 'descending') {
if (sort && (sort_1.isSortField(sort) ? sort.order : sort) === sort_1.SortOrder.DESCENDING) {
scaleDef.reverse = true;

@@ -115,2 +116,5 @@ }

if (util_1.contains([channel_1.ROW, channel_1.COLUMN, channel_1.SHAPE], channel)) {
if (scale && scale.type !== undefined && scale.type !== scale_1.ScaleType.ORDINAL) {
console.warn('Channel', channel, 'does not work with scale type =', scale.type);
}
return scale_1.ScaleType.ORDINAL;

@@ -134,11 +138,3 @@ }

if (fieldDef.timeUnit) {
switch (fieldDef.timeUnit) {
case timeunit_1.TimeUnit.HOURS:
case timeunit_1.TimeUnit.DAY:
case timeunit_1.TimeUnit.MONTH:
case timeunit_1.TimeUnit.QUARTER:
return scale_1.ScaleType.ORDINAL;
default:
return scale_1.ScaleType.TIME;
}
return timeunit_1.defaultScaleType(fieldDef.timeUnit);
}

@@ -161,3 +157,3 @@ return scale_1.ScaleType.TIME;

if (fieldDef.type === type_1.TEMPORAL) {
if (time_1.rawDomain(fieldDef.timeUnit, channel)) {
if (timeunit_1.rawDomain(fieldDef.timeUnit, channel)) {
return {

@@ -241,6 +237,3 @@ data: fieldDef.timeUnit,

var sort = model.sort(channel);
if (util_1.contains(['ascending', 'descending', undefined], sort)) {
return true;
}
if (typeof sort !== 'string') {
if (sort_1.isSortField(sort)) {
return {

@@ -251,2 +244,5 @@ op: sort.op,

}
if (util_1.contains([sort_1.SortOrder.ASCENDING, sort_1.SortOrder.DESCENDING, undefined], sort)) {
return true;
}
return undefined;

@@ -295,3 +291,3 @@ }

}
var dimension = model.config().mark.orient === 'horizontal' ? channel_1.Y : channel_1.X;
var dimension = model.config().mark.orient === config_1.Orient.HORIZONTAL ? channel_1.Y : channel_1.X;
return { range: [model.config().mark.barThinSize, model.scale(dimension).bandSize] };

@@ -367,3 +363,3 @@ }

if (util_1.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scale.type)) {
return time_1.smallestUnit(fieldDef.timeUnit);
return timeunit_1.smallestUnit(fieldDef.timeUnit);
}

@@ -401,3 +397,3 @@ return util_1.contains([channel_1.X, channel_1.Y], channel);

}
return !fieldDef.bin && util_1.contains([channel_1.X, channel_1.Y], channel);
return !scale.domain && !fieldDef.bin && util_1.contains([channel_1.X, channel_1.Y], channel);
}

@@ -404,0 +400,0 @@ return undefined;

@@ -6,2 +6,3 @@ // https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11-ambient-declarations

import {COLUMN, ROW, X, Y, X2, Y2, SHAPE, SIZE, COLOR, OPACITY, TEXT, hasScale, Channel} from '../channel';
import {Orient} from '../config';
import {SOURCE, STACKED_SCALE} from '../data';

@@ -11,4 +12,4 @@ import {FieldDef, field, isMeasure} from '../fielddef';

import {Scale, ScaleType, NiceTime} from '../scale';
import {isSortField, SortOrder} from '../sort';
import {StackOffset} from '../stack';
import {TimeUnit} from '../timeunit';
import {NOMINAL, ORDINAL, QUANTITATIVE, TEMPORAL} from '../type';

@@ -19,3 +20,3 @@ import {contains, extend, Dict} from '../util';

import {Model} from './model';
import {rawDomain, smallestUnit} from './time';
import {defaultScaleType, rawDomain, smallestUnit} from '../timeunit';
import {UnitModel} from './unit';

@@ -98,3 +99,3 @@

extend(scaleDef, rangeMixins(scale, model, channel));
if (sort && (typeof sort === 'string' ? sort : sort.order) === 'descending') {
if (sort && (isSortField(sort) ? sort.order : sort) === SortOrder.DESCENDING) {
scaleDef.reverse = true;

@@ -174,2 +175,6 @@ }

if (contains([ROW, COLUMN, SHAPE], channel)) {
if (scale && scale.type !== undefined && scale.type !== ScaleType.ORDINAL) {
// TODO: consolidate warning
console.warn('Channel', channel, 'does not work with scale type =', scale.type);
}
return ScaleType.ORDINAL;

@@ -196,12 +201,3 @@ }

if (fieldDef.timeUnit) {
switch (fieldDef.timeUnit) {
case TimeUnit.HOURS:
case TimeUnit.DAY:
case TimeUnit.MONTH:
case TimeUnit.QUARTER:
return ScaleType.ORDINAL;
default:
// date, year, minute, second, yearmonth, monthday, ...
return ScaleType.TIME;
}
return defaultScaleType(fieldDef.timeUnit);
}

@@ -317,8 +313,5 @@ return ScaleType.TIME;

const sort = model.sort(channel);
if (contains(['ascending', 'descending', undefined /* default =ascending*/], sort)) {
return true;
}
// Sorted based on an aggregate calculation over a specified sort field (only for ordinal scale)
if (typeof sort !== 'string') {
if (isSortField(sort)) {
return {

@@ -330,2 +323,6 @@ op: sort.op,

if (contains([SortOrder.ASCENDING, SortOrder.DESCENDING, undefined /* default =ascending*/], sort)) {
return true;
}
// sort === 'none'

@@ -406,3 +403,3 @@ return undefined;

}
const dimension = model.config().mark.orient === 'horizontal' ? Y : X;
const dimension = model.config().mark.orient === Orient.HORIZONTAL ? Y : X;
return {range: [model.config().mark.barThinSize, model.scale(dimension).bandSize]};

@@ -533,6 +530,7 @@ } else if (unitModel.mark() === TEXTMARK) {

}
// By default, return true only for non-binned, quantitative x-scale or y-scale.
return !fieldDef.bin && contains([X, Y], channel);
// By default, return true only for non-binned, quantitative x-scale or y-scale
// If no custom domain is provided.
return !scale.domain && !fieldDef.bin && contains([X, Y], channel);
}
return undefined;
}

@@ -38,2 +38,7 @@ "use strict";

var Shape = exports.Shape;
(function (Orient) {
Orient[Orient["HORIZONTAL"] = 'horizontal'] = "HORIZONTAL";
Orient[Orient["VERTICAL"] = 'vertical'] = "VERTICAL";
})(exports.Orient || (exports.Orient = {}));
var Orient = exports.Orient;
(function (HorizontalAlign) {

@@ -40,0 +45,0 @@ HorizontalAlign[HorizontalAlign["LEFT"] = 'left'] = "LEFT";

@@ -96,2 +96,7 @@ import {ScaleConfig, FacetScaleConfig, defaultScaleConfig, defaultFacetScaleConfig} from './scale';

export enum Orient {
HORIZONTAL = 'horizontal' as any,
VERTICAL = 'vertical' as any
}
export enum HorizontalAlign {

@@ -114,4 +119,2 @@ LEFT = 'left' as any,

export enum Interpolate {

@@ -260,3 +263,3 @@ /** piecewise linear segments, as in a polyline */

*/
orient?: string;
orient?: Orient;

@@ -263,0 +266,0 @@ // ---------- Interpolation: Line / area ----------

@@ -147,3 +147,5 @@ export enum ScaleType {

/**
* If true, ensures that a zero baseline value is included in the scale domain. This option is ignored for non-quantitative scales.
* If `true`, ensures that a zero baseline value is included in the scale domain.
* Default value: `true` for `x` and `y` channel if the quantitative field is not binned
* and no custom `domain` is provided; `false` otherwise.
*/

@@ -150,0 +152,0 @@ zero?: boolean;

@@ -8,2 +8,6 @@ "use strict";

var SortOrder = exports.SortOrder;
function isSortField(sort) {
return !!sort && !!sort['field'] && !!sort['op'];
}
exports.isSortField = isSortField;
//# sourceMappingURL=sort.js.map

@@ -21,1 +21,5 @@ import {AggregateOp} from './aggregate';

}
export function isSortField(sort: SortOrder | SortField): sort is SortField {
return !!sort && !!sort['field'] && !!sort['op'];
}
"use strict";
var channel_1 = require('./channel');
var datetime_1 = require('./datetime');
var scale_1 = require('./scale');
var util_1 = require('./util');
(function (TimeUnit) {

@@ -12,9 +16,6 @@ TimeUnit[TimeUnit["YEAR"] = 'year'] = "YEAR";

TimeUnit[TimeUnit["YEARMONTH"] = 'yearmonth'] = "YEARMONTH";
TimeUnit[TimeUnit["YEARMONTHDAY"] = 'yearmonthday'] = "YEARMONTHDAY";
TimeUnit[TimeUnit["YEARMONTHDATE"] = 'yearmonthdate'] = "YEARMONTHDATE";
TimeUnit[TimeUnit["YEARDAY"] = 'yearday'] = "YEARDAY";
TimeUnit[TimeUnit["YEARDATE"] = 'yeardate'] = "YEARDATE";
TimeUnit[TimeUnit["YEARMONTHDAYHOURS"] = 'yearmonthdayhours'] = "YEARMONTHDAYHOURS";
TimeUnit[TimeUnit["YEARMONTHDAYHOURSMINUTES"] = 'yearmonthdayhoursminutes'] = "YEARMONTHDAYHOURSMINUTES";
TimeUnit[TimeUnit["YEARMONTHDAYHOURSMINUTESSECONDS"] = 'yearmonthdayhoursminutesseconds'] = "YEARMONTHDAYHOURSMINUTESSECONDS";
TimeUnit[TimeUnit["YEARMONTHDATEHOURS"] = 'yearmonthdatehours'] = "YEARMONTHDATEHOURS";
TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTES"] = 'yearmonthdatehoursminutes'] = "YEARMONTHDATEHOURSMINUTES";
TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTESSECONDS"] = 'yearmonthdatehoursminutesseconds'] = "YEARMONTHDATEHOURSMINUTESSECONDS";
TimeUnit[TimeUnit["HOURSMINUTES"] = 'hoursminutes'] = "HOURSMINUTES";

@@ -30,4 +31,5 @@ TimeUnit[TimeUnit["HOURSMINUTESSECONDS"] = 'hoursminutesseconds'] = "HOURSMINUTESSECONDS";

var TimeUnit = exports.TimeUnit;
exports.TIMEUNITS = [
exports.SINGLE_TIMEUNITS = [
TimeUnit.YEAR,
TimeUnit.QUARTER,
TimeUnit.MONTH,

@@ -40,10 +42,20 @@ TimeUnit.DAY,

TimeUnit.MILLISECONDS,
];
var SINGLE_TIMEUNIT_INDEX = exports.SINGLE_TIMEUNITS.reduce(function (d, timeUnit) {
d[timeUnit] = true;
return d;
}, {});
function isSingleTimeUnit(timeUnit) {
return !!SINGLE_TIMEUNIT_INDEX[timeUnit];
}
exports.isSingleTimeUnit = isSingleTimeUnit;
exports.MULTI_TIMEUNITS = [
TimeUnit.YEARQUARTER,
TimeUnit.YEARQUARTERMONTH,
TimeUnit.YEARMONTH,
TimeUnit.YEARMONTHDAY,
TimeUnit.YEARMONTHDATE,
TimeUnit.YEARDAY,
TimeUnit.YEARDATE,
TimeUnit.YEARMONTHDAYHOURS,
TimeUnit.YEARMONTHDAYHOURSMINUTES,
TimeUnit.YEARMONTHDAYHOURSMINUTESSECONDS,
TimeUnit.YEARMONTHDATEHOURS,
TimeUnit.YEARMONTHDATEHOURSMINUTES,
TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS,
TimeUnit.QUARTERMONTH,
TimeUnit.HOURSMINUTES,

@@ -53,7 +65,106 @@ TimeUnit.HOURSMINUTESSECONDS,

TimeUnit.SECONDSMILLISECONDS,
TimeUnit.QUARTER,
TimeUnit.YEARQUARTER,
TimeUnit.QUARTERMONTH,
TimeUnit.YEARQUARTERMONTH,
];
var MULTI_TIMEUNIT_INDEX = exports.MULTI_TIMEUNITS.reduce(function (d, timeUnit) {
d[timeUnit] = true;
return d;
}, {});
function isMultiTimeUnit(timeUnit) {
return !!MULTI_TIMEUNIT_INDEX[timeUnit];
}
exports.isMultiTimeUnit = isMultiTimeUnit;
exports.TIMEUNITS = exports.SINGLE_TIMEUNITS.concat(exports.MULTI_TIMEUNITS);
function containsTimeUnit(fullTimeUnit, timeUnit) {
var fullTimeUnitStr = fullTimeUnit.toString();
var timeUnitStr = timeUnit.toString();
var index = fullTimeUnitStr.indexOf(timeUnitStr);
return index > -1 &&
(timeUnit !== TimeUnit.SECONDS ||
index === 0 ||
fullTimeUnitStr.charAt(index - 1) !== 'i');
}
exports.containsTimeUnit = containsTimeUnit;
function defaultScaleType(timeUnit) {
switch (timeUnit) {
case TimeUnit.HOURS:
case TimeUnit.DAY:
case TimeUnit.MONTH:
case TimeUnit.QUARTER:
return scale_1.ScaleType.ORDINAL;
}
return scale_1.ScaleType.TIME;
}
exports.defaultScaleType = defaultScaleType;
function fieldExpr(fullTimeUnit, field) {
var fieldRef = 'datum.' + field;
function func(timeUnit) {
if (timeUnit === TimeUnit.QUARTER) {
return 'floor(month(' + fieldRef + ')' + '/3)';
}
else {
return timeUnit + '(' + fieldRef + ')';
}
}
var d = exports.SINGLE_TIMEUNITS.reduce(function (_d, tu) {
if (containsTimeUnit(fullTimeUnit, tu)) {
_d[tu] = func(tu);
}
return _d;
}, {});
if (d.day && util_1.keys(d).length > 1) {
console.warn('Time unit "' + fullTimeUnit + '" is not supported. We are replacing it with ', (fullTimeUnit + '').replace('day', 'date') + '.');
delete d.day;
d.date = func(TimeUnit.DATE);
}
return datetime_1.dateTimeExpr(d);
}
exports.fieldExpr = fieldExpr;
function rawDomain(timeUnit, channel) {
if (util_1.contains([channel_1.ROW, channel_1.COLUMN, channel_1.SHAPE, channel_1.COLOR], channel)) {
return null;
}
switch (timeUnit) {
case TimeUnit.SECONDS:
return util_1.range(0, 60);
case TimeUnit.MINUTES:
return util_1.range(0, 60);
case TimeUnit.HOURS:
return util_1.range(0, 24);
case TimeUnit.DAY:
return util_1.range(0, 7);
case TimeUnit.DATE:
return util_1.range(1, 32);
case TimeUnit.MONTH:
return util_1.range(0, 12);
case TimeUnit.QUARTER:
return [0, 3, 6, 9];
}
return null;
}
exports.rawDomain = rawDomain;
function smallestUnit(timeUnit) {
if (!timeUnit) {
return undefined;
}
if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {
return 'second';
}
if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {
return 'minute';
}
if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {
return 'hour';
}
if (containsTimeUnit(timeUnit, TimeUnit.DAY) ||
containsTimeUnit(timeUnit, TimeUnit.DATE)) {
return 'day';
}
if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {
return 'month';
}
if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) {
return 'year';
}
return undefined;
}
exports.smallestUnit = smallestUnit;
function template(timeUnit, field, shortTimeLabels) {

@@ -108,8 +219,2 @@ if (!timeUnit) {

exports.template = template;
function containsTimeUnit(fullTimeUnit, timeUnit) {
var fullTimeUnitStr = fullTimeUnit.toString();
var timeUnitStr = timeUnit.toString();
return fullTimeUnitStr.indexOf(timeUnitStr) > -1;
}
exports.containsTimeUnit = containsTimeUnit;
//# sourceMappingURL=timeunit.js.map

@@ -0,56 +1,195 @@

import {COLUMN, ROW, SHAPE, COLOR, Channel} from './channel';
import {DateTimeExpr, dateTimeExpr} from './datetime';
import {ScaleType} from './scale';
import {Dict, contains, keys, range} from './util';
export enum TimeUnit {
YEAR = 'year' as any,
MONTH = 'month' as any,
DAY = 'day' as any,
DATE = 'date' as any,
HOURS = 'hours' as any,
MINUTES = 'minutes' as any,
SECONDS = 'seconds' as any,
MILLISECONDS = 'milliseconds' as any,
YEARMONTH = 'yearmonth' as any,
YEARMONTHDAY = 'yearmonthday' as any,
YEARMONTHDATE = 'yearmonthdate' as any,
YEARDAY = 'yearday' as any,
YEARDATE = 'yeardate' as any,
YEARMONTHDAYHOURS = 'yearmonthdayhours' as any,
YEARMONTHDAYHOURSMINUTES = 'yearmonthdayhoursminutes' as any,
YEARMONTHDAYHOURSMINUTESSECONDS = 'yearmonthdayhoursminutesseconds' as any,
HOURSMINUTES = 'hoursminutes' as any,
HOURSMINUTESSECONDS = 'hoursminutesseconds' as any,
MINUTESSECONDS = 'minutesseconds' as any,
SECONDSMILLISECONDS = 'secondsmilliseconds' as any,
QUARTER = 'quarter' as any,
YEARQUARTER = 'yearquarter' as any,
QUARTERMONTH = 'quartermonth' as any,
YEARQUARTERMONTH = 'yearquartermonth' as any,
YEAR = 'year' as any,
MONTH = 'month' as any,
DAY = 'day' as any,
DATE = 'date' as any,
HOURS = 'hours' as any,
MINUTES = 'minutes' as any,
SECONDS = 'seconds' as any,
MILLISECONDS = 'milliseconds' as any,
YEARMONTH = 'yearmonth' as any,
YEARMONTHDATE = 'yearmonthdate' as any,
YEARMONTHDATEHOURS = 'yearmonthdatehours' as any,
YEARMONTHDATEHOURSMINUTES = 'yearmonthdatehoursminutes' as any,
YEARMONTHDATEHOURSMINUTESSECONDS = 'yearmonthdatehoursminutesseconds' as any,
HOURSMINUTES = 'hoursminutes' as any,
HOURSMINUTESSECONDS = 'hoursminutesseconds' as any,
MINUTESSECONDS = 'minutesseconds' as any,
SECONDSMILLISECONDS = 'secondsmilliseconds' as any,
QUARTER = 'quarter' as any,
YEARQUARTER = 'yearquarter' as any,
QUARTERMONTH = 'quartermonth' as any,
YEARQUARTERMONTH = 'yearquartermonth' as any,
}
export const TIMEUNITS = [
TimeUnit.YEAR,
TimeUnit.MONTH,
TimeUnit.DAY,
TimeUnit.DATE,
TimeUnit.HOURS,
TimeUnit.MINUTES,
TimeUnit.SECONDS,
TimeUnit.MILLISECONDS,
TimeUnit.YEARMONTH,
TimeUnit.YEARMONTHDAY,
TimeUnit.YEARMONTHDATE,
TimeUnit.YEARDAY,
TimeUnit.YEARDATE,
TimeUnit.YEARMONTHDAYHOURS,
TimeUnit.YEARMONTHDAYHOURSMINUTES,
TimeUnit.YEARMONTHDAYHOURSMINUTESSECONDS,
TimeUnit.HOURSMINUTES,
TimeUnit.HOURSMINUTESSECONDS,
TimeUnit.MINUTESSECONDS,
TimeUnit.SECONDSMILLISECONDS,
TimeUnit.QUARTER,
TimeUnit.YEARQUARTER,
TimeUnit.QUARTERMONTH,
TimeUnit.YEARQUARTERMONTH,
/** Time Unit that only corresponds to only one part of Date objects. */
export const SINGLE_TIMEUNITS = [
TimeUnit.YEAR,
TimeUnit.QUARTER,
TimeUnit.MONTH,
TimeUnit.DAY,
TimeUnit.DATE,
TimeUnit.HOURS,
TimeUnit.MINUTES,
TimeUnit.SECONDS,
TimeUnit.MILLISECONDS,
];
const SINGLE_TIMEUNIT_INDEX: Dict<boolean> = SINGLE_TIMEUNITS.reduce((d, timeUnit) => {
d[timeUnit] = true;
return d;
}, {} as Dict<boolean>);
export function isSingleTimeUnit(timeUnit: TimeUnit) {
return !!SINGLE_TIMEUNIT_INDEX[timeUnit];
}
export const MULTI_TIMEUNITS = [
TimeUnit.YEARQUARTER,
TimeUnit.YEARQUARTERMONTH,
TimeUnit.YEARMONTH,
TimeUnit.YEARMONTHDATE,
TimeUnit.YEARMONTHDATEHOURS,
TimeUnit.YEARMONTHDATEHOURSMINUTES,
TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS,
TimeUnit.QUARTERMONTH,
TimeUnit.HOURSMINUTES,
TimeUnit.HOURSMINUTESSECONDS,
TimeUnit.MINUTESSECONDS,
TimeUnit.SECONDSMILLISECONDS,
];
const MULTI_TIMEUNIT_INDEX: Dict<boolean> = MULTI_TIMEUNITS.reduce((d, timeUnit) => {
d[timeUnit] = true;
return d;
}, {} as Dict<boolean>);
export function isMultiTimeUnit(timeUnit: TimeUnit) {
return !!MULTI_TIMEUNIT_INDEX[timeUnit];
}
export const TIMEUNITS = SINGLE_TIMEUNITS.concat(MULTI_TIMEUNITS);
/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */
export function containsTimeUnit(fullTimeUnit: TimeUnit, timeUnit: TimeUnit) {
let fullTimeUnitStr = fullTimeUnit.toString();
let timeUnitStr = timeUnit.toString();
const index = fullTimeUnitStr.indexOf(timeUnitStr);
return index > -1 &&
(
timeUnit !== TimeUnit.SECONDS ||
index === 0 ||
fullTimeUnitStr.charAt(index-1) !== 'i' // exclude milliseconds
);
}
export function defaultScaleType(timeUnit: TimeUnit) {
switch (timeUnit) {
case TimeUnit.HOURS:
case TimeUnit.DAY:
case TimeUnit.MONTH:
case TimeUnit.QUARTER:
return ScaleType.ORDINAL;
}
// date, year, minute, second, yearmonth, monthday, ...
return ScaleType.TIME;
}
/**
* Returns Vega expresssion for a given timeUnit and fieldRef
*/
export function fieldExpr(fullTimeUnit: TimeUnit, field: string): string {
const fieldRef = 'datum.' + field;
function func(timeUnit: TimeUnit) {
if (timeUnit === TimeUnit.QUARTER) {
// Divide by 3 to get the corresponding quarter number, multiply by 3
// to scale to the first month of the corresponding quarter(0,3,6,9).
return 'floor(month(' + fieldRef + ')' + '/3)';
} else {
return timeUnit + '(' + fieldRef + ')' ;
}
}
let d: DateTimeExpr = SINGLE_TIMEUNITS.reduce((_d, tu: TimeUnit) => {
if (containsTimeUnit(fullTimeUnit, tu)) {
_d[tu] = func(tu);
}
return _d;
}, {});
if (d.day && keys(d).length > 1) {
console.warn('Time unit "'+ fullTimeUnit +'" is not supported. We are replacing it with ',
(fullTimeUnit+'').replace('day', 'date')+'.');
delete d.day;
d.date = func(TimeUnit.DATE);
}
return dateTimeExpr(d);
}
/** Generate the complete raw domain. */
export function rawDomain(timeUnit: TimeUnit, channel: Channel) {
if (contains([ROW, COLUMN, SHAPE, COLOR], channel)) {
return null;
}
switch (timeUnit) {
case TimeUnit.SECONDS:
return range(0, 60);
case TimeUnit.MINUTES:
return range(0, 60);
case TimeUnit.HOURS:
return range(0, 24);
case TimeUnit.DAY:
return range(0, 7);
case TimeUnit.DATE:
return range(1, 32);
case TimeUnit.MONTH:
return range(0, 12);
case TimeUnit.QUARTER:
return [0,3,6,9];
}
return null;
}
/** returns the smallest nice unit for scale.nice */
export function smallestUnit(timeUnit): string {
if (!timeUnit) {
return undefined;
}
if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {
return 'second';
}
if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {
return 'minute';
}
if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {
return 'hour';
}
if (containsTimeUnit(timeUnit, TimeUnit.DAY) ||
containsTimeUnit(timeUnit, TimeUnit.DATE)) {
return 'day';
}
if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {
return 'month';
}
if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) {
return 'year';
}
return undefined;
}
/** returns the template name used for axis labels for a time unit */

@@ -109,2 +248,4 @@ export function template(timeUnit: TimeUnit, field: string, shortTimeLabels: boolean): string {

const template = '{{' + field + ' | time:\'' + out.join(' ') + '\'}}';
// FIXME: Remove this RegExp Hack!!!
return template.replace(new RegExp('{{' + field + ' \\| time:\'\'}}', 'g'), '');

@@ -116,7 +257,1 @@ } else {

/** Returns true if container contains the containee, false otherwise. */
export function containsTimeUnit(fullTimeUnit: TimeUnit, timeUnit: TimeUnit) {
let fullTimeUnitStr = fullTimeUnit.toString();
let timeUnitStr = timeUnit.toString();
return fullTimeUnitStr.indexOf(timeUnitStr) > -1;
}

@@ -0,1 +1,3 @@

import {Filter} from './filter';
/**

@@ -8,7 +10,7 @@ * Top-level transform object.

*/
filter?: string;
filter?: string | Filter | (string | Filter)[];
/**
* Filter null values from the data. If set to true, all rows with null values are filtered. If false, no rows are filtered. Set the property to undefined to filter only quantitative and temporal fields.
* Whether to filter invalid values (`null` and `NaN`) from the data. By default (`undefined`), only quantitative and temporal fields are filtered. If set to `true`, all data items with null values are filtered. If `false`, all data items are included.
*/
filterNull?: boolean;
filterInvalid?: boolean;
/**

@@ -15,0 +17,0 @@ * Calculate new field(s) using the provided expresssion(s). Calculation are applied before filter.

@@ -18,6 +18,2 @@ "use strict";

exports.range = generate_1.range;
var encoding_1 = require('./encoding');
exports.has = encoding_1.has;
var channel_1 = require('./channel');
exports.Channel = channel_1.Channel;
var util_3 = require('datalib/src/util');

@@ -24,0 +20,0 @@ function pick(obj, props) {

@@ -8,5 +8,2 @@ /// <reference path="../typings/datalib.d.ts"/>

export {range} from 'datalib/src/generate';
export {has} from './encoding'
export {FieldDef} from './fielddef';
export {Channel} from './channel';

@@ -13,0 +10,0 @@ import {isString, isNumber, isBoolean} from 'datalib/src/util';

@@ -9,2 +9,3 @@ "use strict";

exports.data = require('./data');
exports.datetime = require('./datetime');
exports.encoding = require('./encoding');

@@ -11,0 +12,0 @@ exports.facet = require('./facet');

@@ -8,2 +8,3 @@ export import axis = require('./axis');

export import data = require('./data');
export import datetime = require('./datetime');
export import encoding = require('./encoding');

@@ -10,0 +11,0 @@ export import facet = require('./facet');

@@ -69,9 +69,10 @@ {

"src/compile/scale.ts",
"src/compile/time.ts",
"src/compile/unit.ts",
"src/config.ts",
"src/data.ts",
"src/datetime.ts",
"src/encoding.ts",
"src/facet.ts",
"src/fielddef.ts",
"src/filter.ts",
"src/legend.ts",

@@ -93,5 +94,9 @@ "src/mark.ts",

"test/compile/common.test.ts",
"test/compile/timeunit.test.ts",
"test/compile/compile.test.ts",
"test/compile/config.test.ts",
"test/compile/data.test.ts",
"test/compile/data/datatestutil.ts",
"test/compile/data/filter.test.ts",
"test/compile/data/timeunit.test.ts",
"test/compile/data/timeunitdomain.test.ts",
"test/compile/facet.test.ts",

@@ -108,8 +113,11 @@ "test/compile/layer.test.ts",

"test/compile/scale.test.ts",
"test/compile/timeunit.test.ts",
"test/compile/unit.test.ts",
"test/datetime.test.ts",
"test/fielddef.test.ts",
"test/filter.test.ts",
"test/schema.test.ts",
"test/spec.test.ts",
"test/stack.test.ts",
"test/timeunit.test.ts",
"test/stack.test.ts",
"test/type.test.ts",

@@ -116,0 +124,0 @@ "test/util.ts",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc