ts-pattern
Advanced tools
Comparing version 3.1.4 to 3.1.5
137
lib/index.js
@@ -37,2 +37,3 @@ "use strict"; | ||
exports.not = not; | ||
var ANONYMOUS_SELECT_KEY = '@ts-pattern/__anonymous-select-key'; | ||
function select(key) { | ||
@@ -104,5 +105,9 @@ return key === undefined | ||
} | ||
var selected = {}; | ||
var doesMatch = function (value) { | ||
return Boolean(patterns.some(function (pattern) { return matchPattern(pattern, value); }) && | ||
predicates.every(function (predicate) { return predicate(value); })); | ||
return Boolean(patterns.some(function (pattern) { | ||
return matchPattern(pattern, value, function (key, value) { | ||
selected[key] = value; | ||
}); | ||
}) && predicates.every(function (predicate) { return predicate(value); })); | ||
}; | ||
@@ -114,4 +119,6 @@ return builder(value, cases.concat([ | ||
select: function (value) { | ||
return patterns.length === 1 | ||
? selectWithPattern(patterns[0], value) | ||
return Object.keys(selected).length | ||
? selected[ANONYMOUS_SELECT_KEY] !== undefined | ||
? selected[ANONYMOUS_SELECT_KEY] | ||
: selected | ||
: value; | ||
@@ -170,7 +177,13 @@ }, | ||
// tells us if the value matches a given pattern. | ||
var matchPattern = function (pattern, value) { | ||
if (pattern === PatternType_1.__ || | ||
isNamedSelectPattern(pattern) || | ||
isAnonymousSelectPattern(pattern)) | ||
var matchPattern = function (pattern, value, select) { | ||
if (pattern === PatternType_1.__) | ||
return true; | ||
if (isNamedSelectPattern(pattern)) { | ||
select(pattern['@ts-pattern/__key'], value); | ||
return true; | ||
} | ||
if (isAnonymousSelectPattern(pattern)) { | ||
select(ANONYMOUS_SELECT_KEY, value); | ||
return true; | ||
} | ||
if (pattern === PatternType_1.__.string) | ||
@@ -186,13 +199,26 @@ return typeof value === 'string'; | ||
if (isNotPattern(pattern)) | ||
return !matchPattern(pattern['@ts-pattern/__pattern'], value); | ||
if (isListPattern(pattern)) | ||
return Array.isArray(value) | ||
? value.every(function (v) { return matchPattern(pattern[0], v); }) | ||
: false; | ||
return !matchPattern(pattern['@ts-pattern/__pattern'], value, select); | ||
if (typeof pattern !== typeof value) | ||
return false; | ||
if (isObject(pattern)) { | ||
if (isListPattern(pattern)) { | ||
if (!Array.isArray(value)) | ||
return false; | ||
var selected_1 = {}; | ||
var listSelect_1 = function (key, value) { | ||
selected_1[key] = (selected_1[key] || []).concat([value]); | ||
}; | ||
var doesMatch = value.every(function (v) { | ||
return matchPattern(pattern[0], v, listSelect_1); | ||
}); | ||
if (doesMatch) { | ||
Object.keys(selected_1).forEach(function (key) { return select(key, selected_1[key]); }); | ||
} | ||
return doesMatch; | ||
} | ||
if (Array.isArray(pattern)) { | ||
return Array.isArray(value) && pattern.length === value.length | ||
? pattern.every(function (subPattern, i) { return matchPattern(subPattern, value[i]); }) | ||
? pattern.every(function (subPattern, i) { | ||
return matchPattern(subPattern, value[i], select); | ||
}) | ||
: false; | ||
@@ -204,3 +230,3 @@ } | ||
return __spreadArray([], __read(pattern.keys())).every(function (key) { | ||
return matchPattern(pattern.get(key), value.get(key)); | ||
return matchPattern(pattern.get(key), value.get(key), select); | ||
}); | ||
@@ -216,3 +242,3 @@ } | ||
return Object.values(PatternType_1.__).includes(subPattern) | ||
? matchPattern([subPattern], __spreadArray([], __read(value.values()))) | ||
? matchPattern([subPattern], __spreadArray([], __read(value.values())), select) | ||
: value.has(subPattern); | ||
@@ -225,4 +251,7 @@ } | ||
return Object.keys(pattern).every(function (k) { | ||
return matchPattern( | ||
// @ts-ignore | ||
return matchPattern(pattern[k], value[k]); | ||
pattern[k], | ||
// @ts-ignore | ||
value[k], select); | ||
}); | ||
@@ -232,75 +261,1 @@ } | ||
}; | ||
var selectWithPattern = function (pattern, value) { | ||
var positional = selectPositionalWithPattern(pattern, value); | ||
var kwargs = selectKwargsWithPattern(pattern, value); | ||
return positional.kind === 'some' | ||
? positional.value | ||
: Object.keys(kwargs).length | ||
? kwargs | ||
: value; | ||
}; | ||
var none = { kind: 'none' }; | ||
var selectPositionalWithPattern = function (pattern, value) { | ||
if (isAnonymousSelectPattern(pattern)) | ||
return { kind: 'some', value: value }; | ||
if (isObject(pattern) && isObject(value)) { | ||
if (Array.isArray(value)) { | ||
if (isListPattern(pattern)) { | ||
return value.reduce(function (acc, item) { | ||
var selection = selectPositionalWithPattern(pattern[0], item); | ||
return selection.kind === 'none' | ||
? acc | ||
: acc.kind === 'none' | ||
? { kind: 'some', value: [selection.value] } | ||
: { kind: 'some', value: acc.value.concat([selection.value]) }; | ||
}, none); | ||
} | ||
if (Array.isArray(pattern)) { | ||
return pattern.length <= value.length | ||
? pattern.reduce(function (acc, subPattern, i) { | ||
if (acc.kind === 'some') | ||
return acc; | ||
return selectPositionalWithPattern(subPattern, value[i]); | ||
}, none) | ||
: none; | ||
} | ||
} | ||
return Object.keys(pattern).reduce(function (acc, k) { | ||
if (acc.kind === 'some') | ||
return acc; | ||
// @ts-ignore | ||
return selectPositionalWithPattern(pattern[k], value[k]); | ||
}, none); | ||
} | ||
return none; | ||
}; | ||
var selectKwargsWithPattern = function (pattern, value) { | ||
var _a; | ||
if (isNamedSelectPattern(pattern)) | ||
return _a = {}, _a[pattern['@ts-pattern/__key']] = value, _a; | ||
if (isObject(pattern) && isObject(value)) { | ||
if (Array.isArray(value)) { | ||
if (isListPattern(pattern)) { | ||
return value.reduce(function (acc, item) { | ||
var selections = selectKwargsWithPattern(pattern[0], item); | ||
return Object.keys(selections).reduce(function (acc, key) { | ||
acc[key] = (acc[key] || []).concat([selections[key]]); | ||
return acc; | ||
}, acc); | ||
}, {}); | ||
} | ||
if (Array.isArray(pattern)) { | ||
return pattern.length <= value.length | ||
? pattern.reduce(function (acc, subPattern, i) { | ||
return Object.assign(acc, selectKwargsWithPattern(subPattern, value[i])); | ||
}, {}) | ||
: {}; | ||
} | ||
} | ||
return Object.keys(pattern).reduce(function (acc, k) { | ||
// @ts-ignore | ||
return Object.assign(acc, selectKwargsWithPattern(pattern[k], value[k])); | ||
}, {}); | ||
} | ||
return {}; | ||
}; |
{ | ||
"name": "ts-pattern", | ||
"version": "3.1.4", | ||
"version": "3.1.5", | ||
"description": "Typescript pattern matching library", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
69973
809