UNPKG

5.76 kBJavaScriptView Raw
1"use strict";
2var __values = (this && this.__values) || function (o) {
3 var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
4 if (m) return m.call(o);
5 return {
6 next: function () {
7 if (o && i >= o.length) o = void 0;
8 return { value: o && o[i++], done: !o };
9 }
10 };
11};
12var __importDefault = (this && this.__importDefault) || function (mod) {
13 return (mod && mod.__esModule) ? mod : { "default": mod };
14};
15Object.defineProperty(exports, "__esModule", { value: true });
16var ParameterType_1 = __importDefault(require("./ParameterType"));
17var CucumberExpressionGenerator_1 = __importDefault(require("./CucumberExpressionGenerator"));
18var Errors_1 = require("./Errors");
19var ParameterTypeRegistry = /** @class */ (function () {
20 function ParameterTypeRegistry() {
21 this.parameterTypeByName = new Map();
22 this.parameterTypesByRegexp = new Map();
23 this.defineParameterType(new ParameterType_1.default('int', ParameterTypeRegistry.INTEGER_REGEXPS, Number, function (s) { return (s === undefined ? null : Number(s)); }, true, true));
24 this.defineParameterType(new ParameterType_1.default('float', ParameterTypeRegistry.FLOAT_REGEXP, Number, function (s) { return (s === undefined ? null : parseFloat(s)); }, true, false));
25 this.defineParameterType(new ParameterType_1.default('word', ParameterTypeRegistry.WORD_REGEXP, String, function (s) { return s; }, false, false));
26 this.defineParameterType(new ParameterType_1.default('string', ParameterTypeRegistry.STRING_REGEXP, String, function (s) { return s.replace(/\\"/g, '"').replace(/\\'/g, "'"); }, true, false));
27 this.defineParameterType(new ParameterType_1.default('', ParameterTypeRegistry.ANONYMOUS_REGEXP, String, function (s) { return s; }, false, true));
28 }
29 Object.defineProperty(ParameterTypeRegistry.prototype, "parameterTypes", {
30 get: function () {
31 return this.parameterTypeByName.values();
32 },
33 enumerable: true,
34 configurable: true
35 });
36 ParameterTypeRegistry.prototype.lookupByTypeName = function (typeName) {
37 return this.parameterTypeByName.get(typeName);
38 };
39 ParameterTypeRegistry.prototype.lookupByRegexp = function (parameterTypeRegexp, expressionRegexp, text) {
40 var parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp);
41 if (!parameterTypes) {
42 return null;
43 }
44 if (parameterTypes.length > 1 && !parameterTypes[0].preferForRegexpMatch) {
45 // We don't do this check on insertion because we only want to restrict
46 // ambiguiuty when we look up by Regexp. Users of CucumberExpression should
47 // not be restricted.
48 var generatedExpressions = new CucumberExpressionGenerator_1.default(this).generateExpressions(text);
49 throw Errors_1.AmbiguousParameterTypeError.forRegExp(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions);
50 }
51 return parameterTypes[0];
52 };
53 ParameterTypeRegistry.prototype.defineParameterType = function (parameterType) {
54 var e_1, _a;
55 if (parameterType.name !== undefined) {
56 if (this.parameterTypeByName.has(parameterType.name)) {
57 if (parameterType.name.length === 0) {
58 throw new Error("The anonymous parameter type has already been defined");
59 }
60 else {
61 throw new Error("There is already a parameter type with name " + parameterType.name);
62 }
63 }
64 this.parameterTypeByName.set(parameterType.name, parameterType);
65 }
66 try {
67 for (var _b = __values(parameterType.regexpStrings), _c = _b.next(); !_c.done; _c = _b.next()) {
68 var parameterTypeRegexp = _c.value;
69 if (!this.parameterTypesByRegexp.has(parameterTypeRegexp)) {
70 this.parameterTypesByRegexp.set(parameterTypeRegexp, []);
71 }
72 var parameterTypes = this.parameterTypesByRegexp.get(parameterTypeRegexp);
73 var existingParameterType = parameterTypes[0];
74 if (parameterTypes.length > 0 &&
75 existingParameterType.preferForRegexpMatch &&
76 parameterType.preferForRegexpMatch) {
77 throw new Errors_1.CucumberExpressionError('There can only be one preferential parameter type per regexp. ' +
78 ("The regexp /" + parameterTypeRegexp + "/ is used for two preferential parameter types, {" + existingParameterType.name + "} and {" + parameterType.name + "}"));
79 }
80 if (parameterTypes.indexOf(parameterType) === -1) {
81 parameterTypes.push(parameterType);
82 this.parameterTypesByRegexp.set(parameterTypeRegexp, parameterTypes.sort(ParameterType_1.default.compare));
83 }
84 }
85 }
86 catch (e_1_1) { e_1 = { error: e_1_1 }; }
87 finally {
88 try {
89 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
90 }
91 finally { if (e_1) throw e_1.error; }
92 }
93 };
94 ParameterTypeRegistry.INTEGER_REGEXPS = [/-?\d+/, /\d+/];
95 ParameterTypeRegistry.FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][+\-]?\d+)?/;
96 ParameterTypeRegistry.WORD_REGEXP = /[^\s]+/;
97 ParameterTypeRegistry.STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/;
98 ParameterTypeRegistry.ANONYMOUS_REGEXP = /.*/;
99 return ParameterTypeRegistry;
100}());
101exports.default = ParameterTypeRegistry;
102module.exports = ParameterTypeRegistry;
103//# sourceMappingURL=ParameterTypeRegistry.js.map
\No newline at end of file