-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpep440.js
76 lines (61 loc) · 2.1 KB
/
pep440.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
module.exports = {
version: ($) =>
seq(
optional("v"),
optional(field("epoch", $.epoch)),
field("release", $.release),
optional(field("pre_release", $.pre_release)),
optional(field("post_release", $.post_release)),
optional(field("dev_release", $.dev_release)),
optional(field("local_version", $.local_version)),
),
epoch: ($) => seq($._number, "!"),
release: ($) => seq($._number, repeat(seq(".", $._number))),
pre_release: ($) =>
seq(
optional($._separator),
field("label", $.pre_release_label),
optional($._separator),
optional(field("number", optional($._number))), // Number is optional in regex
),
post_release: ($) =>
choice(
seq("-", field("number1", $._number)),
seq(
optional($._separator),
field("label", $.post_release_label),
optional($._separator),
optional(field("number2", optional($._number))), // Number is optional in regex
),
),
dev_release: ($) =>
seq(
optional($._separator),
field("label", $.dev_release_label),
optional($._separator),
optional(field("number", optional($._number))), // Number is optional in regex
),
local_version: ($) => seq("+", field("identifier", $.local_version_identifier)),
local_version_identifier: ($) => seq($.alphanumeric, repeat(seq($._local_separator, $.alphanumeric))),
// --- Token Definitions ---
_number: () => /\d+/,
alphanumeric: () => /[a-z0-9]+/,
_separator: () => /[-_\.]/,
_local_separator: ($) => /[-_\.]/, // Separator for local version can be the same
pre_release_label: ($) =>
choice(
caseInsensitive("a"),
caseInsensitive("b"),
caseInsensitive("c"),
caseInsensitive("rc"),
caseInsensitive("alpha"),
caseInsensitive("beta"),
caseInsensitive("pre"),
caseInsensitive("preview"),
),
post_release_label: ($) => choice(caseInsensitive("post"), caseInsensitive("rev"), caseInsensitive("r")),
dev_release_label: ($) => caseInsensitive("dev"),
};
function caseInsensitive(keyword) {
return new RegExp(keyword, "i");
}