@whiteslove/parsing-lexicon 0.2.0 → 0.2.2

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 (94) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +137 -137
  3. package/index.d.ts +374 -374
  4. package/package.json +77 -75
  5. package/src/central-asia-locations.js +211 -211
  6. package/src/central-asia.js +233 -233
  7. package/src/contact.d.ts +44 -44
  8. package/src/contact.js +159 -159
  9. package/src/countries.js +175 -175
  10. package/src/country-context.d.ts +10 -10
  11. package/src/country-context.js +22 -22
  12. package/src/currency.d.ts +14 -14
  13. package/src/currency.js +66 -66
  14. package/src/geo.js +169 -169
  15. package/src/geography-central-asia.js +42 -42
  16. package/src/geography-detection.d.ts +14 -14
  17. package/src/geography-detection.js +64 -64
  18. package/src/geography-display.d.ts +13 -13
  19. package/src/geography-display.js +113 -113
  20. package/src/geography.js +210 -210
  21. package/src/hiring-advanced.js +147 -147
  22. package/src/hiring-candidate-fields.d.ts +9 -9
  23. package/src/hiring-candidate-fields.js +92 -92
  24. package/src/hiring-context.d.ts +64 -64
  25. package/src/hiring-context.js +412 -412
  26. package/src/hiring-language-extensions.d.ts +19 -19
  27. package/src/hiring-language-extensions.js +139 -139
  28. package/src/hiring-languages.js +135 -135
  29. package/src/hiring-location-fields.d.ts +3 -3
  30. package/src/hiring-location-fields.js +53 -53
  31. package/src/hiring-professions-ro.js +191 -191
  32. package/src/hiring-professions.js +437 -437
  33. package/src/hiring-requirements.d.ts +16 -16
  34. package/src/hiring-requirements.js +170 -170
  35. package/src/hiring-salary-context.d.ts +27 -27
  36. package/src/hiring-salary-context.js +76 -76
  37. package/src/hiring-semantics.d.ts +29 -29
  38. package/src/hiring-semantics.js +218 -218
  39. package/src/hiring-skills.d.ts +21 -21
  40. package/src/hiring-skills.js +315 -315
  41. package/src/hiring-source-aliases.d.ts +32 -32
  42. package/src/hiring-source-aliases.js +185 -185
  43. package/src/hiring-source-semantics.d.ts +31 -31
  44. package/src/hiring-source-semantics.js +293 -293
  45. package/src/hiring-temporal.d.ts +15 -15
  46. package/src/hiring-temporal.js +67 -67
  47. package/src/hiring-vacancy-fields.d.ts +5 -5
  48. package/src/hiring-vacancy-fields.js +23 -23
  49. package/src/hiring-work-semantics.d.ts +34 -34
  50. package/src/hiring-work-semantics.js +72 -72
  51. package/src/hiring.js +180 -180
  52. package/src/housing-address.d.ts +18 -18
  53. package/src/housing-address.js +217 -210
  54. package/src/housing-commercial.d.ts +1 -0
  55. package/src/housing-commercial.js +9 -0
  56. package/src/housing-context.d.ts +36 -36
  57. package/src/housing-context.js +183 -183
  58. package/src/housing-features.js +30 -30
  59. package/src/housing-intent.d.ts +9 -9
  60. package/src/housing-intent.js +132 -132
  61. package/src/housing-listing-fields.js +131 -131
  62. package/src/housing-money.d.ts +7 -7
  63. package/src/housing-money.js +102 -102
  64. package/src/housing-source-aliases.d.ts +8 -8
  65. package/src/housing-source-aliases.js +51 -51
  66. package/src/housing-structured.d.ts +55 -55
  67. package/src/housing-structured.js +219 -219
  68. package/src/housing.js +200 -200
  69. package/src/index.js +45 -44
  70. package/src/kz-location-extensions.js +307 -307
  71. package/src/landmarks.js +21 -21
  72. package/src/lexicon-core.js +58 -58
  73. package/src/location-merge.js +106 -106
  74. package/src/locations.js +456 -456
  75. package/src/money-core.d.ts +10 -10
  76. package/src/money-core.js +81 -81
  77. package/src/money-lexicon.d.ts +5 -5
  78. package/src/money-lexicon.js +79 -79
  79. package/src/money.js +154 -154
  80. package/src/normalization.js +384 -384
  81. package/src/odesa-metropolitan.js +144 -144
  82. package/src/romania-geography.js +47 -47
  83. package/src/tashkent-colloquial.js +80 -72
  84. package/src/tashkent-housing-geography.d.ts +38 -38
  85. package/src/tashkent-housing-geography.js +211 -211
  86. package/src/tashkent-pois.js +215 -215
  87. package/src/tashkent-residential-complexes.js +272 -272
  88. package/src/ua-location-extensions-major.js +118 -118
  89. package/src/ua-location-extensions-metro.js +9 -9
  90. package/src/ua-location-extensions-regional.js +246 -246
  91. package/src/ua-secondary-cities.d.ts +2 -2
  92. package/src/ua-secondary-cities.js +57 -57
  93. package/src/ukraine.js +75 -75
  94. package/src/uz-location-extensions.js +259 -259
@@ -1,315 +1,315 @@
1
- // These canonical labels are ordinary words or one-letter tokens. Matching the
2
- // label itself would create noisy results; only their explicit aliases are safe.
3
- const AMBIGUOUS_CANONICALS = new Set(['C', 'Go', 'Make', 'REST', 'Spring'])
4
-
5
- const group = (category, subcategory, entries) =>
6
- entries.map(([name, aliases = []]) => ({
7
- name,
8
- category,
9
- subcategory,
10
- aliases: [...(AMBIGUOUS_CANONICALS.has(name) ? [] : [name]), ...aliases],
11
- }))
12
-
13
- // Shared by Nitro enrichment and the browser-only ATS scorer. Keep canonical
14
- // labels readable; aliases hold abbreviations, spelling variants and local terms.
15
- export const SKILL_CATALOG = [
16
- ...group('IT', 'Frontend', [
17
- ['HTML', ['html5']], ['CSS', ['css3']], ['Sass', ['scss']], ['Less', ['less css']],
18
- ['JavaScript', ['ecmascript', 'es6', 'js developer', 'js framework']], ['TypeScript', ['type script']],
19
- ['React', ['react.js', 'reactjs']], ['React Native', ['react-native']],
20
- ['Vue', ['vue.js', 'vuejs']], ['Nuxt', ['nuxt.js', 'nuxtjs']],
21
- ['Next.js', ['nextjs', 'next js']], ['Angular', ['angular.js', 'angularjs']],
22
- ['Svelte'], ['SvelteKit', ['svelte kit']], ['Astro', ['astro.js']], ['jQuery'],
23
- ['Knockout', ['knockout.js', 'knockout js']], ['AlpineJS', ['alpine.js', 'alpine js']],
24
- ['HTMX'], ['Web Components', ['custom elements']], ['Tailwind', ['tailwindcss', 'tailwind css']],
25
- ['Bootstrap'], ['Material UI', ['mui', '@mui/material']], ['Ant Design', ['antd']],
26
- ['Vuetify'], ['Nuxt UI'], ['Quasar'], ['PrimeVue', ['prime vue']], ['Storybook'],
27
- ['Redux'], ['Redux Toolkit', ['rtk', '@reduxjs/toolkit']], ['Zustand'], ['MobX'],
28
- ['Pinia'], ['Vuex'], ['RxJS'], ['React Query', ['tanstack query', '@tanstack/react-query']],
29
- ['Axios'], ['Fetch API', ['window.fetch']], ['Webpack'], ['Vite'], ['Rollup'], ['Babel'],
30
- ['ESLint'], ['Prettier'], ['Stylelint'], ['npm'], ['Yarn'], ['pnpm'],
31
- ['Freemarker'], ['Velocity'], ['Liquid'], ['Nunjucks'],
32
- ['Responsive Design', ['responsive web design', 'responsive layout', 'адаптивная верстка', 'адаптивний дизайн']],
33
- ['Cross-browser Development', ['cross-browser', 'cross browser', 'кроссбраузерность']],
34
- ['Accessibility', ['web accessibility', 'wcag', 'a11y']], ['BEM', ['бэм']],
35
- ['SEO', ['search engine optimization', 'поисковая оптимизация']],
36
- ['Technical SEO', ['техническое seo']], ['i18n', ['internationalization', 'localization', 'локализация']],
37
- ]),
38
- ...group('IT', 'Backend', [
39
- ['Node.js', ['nodejs', 'node js']], ['Express', ['express.js', 'expressjs']],
40
- ['NestJS', ['nest.js', 'nest js']], ['Fastify'], ['Python', ['python3']], ['Django'],
41
- ['Flask'], ['FastAPI', ['fast api']], ['PHP'], ['Laravel'], ['Symfony'], ['WordPress'],
42
- ['Java', ['java ee', 'jakarta ee']], ['Spring', ['spring framework']], ['Spring Boot', ['springboot']],
43
- ['Hibernate'], ['Maven'], ['Gradle'], ['Kotlin'], ['Ktor'], ['C#', ['c sharp', 'csharp']],
44
- ['.NET', ['dotnet', 'dot net']], ['ASP.NET', ['asp net', 'asp.net core']],
45
- ['Entity Framework', ['entityframework', 'ef core']], ['Tomcat'], ['Go', ['golang', 'go language']],
46
- ['Rust', ['rustlang']], ['C', ['c programming', 'c language']], ['C++', ['cpp', 'c plus plus']],
47
- ['Ruby'], ['Ruby on Rails', ['rails framework']], ['Scala'], ['Elixir'], ['Erlang'],
48
- ['OOP', ['object-oriented programming', 'object oriented programming']], ['SOLID', ['solid principles']],
49
- ]),
50
- ...group('IT', 'API & Architecture', [
51
- ['REST', ['rest api', 'restful api', 'rest services']], ['GraphQL'],
52
- ['Apollo GraphQL', ['apollo client', 'apollo server']], ['gRPC'], ['WebSocket', ['websockets', 'web socket']],
53
- ['Socket.IO', ['socketio']], ['API Integration', ['api integrations', 'third-party integration', 'интеграция api']],
54
- ['Webhooks', ['webhook']], ['SOAP', ['soap api', 'soap web service']], ['Microservices', ['micro services']],
55
- ['PWA', ['progressive web app']], ['SPA', ['single-page application']],
56
- ['SSR', ['server-side rendering']], ['SSG', ['static site generation']], ['JSON'], ['XML'], ['YAML', ['yml']],
57
- ]),
58
- ...group('IT', 'Mobile & Desktop', [
59
- ['Android'], ['Android Studio'], ['Jetpack Compose'], ['Android SDK'], ['iOS'], ['Swift'], ['Objective-C', ['objective c']],
60
- ['SwiftUI'], ['UIKit'], ['Xcode'], ['Flutter'], ['Dart'], ['Electron', ['electron.js', 'electronjs']],
61
- ['Tauri'], ['Qt'], ['WPF'], ['WinForms'], ['Unity', ['unity3d']], ['Unreal Engine', ['ue4', 'ue5']], ['Godot'],
62
- ]),
63
- ...group('IT', 'Databases', [
64
- ['SQL'], ['NoSQL', ['no sql', 'no-sql']], ['PostgreSQL', ['postgres', 'psql']], ['MySQL'], ['MariaDB', ['maria db']], ['SQLite'],
65
- ['Microsoft SQL Server', ['mssql', 'sql server']], ['Oracle Database', ['oracle db']],
66
- ['MongoDB', ['mongo db', 'mongo']], ['Redis'], ['Elasticsearch', ['elastic search']], ['OpenSearch'],
67
- ['ClickHouse', ['click house']], ['DynamoDB'], ['Firestore'], ['Firebase'], ['Neo4j'],
68
- ['Supabase'], ['Snowflake'], ['BigQuery'], ['Prisma', ['prisma orm']], ['TypeORM'], ['Sequelize'], ['SQLAlchemy'],
69
- ]),
70
- ...group('IT', 'DevOps & Cloud', [
71
- ['Git'], ['GitHub'], ['GitLab'], ['Bitbucket'], ['DevOps'], ['Docker'], ['Docker Compose', ['docker-compose']],
72
- ['Kubernetes', ['k8s']], ['Helm'], ['Terraform'], ['Ansible'], ['Jenkins'],
73
- ['GitHub Actions'], ['GitLab CI', ['gitlab ci/cd']], ['CircleCI'], ['TeamCity'], ['ArgoCD', ['argo cd']],
74
- ['CI/CD', ['ci cd', 'cicd', 'continuous integration', 'continuous delivery']],
75
- ['AWS', ['amazon web services']], ['Azure', ['microsoft azure']], ['Google Cloud', ['gcp', 'google cloud platform']],
76
- ['Cloudflare'], ['Vercel'], ['Netlify'], ['Nginx'], ['Apache'], ['Linux'], ['Ubuntu'], ['Windows Server'],
77
- ['Bash', ['shell scripting']], ['PowerShell'], ['SSH'], ['Active Directory'], ['VMware'], ['Grafana'],
78
- ['Prometheus'], ['Zabbix'], ['Sentry'], ['ELK', ['elastic stack']], ['Kibana'],
79
- ]),
80
- ...group('IT', 'QA & Security', [
81
- ['Jest'], ['Vitest'], ['Cypress'], ['Playwright'], ['Selenium'], ['Appium'], ['Postman'],
82
- ['Swagger', ['openapi']], ['TestRail'], ['TDD', ['test-driven development']], ['BDD', ['behavior-driven development']],
83
- ['Manual Testing', ['ручное тестирование']],
84
- ['Test Automation', ['automation testing', 'автоматизация тестирования']],
85
- ['Regression Testing', ['регрессионное тестирование']], ['Unit Testing', ['unit tests']],
86
- ['Integration Testing'], ['E2E Testing', ['end-to-end testing']], ['Cybersecurity', ['information security']],
87
- ['SIEM'], ['Splunk'], ['OAuth', ['oauth2']], ['JWT'], ['OWASP'], ['Penetration Testing', ['pentest', 'пентест']],
88
- ]),
89
- ...group('Data', 'Analytics & AI', [
90
- ['Data Analysis', ['analytics', 'data analytics', 'анализ данных']], ['Business Analytics'], ['Commercial Analytics'],
91
- ['Pandas'], ['NumPy'], ['Jupyter'], ['Power BI', ['powerbi']], ['Tableau'], ['Looker'], ['Qlik'],
92
- ['Apache Spark', ['pyspark']], ['Hadoop'], ['Airflow'], ['Kafka'], ['RabbitMQ'], ['ETL'],
93
- ['Data Warehouse'], ['Data Science'], ['Machine Learning', ['машинное обучение']], ['Deep Learning'], ['TensorFlow'],
94
- ['PyTorch'], ['Scikit-learn', ['sklearn']], ['NLP'], ['Computer Vision'], ['LLM', ['large language models']],
95
- ['Generative AI', ['genai', 'генеративный ии']], ['OpenAI'], ['LangChain'], ['RAG'], ['AI Tools', ['ai tools']],
96
- ]),
97
- ...group('Office', 'Productivity', [
98
- ['Microsoft Office', ['ms office', 'мс офис']], ['Microsoft 365', ['office 365', 'm365']],
99
- ['Microsoft Word', ['ms word', 'ворд']],
100
- ['Microsoft PowerPoint', ['ms powerpoint', 'powerpoint']], ['Microsoft Outlook', ['ms outlook']],
101
- ['Microsoft Access', ['ms access']], ['Microsoft Visio', ['ms visio']], ['Microsoft Project', ['ms project']],
102
- ['Microsoft Teams', ['ms teams']], ['SharePoint'], ['OneDrive'], ['Google Workspace', ['g suite']],
103
- ['Google Sheets'], ['Google Docs'], ['Google Slides'], ['LibreOffice'],
104
- ]),
105
- ...group('Office', 'Spreadsheets', [
106
- ['Microsoft Excel', ['ms excel', 'excel', 'эксель']], ['Excel Pivot Tables', ['pivot tables', 'сводные таблицы']],
107
- ['VLOOKUP', ['впр excel']], ['XLOOKUP'],
108
- ['Power Query', ['powerquery']], ['Power Pivot', ['powerpivot']], ['Excel Macros', ['макросы excel']], ['VBA'],
109
- ]),
110
- ...group('Design', 'UI & UX', [
111
- ['Figma'], ['Adobe Photoshop', ['photoshop']], ['Adobe Illustrator', ['illustrator']],
112
- ['Adobe XD'], ['Sketch', ['sketch app']], ['UI Design'], ['UX Design'], ['Design Systems'], ['Prototyping'],
113
- ]),
114
- ...group('Business', 'Management', [
115
- ['Business Strategy'], ['Strategic Planning'], ['Corporate Planning'], ['Business Planning'],
116
- ['Corporate Strategy'], ['Commercial Strategy'], ['Management Consulting'], ['M&A', ['mergers and acquisitions']],
117
- ['Project Management'], ['Portfolio Management'],
118
- ['Corporate Governance', ['group governance']], ['Business Process'], ['Process Improvement', ['process improvements']],
119
- ['Operational Efficiency'], ['Operations'], ['Stakeholder Management'], ['Negotiation'],
120
- ['Cross-functional Collaboration', ['cross-functional', 'cross functionally']], ['KPI', ['key performance indicators']],
121
- ['Dashboards'], ['Forecasting'], ['Risk Management'], ['Resource Planning'], ['Gantt Charts'],
122
- ['Agile'], ['Scrum'], ['Kanban'], ['Jira'], ['Confluence'], ['SDLC'],
123
- ]),
124
- ...group('Finance', 'Accounting Software', [
125
- ['1C', ['1с', '1c accounting', '1с бухгалтерия']], ['SAP', ['sap erp', 'sap fico']],
126
- ['SONO', ['соно']], ['M.E.Doc', ['medoc', 'медок']], ['Didox'], ['MySoliq', ['my soliq']],
127
- ['ProZorro', ['прозорро']], ['SAGA', ['saga accounting', 'saga software']],
128
- ]),
129
- ...group('Finance', 'Accounting & Banking', [
130
- ['Accounting', ['бухгалтерский учет', 'бухгалтерський облік']],
131
- ['Financial Analysis'], ['P&L', ['profit and loss']], ['Budgeting'], ['Management Accounting'],
132
- ['Tax Accounting'], ['Payroll'], ['IFRS', ['мсфо']], ['GAAP'], ['Audit'], ['Treasury'],
133
- ['Investment Banking'], ['Credit Analysis'], ['AML', ['anti-money laundering']], ['KYC', ['know your customer']],
134
- ]),
135
- ...group('Business Systems', 'CRM & ERP', [
136
- ['Microsoft Dynamics', ['dynamics 365']], ['HubSpot', ['hubspot crm']],
137
- ['Bitrix24', ['битрикс24']], ['amoCRM', ['амо срм']], ['Smartup', ['smart up']], ['Odoo'], ['Oracle ERP'],
138
- ]),
139
- ...group('Sales', 'Sales & Customer Service', [
140
- ['Sales', ['продажи', 'сотув', 'savdo']], ['Sales Pipeline'], ['Lead Generation', ['лидогенерация']],
141
- ['Cold Calling', ['холодные звонки']], ['Account Management'], ['Key Account Management'],
142
- ['CRM'], ['Customer Service', ['обслуживание клиентов']], ['Customer Support', ['поддержка клиентов']],
143
- ['Call Center', ['колл-центр']], ['Client Communication', ['переписка с клиентами', 'мижозлар билан ёзишмалар']],
144
- ['Complaint Handling'], ['Onboarding', ['employee onboarding', 'courier onboarding']], ['Conversion Funnel'],
145
- ]),
146
- ...group('Sales', 'CRM', [
147
- ['Salesforce', ['salesforce crm']],
148
- ]),
149
- ...group('Marketing', 'Digital Marketing', [
150
- ['Digital Marketing'], ['Content Marketing'], ['Social Media Marketing', ['smm']], ['Email Marketing'],
151
- ['Google Ads', ['google adwords']], ['Meta Ads', ['facebook ads']], ['Google Analytics', ['ga4']],
152
- ['Google Tag Manager', ['gtm']], ['Marketing Automation'], ['Copywriting', ['копирайтинг']],
153
- ['Market Research'], ['A/B Testing', ['ab testing']], ['Conversion Rate Optimization', ['cro']],
154
- ]),
155
- ...group('HR', 'Recruiting & People', [
156
- ['Recruitment', ['recruiting', 'подбор персонала']], ['Candidate Sourcing'], ['Boolean Search'],
157
- ['LinkedIn Recruiter'], ['Interviewing', ['проведение собеседований']], ['HR Administration'],
158
- ['HRIS'], ['Workday HCM'], ['Greenhouse ATS'], ['BambooHR'], ['SAP SuccessFactors'],
159
- ]),
160
- ...group('Legal', 'Legal & Compliance', [
161
- ['Legal Research', ['правовой анализ']], ['Contract Drafting', ['составление договоров']],
162
- ['Contract Management', ['договорная работа']], ['Due Diligence'], ['Corporate Law'], ['Commercial Law'],
163
- ['Labor Law', ['трудовое право']], ['Litigation'], ['Compliance', ['комплаенс']], ['GDPR'],
164
- ]),
165
- ...group('Administration', 'Office Work', [
166
- ['Document Management', ['документооборот']], ['Electronic Document Management', ['эдо']],
167
- ['Records Management', ['делопроизводство']], ['Business Correspondence', ['деловая переписка']],
168
- ['Data Entry', ['ввод данных']], ['Office Administration'], ['Calendar Management'], ['Meeting Coordination'],
169
- ]),
170
- ...group('Logistics', 'Supply Chain & Transport', [
171
- ['Logistics', ['логистика']], ['Supply Chain', ['управление цепями поставок']], ['Procurement', ['закупки']],
172
- ['Strategic Sourcing'], ['Tendering', ['тендеры']], ['Vendor Management'], ['Inventory Management'],
173
- ['Warehouse Management'], ['WMS'], ['TMS'], ['Incoterms'], ['Customs Clearance'], ['Import/Export'],
174
- ['Freight Forwarding'], ['Route Planning', ['маршрутизация']], ['Last-mile Logistics'],
175
- ['Driving License B', ['права категории b']], ['Driving License C', ['права категории c']],
176
- ['Forklift', ['водитель погрузчика']], ['Barcode Scanner', ['тсд', 'терминал сбора данных']],
177
- ]),
178
- ...group('Retail & Hospitality', 'Retail, POS & HoReCa', [
179
- ['POS', ['point of sale']], ['R-Keeper', ['rkeeper']], ['iiko', ['айко ресторан']],
180
- ['Poster POS', ['poster restaurant']], ['MICROS', ['oracle micros']], ['Cash Register', ['работа с кассой']],
181
- ['Merchandising', ['мерчандайзинг']], ['Stocktaking', ['инвентаризация']], ['HACCP', ['хассп']],
182
- ['Hotel Management'], ['Opera PMS', ['oracle hospitality opera']], ['Restaurant Management'],
183
- ]),
184
- ...group('Engineering', 'CAD', [
185
- ['AutoCAD', ['autocad civil 3d']], ['SolidWorks'], ['Revit'], ['ArchiCAD'], ['SketchUp'],
186
- ]),
187
- ...group('Engineering', 'Manufacturing', [
188
- ['CNC', ['чпу']], ['PLC', ['плк']], ['SCADA', ['асу тп']], ['TIA Portal'], ['Siemens S7'],
189
- ['Electrical Engineering'], ['Mechanical Engineering'], ['Mechatronics'], ['Welding', ['сварка']],
190
- ['Lean Manufacturing', ['бережливое производство']], ['Six Sigma'], ['Kaizen'], ['5S'],
191
- ['ISO 9001', ['iso9001']], ['ISO 14001'], ['ISO 45001'], ['Quality Management'], ['HSE', ['охрана труда']],
192
- ]),
193
- ...group('Construction', 'Construction & Design', [
194
- ['Construction Management'], ['Quantity Surveying'], ['Cost Estimation', ['сметное дело', 'составление смет']],
195
- ['Project Documentation'], ['Technical Drawings', ['технические чертежи']], ['BIM'],
196
- ]),
197
- ...group('Healthcare', 'Medical & Pharma', [
198
- ['EMR', ['electronic medical record']], ['EHR', ['electronic health record']],
199
- ['Medical Records', ['медицинская документация']], ['GMP'], ['GLP'],
200
- ['Good Clinical Practice', ['gcp clinical']], ['PCR', ['пцр']], ['ELISA', ['ифа анализ']],
201
- ['Laboratory Equipment'], ['Pharmacovigilance'], ['Clinical Research'], ['Patient Care'],
202
- ]),
203
- ...group('Education', 'Teaching & Learning', [
204
- ['Teaching', ['преподавание', 'викладання']], ['Curriculum Development'], ['Lesson Planning'],
205
- ['Classroom Management'], ['Moodle'], ['Google Classroom'], ['LMS', ['learning management system']],
206
- ]),
207
- ...group('Aviation', 'Aviation Operations', [
208
- ['Airport Operations'], ['Flight Operations'], ['Ground Handling'], ['Aviation Safety'],
209
- ['IATA'], ['ICAO'], ['Amadeus'], ['Sabre'],
210
- ]),
211
- ...group('E-commerce', 'Marketplaces', [
212
- ['E-commerce', ['ecommerce', 'электронная коммерция', 'онлайн савдо']], ['Shopify'], ['Magento'],
213
- ['OpenCart'], ['Amazon Seller Central'], ['Wildberries', ['вайлдберриз']], ['Ozon'],
214
- ['Kaspi', ['kaspi marketplace', 'kaspi магазин']], ['Uzum', ['uzum market']],
215
- ['Marketplace Management', ['ведение маркетплейсов']], ['Product Cards', ['карточки товаров']],
216
- ]),
217
- ...group('Automation', 'Low Code', [
218
- ['Automation'], ['Zapier'], ['Make', ['make.com', 'integromat']], ['n8n'], ['Power Automate'], ['Power Apps'],
219
- ['UiPath'], ['Automation Anywhere'], ['RPA', ['robotic process automation']],
220
- ]),
221
- ...group('Professional', 'Soft Skills', [
222
- ['Communication', ['communication skills', 'коммуникация', 'коммуникабельность', 'коммуникация кўникмалари']],
223
- ['Teamwork', ['team player', 'работа в команде', 'командная работа', 'жамоа билан']],
224
- ['Leadership'], ['Time Management'], ['Problem Solving', ['решение проблем']], ['Critical Thinking'],
225
- ['Analytical Thinking'], ['Multitasking', ['многозадачность']], ['Attention to Detail'],
226
- ['Presentation Skills'], ['Responsibility', ['ответственность', 'масъулиятлилик']],
227
- ['Adaptability', ['адаптивность', 'мослашувчан']], ['Fast Learner', ['быстрая обучаемость', 'тез ўрганувчи']],
228
- ['Goal Orientation', ['стремление к цели', 'мақсадларга эришиш']],
229
- ]),
230
- ]
231
-
232
- export const SKILL_KEYWORDS = Object.freeze(
233
- Object.fromEntries(SKILL_CATALOG.map(({ name, aliases }) => [name, Object.freeze([...new Set(aliases)])])),
234
- )
235
-
236
- export const SKILL_META = Object.freeze(
237
- Object.fromEntries(SKILL_CATALOG.map(({ name, category, subcategory }) => [name, { category, subcategory }])),
238
- )
239
-
240
- export function normalizeSkillText(value) {
241
- return value
242
- .normalize('NFKC')
243
- .toLocaleLowerCase('en')
244
- .replace(/[‘’`´]/g, "'")
245
- .replace(/[‐‑‒–—]/g, '-')
246
- .replace(/\s+/g, ' ')
247
- .trim()
248
- }
249
-
250
- export function escapeRegex(value) {
251
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
252
- }
253
-
254
- export function buildSkillRegex(alias) {
255
- const normalized = normalizeSkillText(alias)
256
- const pattern = escapeRegex(normalized).replace(/\s+/g, '\\s+')
257
- // Unicode-aware boundaries prevent `react` matching `reactive`, `reaction`
258
- // or `interaction`, while still handling C++, C#, .NET, 1C and Vue.js.
259
- return new RegExp(`(?:^|[^\\p{L}\\p{N}_])${pattern}(?=$|[^\\p{L}\\p{N}_])`, 'iu')
260
- }
261
-
262
- const CONTEXTUAL_SKILL_PATTERNS = Object.freeze([
263
- ['Corporate Governance', /\b(?:group|company|corporate) governance\b/i],
264
- ['Data Analysis', /\banalys(?:e|is|ing)\b[^.;\n]{0,60}\b(?:data|metrics?|funnels?)\b|\b(?:data|metrics?|funnels?)\b[^.;\n]{0,60}\banalys(?:e|is|ing)\b/i],
265
- ['Conversion Funnel', /\b(?:conversion|onboarding|registration)[- ](?:to[- ]\w+\s+)?funnel\b|\bonboarding funnel\b/i],
266
- ['Cross-functional Collaboration', /\bcross[- ]function(?:al|ally)\b/i],
267
- ])
268
-
269
- const COMPILED_SKILLS = SKILL_CATALOG.map((definition) => ({
270
- definition,
271
- patterns: [...new Set(definition.aliases.map(normalizeSkillText))].map(buildSkillRegex),
272
- }))
273
-
274
- const CANONICAL_BY_ALIAS = new Map()
275
- for (const { name, aliases } of SKILL_CATALOG) {
276
- CANONICAL_BY_ALIAS.set(normalizeSkillText(name), name)
277
- for (const alias of aliases) CANONICAL_BY_ALIAS.set(normalizeSkillText(alias), name)
278
- }
279
-
280
- export function canonicalSkillName(value) {
281
- const normalized = normalizeSkillText(value)
282
- return CANONICAL_BY_ALIAS.get(normalized) ?? extractSkillNames(normalized)[0]
283
- }
284
-
285
- export function extractSkillDetails(text) {
286
- const normalized = normalizeSkillText(text)
287
- const found = []
288
- const names = new Set()
289
- for (const { definition, patterns } of COMPILED_SKILLS) {
290
- if (!patterns.some((pattern) => pattern.test(normalized))) continue
291
- found.push({
292
- name: definition.name,
293
- category: definition.category,
294
- subcategory: definition.subcategory,
295
- })
296
- names.add(definition.name)
297
- }
298
- for (const [name, pattern] of CONTEXTUAL_SKILL_PATTERNS) {
299
- if (names.has(name) || !pattern.test(normalized)) continue
300
- const meta = SKILL_META[name]
301
- if (!meta) continue
302
- found.push({ name, ...meta })
303
- names.add(name)
304
- }
305
- return found
306
- }
307
-
308
- export function extractSkillNames(text) {
309
- return extractSkillDetails(text).map(({ name }) => name)
310
- }
311
-
312
- export function getSkillMeta(name) {
313
- const canonical = canonicalSkillName(name)
314
- return canonical ? SKILL_META[canonical] : undefined
315
- }
1
+ // These canonical labels are ordinary words or one-letter tokens. Matching the
2
+ // label itself would create noisy results; only their explicit aliases are safe.
3
+ const AMBIGUOUS_CANONICALS = new Set(['C', 'Go', 'Make', 'REST', 'Spring'])
4
+
5
+ const group = (category, subcategory, entries) =>
6
+ entries.map(([name, aliases = []]) => ({
7
+ name,
8
+ category,
9
+ subcategory,
10
+ aliases: [...(AMBIGUOUS_CANONICALS.has(name) ? [] : [name]), ...aliases],
11
+ }))
12
+
13
+ // Shared by Nitro enrichment and the browser-only ATS scorer. Keep canonical
14
+ // labels readable; aliases hold abbreviations, spelling variants and local terms.
15
+ export const SKILL_CATALOG = [
16
+ ...group('IT', 'Frontend', [
17
+ ['HTML', ['html5']], ['CSS', ['css3']], ['Sass', ['scss']], ['Less', ['less css']],
18
+ ['JavaScript', ['ecmascript', 'es6', 'js developer', 'js framework']], ['TypeScript', ['type script']],
19
+ ['React', ['react.js', 'reactjs']], ['React Native', ['react-native']],
20
+ ['Vue', ['vue.js', 'vuejs']], ['Nuxt', ['nuxt.js', 'nuxtjs']],
21
+ ['Next.js', ['nextjs', 'next js']], ['Angular', ['angular.js', 'angularjs']],
22
+ ['Svelte'], ['SvelteKit', ['svelte kit']], ['Astro', ['astro.js']], ['jQuery'],
23
+ ['Knockout', ['knockout.js', 'knockout js']], ['AlpineJS', ['alpine.js', 'alpine js']],
24
+ ['HTMX'], ['Web Components', ['custom elements']], ['Tailwind', ['tailwindcss', 'tailwind css']],
25
+ ['Bootstrap'], ['Material UI', ['mui', '@mui/material']], ['Ant Design', ['antd']],
26
+ ['Vuetify'], ['Nuxt UI'], ['Quasar'], ['PrimeVue', ['prime vue']], ['Storybook'],
27
+ ['Redux'], ['Redux Toolkit', ['rtk', '@reduxjs/toolkit']], ['Zustand'], ['MobX'],
28
+ ['Pinia'], ['Vuex'], ['RxJS'], ['React Query', ['tanstack query', '@tanstack/react-query']],
29
+ ['Axios'], ['Fetch API', ['window.fetch']], ['Webpack'], ['Vite'], ['Rollup'], ['Babel'],
30
+ ['ESLint'], ['Prettier'], ['Stylelint'], ['npm'], ['Yarn'], ['pnpm'],
31
+ ['Freemarker'], ['Velocity'], ['Liquid'], ['Nunjucks'],
32
+ ['Responsive Design', ['responsive web design', 'responsive layout', 'адаптивная верстка', 'адаптивний дизайн']],
33
+ ['Cross-browser Development', ['cross-browser', 'cross browser', 'кроссбраузерность']],
34
+ ['Accessibility', ['web accessibility', 'wcag', 'a11y']], ['BEM', ['бэм']],
35
+ ['SEO', ['search engine optimization', 'поисковая оптимизация']],
36
+ ['Technical SEO', ['техническое seo']], ['i18n', ['internationalization', 'localization', 'локализация']],
37
+ ]),
38
+ ...group('IT', 'Backend', [
39
+ ['Node.js', ['nodejs', 'node js']], ['Express', ['express.js', 'expressjs']],
40
+ ['NestJS', ['nest.js', 'nest js']], ['Fastify'], ['Python', ['python3']], ['Django'],
41
+ ['Flask'], ['FastAPI', ['fast api']], ['PHP'], ['Laravel'], ['Symfony'], ['WordPress'],
42
+ ['Java', ['java ee', 'jakarta ee']], ['Spring', ['spring framework']], ['Spring Boot', ['springboot']],
43
+ ['Hibernate'], ['Maven'], ['Gradle'], ['Kotlin'], ['Ktor'], ['C#', ['c sharp', 'csharp']],
44
+ ['.NET', ['dotnet', 'dot net']], ['ASP.NET', ['asp net', 'asp.net core']],
45
+ ['Entity Framework', ['entityframework', 'ef core']], ['Tomcat'], ['Go', ['golang', 'go language']],
46
+ ['Rust', ['rustlang']], ['C', ['c programming', 'c language']], ['C++', ['cpp', 'c plus plus']],
47
+ ['Ruby'], ['Ruby on Rails', ['rails framework']], ['Scala'], ['Elixir'], ['Erlang'],
48
+ ['OOP', ['object-oriented programming', 'object oriented programming']], ['SOLID', ['solid principles']],
49
+ ]),
50
+ ...group('IT', 'API & Architecture', [
51
+ ['REST', ['rest api', 'restful api', 'rest services']], ['GraphQL'],
52
+ ['Apollo GraphQL', ['apollo client', 'apollo server']], ['gRPC'], ['WebSocket', ['websockets', 'web socket']],
53
+ ['Socket.IO', ['socketio']], ['API Integration', ['api integrations', 'third-party integration', 'интеграция api']],
54
+ ['Webhooks', ['webhook']], ['SOAP', ['soap api', 'soap web service']], ['Microservices', ['micro services']],
55
+ ['PWA', ['progressive web app']], ['SPA', ['single-page application']],
56
+ ['SSR', ['server-side rendering']], ['SSG', ['static site generation']], ['JSON'], ['XML'], ['YAML', ['yml']],
57
+ ]),
58
+ ...group('IT', 'Mobile & Desktop', [
59
+ ['Android'], ['Android Studio'], ['Jetpack Compose'], ['Android SDK'], ['iOS'], ['Swift'], ['Objective-C', ['objective c']],
60
+ ['SwiftUI'], ['UIKit'], ['Xcode'], ['Flutter'], ['Dart'], ['Electron', ['electron.js', 'electronjs']],
61
+ ['Tauri'], ['Qt'], ['WPF'], ['WinForms'], ['Unity', ['unity3d']], ['Unreal Engine', ['ue4', 'ue5']], ['Godot'],
62
+ ]),
63
+ ...group('IT', 'Databases', [
64
+ ['SQL'], ['NoSQL', ['no sql', 'no-sql']], ['PostgreSQL', ['postgres', 'psql']], ['MySQL'], ['MariaDB', ['maria db']], ['SQLite'],
65
+ ['Microsoft SQL Server', ['mssql', 'sql server']], ['Oracle Database', ['oracle db']],
66
+ ['MongoDB', ['mongo db', 'mongo']], ['Redis'], ['Elasticsearch', ['elastic search']], ['OpenSearch'],
67
+ ['ClickHouse', ['click house']], ['DynamoDB'], ['Firestore'], ['Firebase'], ['Neo4j'],
68
+ ['Supabase'], ['Snowflake'], ['BigQuery'], ['Prisma', ['prisma orm']], ['TypeORM'], ['Sequelize'], ['SQLAlchemy'],
69
+ ]),
70
+ ...group('IT', 'DevOps & Cloud', [
71
+ ['Git'], ['GitHub'], ['GitLab'], ['Bitbucket'], ['DevOps'], ['Docker'], ['Docker Compose', ['docker-compose']],
72
+ ['Kubernetes', ['k8s']], ['Helm'], ['Terraform'], ['Ansible'], ['Jenkins'],
73
+ ['GitHub Actions'], ['GitLab CI', ['gitlab ci/cd']], ['CircleCI'], ['TeamCity'], ['ArgoCD', ['argo cd']],
74
+ ['CI/CD', ['ci cd', 'cicd', 'continuous integration', 'continuous delivery']],
75
+ ['AWS', ['amazon web services']], ['Azure', ['microsoft azure']], ['Google Cloud', ['gcp', 'google cloud platform']],
76
+ ['Cloudflare'], ['Vercel'], ['Netlify'], ['Nginx'], ['Apache'], ['Linux'], ['Ubuntu'], ['Windows Server'],
77
+ ['Bash', ['shell scripting']], ['PowerShell'], ['SSH'], ['Active Directory'], ['VMware'], ['Grafana'],
78
+ ['Prometheus'], ['Zabbix'], ['Sentry'], ['ELK', ['elastic stack']], ['Kibana'],
79
+ ]),
80
+ ...group('IT', 'QA & Security', [
81
+ ['Jest'], ['Vitest'], ['Cypress'], ['Playwright'], ['Selenium'], ['Appium'], ['Postman'],
82
+ ['Swagger', ['openapi']], ['TestRail'], ['TDD', ['test-driven development']], ['BDD', ['behavior-driven development']],
83
+ ['Manual Testing', ['ручное тестирование']],
84
+ ['Test Automation', ['automation testing', 'автоматизация тестирования']],
85
+ ['Regression Testing', ['регрессионное тестирование']], ['Unit Testing', ['unit tests']],
86
+ ['Integration Testing'], ['E2E Testing', ['end-to-end testing']], ['Cybersecurity', ['information security']],
87
+ ['SIEM'], ['Splunk'], ['OAuth', ['oauth2']], ['JWT'], ['OWASP'], ['Penetration Testing', ['pentest', 'пентест']],
88
+ ]),
89
+ ...group('Data', 'Analytics & AI', [
90
+ ['Data Analysis', ['analytics', 'data analytics', 'анализ данных']], ['Business Analytics'], ['Commercial Analytics'],
91
+ ['Pandas'], ['NumPy'], ['Jupyter'], ['Power BI', ['powerbi']], ['Tableau'], ['Looker'], ['Qlik'],
92
+ ['Apache Spark', ['pyspark']], ['Hadoop'], ['Airflow'], ['Kafka'], ['RabbitMQ'], ['ETL'],
93
+ ['Data Warehouse'], ['Data Science'], ['Machine Learning', ['машинное обучение']], ['Deep Learning'], ['TensorFlow'],
94
+ ['PyTorch'], ['Scikit-learn', ['sklearn']], ['NLP'], ['Computer Vision'], ['LLM', ['large language models']],
95
+ ['Generative AI', ['genai', 'генеративный ии']], ['OpenAI'], ['LangChain'], ['RAG'], ['AI Tools', ['ai tools']],
96
+ ]),
97
+ ...group('Office', 'Productivity', [
98
+ ['Microsoft Office', ['ms office', 'мс офис']], ['Microsoft 365', ['office 365', 'm365']],
99
+ ['Microsoft Word', ['ms word', 'ворд']],
100
+ ['Microsoft PowerPoint', ['ms powerpoint', 'powerpoint']], ['Microsoft Outlook', ['ms outlook']],
101
+ ['Microsoft Access', ['ms access']], ['Microsoft Visio', ['ms visio']], ['Microsoft Project', ['ms project']],
102
+ ['Microsoft Teams', ['ms teams']], ['SharePoint'], ['OneDrive'], ['Google Workspace', ['g suite']],
103
+ ['Google Sheets'], ['Google Docs'], ['Google Slides'], ['LibreOffice'],
104
+ ]),
105
+ ...group('Office', 'Spreadsheets', [
106
+ ['Microsoft Excel', ['ms excel', 'excel', 'эксель']], ['Excel Pivot Tables', ['pivot tables', 'сводные таблицы']],
107
+ ['VLOOKUP', ['впр excel']], ['XLOOKUP'],
108
+ ['Power Query', ['powerquery']], ['Power Pivot', ['powerpivot']], ['Excel Macros', ['макросы excel']], ['VBA'],
109
+ ]),
110
+ ...group('Design', 'UI & UX', [
111
+ ['Figma'], ['Adobe Photoshop', ['photoshop']], ['Adobe Illustrator', ['illustrator']],
112
+ ['Adobe XD'], ['Sketch', ['sketch app']], ['UI Design'], ['UX Design'], ['Design Systems'], ['Prototyping'],
113
+ ]),
114
+ ...group('Business', 'Management', [
115
+ ['Business Strategy'], ['Strategic Planning'], ['Corporate Planning'], ['Business Planning'],
116
+ ['Corporate Strategy'], ['Commercial Strategy'], ['Management Consulting'], ['M&A', ['mergers and acquisitions']],
117
+ ['Project Management'], ['Portfolio Management'],
118
+ ['Corporate Governance', ['group governance']], ['Business Process'], ['Process Improvement', ['process improvements']],
119
+ ['Operational Efficiency'], ['Operations'], ['Stakeholder Management'], ['Negotiation'],
120
+ ['Cross-functional Collaboration', ['cross-functional', 'cross functionally']], ['KPI', ['key performance indicators']],
121
+ ['Dashboards'], ['Forecasting'], ['Risk Management'], ['Resource Planning'], ['Gantt Charts'],
122
+ ['Agile'], ['Scrum'], ['Kanban'], ['Jira'], ['Confluence'], ['SDLC'],
123
+ ]),
124
+ ...group('Finance', 'Accounting Software', [
125
+ ['1C', ['1с', '1c accounting', '1с бухгалтерия']], ['SAP', ['sap erp', 'sap fico']],
126
+ ['SONO', ['соно']], ['M.E.Doc', ['medoc', 'медок']], ['Didox'], ['MySoliq', ['my soliq']],
127
+ ['ProZorro', ['прозорро']], ['SAGA', ['saga accounting', 'saga software']],
128
+ ]),
129
+ ...group('Finance', 'Accounting & Banking', [
130
+ ['Accounting', ['бухгалтерский учет', 'бухгалтерський облік']],
131
+ ['Financial Analysis'], ['P&L', ['profit and loss']], ['Budgeting'], ['Management Accounting'],
132
+ ['Tax Accounting'], ['Payroll'], ['IFRS', ['мсфо']], ['GAAP'], ['Audit'], ['Treasury'],
133
+ ['Investment Banking'], ['Credit Analysis'], ['AML', ['anti-money laundering']], ['KYC', ['know your customer']],
134
+ ]),
135
+ ...group('Business Systems', 'CRM & ERP', [
136
+ ['Microsoft Dynamics', ['dynamics 365']], ['HubSpot', ['hubspot crm']],
137
+ ['Bitrix24', ['битрикс24']], ['amoCRM', ['амо срм']], ['Smartup', ['smart up']], ['Odoo'], ['Oracle ERP'],
138
+ ]),
139
+ ...group('Sales', 'Sales & Customer Service', [
140
+ ['Sales', ['продажи', 'сотув', 'savdo']], ['Sales Pipeline'], ['Lead Generation', ['лидогенерация']],
141
+ ['Cold Calling', ['холодные звонки']], ['Account Management'], ['Key Account Management'],
142
+ ['CRM'], ['Customer Service', ['обслуживание клиентов']], ['Customer Support', ['поддержка клиентов']],
143
+ ['Call Center', ['колл-центр']], ['Client Communication', ['переписка с клиентами', 'мижозлар билан ёзишмалар']],
144
+ ['Complaint Handling'], ['Onboarding', ['employee onboarding', 'courier onboarding']], ['Conversion Funnel'],
145
+ ]),
146
+ ...group('Sales', 'CRM', [
147
+ ['Salesforce', ['salesforce crm']],
148
+ ]),
149
+ ...group('Marketing', 'Digital Marketing', [
150
+ ['Digital Marketing'], ['Content Marketing'], ['Social Media Marketing', ['smm']], ['Email Marketing'],
151
+ ['Google Ads', ['google adwords']], ['Meta Ads', ['facebook ads']], ['Google Analytics', ['ga4']],
152
+ ['Google Tag Manager', ['gtm']], ['Marketing Automation'], ['Copywriting', ['копирайтинг']],
153
+ ['Market Research'], ['A/B Testing', ['ab testing']], ['Conversion Rate Optimization', ['cro']],
154
+ ]),
155
+ ...group('HR', 'Recruiting & People', [
156
+ ['Recruitment', ['recruiting', 'подбор персонала']], ['Candidate Sourcing'], ['Boolean Search'],
157
+ ['LinkedIn Recruiter'], ['Interviewing', ['проведение собеседований']], ['HR Administration'],
158
+ ['HRIS'], ['Workday HCM'], ['Greenhouse ATS'], ['BambooHR'], ['SAP SuccessFactors'],
159
+ ]),
160
+ ...group('Legal', 'Legal & Compliance', [
161
+ ['Legal Research', ['правовой анализ']], ['Contract Drafting', ['составление договоров']],
162
+ ['Contract Management', ['договорная работа']], ['Due Diligence'], ['Corporate Law'], ['Commercial Law'],
163
+ ['Labor Law', ['трудовое право']], ['Litigation'], ['Compliance', ['комплаенс']], ['GDPR'],
164
+ ]),
165
+ ...group('Administration', 'Office Work', [
166
+ ['Document Management', ['документооборот']], ['Electronic Document Management', ['эдо']],
167
+ ['Records Management', ['делопроизводство']], ['Business Correspondence', ['деловая переписка']],
168
+ ['Data Entry', ['ввод данных']], ['Office Administration'], ['Calendar Management'], ['Meeting Coordination'],
169
+ ]),
170
+ ...group('Logistics', 'Supply Chain & Transport', [
171
+ ['Logistics', ['логистика']], ['Supply Chain', ['управление цепями поставок']], ['Procurement', ['закупки']],
172
+ ['Strategic Sourcing'], ['Tendering', ['тендеры']], ['Vendor Management'], ['Inventory Management'],
173
+ ['Warehouse Management'], ['WMS'], ['TMS'], ['Incoterms'], ['Customs Clearance'], ['Import/Export'],
174
+ ['Freight Forwarding'], ['Route Planning', ['маршрутизация']], ['Last-mile Logistics'],
175
+ ['Driving License B', ['права категории b']], ['Driving License C', ['права категории c']],
176
+ ['Forklift', ['водитель погрузчика']], ['Barcode Scanner', ['тсд', 'терминал сбора данных']],
177
+ ]),
178
+ ...group('Retail & Hospitality', 'Retail, POS & HoReCa', [
179
+ ['POS', ['point of sale']], ['R-Keeper', ['rkeeper']], ['iiko', ['айко ресторан']],
180
+ ['Poster POS', ['poster restaurant']], ['MICROS', ['oracle micros']], ['Cash Register', ['работа с кассой']],
181
+ ['Merchandising', ['мерчандайзинг']], ['Stocktaking', ['инвентаризация']], ['HACCP', ['хассп']],
182
+ ['Hotel Management'], ['Opera PMS', ['oracle hospitality opera']], ['Restaurant Management'],
183
+ ]),
184
+ ...group('Engineering', 'CAD', [
185
+ ['AutoCAD', ['autocad civil 3d']], ['SolidWorks'], ['Revit'], ['ArchiCAD'], ['SketchUp'],
186
+ ]),
187
+ ...group('Engineering', 'Manufacturing', [
188
+ ['CNC', ['чпу']], ['PLC', ['плк']], ['SCADA', ['асу тп']], ['TIA Portal'], ['Siemens S7'],
189
+ ['Electrical Engineering'], ['Mechanical Engineering'], ['Mechatronics'], ['Welding', ['сварка']],
190
+ ['Lean Manufacturing', ['бережливое производство']], ['Six Sigma'], ['Kaizen'], ['5S'],
191
+ ['ISO 9001', ['iso9001']], ['ISO 14001'], ['ISO 45001'], ['Quality Management'], ['HSE', ['охрана труда']],
192
+ ]),
193
+ ...group('Construction', 'Construction & Design', [
194
+ ['Construction Management'], ['Quantity Surveying'], ['Cost Estimation', ['сметное дело', 'составление смет']],
195
+ ['Project Documentation'], ['Technical Drawings', ['технические чертежи']], ['BIM'],
196
+ ]),
197
+ ...group('Healthcare', 'Medical & Pharma', [
198
+ ['EMR', ['electronic medical record']], ['EHR', ['electronic health record']],
199
+ ['Medical Records', ['медицинская документация']], ['GMP'], ['GLP'],
200
+ ['Good Clinical Practice', ['gcp clinical']], ['PCR', ['пцр']], ['ELISA', ['ифа анализ']],
201
+ ['Laboratory Equipment'], ['Pharmacovigilance'], ['Clinical Research'], ['Patient Care'],
202
+ ]),
203
+ ...group('Education', 'Teaching & Learning', [
204
+ ['Teaching', ['преподавание', 'викладання']], ['Curriculum Development'], ['Lesson Planning'],
205
+ ['Classroom Management'], ['Moodle'], ['Google Classroom'], ['LMS', ['learning management system']],
206
+ ]),
207
+ ...group('Aviation', 'Aviation Operations', [
208
+ ['Airport Operations'], ['Flight Operations'], ['Ground Handling'], ['Aviation Safety'],
209
+ ['IATA'], ['ICAO'], ['Amadeus'], ['Sabre'],
210
+ ]),
211
+ ...group('E-commerce', 'Marketplaces', [
212
+ ['E-commerce', ['ecommerce', 'электронная коммерция', 'онлайн савдо']], ['Shopify'], ['Magento'],
213
+ ['OpenCart'], ['Amazon Seller Central'], ['Wildberries', ['вайлдберриз']], ['Ozon'],
214
+ ['Kaspi', ['kaspi marketplace', 'kaspi магазин']], ['Uzum', ['uzum market']],
215
+ ['Marketplace Management', ['ведение маркетплейсов']], ['Product Cards', ['карточки товаров']],
216
+ ]),
217
+ ...group('Automation', 'Low Code', [
218
+ ['Automation'], ['Zapier'], ['Make', ['make.com', 'integromat']], ['n8n'], ['Power Automate'], ['Power Apps'],
219
+ ['UiPath'], ['Automation Anywhere'], ['RPA', ['robotic process automation']],
220
+ ]),
221
+ ...group('Professional', 'Soft Skills', [
222
+ ['Communication', ['communication skills', 'коммуникация', 'коммуникабельность', 'коммуникация кўникмалари']],
223
+ ['Teamwork', ['team player', 'работа в команде', 'командная работа', 'жамоа билан']],
224
+ ['Leadership'], ['Time Management'], ['Problem Solving', ['решение проблем']], ['Critical Thinking'],
225
+ ['Analytical Thinking'], ['Multitasking', ['многозадачность']], ['Attention to Detail'],
226
+ ['Presentation Skills'], ['Responsibility', ['ответственность', 'масъулиятлилик']],
227
+ ['Adaptability', ['адаптивность', 'мослашувчан']], ['Fast Learner', ['быстрая обучаемость', 'тез ўрганувчи']],
228
+ ['Goal Orientation', ['стремление к цели', 'мақсадларга эришиш']],
229
+ ]),
230
+ ]
231
+
232
+ export const SKILL_KEYWORDS = Object.freeze(
233
+ Object.fromEntries(SKILL_CATALOG.map(({ name, aliases }) => [name, Object.freeze([...new Set(aliases)])])),
234
+ )
235
+
236
+ export const SKILL_META = Object.freeze(
237
+ Object.fromEntries(SKILL_CATALOG.map(({ name, category, subcategory }) => [name, { category, subcategory }])),
238
+ )
239
+
240
+ export function normalizeSkillText(value) {
241
+ return value
242
+ .normalize('NFKC')
243
+ .toLocaleLowerCase('en')
244
+ .replace(/[‘’`´]/g, "'")
245
+ .replace(/[‐‑‒–—]/g, '-')
246
+ .replace(/\s+/g, ' ')
247
+ .trim()
248
+ }
249
+
250
+ export function escapeRegex(value) {
251
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
252
+ }
253
+
254
+ export function buildSkillRegex(alias) {
255
+ const normalized = normalizeSkillText(alias)
256
+ const pattern = escapeRegex(normalized).replace(/\s+/g, '\\s+')
257
+ // Unicode-aware boundaries prevent `react` matching `reactive`, `reaction`
258
+ // or `interaction`, while still handling C++, C#, .NET, 1C and Vue.js.
259
+ return new RegExp(`(?:^|[^\\p{L}\\p{N}_])${pattern}(?=$|[^\\p{L}\\p{N}_])`, 'iu')
260
+ }
261
+
262
+ const CONTEXTUAL_SKILL_PATTERNS = Object.freeze([
263
+ ['Corporate Governance', /\b(?:group|company|corporate) governance\b/i],
264
+ ['Data Analysis', /\banalys(?:e|is|ing)\b[^.;\n]{0,60}\b(?:data|metrics?|funnels?)\b|\b(?:data|metrics?|funnels?)\b[^.;\n]{0,60}\banalys(?:e|is|ing)\b/i],
265
+ ['Conversion Funnel', /\b(?:conversion|onboarding|registration)[- ](?:to[- ]\w+\s+)?funnel\b|\bonboarding funnel\b/i],
266
+ ['Cross-functional Collaboration', /\bcross[- ]function(?:al|ally)\b/i],
267
+ ])
268
+
269
+ const COMPILED_SKILLS = SKILL_CATALOG.map((definition) => ({
270
+ definition,
271
+ patterns: [...new Set(definition.aliases.map(normalizeSkillText))].map(buildSkillRegex),
272
+ }))
273
+
274
+ const CANONICAL_BY_ALIAS = new Map()
275
+ for (const { name, aliases } of SKILL_CATALOG) {
276
+ CANONICAL_BY_ALIAS.set(normalizeSkillText(name), name)
277
+ for (const alias of aliases) CANONICAL_BY_ALIAS.set(normalizeSkillText(alias), name)
278
+ }
279
+
280
+ export function canonicalSkillName(value) {
281
+ const normalized = normalizeSkillText(value)
282
+ return CANONICAL_BY_ALIAS.get(normalized) ?? extractSkillNames(normalized)[0]
283
+ }
284
+
285
+ export function extractSkillDetails(text) {
286
+ const normalized = normalizeSkillText(text)
287
+ const found = []
288
+ const names = new Set()
289
+ for (const { definition, patterns } of COMPILED_SKILLS) {
290
+ if (!patterns.some((pattern) => pattern.test(normalized))) continue
291
+ found.push({
292
+ name: definition.name,
293
+ category: definition.category,
294
+ subcategory: definition.subcategory,
295
+ })
296
+ names.add(definition.name)
297
+ }
298
+ for (const [name, pattern] of CONTEXTUAL_SKILL_PATTERNS) {
299
+ if (names.has(name) || !pattern.test(normalized)) continue
300
+ const meta = SKILL_META[name]
301
+ if (!meta) continue
302
+ found.push({ name, ...meta })
303
+ names.add(name)
304
+ }
305
+ return found
306
+ }
307
+
308
+ export function extractSkillNames(text) {
309
+ return extractSkillDetails(text).map(({ name }) => name)
310
+ }
311
+
312
+ export function getSkillMeta(name) {
313
+ const canonical = canonicalSkillName(name)
314
+ return canonical ? SKILL_META[canonical] : undefined
315
+ }