@pranavraut033/ats-checker 1.3.3 → 2.0.0
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.
- package/README.md +88 -50
- package/dist/chunk-JAFFS7YZ.mjs +1219 -0
- package/dist/chunk-JAFFS7YZ.mjs.map +1 -0
- package/dist/{scoring-BCShrnki.d.mts → config-CVmXtmvk.d.mts} +208 -88
- package/dist/{scoring-BCShrnki.d.ts → config-CVmXtmvk.d.ts} +208 -88
- package/dist/index.cjs +1777 -298
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +840 -133
- package/dist/index.mjs.map +1 -1
- package/dist/lang/de/index.cjs +424 -29
- package/dist/lang/de/index.cjs.map +1 -1
- package/dist/lang/de/index.d.mts +1 -1
- package/dist/lang/de/index.d.ts +1 -1
- package/dist/lang/de/index.mjs +424 -29
- package/dist/lang/de/index.mjs.map +1 -1
- package/dist/lang/en/index.cjs +613 -41
- package/dist/lang/en/index.cjs.map +1 -1
- package/dist/lang/en/index.d.mts +1 -1
- package/dist/lang/en/index.d.ts +1 -1
- package/dist/lang/en/index.mjs +1 -1
- package/dist/lang/en/index.mjs.map +1 -1
- package/dist/pdf/index.cjs.map +1 -1
- package/dist/pdf/index.mjs.map +1 -1
- package/package.json +11 -2
- package/dist/chunk-ZJ5E4H7Z.mjs +0 -446
- package/dist/chunk-ZJ5E4H7Z.mjs.map +0 -1
|
@@ -0,0 +1,1219 @@
|
|
|
1
|
+
// src/utils/match.ts
|
|
2
|
+
var SUFFIXES = [
|
|
3
|
+
{ suffix: "ational", replacement: "ate", minStemLength: 3 },
|
|
4
|
+
{ suffix: "ization", replacement: "ize", minStemLength: 3 },
|
|
5
|
+
{ suffix: "ations", replacement: "ate", minStemLength: 3 },
|
|
6
|
+
{ suffix: "ation", replacement: "ate", minStemLength: 3 },
|
|
7
|
+
{ suffix: "ements", replacement: "e", minStemLength: 3 },
|
|
8
|
+
{ suffix: "ement", replacement: "e", minStemLength: 3 },
|
|
9
|
+
{ suffix: "ments", replacement: "ment", minStemLength: 3 },
|
|
10
|
+
{ suffix: "ment", replacement: "", minStemLength: 3 },
|
|
11
|
+
{ suffix: "ies", replacement: "y", minStemLength: 2 },
|
|
12
|
+
{ suffix: "ied", replacement: "y", minStemLength: 2 },
|
|
13
|
+
{ suffix: "ying", replacement: "y", minStemLength: 2 },
|
|
14
|
+
{ suffix: "tion", replacement: "t", minStemLength: 3 },
|
|
15
|
+
{ suffix: "sion", replacement: "s", minStemLength: 3 },
|
|
16
|
+
{ suffix: "ness", replacement: "", minStemLength: 3 },
|
|
17
|
+
{ suffix: "fully", replacement: "ful", minStemLength: 3 },
|
|
18
|
+
{ suffix: "ally", replacement: "al", minStemLength: 3 },
|
|
19
|
+
{ suffix: "ing", replacement: "", minStemLength: 3 },
|
|
20
|
+
{ suffix: "edly", replacement: "", minStemLength: 3 },
|
|
21
|
+
{ suffix: "ed", replacement: "", minStemLength: 3 },
|
|
22
|
+
{ suffix: "ly", replacement: "", minStemLength: 3 },
|
|
23
|
+
{ suffix: "er", replacement: "", minStemLength: 3 },
|
|
24
|
+
{ suffix: "es", replacement: "", minStemLength: 3 },
|
|
25
|
+
{ suffix: "s", replacement: "", minStemLength: 3 }
|
|
26
|
+
];
|
|
27
|
+
function stripOneSuffix(lower) {
|
|
28
|
+
for (const { suffix, replacement, minStemLength } of SUFFIXES) {
|
|
29
|
+
if (lower.endsWith(suffix) && lower.length - suffix.length >= minStemLength) {
|
|
30
|
+
let stemmed = lower.slice(0, lower.length - suffix.length) + replacement;
|
|
31
|
+
if (replacement === "" && stemmed.length >= 3 && stemmed[stemmed.length - 1] === stemmed[stemmed.length - 2] && !/[aeiou]/.test(stemmed[stemmed.length - 1])) {
|
|
32
|
+
stemmed = stemmed.slice(0, -1);
|
|
33
|
+
}
|
|
34
|
+
return stemmed;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lower;
|
|
38
|
+
}
|
|
39
|
+
function stem(token) {
|
|
40
|
+
let word = token.trim().toLowerCase();
|
|
41
|
+
for (let pass = 0; pass < 2 && word.length > 3; pass++) {
|
|
42
|
+
const next = stripOneSuffix(word);
|
|
43
|
+
if (next === word) {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
word = next;
|
|
47
|
+
}
|
|
48
|
+
return word;
|
|
49
|
+
}
|
|
50
|
+
function levenshteinDistance(a, b, maxDistance) {
|
|
51
|
+
const s = a.toLowerCase();
|
|
52
|
+
const t = b.toLowerCase();
|
|
53
|
+
if (s === t) return 0;
|
|
54
|
+
const lenDiff = Math.abs(s.length - t.length);
|
|
55
|
+
if (lenDiff > maxDistance) return maxDistance + 1;
|
|
56
|
+
let prevRow = new Array(t.length + 1);
|
|
57
|
+
for (let j = 0; j <= t.length; j++) prevRow[j] = j;
|
|
58
|
+
for (let i = 1; i <= s.length; i++) {
|
|
59
|
+
const currRow = new Array(t.length + 1);
|
|
60
|
+
currRow[0] = i;
|
|
61
|
+
let rowMin = currRow[0];
|
|
62
|
+
for (let j = 1; j <= t.length; j++) {
|
|
63
|
+
const cost = s[i - 1] === t[j - 1] ? 0 : 1;
|
|
64
|
+
currRow[j] = Math.min(
|
|
65
|
+
prevRow[j] + 1,
|
|
66
|
+
// deletion
|
|
67
|
+
currRow[j - 1] + 1,
|
|
68
|
+
// insertion
|
|
69
|
+
prevRow[j - 1] + cost
|
|
70
|
+
// substitution
|
|
71
|
+
);
|
|
72
|
+
if (currRow[j] < rowMin) rowMin = currRow[j];
|
|
73
|
+
}
|
|
74
|
+
if (rowMin > maxDistance) {
|
|
75
|
+
return maxDistance + 1;
|
|
76
|
+
}
|
|
77
|
+
prevRow = currRow;
|
|
78
|
+
}
|
|
79
|
+
return prevRow[t.length];
|
|
80
|
+
}
|
|
81
|
+
function fuzzyEqual(a, b, opts) {
|
|
82
|
+
const x = a.trim().toLowerCase();
|
|
83
|
+
const y = b.trim().toLowerCase();
|
|
84
|
+
if (x === y) return true;
|
|
85
|
+
if (!x || !y) return false;
|
|
86
|
+
const longer = Math.max(x.length, y.length);
|
|
87
|
+
const defaultMax = longer <= 6 ? 1 : 2;
|
|
88
|
+
const maxDistance = opts?.maxDistance ?? defaultMax;
|
|
89
|
+
return levenshteinDistance(x, y, maxDistance) <= maxDistance;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/utils/text.ts
|
|
93
|
+
var STOP_WORDS = /* @__PURE__ */ new Set([
|
|
94
|
+
// articles / prepositions / conjunctions
|
|
95
|
+
"the",
|
|
96
|
+
"and",
|
|
97
|
+
"or",
|
|
98
|
+
"a",
|
|
99
|
+
"an",
|
|
100
|
+
"of",
|
|
101
|
+
"for",
|
|
102
|
+
"to",
|
|
103
|
+
"with",
|
|
104
|
+
"in",
|
|
105
|
+
"on",
|
|
106
|
+
"at",
|
|
107
|
+
"by",
|
|
108
|
+
"from",
|
|
109
|
+
"as",
|
|
110
|
+
"into",
|
|
111
|
+
"onto",
|
|
112
|
+
"upon",
|
|
113
|
+
"via",
|
|
114
|
+
"per",
|
|
115
|
+
"plus",
|
|
116
|
+
// verbs / modals
|
|
117
|
+
"is",
|
|
118
|
+
"are",
|
|
119
|
+
"be",
|
|
120
|
+
"was",
|
|
121
|
+
"were",
|
|
122
|
+
"will",
|
|
123
|
+
"can",
|
|
124
|
+
"should",
|
|
125
|
+
"must",
|
|
126
|
+
"have",
|
|
127
|
+
"has",
|
|
128
|
+
"had",
|
|
129
|
+
"do",
|
|
130
|
+
"does",
|
|
131
|
+
"did",
|
|
132
|
+
"get",
|
|
133
|
+
"give",
|
|
134
|
+
"go",
|
|
135
|
+
"use",
|
|
136
|
+
"see",
|
|
137
|
+
"help",
|
|
138
|
+
"work",
|
|
139
|
+
"build",
|
|
140
|
+
"show",
|
|
141
|
+
"need",
|
|
142
|
+
"want",
|
|
143
|
+
"make",
|
|
144
|
+
"let",
|
|
145
|
+
// pronouns / determiners
|
|
146
|
+
"it",
|
|
147
|
+
"its",
|
|
148
|
+
"this",
|
|
149
|
+
"that",
|
|
150
|
+
"these",
|
|
151
|
+
"those",
|
|
152
|
+
"we",
|
|
153
|
+
"our",
|
|
154
|
+
"you",
|
|
155
|
+
"your",
|
|
156
|
+
"they",
|
|
157
|
+
"their",
|
|
158
|
+
"us",
|
|
159
|
+
"who",
|
|
160
|
+
"what",
|
|
161
|
+
"which",
|
|
162
|
+
"how",
|
|
163
|
+
// common English fillers that leak into JDs
|
|
164
|
+
"no",
|
|
165
|
+
"not",
|
|
166
|
+
"all",
|
|
167
|
+
"any",
|
|
168
|
+
"also",
|
|
169
|
+
"more",
|
|
170
|
+
"well",
|
|
171
|
+
"very",
|
|
172
|
+
"highly",
|
|
173
|
+
"across",
|
|
174
|
+
"over",
|
|
175
|
+
"under",
|
|
176
|
+
"within",
|
|
177
|
+
"about",
|
|
178
|
+
"out",
|
|
179
|
+
"up",
|
|
180
|
+
"down",
|
|
181
|
+
"new",
|
|
182
|
+
"if",
|
|
183
|
+
"so",
|
|
184
|
+
"such",
|
|
185
|
+
"both",
|
|
186
|
+
"each",
|
|
187
|
+
"one",
|
|
188
|
+
"many",
|
|
189
|
+
"only",
|
|
190
|
+
// JD/HR boilerplate — never skills
|
|
191
|
+
"years",
|
|
192
|
+
"year",
|
|
193
|
+
"experience",
|
|
194
|
+
"required",
|
|
195
|
+
"requirement",
|
|
196
|
+
"requirements",
|
|
197
|
+
"preferred",
|
|
198
|
+
"role",
|
|
199
|
+
"degree",
|
|
200
|
+
"practices",
|
|
201
|
+
"best",
|
|
202
|
+
"skills",
|
|
203
|
+
"team",
|
|
204
|
+
"field",
|
|
205
|
+
"related",
|
|
206
|
+
"relevant",
|
|
207
|
+
"desired",
|
|
208
|
+
"strong",
|
|
209
|
+
"solid",
|
|
210
|
+
"good",
|
|
211
|
+
"first",
|
|
212
|
+
"based",
|
|
213
|
+
"day",
|
|
214
|
+
"week",
|
|
215
|
+
"month",
|
|
216
|
+
"time",
|
|
217
|
+
"fast",
|
|
218
|
+
"open",
|
|
219
|
+
"dynamic"
|
|
220
|
+
]);
|
|
221
|
+
var ROLE_NOUNS = [
|
|
222
|
+
"engineer",
|
|
223
|
+
"developer",
|
|
224
|
+
"manager",
|
|
225
|
+
"scientist",
|
|
226
|
+
"analyst",
|
|
227
|
+
"designer",
|
|
228
|
+
"architect",
|
|
229
|
+
"director",
|
|
230
|
+
"consultant",
|
|
231
|
+
"lead",
|
|
232
|
+
"vp",
|
|
233
|
+
"specialist",
|
|
234
|
+
"coordinator",
|
|
235
|
+
"administrator",
|
|
236
|
+
"accountant",
|
|
237
|
+
"recruiter",
|
|
238
|
+
"nurse",
|
|
239
|
+
"teacher",
|
|
240
|
+
"associate",
|
|
241
|
+
"representative",
|
|
242
|
+
"executive",
|
|
243
|
+
"officer",
|
|
244
|
+
"technician",
|
|
245
|
+
"strategist",
|
|
246
|
+
"marketer",
|
|
247
|
+
"writer",
|
|
248
|
+
"editor",
|
|
249
|
+
"product",
|
|
250
|
+
"principal",
|
|
251
|
+
"staff",
|
|
252
|
+
"head"
|
|
253
|
+
];
|
|
254
|
+
function normalizeWhitespace(text) {
|
|
255
|
+
return text.replace(/\r\n?/g, "\n").replace(/\s+/g, " ").trim();
|
|
256
|
+
}
|
|
257
|
+
function normalizeForComparison(text) {
|
|
258
|
+
return normalizeWhitespace(text).normalize("NFKC").toLowerCase();
|
|
259
|
+
}
|
|
260
|
+
function splitLines(text) {
|
|
261
|
+
return text.replace(/\r\n?/g, "\n").split("\n").map((line) => line.trim()).filter(Boolean);
|
|
262
|
+
}
|
|
263
|
+
var TECH_TOKEN_RE = /[a-z0-9][a-z0-9.#+\-/]*[a-z0-9#+]/g;
|
|
264
|
+
function tokenize(text, options) {
|
|
265
|
+
const normalized = normalizeForComparison(text);
|
|
266
|
+
const tokens = (normalized.match(TECH_TOKEN_RE) ?? []).filter(
|
|
267
|
+
(t) => /[a-z]/.test(t) && !STOP_WORDS.has(t)
|
|
268
|
+
);
|
|
269
|
+
if (!options?.stem) {
|
|
270
|
+
return tokens;
|
|
271
|
+
}
|
|
272
|
+
return tokens.map((t) => stem(t));
|
|
273
|
+
}
|
|
274
|
+
function escapeRegExp(input) {
|
|
275
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
276
|
+
}
|
|
277
|
+
function unique(values) {
|
|
278
|
+
const seen = /* @__PURE__ */ new Set();
|
|
279
|
+
const output = [];
|
|
280
|
+
for (const value of values) {
|
|
281
|
+
const lower = value.toLowerCase();
|
|
282
|
+
if (!seen.has(lower)) {
|
|
283
|
+
seen.add(lower);
|
|
284
|
+
output.push(value);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return output;
|
|
288
|
+
}
|
|
289
|
+
function clamp(value, min, max) {
|
|
290
|
+
return Math.min(Math.max(value, min), max);
|
|
291
|
+
}
|
|
292
|
+
function countFrequencies(values) {
|
|
293
|
+
const counts = {};
|
|
294
|
+
for (const value of values) {
|
|
295
|
+
counts[value] = (counts[value] ?? 0) + 1;
|
|
296
|
+
}
|
|
297
|
+
return counts;
|
|
298
|
+
}
|
|
299
|
+
function containsTableLikeStructure(text) {
|
|
300
|
+
const lines = splitLines(text);
|
|
301
|
+
let tableLines = 0;
|
|
302
|
+
for (const line of lines) {
|
|
303
|
+
const hasPipeColumns = line.includes("|") && line.split("|").length >= 3;
|
|
304
|
+
const hasTabColumns = /\t.+\t/.test(line);
|
|
305
|
+
const hasAlignedSpaces = /( {3,})(\S+)( {3,}\S+)/.test(line);
|
|
306
|
+
if (hasPipeColumns || hasTabColumns || hasAlignedSpaces) {
|
|
307
|
+
tableLines += 1;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return tableLines >= 2;
|
|
311
|
+
}
|
|
312
|
+
var STANDARD_BULLET_RE = /^\s*(?:[-*•o‣▪]|\(?[a-z0-9]+[.)])\s+/i;
|
|
313
|
+
var NON_STANDARD_BULLET_RE = /^\s*[➤➢✓✔✗➔❖◆♦❯›»★☆♥❤]/;
|
|
314
|
+
var SPECIAL_CHAR_RE = /[-�]|[\x00-\x08\x0B\x0C\x0E-\x1F]/;
|
|
315
|
+
function detectFormatting(raw) {
|
|
316
|
+
const lines = splitLines(raw);
|
|
317
|
+
const hasTables = containsTableLikeStructure(raw);
|
|
318
|
+
let wideGapLines = 0;
|
|
319
|
+
for (const line of lines) {
|
|
320
|
+
if (/\S( {6,})\S/.test(line)) {
|
|
321
|
+
wideGapLines += 1;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
const hasMultiColumn = wideGapLines >= 2;
|
|
325
|
+
const hasSpecialChars = SPECIAL_CHAR_RE.test(raw);
|
|
326
|
+
let bulletLines = 0;
|
|
327
|
+
let nonStandardBulletLines = 0;
|
|
328
|
+
for (const line of lines) {
|
|
329
|
+
if (NON_STANDARD_BULLET_RE.test(line)) {
|
|
330
|
+
bulletLines += 1;
|
|
331
|
+
nonStandardBulletLines += 1;
|
|
332
|
+
} else if (STANDARD_BULLET_RE.test(line)) {
|
|
333
|
+
bulletLines += 1;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const nonStandardBullets = nonStandardBulletLines > 0 && nonStandardBulletLines >= bulletLines / 2;
|
|
337
|
+
const trimmed = raw.trim();
|
|
338
|
+
const letterCount = (trimmed.match(/[a-zA-Z]/g) ?? []).length;
|
|
339
|
+
const likelyScanned = trimmed.length > 0 && (letterCount < 20 || letterCount / trimmed.length < 0.2);
|
|
340
|
+
const contactParseable = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/.test(raw);
|
|
341
|
+
return {
|
|
342
|
+
hasTables,
|
|
343
|
+
hasMultiColumn,
|
|
344
|
+
hasSpecialChars,
|
|
345
|
+
nonStandardBullets,
|
|
346
|
+
likelyScanned,
|
|
347
|
+
contactParseable
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// src/utils/skills.ts
|
|
352
|
+
var aliasIndexCache = /* @__PURE__ */ new WeakMap();
|
|
353
|
+
var stemIndexCache = /* @__PURE__ */ new WeakMap();
|
|
354
|
+
function getAliasIndex(aliases) {
|
|
355
|
+
let index = aliasIndexCache.get(aliases);
|
|
356
|
+
if (!index) {
|
|
357
|
+
index = /* @__PURE__ */ new Map();
|
|
358
|
+
for (const [canonical, aliasList] of Object.entries(aliases)) {
|
|
359
|
+
const lower = canonical.toLowerCase();
|
|
360
|
+
index.set(lower, lower);
|
|
361
|
+
for (const alias of aliasList) {
|
|
362
|
+
index.set(alias.toLowerCase(), lower);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
aliasIndexCache.set(aliases, index);
|
|
366
|
+
}
|
|
367
|
+
return index;
|
|
368
|
+
}
|
|
369
|
+
function getStemIndex(aliases) {
|
|
370
|
+
let index = stemIndexCache.get(aliases);
|
|
371
|
+
if (!index) {
|
|
372
|
+
index = /* @__PURE__ */ new Map();
|
|
373
|
+
for (const [key, canonical] of getAliasIndex(aliases)) {
|
|
374
|
+
const stemmed = stem(key);
|
|
375
|
+
if (!index.has(stemmed)) {
|
|
376
|
+
index.set(stemmed, canonical);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
stemIndexCache.set(aliases, index);
|
|
380
|
+
}
|
|
381
|
+
return index;
|
|
382
|
+
}
|
|
383
|
+
function normalizeSkill(skill, aliases, options) {
|
|
384
|
+
const normalized = skill.trim().toLowerCase();
|
|
385
|
+
const exact = getAliasIndex(aliases).get(normalized);
|
|
386
|
+
if (exact) {
|
|
387
|
+
return exact;
|
|
388
|
+
}
|
|
389
|
+
if (!options?.fuzzy) {
|
|
390
|
+
return normalized;
|
|
391
|
+
}
|
|
392
|
+
const stemmed = stem(normalized);
|
|
393
|
+
const stemIndex = getStemIndex(aliases);
|
|
394
|
+
const stemHit = stemIndex.get(stemmed);
|
|
395
|
+
if (stemHit) {
|
|
396
|
+
return stemHit;
|
|
397
|
+
}
|
|
398
|
+
for (const [key, canonical] of stemIndex) {
|
|
399
|
+
if (fuzzyEqual(stemmed, key, { maxDistance: options.maxDistance })) {
|
|
400
|
+
return canonical;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return normalized;
|
|
404
|
+
}
|
|
405
|
+
function normalizeSkills(skills, aliases, options) {
|
|
406
|
+
return unique(skills.map((skill) => normalizeSkill(skill, aliases, options)));
|
|
407
|
+
}
|
|
408
|
+
function deriveSkillAliases(registry) {
|
|
409
|
+
const aliases = {};
|
|
410
|
+
for (const entry of registry) {
|
|
411
|
+
aliases[entry.canonical] = entry.aliases;
|
|
412
|
+
}
|
|
413
|
+
return aliases;
|
|
414
|
+
}
|
|
415
|
+
function buildCategoryIndex(registry) {
|
|
416
|
+
const index = /* @__PURE__ */ new Map();
|
|
417
|
+
for (const entry of registry) {
|
|
418
|
+
index.set(entry.canonical.toLowerCase(), entry.category);
|
|
419
|
+
}
|
|
420
|
+
return index;
|
|
421
|
+
}
|
|
422
|
+
function mergeKeywordRegistries(base, overrides) {
|
|
423
|
+
const byCanonical = /* @__PURE__ */ new Map();
|
|
424
|
+
for (const entry of base)
|
|
425
|
+
byCanonical.set(entry.canonical.toLowerCase(), entry);
|
|
426
|
+
for (const entry of overrides)
|
|
427
|
+
byCanonical.set(entry.canonical.toLowerCase(), entry);
|
|
428
|
+
return [...byCanonical.values()];
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// src/profiles/index.ts
|
|
432
|
+
var defaultKeywordRegistry = [
|
|
433
|
+
// languages / frameworks
|
|
434
|
+
// ponytail: "node" split from javascript — Node.js runtime !== JS language
|
|
435
|
+
{
|
|
436
|
+
canonical: "javascript",
|
|
437
|
+
aliases: ["js", "ecmascript", "es6"],
|
|
438
|
+
category: "technical"
|
|
439
|
+
},
|
|
440
|
+
{ canonical: "node", aliases: ["node.js", "nodejs"], category: "technical" },
|
|
441
|
+
{ canonical: "typescript", aliases: ["ts"], category: "technical" },
|
|
442
|
+
{
|
|
443
|
+
canonical: "react",
|
|
444
|
+
aliases: ["reactjs", "react.js"],
|
|
445
|
+
category: "technical"
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
canonical: "angular",
|
|
449
|
+
aliases: ["angularjs", "angular2+"],
|
|
450
|
+
category: "technical"
|
|
451
|
+
},
|
|
452
|
+
{ canonical: "vue", aliases: ["vue.js", "vuejs"], category: "technical" },
|
|
453
|
+
{ canonical: "svelte", aliases: ["sveltekit"], category: "technical" },
|
|
454
|
+
{ canonical: "next.js", aliases: ["nextjs"], category: "technical" },
|
|
455
|
+
{ canonical: "nuxt.js", aliases: ["nuxtjs", "nuxt"], category: "technical" },
|
|
456
|
+
{ canonical: "remix", aliases: [], category: "technical" },
|
|
457
|
+
{ canonical: "c++", aliases: ["cpp"], category: "technical" },
|
|
458
|
+
{ canonical: "c#", aliases: ["csharp", ".net"], category: "technical" },
|
|
459
|
+
{ canonical: "java", aliases: [], category: "technical" },
|
|
460
|
+
{ canonical: "python", aliases: ["py"], category: "technical" },
|
|
461
|
+
{ canonical: "go", aliases: ["golang"], category: "technical" },
|
|
462
|
+
{ canonical: "rust", aliases: [], category: "technical" },
|
|
463
|
+
{
|
|
464
|
+
canonical: "ruby",
|
|
465
|
+
aliases: ["ruby on rails", "rails"],
|
|
466
|
+
category: "technical"
|
|
467
|
+
},
|
|
468
|
+
{ canonical: "php", aliases: [], category: "technical" },
|
|
469
|
+
{ canonical: "swift", aliases: ["swiftui"], category: "technical" },
|
|
470
|
+
{ canonical: "kotlin", aliases: [], category: "technical" },
|
|
471
|
+
{ canonical: "scala", aliases: [], category: "technical" },
|
|
472
|
+
{ canonical: "perl", aliases: [], category: "technical" },
|
|
473
|
+
{
|
|
474
|
+
canonical: "r",
|
|
475
|
+
aliases: ["r language", "r programming"],
|
|
476
|
+
category: "technical"
|
|
477
|
+
},
|
|
478
|
+
{ canonical: "matlab", aliases: [], category: "technical" },
|
|
479
|
+
{
|
|
480
|
+
canonical: "objective-c",
|
|
481
|
+
aliases: ["objective c", "objc"],
|
|
482
|
+
category: "technical"
|
|
483
|
+
},
|
|
484
|
+
{ canonical: "dart", aliases: [], category: "technical" },
|
|
485
|
+
{ canonical: "elixir", aliases: [], category: "technical" },
|
|
486
|
+
{ canonical: "haskell", aliases: [], category: "technical" },
|
|
487
|
+
{ canonical: "html", aliases: ["html5"], category: "technical" },
|
|
488
|
+
{ canonical: "css", aliases: ["css3"], category: "technical" },
|
|
489
|
+
{ canonical: "sass", aliases: ["scss"], category: "technical" },
|
|
490
|
+
{ canonical: "less", aliases: [], category: "technical" },
|
|
491
|
+
{
|
|
492
|
+
canonical: "tailwind css",
|
|
493
|
+
aliases: ["tailwind", "tailwindcss"],
|
|
494
|
+
category: "technical"
|
|
495
|
+
},
|
|
496
|
+
{ canonical: "bootstrap", aliases: [], category: "technical" },
|
|
497
|
+
{ canonical: "webassembly", aliases: ["wasm"], category: "technical" },
|
|
498
|
+
{ canonical: "ios development", aliases: ["ios"], category: "technical" },
|
|
499
|
+
{
|
|
500
|
+
canonical: "android development",
|
|
501
|
+
aliases: ["android"],
|
|
502
|
+
category: "technical"
|
|
503
|
+
},
|
|
504
|
+
{ canonical: "react native", aliases: [], category: "technical" },
|
|
505
|
+
{ canonical: "flutter", aliases: [], category: "technical" },
|
|
506
|
+
{ canonical: "xamarin", aliases: [], category: "technical" },
|
|
507
|
+
{ canonical: "machine learning", aliases: ["ml"], category: "technical" },
|
|
508
|
+
{ canonical: "deep learning", aliases: ["dl"], category: "technical" },
|
|
509
|
+
{
|
|
510
|
+
canonical: "natural language processing",
|
|
511
|
+
aliases: ["nlp"],
|
|
512
|
+
category: "technical"
|
|
513
|
+
},
|
|
514
|
+
{ canonical: "computer vision", aliases: ["cv"], category: "technical" },
|
|
515
|
+
{
|
|
516
|
+
canonical: "large language models",
|
|
517
|
+
aliases: ["llm", "llms"],
|
|
518
|
+
category: "technical"
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
canonical: "generative ai",
|
|
522
|
+
aliases: ["genai", "gen ai"],
|
|
523
|
+
category: "technical"
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
canonical: "reinforcement learning",
|
|
527
|
+
aliases: ["rl"],
|
|
528
|
+
category: "technical"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
canonical: "neural networks",
|
|
532
|
+
aliases: ["neural network"],
|
|
533
|
+
category: "technical"
|
|
534
|
+
},
|
|
535
|
+
{ canonical: "data engineering", aliases: [], category: "technical" },
|
|
536
|
+
{
|
|
537
|
+
canonical: "data warehousing",
|
|
538
|
+
aliases: ["data warehouse"],
|
|
539
|
+
category: "technical"
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
canonical: "etl",
|
|
543
|
+
aliases: ["extract transform load", "elt"],
|
|
544
|
+
category: "technical"
|
|
545
|
+
},
|
|
546
|
+
{ canonical: "distributed systems", aliases: [], category: "technical" },
|
|
547
|
+
{ canonical: "embedded systems", aliases: [], category: "technical" },
|
|
548
|
+
{
|
|
549
|
+
canonical: "firmware development",
|
|
550
|
+
aliases: ["firmware"],
|
|
551
|
+
category: "technical"
|
|
552
|
+
},
|
|
553
|
+
{ canonical: "game development", aliases: [], category: "technical" },
|
|
554
|
+
{ canonical: "unity", aliases: [], category: "technical" },
|
|
555
|
+
{ canonical: "unreal engine", aliases: ["unreal"], category: "technical" },
|
|
556
|
+
{ canonical: "web development", aliases: [], category: "technical" },
|
|
557
|
+
{
|
|
558
|
+
canonical: "full stack development",
|
|
559
|
+
aliases: ["full-stack development", "full stack"],
|
|
560
|
+
category: "technical"
|
|
561
|
+
},
|
|
562
|
+
{ canonical: "api development", aliases: [], category: "technical" },
|
|
563
|
+
{ canonical: "grpc", aliases: [], category: "technical" },
|
|
564
|
+
{ canonical: "websockets", aliases: ["websocket"], category: "technical" },
|
|
565
|
+
{ canonical: "linux", aliases: [], category: "technical" },
|
|
566
|
+
{ canonical: "unix", aliases: [], category: "technical" },
|
|
567
|
+
{
|
|
568
|
+
canonical: "bash scripting",
|
|
569
|
+
aliases: ["bash", "shell scripting"],
|
|
570
|
+
category: "technical"
|
|
571
|
+
},
|
|
572
|
+
{ canonical: "powershell", aliases: [], category: "technical" },
|
|
573
|
+
// tools / platforms / infra
|
|
574
|
+
{
|
|
575
|
+
canonical: "sql",
|
|
576
|
+
aliases: ["structured query language"],
|
|
577
|
+
category: "tool"
|
|
578
|
+
},
|
|
579
|
+
{ canonical: "postgresql", aliases: ["postgres", "psql"], category: "tool" },
|
|
580
|
+
{ canonical: "mysql", aliases: [], category: "tool" },
|
|
581
|
+
{ canonical: "sqlite", aliases: [], category: "tool" },
|
|
582
|
+
{
|
|
583
|
+
canonical: "microsoft sql server",
|
|
584
|
+
aliases: ["mssql", "sql server", "t-sql"],
|
|
585
|
+
category: "tool"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
canonical: "oracle database",
|
|
589
|
+
aliases: ["oracle db", "oracle"],
|
|
590
|
+
category: "tool"
|
|
591
|
+
},
|
|
592
|
+
{ canonical: "mongodb", aliases: ["mongo"], category: "tool" },
|
|
593
|
+
{ canonical: "cassandra", aliases: ["apache cassandra"], category: "tool" },
|
|
594
|
+
{ canonical: "dynamodb", aliases: ["amazon dynamodb"], category: "tool" },
|
|
595
|
+
{ canonical: "couchbase", aliases: [], category: "tool" },
|
|
596
|
+
{ canonical: "neo4j", aliases: [], category: "tool" },
|
|
597
|
+
{ canonical: "firebase", aliases: [], category: "tool" },
|
|
598
|
+
{ canonical: "supabase", aliases: [], category: "tool" },
|
|
599
|
+
{ canonical: "graphql", aliases: ["gql"], category: "tool" },
|
|
600
|
+
{ canonical: "aws", aliases: ["amazon web services"], category: "tool" },
|
|
601
|
+
{ canonical: "amazon ec2", aliases: ["ec2"], category: "tool" },
|
|
602
|
+
{ canonical: "amazon s3", aliases: ["s3"], category: "tool" },
|
|
603
|
+
{ canonical: "amazon rds", aliases: ["rds"], category: "tool" },
|
|
604
|
+
{ canonical: "aws lambda", aliases: ["lambda"], category: "tool" },
|
|
605
|
+
{ canonical: "amazon cloudfront", aliases: ["cloudfront"], category: "tool" },
|
|
606
|
+
{ canonical: "amazon sqs", aliases: ["sqs"], category: "tool" },
|
|
607
|
+
{ canonical: "amazon sns", aliases: ["sns"], category: "tool" },
|
|
608
|
+
{ canonical: "azure", aliases: ["microsoft azure"], category: "tool" },
|
|
609
|
+
{ canonical: "azure devops", aliases: [], category: "tool" },
|
|
610
|
+
{ canonical: "azure functions", aliases: [], category: "tool" },
|
|
611
|
+
{
|
|
612
|
+
canonical: "google cloud platform",
|
|
613
|
+
aliases: ["gcp", "google cloud"],
|
|
614
|
+
category: "tool"
|
|
615
|
+
},
|
|
616
|
+
{ canonical: "google bigquery", aliases: ["bigquery"], category: "tool" },
|
|
617
|
+
{ canonical: "google kubernetes engine", aliases: ["gke"], category: "tool" },
|
|
618
|
+
{
|
|
619
|
+
canonical: "docker",
|
|
620
|
+
aliases: ["containers", "containerization"],
|
|
621
|
+
category: "tool"
|
|
622
|
+
},
|
|
623
|
+
{ canonical: "kubernetes", aliases: ["k8s"], category: "tool" },
|
|
624
|
+
{ canonical: "helm", aliases: [], category: "tool" },
|
|
625
|
+
{ canonical: "terraform", aliases: [], category: "tool" },
|
|
626
|
+
{ canonical: "pulumi", aliases: [], category: "tool" },
|
|
627
|
+
{ canonical: "ansible", aliases: [], category: "tool" },
|
|
628
|
+
{ canonical: "puppet", aliases: [], category: "tool" },
|
|
629
|
+
{ canonical: "chef", aliases: [], category: "tool" },
|
|
630
|
+
{ canonical: "jenkins", aliases: [], category: "tool" },
|
|
631
|
+
{ canonical: "circleci", aliases: ["circle ci"], category: "tool" },
|
|
632
|
+
{ canonical: "github actions", aliases: [], category: "tool" },
|
|
633
|
+
{ canonical: "gitlab ci", aliases: ["gitlab ci/cd"], category: "tool" },
|
|
634
|
+
{ canonical: "travis ci", aliases: [], category: "tool" },
|
|
635
|
+
{
|
|
636
|
+
canonical: "git",
|
|
637
|
+
aliases: ["github", "gitlab", "bitbucket"],
|
|
638
|
+
category: "tool"
|
|
639
|
+
},
|
|
640
|
+
{ canonical: "jira", aliases: [], category: "tool" },
|
|
641
|
+
{ canonical: "confluence", aliases: [], category: "tool" },
|
|
642
|
+
{ canonical: "trello", aliases: [], category: "tool" },
|
|
643
|
+
{ canonical: "asana", aliases: [], category: "tool" },
|
|
644
|
+
{ canonical: "monday.com", aliases: ["monday"], category: "tool" },
|
|
645
|
+
{ canonical: "notion", aliases: [], category: "tool" },
|
|
646
|
+
{ canonical: "linear", aliases: [], category: "tool" },
|
|
647
|
+
{ canonical: "slack", aliases: [], category: "tool" },
|
|
648
|
+
{ canonical: "microsoft teams", aliases: ["ms teams"], category: "tool" },
|
|
649
|
+
{ canonical: "pytorch", aliases: ["torch"], category: "tool" },
|
|
650
|
+
{ canonical: "tensorflow", aliases: ["tf"], category: "tool" },
|
|
651
|
+
{ canonical: "keras", aliases: [], category: "tool" },
|
|
652
|
+
{ canonical: "scikit-learn", aliases: ["sklearn"], category: "tool" },
|
|
653
|
+
{ canonical: "pandas", aliases: [], category: "tool" },
|
|
654
|
+
{ canonical: "numpy", aliases: [], category: "tool" },
|
|
655
|
+
{
|
|
656
|
+
canonical: "hugging face",
|
|
657
|
+
aliases: ["huggingface", "transformers"],
|
|
658
|
+
category: "tool"
|
|
659
|
+
},
|
|
660
|
+
{ canonical: "langchain", aliases: [], category: "tool" },
|
|
661
|
+
{ canonical: "openai api", aliases: ["openai", "gpt api"], category: "tool" },
|
|
662
|
+
{ canonical: "jupyter", aliases: ["jupyter notebook"], category: "tool" },
|
|
663
|
+
{ canonical: "fastapi", aliases: [], category: "tool" },
|
|
664
|
+
{ canonical: "flask", aliases: [], category: "tool" },
|
|
665
|
+
{ canonical: "django", aliases: [], category: "tool" },
|
|
666
|
+
{
|
|
667
|
+
canonical: "express.js",
|
|
668
|
+
aliases: ["express", "expressjs"],
|
|
669
|
+
category: "tool"
|
|
670
|
+
},
|
|
671
|
+
{ canonical: "spring boot", aliases: ["spring"], category: "tool" },
|
|
672
|
+
{ canonical: "laravel", aliases: [], category: "tool" },
|
|
673
|
+
{ canonical: "kafka", aliases: ["apache kafka"], category: "tool" },
|
|
674
|
+
{ canonical: "rabbitmq", aliases: [], category: "tool" },
|
|
675
|
+
{ canonical: "redis", aliases: [], category: "tool" },
|
|
676
|
+
{ canonical: "memcached", aliases: [], category: "tool" },
|
|
677
|
+
{ canonical: "elasticsearch", aliases: ["elastic"], category: "tool" },
|
|
678
|
+
{ canonical: "logstash", aliases: [], category: "tool" },
|
|
679
|
+
{ canonical: "kibana", aliases: [], category: "tool" },
|
|
680
|
+
{ canonical: "grafana", aliases: [], category: "tool" },
|
|
681
|
+
{ canonical: "prometheus", aliases: [], category: "tool" },
|
|
682
|
+
{ canonical: "datadog", aliases: [], category: "tool" },
|
|
683
|
+
{ canonical: "new relic", aliases: [], category: "tool" },
|
|
684
|
+
{ canonical: "splunk", aliases: [], category: "tool" },
|
|
685
|
+
{
|
|
686
|
+
canonical: "spark",
|
|
687
|
+
aliases: ["apache spark", "pyspark"],
|
|
688
|
+
category: "tool"
|
|
689
|
+
},
|
|
690
|
+
{ canonical: "hadoop", aliases: ["apache hadoop"], category: "tool" },
|
|
691
|
+
{ canonical: "airflow", aliases: ["apache airflow"], category: "tool" },
|
|
692
|
+
{ canonical: "dbt", aliases: ["data build tool"], category: "tool" },
|
|
693
|
+
{ canonical: "snowflake", aliases: [], category: "tool" },
|
|
694
|
+
{ canonical: "databricks", aliases: [], category: "tool" },
|
|
695
|
+
{ canonical: "looker", aliases: [], category: "tool" },
|
|
696
|
+
{ canonical: "tableau", aliases: [], category: "tool" },
|
|
697
|
+
{ canonical: "power bi", aliases: ["powerbi"], category: "tool" },
|
|
698
|
+
{
|
|
699
|
+
canonical: "excel",
|
|
700
|
+
aliases: ["microsoft excel", "ms excel"],
|
|
701
|
+
category: "tool"
|
|
702
|
+
},
|
|
703
|
+
{ canonical: "google sheets", aliases: [], category: "tool" },
|
|
704
|
+
{ canonical: "spss", aliases: [], category: "tool" },
|
|
705
|
+
{ canonical: "sas", aliases: [], category: "tool" },
|
|
706
|
+
{ canonical: "salesforce", aliases: [], category: "tool" },
|
|
707
|
+
{ canonical: "hubspot", aliases: [], category: "tool" },
|
|
708
|
+
{ canonical: "marketo", aliases: [], category: "tool" },
|
|
709
|
+
{ canonical: "mailchimp", aliases: [], category: "tool" },
|
|
710
|
+
{ canonical: "google analytics", aliases: ["ga4"], category: "tool" },
|
|
711
|
+
{ canonical: "google tag manager", aliases: ["gtm"], category: "tool" },
|
|
712
|
+
{ canonical: "sap", aliases: [], category: "tool" },
|
|
713
|
+
{ canonical: "quickbooks", aliases: [], category: "tool" },
|
|
714
|
+
{ canonical: "netsuite", aliases: [], category: "tool" },
|
|
715
|
+
{ canonical: "workday", aliases: [], category: "tool" },
|
|
716
|
+
{ canonical: "zendesk", aliases: [], category: "tool" },
|
|
717
|
+
{ canonical: "servicenow", aliases: [], category: "tool" },
|
|
718
|
+
{ canonical: "freshdesk", aliases: [], category: "tool" },
|
|
719
|
+
{ canonical: "figma", aliases: [], category: "tool" },
|
|
720
|
+
{ canonical: "sketch", aliases: [], category: "tool" },
|
|
721
|
+
{ canonical: "adobe xd", aliases: ["xd"], category: "tool" },
|
|
722
|
+
{ canonical: "invision", aliases: [], category: "tool" },
|
|
723
|
+
{ canonical: "photoshop", aliases: ["adobe photoshop"], category: "tool" },
|
|
724
|
+
{
|
|
725
|
+
canonical: "illustrator",
|
|
726
|
+
aliases: ["adobe illustrator"],
|
|
727
|
+
category: "tool"
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
canonical: "after effects",
|
|
731
|
+
aliases: ["adobe after effects"],
|
|
732
|
+
category: "tool"
|
|
733
|
+
},
|
|
734
|
+
{ canonical: "premiere pro", aliases: ["adobe premiere"], category: "tool" },
|
|
735
|
+
{ canonical: "autocad", aliases: [], category: "tool" },
|
|
736
|
+
{ canonical: "solidworks", aliases: [], category: "tool" },
|
|
737
|
+
{ canonical: "postman", aliases: [], category: "tool" },
|
|
738
|
+
{ canonical: "selenium", aliases: [], category: "tool" },
|
|
739
|
+
{ canonical: "cypress", aliases: [], category: "tool" },
|
|
740
|
+
{ canonical: "playwright", aliases: [], category: "tool" },
|
|
741
|
+
{ canonical: "jest", aliases: [], category: "tool" },
|
|
742
|
+
{ canonical: "mocha", aliases: [], category: "tool" },
|
|
743
|
+
{ canonical: "junit", aliases: [], category: "tool" },
|
|
744
|
+
// engineering concepts
|
|
745
|
+
{ canonical: "accessibility", aliases: ["a11y"], category: "concept" },
|
|
746
|
+
{ canonical: "frontend", aliases: ["front-end"], category: "concept" },
|
|
747
|
+
{ canonical: "backend", aliases: ["back-end"], category: "concept" },
|
|
748
|
+
{
|
|
749
|
+
canonical: "security",
|
|
750
|
+
aliases: ["cybersecurity", "infosec"],
|
|
751
|
+
category: "concept"
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
canonical: "application security",
|
|
755
|
+
aliases: ["appsec"],
|
|
756
|
+
category: "concept"
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
canonical: "penetration testing",
|
|
760
|
+
aliases: ["pentesting", "pen testing"],
|
|
761
|
+
category: "concept"
|
|
762
|
+
},
|
|
763
|
+
{ canonical: "vulnerability assessment", aliases: [], category: "concept" },
|
|
764
|
+
{
|
|
765
|
+
canonical: "identity and access management",
|
|
766
|
+
aliases: ["iam"],
|
|
767
|
+
category: "concept"
|
|
768
|
+
},
|
|
769
|
+
{ canonical: "zero trust", aliases: [], category: "concept" },
|
|
770
|
+
{ canonical: "encryption", aliases: [], category: "concept" },
|
|
771
|
+
{
|
|
772
|
+
canonical: "testing",
|
|
773
|
+
aliases: ["unittest", "pytest"],
|
|
774
|
+
category: "concept"
|
|
775
|
+
},
|
|
776
|
+
{ canonical: "unit testing", aliases: [], category: "concept" },
|
|
777
|
+
{ canonical: "integration testing", aliases: [], category: "concept" },
|
|
778
|
+
{
|
|
779
|
+
canonical: "end-to-end testing",
|
|
780
|
+
aliases: ["e2e testing"],
|
|
781
|
+
category: "concept"
|
|
782
|
+
},
|
|
783
|
+
{ canonical: "regression testing", aliases: [], category: "concept" },
|
|
784
|
+
{ canonical: "microservices", aliases: [], category: "concept" },
|
|
785
|
+
{
|
|
786
|
+
canonical: "monolithic architecture",
|
|
787
|
+
aliases: ["monolith"],
|
|
788
|
+
category: "concept"
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
canonical: "event-driven architecture",
|
|
792
|
+
aliases: ["event driven architecture"],
|
|
793
|
+
category: "concept"
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
canonical: "serverless",
|
|
797
|
+
aliases: ["serverless architecture"],
|
|
798
|
+
category: "concept"
|
|
799
|
+
},
|
|
800
|
+
{ canonical: "agile", aliases: [], category: "concept" },
|
|
801
|
+
{ canonical: "scrum", aliases: [], category: "concept" },
|
|
802
|
+
{ canonical: "kanban", aliases: [], category: "concept" },
|
|
803
|
+
{ canonical: "waterfall", aliases: [], category: "concept" },
|
|
804
|
+
{ canonical: "sprint planning", aliases: [], category: "concept" },
|
|
805
|
+
{ canonical: "blockchain", aliases: [], category: "concept" },
|
|
806
|
+
{ canonical: "smart contracts", aliases: [], category: "concept" },
|
|
807
|
+
{ canonical: "devops", aliases: [], category: "concept" },
|
|
808
|
+
{
|
|
809
|
+
canonical: "site reliability engineering",
|
|
810
|
+
aliases: ["sre"],
|
|
811
|
+
category: "concept"
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
canonical: "infrastructure as code",
|
|
815
|
+
aliases: ["iac"],
|
|
816
|
+
category: "concept"
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
canonical: "ci/cd",
|
|
820
|
+
aliases: [
|
|
821
|
+
"continuous integration",
|
|
822
|
+
"continuous deployment",
|
|
823
|
+
"continuous delivery"
|
|
824
|
+
],
|
|
825
|
+
category: "concept"
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
canonical: "rest api",
|
|
829
|
+
aliases: ["restful api", "rest apis"],
|
|
830
|
+
category: "concept"
|
|
831
|
+
},
|
|
832
|
+
{ canonical: "api design", aliases: [], category: "concept" },
|
|
833
|
+
{ canonical: "design patterns", aliases: [], category: "concept" },
|
|
834
|
+
{ canonical: "data structures", aliases: [], category: "concept" },
|
|
835
|
+
{ canonical: "algorithms", aliases: [], category: "concept" },
|
|
836
|
+
{
|
|
837
|
+
canonical: "object-oriented programming",
|
|
838
|
+
aliases: ["oop", "object oriented programming"],
|
|
839
|
+
category: "concept"
|
|
840
|
+
},
|
|
841
|
+
{ canonical: "functional programming", aliases: [], category: "concept" },
|
|
842
|
+
{ canonical: "cloud computing", aliases: [], category: "concept" },
|
|
843
|
+
{ canonical: "cloud migration", aliases: [], category: "concept" },
|
|
844
|
+
{ canonical: "system design", aliases: [], category: "concept" },
|
|
845
|
+
{ canonical: "high availability", aliases: [], category: "concept" },
|
|
846
|
+
{ canonical: "scalability", aliases: [], category: "concept" },
|
|
847
|
+
{ canonical: "load balancing", aliases: [], category: "concept" },
|
|
848
|
+
{ canonical: "caching", aliases: [], category: "concept" },
|
|
849
|
+
{
|
|
850
|
+
canonical: "tdd",
|
|
851
|
+
aliases: ["test driven development", "test-driven development"],
|
|
852
|
+
category: "concept"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
canonical: "bdd",
|
|
856
|
+
aliases: ["behavior driven development", "behavior-driven development"],
|
|
857
|
+
category: "concept"
|
|
858
|
+
},
|
|
859
|
+
{ canonical: "code review", aliases: ["code reviews"], category: "concept" },
|
|
860
|
+
{ canonical: "pair programming", aliases: [], category: "concept" },
|
|
861
|
+
{ canonical: "ux design", aliases: ["user experience"], category: "concept" },
|
|
862
|
+
{
|
|
863
|
+
canonical: "ui design",
|
|
864
|
+
aliases: ["user interface design"],
|
|
865
|
+
category: "concept"
|
|
866
|
+
},
|
|
867
|
+
{ canonical: "user research", aliases: [], category: "concept" },
|
|
868
|
+
{ canonical: "wireframing", aliases: [], category: "concept" },
|
|
869
|
+
{ canonical: "prototyping", aliases: [], category: "concept" },
|
|
870
|
+
{ canonical: "design systems", aliases: [], category: "concept" },
|
|
871
|
+
{ canonical: "responsive design", aliases: [], category: "concept" },
|
|
872
|
+
{ canonical: "project management", aliases: [], category: "concept" },
|
|
873
|
+
{ canonical: "program management", aliases: [], category: "concept" },
|
|
874
|
+
{ canonical: "change management", aliases: [], category: "concept" },
|
|
875
|
+
{ canonical: "risk management", aliases: [], category: "concept" },
|
|
876
|
+
{ canonical: "quality assurance", aliases: ["qa"], category: "concept" },
|
|
877
|
+
{ canonical: "data privacy", aliases: [], category: "concept" },
|
|
878
|
+
{ canonical: "version control", aliases: [], category: "concept" },
|
|
879
|
+
{
|
|
880
|
+
canonical: "documentation",
|
|
881
|
+
aliases: ["technical documentation"],
|
|
882
|
+
category: "concept"
|
|
883
|
+
},
|
|
884
|
+
{ canonical: "requirements gathering", aliases: [], category: "concept" },
|
|
885
|
+
{
|
|
886
|
+
canonical: "business process improvement",
|
|
887
|
+
aliases: [],
|
|
888
|
+
category: "concept"
|
|
889
|
+
},
|
|
890
|
+
{ canonical: "root cause analysis", aliases: [], category: "concept" },
|
|
891
|
+
{ canonical: "lean", aliases: ["lean methodology"], category: "concept" },
|
|
892
|
+
{ canonical: "six sigma", aliases: [], category: "concept" },
|
|
893
|
+
// product / data domain
|
|
894
|
+
{ canonical: "roadmap", aliases: ["product roadmap"], category: "domain" },
|
|
895
|
+
{ canonical: "stakeholder management", aliases: [], category: "domain" },
|
|
896
|
+
{ canonical: "prioritization", aliases: [], category: "domain" },
|
|
897
|
+
{ canonical: "a/b testing", aliases: ["ab testing"], category: "domain" },
|
|
898
|
+
{ canonical: "analytics", aliases: [], category: "domain" },
|
|
899
|
+
{ canonical: "statistics", aliases: ["stats"], category: "domain" },
|
|
900
|
+
{ canonical: "data visualization", aliases: [], category: "domain" },
|
|
901
|
+
{ canonical: "data governance", aliases: [], category: "domain" },
|
|
902
|
+
{ canonical: "product management", aliases: [], category: "domain" },
|
|
903
|
+
{ canonical: "product strategy", aliases: [], category: "domain" },
|
|
904
|
+
{
|
|
905
|
+
canonical: "go-to-market strategy",
|
|
906
|
+
aliases: ["go to market", "gtm strategy"],
|
|
907
|
+
category: "domain"
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
canonical: "user story writing",
|
|
911
|
+
aliases: ["user stories"],
|
|
912
|
+
category: "domain"
|
|
913
|
+
},
|
|
914
|
+
{ canonical: "competitive analysis", aliases: [], category: "domain" },
|
|
915
|
+
{
|
|
916
|
+
canonical: "okrs",
|
|
917
|
+
aliases: ["objectives and key results"],
|
|
918
|
+
category: "domain"
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
canonical: "kpis",
|
|
922
|
+
aliases: ["key performance indicators"],
|
|
923
|
+
category: "domain"
|
|
924
|
+
},
|
|
925
|
+
// finance / accounting domain
|
|
926
|
+
{ canonical: "financial analysis", aliases: [], category: "domain" },
|
|
927
|
+
{ canonical: "financial modeling", aliases: [], category: "domain" },
|
|
928
|
+
{ canonical: "budgeting", aliases: [], category: "domain" },
|
|
929
|
+
{ canonical: "forecasting", aliases: [], category: "domain" },
|
|
930
|
+
{ canonical: "bookkeeping", aliases: [], category: "domain" },
|
|
931
|
+
{ canonical: "accounts payable", aliases: ["ap"], category: "domain" },
|
|
932
|
+
{ canonical: "accounts receivable", aliases: ["ar"], category: "domain" },
|
|
933
|
+
{ canonical: "payroll", aliases: [], category: "domain" },
|
|
934
|
+
{ canonical: "auditing", aliases: ["audit"], category: "domain" },
|
|
935
|
+
{ canonical: "tax preparation", aliases: [], category: "domain" },
|
|
936
|
+
{ canonical: "gaap", aliases: [], category: "domain" },
|
|
937
|
+
{ canonical: "ifrs", aliases: [], category: "domain" },
|
|
938
|
+
{
|
|
939
|
+
canonical: "reconciliation",
|
|
940
|
+
aliases: ["account reconciliation"],
|
|
941
|
+
category: "domain"
|
|
942
|
+
},
|
|
943
|
+
{ canonical: "general ledger", aliases: [], category: "domain" },
|
|
944
|
+
{ canonical: "cost accounting", aliases: [], category: "domain" },
|
|
945
|
+
{
|
|
946
|
+
canonical: "mergers and acquisitions",
|
|
947
|
+
aliases: ["m&a"],
|
|
948
|
+
category: "domain"
|
|
949
|
+
},
|
|
950
|
+
{ canonical: "investment banking", aliases: [], category: "domain" },
|
|
951
|
+
{ canonical: "portfolio management", aliases: [], category: "domain" },
|
|
952
|
+
{ canonical: "equity research", aliases: [], category: "domain" },
|
|
953
|
+
{
|
|
954
|
+
canonical: "treasury management",
|
|
955
|
+
aliases: ["treasury"],
|
|
956
|
+
category: "domain"
|
|
957
|
+
},
|
|
958
|
+
{ canonical: "fintech", aliases: [], category: "domain" },
|
|
959
|
+
{
|
|
960
|
+
canonical: "payments processing",
|
|
961
|
+
aliases: ["payment processing"],
|
|
962
|
+
category: "domain"
|
|
963
|
+
},
|
|
964
|
+
// sales / account management domain
|
|
965
|
+
{ canonical: "lead generation", aliases: [], category: "domain" },
|
|
966
|
+
{ canonical: "account management", aliases: [], category: "domain" },
|
|
967
|
+
{
|
|
968
|
+
canonical: "crm",
|
|
969
|
+
aliases: ["customer relationship management"],
|
|
970
|
+
category: "domain"
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
canonical: "sales pipeline",
|
|
974
|
+
aliases: ["pipeline management"],
|
|
975
|
+
category: "domain"
|
|
976
|
+
},
|
|
977
|
+
{ canonical: "cold calling", aliases: [], category: "domain" },
|
|
978
|
+
{ canonical: "upselling", aliases: ["cross-selling"], category: "domain" },
|
|
979
|
+
{ canonical: "customer retention", aliases: [], category: "domain" },
|
|
980
|
+
{
|
|
981
|
+
canonical: "business development",
|
|
982
|
+
aliases: ["bizdev"],
|
|
983
|
+
category: "domain"
|
|
984
|
+
},
|
|
985
|
+
{ canonical: "quota attainment", aliases: [], category: "domain" },
|
|
986
|
+
{ canonical: "b2b sales", aliases: [], category: "domain" },
|
|
987
|
+
{ canonical: "b2c sales", aliases: [], category: "domain" },
|
|
988
|
+
{ canonical: "saas", aliases: ["software as a service"], category: "domain" },
|
|
989
|
+
{ canonical: "e-commerce", aliases: ["ecommerce"], category: "domain" },
|
|
990
|
+
// human resources domain
|
|
991
|
+
{
|
|
992
|
+
canonical: "recruiting",
|
|
993
|
+
aliases: ["talent acquisition"],
|
|
994
|
+
category: "domain"
|
|
995
|
+
},
|
|
996
|
+
{ canonical: "onboarding", aliases: [], category: "domain" },
|
|
997
|
+
{ canonical: "employee relations", aliases: [], category: "domain" },
|
|
998
|
+
{ canonical: "benefits administration", aliases: [], category: "domain" },
|
|
999
|
+
{ canonical: "performance management", aliases: [], category: "domain" },
|
|
1000
|
+
{
|
|
1001
|
+
canonical: "compensation and benefits",
|
|
1002
|
+
aliases: ["comp and benefits"],
|
|
1003
|
+
category: "domain"
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
canonical: "diversity and inclusion",
|
|
1007
|
+
aliases: ["dei"],
|
|
1008
|
+
category: "domain"
|
|
1009
|
+
},
|
|
1010
|
+
{ canonical: "employee engagement", aliases: [], category: "domain" },
|
|
1011
|
+
{
|
|
1012
|
+
canonical: "hris",
|
|
1013
|
+
aliases: ["human resources information system"],
|
|
1014
|
+
category: "domain"
|
|
1015
|
+
},
|
|
1016
|
+
// healthcare domain
|
|
1017
|
+
{ canonical: "patient care", aliases: [], category: "domain" },
|
|
1018
|
+
{ canonical: "clinical documentation", aliases: [], category: "domain" },
|
|
1019
|
+
{ canonical: "hipaa", aliases: [], category: "domain" },
|
|
1020
|
+
{
|
|
1021
|
+
canonical: "electronic health records",
|
|
1022
|
+
aliases: ["ehr", "emr"],
|
|
1023
|
+
category: "domain"
|
|
1024
|
+
},
|
|
1025
|
+
{ canonical: "medical billing", aliases: [], category: "domain" },
|
|
1026
|
+
{
|
|
1027
|
+
canonical: "medical coding",
|
|
1028
|
+
aliases: ["icd-10", "cpt coding"],
|
|
1029
|
+
category: "domain"
|
|
1030
|
+
},
|
|
1031
|
+
{ canonical: "telehealth", aliases: [], category: "domain" },
|
|
1032
|
+
{ canonical: "clinical trials", aliases: [], category: "domain" },
|
|
1033
|
+
{ canonical: "regulatory affairs", aliases: [], category: "domain" },
|
|
1034
|
+
// legal domain
|
|
1035
|
+
{ canonical: "contract review", aliases: [], category: "domain" },
|
|
1036
|
+
{ canonical: "legal research", aliases: [], category: "domain" },
|
|
1037
|
+
{ canonical: "litigation", aliases: [], category: "domain" },
|
|
1038
|
+
{
|
|
1039
|
+
canonical: "regulatory compliance",
|
|
1040
|
+
aliases: ["compliance"],
|
|
1041
|
+
category: "domain"
|
|
1042
|
+
},
|
|
1043
|
+
{ canonical: "due diligence", aliases: [], category: "domain" },
|
|
1044
|
+
{
|
|
1045
|
+
canonical: "intellectual property",
|
|
1046
|
+
aliases: ["ip law"],
|
|
1047
|
+
category: "domain"
|
|
1048
|
+
},
|
|
1049
|
+
{
|
|
1050
|
+
canonical: "gdpr",
|
|
1051
|
+
aliases: ["general data protection regulation"],
|
|
1052
|
+
category: "domain"
|
|
1053
|
+
},
|
|
1054
|
+
{ canonical: "soc 2", aliases: ["soc2"], category: "domain" },
|
|
1055
|
+
{ canonical: "iso 27001", aliases: [], category: "domain" },
|
|
1056
|
+
{ canonical: "pci dss", aliases: ["pci compliance"], category: "domain" },
|
|
1057
|
+
// education domain
|
|
1058
|
+
{ canonical: "curriculum development", aliases: [], category: "domain" },
|
|
1059
|
+
{ canonical: "lesson planning", aliases: [], category: "domain" },
|
|
1060
|
+
{ canonical: "classroom management", aliases: [], category: "domain" },
|
|
1061
|
+
{ canonical: "instructional design", aliases: [], category: "domain" },
|
|
1062
|
+
{ canonical: "student assessment", aliases: [], category: "domain" },
|
|
1063
|
+
{ canonical: "e-learning", aliases: ["elearning"], category: "domain" },
|
|
1064
|
+
// operations / supply chain domain
|
|
1065
|
+
{
|
|
1066
|
+
canonical: "supply chain management",
|
|
1067
|
+
aliases: ["supply chain"],
|
|
1068
|
+
category: "domain"
|
|
1069
|
+
},
|
|
1070
|
+
{ canonical: "inventory management", aliases: [], category: "domain" },
|
|
1071
|
+
{ canonical: "procurement", aliases: [], category: "domain" },
|
|
1072
|
+
{ canonical: "vendor management", aliases: [], category: "domain" },
|
|
1073
|
+
{ canonical: "logistics", aliases: [], category: "domain" },
|
|
1074
|
+
{ canonical: "warehouse management", aliases: [], category: "domain" },
|
|
1075
|
+
{ canonical: "demand planning", aliases: [], category: "domain" },
|
|
1076
|
+
{ canonical: "manufacturing", aliases: [], category: "domain" },
|
|
1077
|
+
{ canonical: "quality control", aliases: [], category: "domain" },
|
|
1078
|
+
{ canonical: "lean manufacturing", aliases: [], category: "domain" },
|
|
1079
|
+
// customer service domain
|
|
1080
|
+
{
|
|
1081
|
+
canonical: "customer support",
|
|
1082
|
+
aliases: ["customer service"],
|
|
1083
|
+
category: "domain"
|
|
1084
|
+
},
|
|
1085
|
+
{ canonical: "technical support", aliases: [], category: "domain" },
|
|
1086
|
+
{ canonical: "conflict resolution", aliases: [], category: "domain" },
|
|
1087
|
+
{ canonical: "customer success", aliases: [], category: "domain" },
|
|
1088
|
+
{ canonical: "help desk", aliases: ["helpdesk"], category: "domain" },
|
|
1089
|
+
// soft skills
|
|
1090
|
+
{ canonical: "communication", aliases: [], category: "soft" },
|
|
1091
|
+
{ canonical: "written communication", aliases: [], category: "soft" },
|
|
1092
|
+
{ canonical: "verbal communication", aliases: [], category: "soft" },
|
|
1093
|
+
{ canonical: "leadership", aliases: [], category: "soft" },
|
|
1094
|
+
{ canonical: "team leadership", aliases: [], category: "soft" },
|
|
1095
|
+
{ canonical: "teamwork", aliases: ["collaboration"], category: "soft" },
|
|
1096
|
+
{
|
|
1097
|
+
canonical: "cross-functional collaboration",
|
|
1098
|
+
aliases: ["cross functional collaboration"],
|
|
1099
|
+
category: "soft"
|
|
1100
|
+
},
|
|
1101
|
+
{
|
|
1102
|
+
canonical: "problem solving",
|
|
1103
|
+
aliases: ["problem-solving"],
|
|
1104
|
+
category: "soft"
|
|
1105
|
+
},
|
|
1106
|
+
{ canonical: "adaptability", aliases: ["flexibility"], category: "soft" },
|
|
1107
|
+
{ canonical: "time management", aliases: [], category: "soft" },
|
|
1108
|
+
{ canonical: "critical thinking", aliases: [], category: "soft" },
|
|
1109
|
+
{ canonical: "creativity", aliases: [], category: "soft" },
|
|
1110
|
+
{ canonical: "attention to detail", aliases: [], category: "soft" },
|
|
1111
|
+
{
|
|
1112
|
+
canonical: "decision making",
|
|
1113
|
+
aliases: ["decision-making"],
|
|
1114
|
+
category: "soft"
|
|
1115
|
+
},
|
|
1116
|
+
{ canonical: "emotional intelligence", aliases: [], category: "soft" },
|
|
1117
|
+
{ canonical: "negotiation", aliases: [], category: "soft" },
|
|
1118
|
+
{
|
|
1119
|
+
canonical: "organization",
|
|
1120
|
+
aliases: ["organizational skills"],
|
|
1121
|
+
category: "soft"
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
canonical: "public speaking",
|
|
1125
|
+
aliases: ["presentation skills"],
|
|
1126
|
+
category: "soft"
|
|
1127
|
+
},
|
|
1128
|
+
{ canonical: "mentoring", aliases: ["coaching"], category: "soft" },
|
|
1129
|
+
{ canonical: "interpersonal skills", aliases: [], category: "soft" },
|
|
1130
|
+
{ canonical: "work ethic", aliases: [], category: "soft" },
|
|
1131
|
+
{ canonical: "stakeholder communication", aliases: [], category: "soft" },
|
|
1132
|
+
{
|
|
1133
|
+
canonical: "self-motivation",
|
|
1134
|
+
aliases: ["self motivation"],
|
|
1135
|
+
category: "soft"
|
|
1136
|
+
},
|
|
1137
|
+
{ canonical: "resilience", aliases: [], category: "soft" },
|
|
1138
|
+
{ canonical: "empathy", aliases: [], category: "soft" },
|
|
1139
|
+
{ canonical: "active listening", aliases: [], category: "soft" },
|
|
1140
|
+
{ canonical: "delegation", aliases: [], category: "soft" },
|
|
1141
|
+
{ canonical: "strategic thinking", aliases: [], category: "soft" },
|
|
1142
|
+
{ canonical: "multitasking", aliases: [], category: "soft" },
|
|
1143
|
+
// marketing
|
|
1144
|
+
{
|
|
1145
|
+
canonical: "seo",
|
|
1146
|
+
aliases: ["search engine optimization"],
|
|
1147
|
+
category: "marketing"
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
canonical: "sem",
|
|
1151
|
+
aliases: ["search engine marketing"],
|
|
1152
|
+
category: "marketing"
|
|
1153
|
+
},
|
|
1154
|
+
{ canonical: "branding", aliases: ["brand strategy"], category: "marketing" },
|
|
1155
|
+
{ canonical: "campaign management", aliases: [], category: "marketing" },
|
|
1156
|
+
{ canonical: "content marketing", aliases: [], category: "marketing" },
|
|
1157
|
+
{ canonical: "content strategy", aliases: [], category: "marketing" },
|
|
1158
|
+
{
|
|
1159
|
+
canonical: "social media marketing",
|
|
1160
|
+
aliases: ["social media"],
|
|
1161
|
+
category: "marketing"
|
|
1162
|
+
},
|
|
1163
|
+
{ canonical: "email marketing", aliases: [], category: "marketing" },
|
|
1164
|
+
{ canonical: "digital marketing", aliases: [], category: "marketing" },
|
|
1165
|
+
{
|
|
1166
|
+
canonical: "growth marketing",
|
|
1167
|
+
aliases: ["growth hacking"],
|
|
1168
|
+
category: "marketing"
|
|
1169
|
+
},
|
|
1170
|
+
{ canonical: "copywriting", aliases: [], category: "marketing" },
|
|
1171
|
+
{ canonical: "market research", aliases: [], category: "marketing" },
|
|
1172
|
+
{
|
|
1173
|
+
canonical: "ppc",
|
|
1174
|
+
aliases: ["pay-per-click", "google ads"],
|
|
1175
|
+
category: "marketing"
|
|
1176
|
+
},
|
|
1177
|
+
{
|
|
1178
|
+
canonical: "conversion rate optimization",
|
|
1179
|
+
aliases: ["cro"],
|
|
1180
|
+
category: "marketing"
|
|
1181
|
+
},
|
|
1182
|
+
{ canonical: "public relations", aliases: ["pr"], category: "marketing" },
|
|
1183
|
+
{ canonical: "marketing automation", aliases: [], category: "marketing" },
|
|
1184
|
+
{ canonical: "affiliate marketing", aliases: [], category: "marketing" },
|
|
1185
|
+
{ canonical: "influencer marketing", aliases: [], category: "marketing" },
|
|
1186
|
+
{ canonical: "product marketing", aliases: [], category: "marketing" },
|
|
1187
|
+
{ canonical: "event marketing", aliases: [], category: "marketing" },
|
|
1188
|
+
{ canonical: "brand awareness", aliases: [], category: "marketing" },
|
|
1189
|
+
{ canonical: "media planning", aliases: [], category: "marketing" },
|
|
1190
|
+
{ canonical: "lead nurturing", aliases: [], category: "marketing" }
|
|
1191
|
+
];
|
|
1192
|
+
var defaultSkillAliases = deriveSkillAliases(defaultKeywordRegistry);
|
|
1193
|
+
var softwareEngineerProfile = {
|
|
1194
|
+
name: "software-engineer",
|
|
1195
|
+
mandatorySkills: ["javascript", "typescript", "react", "node"],
|
|
1196
|
+
optionalSkills: ["graphql", "sql", "docker"],
|
|
1197
|
+
minExperience: 3
|
|
1198
|
+
};
|
|
1199
|
+
var dataScientistProfile = {
|
|
1200
|
+
name: "data-scientist",
|
|
1201
|
+
mandatorySkills: ["python", "sql", "statistics"],
|
|
1202
|
+
optionalSkills: ["pandas", "numpy", "pytorch", "tensorflow"],
|
|
1203
|
+
minExperience: 2
|
|
1204
|
+
};
|
|
1205
|
+
var productManagerProfile = {
|
|
1206
|
+
name: "product-manager",
|
|
1207
|
+
mandatorySkills: ["roadmap", "stakeholder management", "prioritization"],
|
|
1208
|
+
optionalSkills: ["a/b testing", "analytics", "sql"],
|
|
1209
|
+
minExperience: 3
|
|
1210
|
+
};
|
|
1211
|
+
var defaultProfiles = [
|
|
1212
|
+
softwareEngineerProfile,
|
|
1213
|
+
dataScientistProfile,
|
|
1214
|
+
productManagerProfile
|
|
1215
|
+
];
|
|
1216
|
+
|
|
1217
|
+
export { ROLE_NOUNS, STOP_WORDS, buildCategoryIndex, clamp, countFrequencies, defaultKeywordRegistry, defaultProfiles, defaultSkillAliases, deriveSkillAliases, detectFormatting, escapeRegExp, fuzzyEqual, mergeKeywordRegistries, normalizeForComparison, normalizeSkill, normalizeSkills, normalizeWhitespace, softwareEngineerProfile, splitLines, stem, tokenize, unique };
|
|
1218
|
+
//# sourceMappingURL=chunk-JAFFS7YZ.mjs.map
|
|
1219
|
+
//# sourceMappingURL=chunk-JAFFS7YZ.mjs.map
|