@wener/common 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/lib/cn/DivisionCode.js +311 -0
  2. package/lib/cn/DivisionCode.js.map +1 -0
  3. package/lib/cn/Mod11Checksum.js +42 -0
  4. package/lib/cn/Mod11Checksum.js.map +1 -0
  5. package/lib/cn/Mod31Checksum.js +48 -0
  6. package/lib/cn/Mod31Checksum.js.map +1 -0
  7. package/lib/cn/ResidentIdentityCardNumber.js +50 -0
  8. package/lib/cn/ResidentIdentityCardNumber.js.map +1 -0
  9. package/lib/cn/UnifiedSocialCreditCode.js +118 -0
  10. package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
  11. package/lib/cn/formatDate.js +15 -0
  12. package/lib/cn/formatDate.js.map +1 -0
  13. package/lib/cn/index.js +4 -0
  14. package/lib/cn/index.js.map +1 -0
  15. package/lib/cn/parseSex.js +22 -0
  16. package/lib/cn/parseSex.js.map +1 -0
  17. package/lib/cn/types.d.js +8 -0
  18. package/lib/cn/types.d.js.map +1 -0
  19. package/lib/meta/defineFileType.js +44 -0
  20. package/lib/meta/defineFileType.js.map +1 -0
  21. package/lib/meta/defineMetadata.js +14 -3
  22. package/lib/meta/defineMetadata.js.map +1 -1
  23. package/lib/meta/index.js +1 -0
  24. package/lib/meta/index.js.map +1 -1
  25. package/lib/parseSort.js +15 -0
  26. package/lib/parseSort.js.map +1 -1
  27. package/lib/search/AdvanceSearch.js +10 -0
  28. package/lib/search/AdvanceSearch.js.map +1 -0
  29. package/lib/search/formatAdvanceSearch.js +64 -0
  30. package/lib/search/formatAdvanceSearch.js.map +1 -0
  31. package/lib/search/index.js +2 -0
  32. package/lib/search/index.js.map +1 -0
  33. package/lib/search/optimizeAdvanceSearch.js +89 -0
  34. package/lib/search/optimizeAdvanceSearch.js.map +1 -0
  35. package/lib/search/parseAdvanceSearch.js +20 -0
  36. package/lib/search/parseAdvanceSearch.js.map +1 -0
  37. package/lib/search/parser.d.js +3 -0
  38. package/lib/search/parser.d.js.map +1 -0
  39. package/lib/search/parser.js +3065 -0
  40. package/lib/search/parser.js.map +1 -0
  41. package/lib/search/types.d.js +3 -0
  42. package/lib/search/types.d.js.map +1 -0
  43. package/package.json +12 -4
  44. package/src/cn/DivisionCode.test.ts +50 -0
  45. package/src/cn/DivisionCode.ts +253 -0
  46. package/src/cn/Mod11Checksum.ts +24 -0
  47. package/src/cn/Mod31Checksum.ts +36 -0
  48. package/src/cn/ResidentIdentityCardNumber.test.ts +21 -0
  49. package/src/cn/ResidentIdentityCardNumber.ts +96 -0
  50. package/src/cn/UnifiedSocialCreditCode.test.ts +16 -0
  51. package/src/cn/UnifiedSocialCreditCode.ts +148 -0
  52. package/src/cn/__snapshots__/ResidentIdentityCardNumber.test.ts.snap +15 -0
  53. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +41 -0
  54. package/src/cn/formatDate.ts +12 -0
  55. package/src/cn/index.ts +3 -0
  56. package/src/cn/parseSex.ts +27 -0
  57. package/src/cn/types.d.ts +51 -0
  58. package/src/meta/defineFileType.tsx +68 -0
  59. package/src/meta/defineMetadata.ts +16 -3
  60. package/src/meta/index.ts +2 -0
  61. package/src/parseSort.test.ts +1 -0
  62. package/src/parseSort.ts +18 -0
  63. package/src/search/AdvanceSearch.test.ts +156 -0
  64. package/src/search/AdvanceSearch.ts +14 -0
  65. package/src/search/Makefile +2 -0
  66. package/src/search/__snapshots__/AdvanceSearch.test.ts.snap +675 -0
  67. package/src/search/formatAdvanceSearch.ts +61 -0
  68. package/src/search/index.ts +1 -0
  69. package/src/search/optimizeAdvanceSearch.ts +90 -0
  70. package/src/search/parseAdvanceSearch.ts +26 -0
  71. package/src/search/parser.d.ts +8 -0
  72. package/src/search/parser.js +2794 -0
  73. package/src/search/parser.peggy +237 -0
  74. package/src/search/types.d.ts +71 -0
@@ -0,0 +1,237 @@
1
+ /*
2
+ Grammar for advance search query
3
+
4
+ grammar: https://github.com/wenerme/wener/blob/master/notes/languages/parser/peg/advance-search.peggy
5
+ js: https://github.com/wenerme/wode/tree/main/packages/wener-common
6
+ playground: https://peggyjs.org/online
7
+ ================================
8
+
9
+ - Github search
10
+ - Google search like
11
+
12
+ MAYBE date(createdAt):>2024-01-01
13
+ BUT createdAt:2024-01-01..*
14
+
15
+ MAYBE createdAt:now-7d..now
16
+
17
+ single quote string
18
+ MAYBE @HELLO:'HI'
19
+
20
+ MAYBE field.*, field.0
21
+
22
+ Examples
23
+ ==========
24
+ ok OR yes AND NO AND NO
25
+ QUALIFIER.a:@me is:yes AND yes HELLO WORLD
26
+ start:>2019-09-12T12:20:30.123+08:00
27
+ a:[2, 1 ) -owner:@me AND YES
28
+ -a a yes OR KEY
29
+ NOT NOT AND AND OR OR
30
+ NOT -a
31
+ (NOT hello)
32
+ @AI:"Where is my car"
33
+ owner:@me
34
+ owner:!=@me
35
+ (a OR B)
36
+ ( a OR "B )" )
37
+ */
38
+
39
+ {
40
+ const OPERATORS = {
41
+ ":": "match",
42
+ ":=": "eq",
43
+ ":!=": "ne",
44
+ ":>": "gt",
45
+ ":>=": "gte",
46
+ ":<": "lt",
47
+ ":<=": "lte",
48
+ };
49
+ }
50
+
51
+ // todo make /**/b works
52
+ Main = @Exprs EOF
53
+
54
+ Exprs = _ @Expr|1.., __| _
55
+
56
+ Expr
57
+ = Comment
58
+ / OrExpr
59
+
60
+ Comment
61
+ = "/*" value:$[^*]* "*/" { return { type: "comment", value: value.trim() }; }
62
+
63
+ OrExpr
64
+ = head:AndExpr tail:(__ KW_OR __ @AndExpr)* {
65
+ return !tail.length
66
+ ? head
67
+ : { type: "logical", operator: "or", value: [head].concat(tail) };
68
+ }
69
+
70
+ AndExpr
71
+ = head:NotExpr tail:(__ KW_AND __ @NotExpr)* {
72
+ return !tail.length
73
+ ? head
74
+ : { type: "logical", operator: "and", value: [head].concat(tail) };
75
+ }
76
+
77
+ NotExpr
78
+ = KW_NOT __ value:NotExpr { return { type: "not", value }; }
79
+ / @ParenthesesExpr
80
+
81
+ ParenthesesExpr
82
+ = "(" _ value:Exprs _ ")" { return { type: "parentheses", value }; }
83
+ / @ComparisonExpr
84
+
85
+ ComparisonExpr
86
+ = modifier:(negative:"-" { return { negative: true }; } / "+" { return {}; })?
87
+ expr:(
88
+ field:field operator:":" value:range {
89
+ return { type: "compare", field, operator: "range", value };
90
+ }
91
+ / field:field operator:(":=" / ":!=" / ":") value:mention {
92
+ return {
93
+ type: "compare",
94
+ field,
95
+ operator: operator === ":!=" ? "ne" : "eq",
96
+ value,
97
+ };
98
+ }
99
+ / field:field
100
+ operator:(":=" / ":>" / ":<" / ":>=" / ":<=" / ":!=" / ":")
101
+ value:value {
102
+ return {
103
+ type: "compare",
104
+ field,
105
+ operator: OPERATORS[operator],
106
+ value,
107
+ };
108
+ }
109
+ ) { return { ...expr, ...modifier }; }
110
+ / "@" field:field ":" value:string {
111
+ return {
112
+ type: "compare",
113
+ field,
114
+ operator: "match",
115
+ value: { value },
116
+ mention: true,
117
+ };
118
+ }
119
+ / KeywordExpr
120
+
121
+ KeywordExpr
122
+ = negative:"-"? value:string {
123
+ return {
124
+ type: "keyword",
125
+ negative: Boolean(negative),
126
+ value,
127
+ exact: true,
128
+ };
129
+ }
130
+ / negative:"-"? value:keyword {
131
+ return { type: "keyword", negative: Boolean(negative), value };
132
+ }
133
+
134
+ keyword = [^-+,'" \r\n\t()] [^ \r\n\t)]* { return text(); }
135
+
136
+ field = $ident|1.., "."|
137
+
138
+ range
139
+ = minimum:(value / "*") ".." maximum:(value / "*") {
140
+ return {
141
+ type: "range",
142
+ minimum: minimum === "*" ? undefined : minimum,
143
+ maximum: maximum === "*" ? undefined : maximum,
144
+ };
145
+ }
146
+ / minimumBoundary:[\[(]
147
+ _
148
+ minimum:value?
149
+ _
150
+ ","
151
+ _
152
+ maximum:value?
153
+ _
154
+ maximumBoundary:[)\]] {
155
+ return {
156
+ type: "range",
157
+ minimum,
158
+ maximum,
159
+ minimumExclusive: minimumBoundary === "(",
160
+ maximumExclusive: maximumBoundary === ")",
161
+ };
162
+ }
163
+
164
+ mention = "@" value:ident { return { format: "mention", value }; }
165
+
166
+ value
167
+ = @date
168
+ / value:(ident / literal) { return { type: "literal", value }; }
169
+
170
+ // date-fns yyyy-MM-dd'T'HH:mm:ss.SSSXXX
171
+ // dayjs YYYY-MM-DDTHH:mm:ss.SSSZ
172
+ date
173
+ = ([1-9] [0-9]|3| "-" [0-9]|1..2| "-" [0-9]|1..2|) // date
174
+ time:(
175
+ "T"
176
+ ([0-9]|1..2| ":" [0-9]|1..2| ":" [0-9]|1..2|) // time
177
+ ("." [0-9]|1..3|)? // mills
178
+ ("Z" / "+" [0-9]|1..2| ":" [0-9]|1..2|)? // zone
179
+ )? { return { format: time ? "date-time" : "date", value: text() }; }
180
+
181
+ ident = ([a-zA-Z] [_a-zA-Z0-9]*) { return text(); }
182
+
183
+ literal
184
+ = string
185
+ / float
186
+ / int
187
+ / bool
188
+ / null
189
+
190
+ number = ([0-9]+ ("." [0-9]+)? / "." [0-9]+) { return parseFloat(text()); }
191
+
192
+ string = "\"" v:single_char* "\"" { return v.join(""); }
193
+
194
+ single_char
195
+ = [^"\\\0-\x1F\x7f]
196
+ / escape_char
197
+
198
+ escape_char
199
+ = "\\'" { return "'"; }
200
+ / "\\\"" { return '"'; }
201
+ / "\\\\" { return "\\"; }
202
+ / "\\/" { return "/"; }
203
+ / "\\b" { return "\b"; }
204
+ / "\\f" { return "\f"; }
205
+ / "\\n" { return "\n"; }
206
+ / "\\r" { return "\r"; }
207
+ / "\\t" { return "\t"; }
208
+ / "''" { return "'"; }
209
+ / "\\u" h1:hex_digit h2:hex_digit h3:hex_digit h4:hex_digit {
210
+ return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4));
211
+ }
212
+
213
+ hex_digit = [0-9a-fA-F]
214
+
215
+ bool = ("true" / "false") { return text().toLowerCase() === "true"; }
216
+
217
+ int = [0-9]+ { return parseInt(text()); }
218
+
219
+ float = [0-9]+ "." [0-9]+ { return parseFloat(text()); }
220
+
221
+ null = "null" { return null; }
222
+
223
+ ident_start = [A-Za-z_]
224
+
225
+ KW_OR = "OR" !ident_start
226
+
227
+ KW_AND = "AND" !ident_start
228
+
229
+ KW_NOT = "NOT" !ident_start
230
+
231
+ _ "whitespace" = white* { return ""; }
232
+
233
+ __ "whitespace" = white+ { return " "; }
234
+
235
+ white = [ \t\n\r]
236
+
237
+ EOF = !.
@@ -0,0 +1,71 @@
1
+ export type Exprs = Expr[];
2
+ export type Expr =
3
+ | CommentExpr
4
+ | ParenthesesExpr
5
+ | KeywordCondition
6
+ | LogicalCondition
7
+ | NotCondition
8
+ | CompareCondition;
9
+
10
+ export type CommentExpr = {
11
+ type: 'comment';
12
+ value: string;
13
+ };
14
+
15
+ export type ParenthesesExpr = {
16
+ type: 'parentheses';
17
+ value: Expr[];
18
+ };
19
+
20
+ export type KeywordCondition = {
21
+ type: 'keyword';
22
+ value: string;
23
+ negative?: boolean;
24
+ exact?: boolean;
25
+ };
26
+
27
+ export type LogicalCondition = {
28
+ type: 'logical';
29
+ operator: 'and' | 'or';
30
+ value: Expr[];
31
+ };
32
+
33
+ export type NotCondition = {
34
+ type: 'not';
35
+ value: Expr;
36
+ };
37
+
38
+ export type CompareCondition = {
39
+ type: 'compare';
40
+ field: string;
41
+ /**
42
+ * mention value for eq, ne only
43
+ * range require range value
44
+ */
45
+ operator: 'eq' | 'ne' | 'gt' | 'lt' | 'gte' | 'lte' | 'range' | 'match';
46
+ negative?: boolean;
47
+ mention?: boolean;
48
+ value: Value;
49
+ };
50
+
51
+ export type Value = LiteralValue | RangeValue | MentionValue;
52
+
53
+ export type LiteralValue = {
54
+ type?: 'literal';
55
+ format?: 'date' | 'date-time';
56
+ value: string | number | null;
57
+ };
58
+
59
+ export type MentionValue = {
60
+ type?: 'literal';
61
+ format: 'mention';
62
+ value: string;
63
+ };
64
+
65
+ export type RangeValue = {
66
+ type: 'range';
67
+ minimum: LiteralValue | undefined;
68
+ maximum: LiteralValue | undefined;
69
+ minimumExclusive: boolean;
70
+ maximumExclusive: boolean;
71
+ };