"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BSONRegExp = void 0;
var error_1 = require("./error");
function alphabetize(str) {
return str.split('').sort().join('');
}
/**
* A class representation of the BSON RegExp type.
* @public
* @category BSONType
*/
var BSONRegExp = /** @class */ (function () {
/**
* @param pattern - The regular expression pattern to match
* @param options - The regular expression options
*/
function BSONRegExp(pattern, options) {
if (!(this instanceof BSONRegExp))
return new BSONRegExp(pattern, options);
this.pattern = pattern;
this.options = alphabetize(options !== null && options !== void 0 ? options : '');
if (this.pattern.indexOf('\x00') !== -1) {
throw new error_1.BSONError("BSON Regex patterns cannot contain null bytes, found: ".concat(JSON.stringify(this.pattern)));
}
if (this.options.indexOf('\x00') !== -1) {
throw new error_1.BSONError("BSON Regex options cannot contain null bytes, found: ".concat(JSON.stringify(this.options)));
}
// Validate options
for (var i = 0; i < this.options.length; i++) {
if (!(this.options[i] === 'i' ||
this.options[i] === 'm' ||
this.options[i] === 'x' ||
this.options[i] === 'l' ||
this.options[i] === 's' ||
this.options[i] === 'u')) {
throw new error_1.BSONError("The regular expression option [".concat(this.options[i], "] is not supported"));
}
}
}
BSONRegExp.parseOptions = function (options) {
return options ? options.split('').sort().join('') : '';
};
/** @internal */
BSONRegExp.prototype.toExtendedJSON = function (options) {
options = options || {};
if (options.legacy) {
return { $regex: this.pattern, $options: this.options };
}
return { $regularExpression: { pattern: this.pattern, options: this.options } };
};
/** @internal */
BSONRegExp.fromExtendedJSON = function (doc) {
if ('$regex' in doc) {
if (typeof doc.$regex !== 'string') {
// This is for $regex query operators that have extended json values.
if (doc.$regex._bsontype === 'BSONRegExp') {
return doc;
}
}
else {
return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options));
}
}
if ('$regularExpression' in doc) {
return new BSONRegExp(doc.$regularExpression.pattern, BSONRegExp.parseOptions(doc.$regularExpression.options));
}
throw new error_1.BSONTypeError("Unexpected BSONRegExp EJSON object form: ".concat(JSON.stringify(doc)));
};
return BSONRegExp;
}());
exports.BSONRegExp = BSONRegExp;
Object.defineProperty(BSONRegExp.prototype, '_bsontype', { value: 'BSONRegExp' });
//# sourceMappingURL=regexp.js.map