1 | "use strict";
|
2 | var __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 | };
|
12 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
13 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
14 | };
|
15 | Object.defineProperty(exports, "__esModule", { value: true });
|
16 | var ParameterType_1 = __importDefault(require("./ParameterType"));
|
17 | var CucumberExpressionGenerator_1 = __importDefault(require("./CucumberExpressionGenerator"));
|
18 | var Errors_1 = require("./Errors");
|
19 | var ParameterTypeRegistry = (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 |
|
46 |
|
47 |
|
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 | }());
|
101 | exports.default = ParameterTypeRegistry;
|
102 | module.exports = ParameterTypeRegistry;
|
103 |
|
\ | No newline at end of file |