@platform/cell.typesystem
Version:
The 'strongly typed sheets' system of the CellOS.
98 lines (97 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var common_1 = require("../common");
var TypeSystem_core_1 = require("../TypeSystem.core");
var TypeBuilderProp_1 = require("./TypeBuilderProp");
var TypeBuilderType = (function () {
function TypeBuilderType(args) {
var _this = this;
this._props = [];
this.onPropChange = function (e) {
if (e.prop === 'column') {
_this.onColumnChange(e.value);
}
};
var validation = TypeSystem_core_1.TypeScript.validate.objectTypename(args.typename);
if (!validation.isValid) {
throw new Error(validation.error);
}
var startColumn = common_1.defaultValue(args.startColumn, 0);
if (typeof startColumn === 'string') {
if (!common_1.coord.cell.isColumn(startColumn)) {
throw new Error("The given start-column key (" + startColumn + ") is not a valid column");
}
startColumn = common_1.coord.cell.toAxisIndex('COLUMN', startColumn);
}
if (typeof startColumn === 'number' && startColumn < 0) {
throw new Error("The given start-column index (" + startColumn + ") is less than zero");
}
this.uri = common_1.Uri.ns(args.uri);
this.typename = (args.typename || '').trim();
this.startColumn = startColumn;
}
Object.defineProperty(TypeBuilderType.prototype, "props", {
get: function () {
return this._props;
},
enumerable: true,
configurable: true
});
TypeBuilderType.prototype.toObject = function () {
return { columns: {} };
};
TypeBuilderType.prototype.prop = function (name, arg) {
name = (name || '').trim();
var validName = TypeSystem_core_1.TypeScript.validate.propname(name);
if (validName.error) {
throw new Error(validName.error);
}
var exists = this.props.some(function (prop) { return prop.toObject().name === name; });
if (exists) {
var err = "A property named '" + name + "' has already been added";
throw new Error(err);
}
var onChange = this.onPropChange;
var column = this.nextColumn(typeof arg === 'object' ? arg.column : undefined);
var toBuilder = function (arg) {
var options = typeof arg === 'string' || arg === undefined ? { type: arg } : arg;
return TypeBuilderProp_1.TypeBuilderProp.create(tslib_1.__assign(tslib_1.__assign({}, options), { column: column, name: name, onChange: onChange }));
};
var builder = typeof arg === 'function'
? TypeBuilderProp_1.TypeBuilderProp.create({ column: column, name: name, onChange: onChange })
: toBuilder(arg);
if (typeof arg === 'function') {
arg(builder);
}
this._props.push(builder);
return this;
};
TypeBuilderType.prototype.nextColumn = function (input) {
var column = -1;
if (input !== undefined) {
column = typeof input === 'string' ? common_1.coord.cell.toAxisIndex('COLUMN', input) : input;
}
else {
if (this._lastColumn === undefined) {
column = this.startColumn;
}
else {
column = this._lastColumn + 1;
}
}
if (this._lastColumn === undefined || column > this._lastColumn) {
this._lastColumn = column;
}
return column;
};
TypeBuilderType.prototype.onColumnChange = function (key) {
var index = common_1.coord.cell.toAxisIndex('COLUMN', key);
if (this._lastColumn === undefined || index > this._lastColumn) {
this._lastColumn = index;
}
};
TypeBuilderType.create = function (args) { return new TypeBuilderType(args); };
return TypeBuilderType;
}());
exports.TypeBuilderType = TypeBuilderType;