@whiteslove/parsing-lexicon 0.2.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.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/index.d.ts +375 -0
  4. package/package.json +75 -0
  5. package/src/central-asia-locations.js +211 -0
  6. package/src/central-asia.js +233 -0
  7. package/src/contact.d.ts +44 -0
  8. package/src/contact.js +159 -0
  9. package/src/countries.js +175 -0
  10. package/src/country-context.d.ts +10 -0
  11. package/src/country-context.js +22 -0
  12. package/src/currency.d.ts +14 -0
  13. package/src/currency.js +66 -0
  14. package/src/geo.js +169 -0
  15. package/src/geography-central-asia.js +42 -0
  16. package/src/geography-detection.d.ts +14 -0
  17. package/src/geography-detection.js +64 -0
  18. package/src/geography-display.d.ts +13 -0
  19. package/src/geography-display.js +113 -0
  20. package/src/geography.js +210 -0
  21. package/src/hiring-advanced.js +147 -0
  22. package/src/hiring-candidate-fields.d.ts +9 -0
  23. package/src/hiring-candidate-fields.js +92 -0
  24. package/src/hiring-context.d.ts +64 -0
  25. package/src/hiring-context.js +412 -0
  26. package/src/hiring-language-extensions.d.ts +19 -0
  27. package/src/hiring-language-extensions.js +139 -0
  28. package/src/hiring-languages.js +135 -0
  29. package/src/hiring-location-fields.d.ts +3 -0
  30. package/src/hiring-location-fields.js +53 -0
  31. package/src/hiring-professions-ro.js +191 -0
  32. package/src/hiring-professions.js +437 -0
  33. package/src/hiring-requirements.d.ts +16 -0
  34. package/src/hiring-requirements.js +170 -0
  35. package/src/hiring-salary-context.d.ts +27 -0
  36. package/src/hiring-salary-context.js +76 -0
  37. package/src/hiring-semantics.d.ts +29 -0
  38. package/src/hiring-semantics.js +218 -0
  39. package/src/hiring-skills.d.ts +21 -0
  40. package/src/hiring-skills.js +315 -0
  41. package/src/hiring-source-aliases.d.ts +32 -0
  42. package/src/hiring-source-aliases.js +186 -0
  43. package/src/hiring-source-semantics.d.ts +31 -0
  44. package/src/hiring-source-semantics.js +293 -0
  45. package/src/hiring-temporal.d.ts +15 -0
  46. package/src/hiring-temporal.js +67 -0
  47. package/src/hiring-vacancy-fields.d.ts +5 -0
  48. package/src/hiring-vacancy-fields.js +23 -0
  49. package/src/hiring-work-semantics.d.ts +34 -0
  50. package/src/hiring-work-semantics.js +72 -0
  51. package/src/hiring.js +180 -0
  52. package/src/housing-address.d.ts +18 -0
  53. package/src/housing-address.js +210 -0
  54. package/src/housing-context.d.ts +36 -0
  55. package/src/housing-context.js +183 -0
  56. package/src/housing-features.js +30 -0
  57. package/src/housing-intent.d.ts +9 -0
  58. package/src/housing-intent.js +132 -0
  59. package/src/housing-listing-fields.js +131 -0
  60. package/src/housing-money.d.ts +7 -0
  61. package/src/housing-money.js +102 -0
  62. package/src/housing-source-aliases.d.ts +8 -0
  63. package/src/housing-source-aliases.js +51 -0
  64. package/src/housing-structured.d.ts +55 -0
  65. package/src/housing-structured.js +219 -0
  66. package/src/housing.js +200 -0
  67. package/src/index.js +44 -0
  68. package/src/kz-location-extensions.js +307 -0
  69. package/src/landmarks.js +21 -0
  70. package/src/lexicon-core.js +58 -0
  71. package/src/location-merge.js +106 -0
  72. package/src/locations.js +456 -0
  73. package/src/money-core.d.ts +10 -0
  74. package/src/money-core.js +81 -0
  75. package/src/money-lexicon.d.ts +5 -0
  76. package/src/money-lexicon.js +79 -0
  77. package/src/money.js +154 -0
  78. package/src/normalization.js +384 -0
  79. package/src/odesa-metropolitan.js +145 -0
  80. package/src/romania-geography.js +47 -0
  81. package/src/tashkent-colloquial.js +72 -0
  82. package/src/tashkent-housing-geography.d.ts +38 -0
  83. package/src/tashkent-housing-geography.js +211 -0
  84. package/src/tashkent-pois.js +215 -0
  85. package/src/tashkent-residential-complexes.js +272 -0
  86. package/src/ua-location-extensions-major.js +118 -0
  87. package/src/ua-location-extensions-metro.js +9 -0
  88. package/src/ua-location-extensions-regional.js +246 -0
  89. package/src/ua-secondary-cities.d.ts +2 -0
  90. package/src/ua-secondary-cities.js +57 -0
  91. package/src/ukraine.js +75 -0
  92. package/src/uz-location-extensions.js +259 -0
@@ -0,0 +1,437 @@
1
+ import { aliasesToRegex, normalizeForMatch } from './normalization.js';
2
+ import { ROMANIAN_GROUP_ALIASES, ROMANIAN_PROFESSION_ALIASES, ROMANIAN_SENIORITY_ALIASES } from './hiring-professions-ro.js';
3
+
4
+ const GROUP_DEFINITIONS = Object.freeze([
5
+ ['software_development', 'engineering', ['software development', 'разработка', 'программирование', 'розробка', 'dasturlash', 'бағдарламалау']],
6
+ ['quality_assurance', 'engineering', ['quality assurance', 'qa', 'тестирование', 'тестування']],
7
+ ['infrastructure', 'engineering', ['infrastructure', 'devops', 'platform engineering', 'инфраструктура', 'системное администрирование']],
8
+ ['data', 'engineering', ['data', 'analytics', 'данные', 'аналитика', 'ma’lumotlar', 'деректер']],
9
+ ['information_security', 'engineering', ['information security', 'cybersecurity', 'информационная безопасность', 'кибербезопасность']],
10
+ ['design', 'creative', ['design', 'дизайн', 'дизайн']],
11
+ ['product', 'management', ['product', 'продукт', 'продакт']],
12
+ ['project_management', 'management', ['project management', 'управление проектами', 'керування проєктами']],
13
+ ['sales', 'commercial', ['sales', 'продажи', 'продажі', 'sotuv', 'сату']],
14
+ ['marketing', 'commercial', ['marketing', 'маркетинг']],
15
+ ['finance', 'business', ['finance', 'accounting', 'финансы', 'бухгалтерия', 'фінанси']],
16
+ ['human_resources', 'business', ['human resources', 'hr', 'recruitment', 'персонал', 'рекрутинг']],
17
+ ['customer_support', 'operations', ['customer support', 'support', 'поддержка', 'підтримка', 'qo‘llab-quvvatlash']],
18
+ ['administration', 'operations', ['administration', 'office', 'администрация', 'офис']],
19
+ ['logistics', 'operations', ['logistics', 'warehouse', 'логистика', 'склад']],
20
+ ['retail', 'commercial', ['retail', 'магазин', 'розница', 'ритейл']],
21
+ ['hospitality', 'service', ['hospitality', 'horeca', 'ресторан', 'кафе', 'отель']],
22
+ ['medicine', 'healthcare', ['medicine', 'healthcare', 'медицина', 'медицина']],
23
+ ['education', 'education', ['education', 'teaching', 'образование', 'освіта']],
24
+ ['construction', 'trades', ['construction', 'строительство', 'будівництво']],
25
+ ['manufacturing', 'trades', ['manufacturing', 'production', 'производство', 'виробництво']],
26
+ ['transport', 'operations', ['transport', 'driving', 'транспорт', 'водители']],
27
+ ['security', 'service', ['security', 'охрана', 'күзет']],
28
+ ['legal', 'business', ['legal', 'law', 'юристы', 'право', 'юридический']],
29
+ ['media_content', 'creative', ['media', 'content', 'контент', 'медиа']],
30
+ ['beauty_wellness', 'service', ['beauty', 'wellness', 'красота', 'бьюти']],
31
+ ['agriculture', 'trades', ['agriculture', 'farm', 'сельское хозяйство', 'агро']],
32
+ ]);
33
+
34
+ const groupAliases = (canonical, aliases) => [...new Set([...aliases, ...(ROMANIAN_GROUP_ALIASES[canonical] || [])])];
35
+ const GROUP_META = new Map(GROUP_DEFINITIONS.map(([canonical, family, aliases]) => [canonical, { family, aliases: groupAliases(canonical, aliases) }]));
36
+
37
+ const rows = [
38
+ // Software development
39
+ ['software_developer','software_development',['software developer','software developers','software engineer','software engineers','programmer','programmers','программист','программисты','разработчик ПО','разработчики ПО','розробник ПЗ','розробники ПЗ','dasturchi','бағдарламашы'],['developer','developers','разработчик','разработчики','разработчиками']],
40
+ ['frontend_developer','software_development',['frontend developer','front-end developer','frontend engineer','фронтенд разработчик','фронтендер','фронтенд розробник','frontend dasturchi','frontend әзірлеуші']],
41
+ ['backend_developer','software_development',['backend developer','back-end developer','backend engineer','бэкенд разработчик','бекенд розробник','backend dasturchi','backend әзірлеуші']],
42
+ ['fullstack_developer','software_development',['fullstack developer','full-stack developer','full stack developer','фулстек разработчик','фулстек розробник','fullstack dasturchi']],
43
+ ['mobile_developer','software_development',['mobile developer','mobile engineer','мобильный разработчик','мобільний розробник']],
44
+ ['ios_developer','software_development',['ios developer','ios engineer','swift developer','ios разработчик']],
45
+ ['android_developer','software_development',['android developer','android engineer','kotlin android developer','android разработчик']],
46
+ ['flutter_developer','software_development',['flutter developer','flutter engineer','flutter разработчик']],
47
+ ['react_native_developer','software_development',['react native developer','react-native developer','react native engineer']],
48
+ ['game_developer','software_development',['game developer','game programmer','разработчик игр','геймдев разработчик']],
49
+ ['unity_developer','software_development',['unity developer','unity3d developer','unity разработчик']],
50
+ ['unreal_developer','software_development',['unreal developer','unreal engine developer','ue developer']],
51
+ ['embedded_developer','software_development',['embedded developer','embedded engineer','embedded software engineer','встраиваемые системы разработчик']],
52
+ ['firmware_engineer','software_development',['firmware engineer','firmware developer','разработчик прошивок']],
53
+ ['desktop_developer','software_development',['desktop developer','desktop application developer','разработчик desktop приложений']],
54
+ ['blockchain_developer','software_development',['blockchain developer','web3 developer','smart contract developer','блокчейн разработчик']],
55
+ ['solutions_architect','software_development',['solutions architect','solution architect','архитектор решений']],
56
+ ['software_architect','software_development',['software architect','application architect','архитектор ПО']],
57
+ ['integration_engineer','software_development',['integration engineer','integration developer','инженер по интеграциям']],
58
+ ['api_developer','software_development',['api developer','api engineer','разработчик api']],
59
+ ['crm_developer','software_development',['crm developer','crm разработчик']],
60
+ ['erp_developer','software_development',['erp developer','erp разработчик']],
61
+
62
+ // QA
63
+ ['qa_engineer','quality_assurance',['qa engineer','quality assurance engineer','software tester','тестировщик','qa инженер','тестувальник','testchi'],['qa']],
64
+ ['manual_qa_engineer','quality_assurance',['manual qa','manual qa engineer','manual tester','ручной тестировщик','мануальный тестировщик']],
65
+ ['qa_automation_engineer','quality_assurance',['qa automation engineer','automation qa','test automation engineer','автоматизатор тестирования','qa automation']],
66
+ ['performance_qa_engineer','quality_assurance',['performance test engineer','performance qa','load test engineer','инженер нагрузочного тестирования']],
67
+ ['qa_lead','quality_assurance',['qa lead','test lead','руководитель qa','лид тестирования']],
68
+
69
+ // Infrastructure
70
+ ['devops_engineer','infrastructure',['devops engineer','devops','девопс инженер','devops muhandis']],
71
+ ['sre_engineer','infrastructure',['site reliability engineer','sre engineer','sre','инженер надежности']],
72
+ ['platform_engineer','infrastructure',['platform engineer','platform engineering','инженер платформы']],
73
+ ['cloud_engineer','infrastructure',['cloud engineer','cloud infrastructure engineer','облачный инженер']],
74
+ ['system_administrator','infrastructure',['system administrator','sysadmin','системный администратор','системний адміністратор']],
75
+ ['network_engineer','infrastructure',['network engineer','network administrator','сетевой инженер','сетевой администратор']],
76
+ ['database_administrator','infrastructure',['database administrator','dba','администратор баз данных']],
77
+ ['linux_administrator','infrastructure',['linux administrator','linux sysadmin','администратор linux']],
78
+ ['windows_administrator','infrastructure',['windows administrator','windows sysadmin','администратор windows']],
79
+
80
+ // Data
81
+ ['data_analyst','data',['data analyst','аналитик данных','аналітик даних','ma’lumotlar tahlilchisi']],
82
+ ['business_analyst','data',['business analyst','бизнес аналитик','бизнес-аналитик','бізнес-аналітик']],
83
+ ['system_analyst','data',['system analyst','systems analyst','системный аналитик','системний аналітик']],
84
+ ['data_engineer','data',['data engineer','инженер данных','інженер даних']],
85
+ ['analytics_engineer','data',['analytics engineer','инженер аналитики']],
86
+ ['data_scientist','data',['data scientist','специалист по data science','дата-сайентист']],
87
+ ['ml_engineer','data',['machine learning engineer','ml engineer','инженер машинного обучения']],
88
+ ['ai_engineer','data',['ai engineer','artificial intelligence engineer','инженер искусственного интеллекта']],
89
+ ['bi_analyst','data',['bi analyst','business intelligence analyst','bi аналитик']],
90
+ ['bi_developer','data',['bi developer','business intelligence developer','bi разработчик']],
91
+ ['database_developer','data',['database developer','sql developer','разработчик баз данных']],
92
+ ['research_scientist','data',['research scientist','applied scientist','исследователь data science']],
93
+
94
+ // Security
95
+ ['security_engineer','information_security',['security engineer','cybersecurity engineer','инженер информационной безопасности','инженер иб']],
96
+ ['security_analyst','information_security',['security analyst','soc analyst','аналитик информационной безопасности','аналитик иб']],
97
+ ['penetration_tester','information_security',['penetration tester','pentester','пентестер','специалист по тестированию на проникновение']],
98
+ ['application_security_engineer','information_security',['application security engineer','appsec engineer','appsec']],
99
+ ['security_architect','information_security',['security architect','архитектор информационной безопасности']],
100
+ ['soc_engineer','information_security',['soc engineer','siem engineer','инженер soc']],
101
+ ['grc_specialist','information_security',['grc specialist','information security compliance specialist','специалист grc']],
102
+
103
+ // Design
104
+ ['product_designer','design',['product designer','продуктовый дизайнер','продуктовий дизайнер']],
105
+ ['ui_designer','design',['ui designer','interface designer','дизайнер интерфейсов']],
106
+ ['ux_designer','design',['ux designer','user experience designer','ux дизайнер']],
107
+ ['ui_ux_designer','design',['ui ux designer','ux ui designer','ui/ux designer','ui ux дизайнер']],
108
+ ['graphic_designer','design',['graphic designer','графический дизайнер','графічний дизайнер']],
109
+ ['web_designer','design',['web designer','веб дизайнер','веб-дизайнер']],
110
+ ['motion_designer','design',['motion designer','motion graphics designer','моушн дизайнер']],
111
+ ['brand_designer','design',['brand designer','бренд дизайнер']],
112
+ ['interior_designer','design',['interior designer','дизайнер интерьера','дизайнер інтер’єру']],
113
+
114
+ // Product and projects
115
+ ['product_manager','product',['product manager','продакт менеджер','продуктовый менеджер','өнім менеджері']],
116
+ ['product_owner','product',['product owner','владелец продукта','власник продукту']],
117
+ ['growth_product_manager','product',['growth product manager','growth pm','менеджер продукта growth']],
118
+ ['product_analyst','product',['product analyst','продуктовый аналитик','продуктовий аналітик']],
119
+ ['scrum_master','product',['scrum master','скрам мастер','скрам-мастер']],
120
+ ['product_operations_manager','product',['product operations manager','product ops manager','product ops']],
121
+ ['project_manager','project_management',['project manager','менеджер проектов','проектный менеджер','менеджер проєктів','loyiha menejeri']],
122
+ ['program_manager','project_management',['program manager','менеджер программ','программный менеджер']],
123
+ ['delivery_manager','project_management',['delivery manager','менеджер по поставке','delivery lead']],
124
+ ['implementation_manager','project_management',['implementation manager','implementation project manager','менеджер внедрения']],
125
+ ['pmo_manager','project_management',['pmo manager','pmo lead','руководитель pmo']],
126
+ ['project_coordinator','project_management',['project coordinator','координатор проектов','координатор проєктів']],
127
+
128
+ // Sales
129
+ ['sales_manager','sales',['sales manager','менеджер по продажам','менеджер з продажів','sotuv menejeri','сату менеджері']],
130
+ ['sales_representative','sales',['sales representative','sales rep','торговый представитель','торговий представник']],
131
+ ['account_manager','sales',['account manager','аккаунт менеджер','менеджер по работе с клиентами']],
132
+ ['key_account_manager','sales',['key account manager','kam','менеджер по ключевым клиентам']],
133
+ ['business_development_manager','sales',['business development manager','bdm','менеджер по развитию бизнеса']],
134
+ ['sales_development_representative','sales',['sales development representative','sdr','sales development rep']],
135
+ ['business_development_representative','sales',['business development representative','bdr']],
136
+ ['sales_director','sales',['sales director','director of sales','директор по продажам','руководитель отдела продаж']],
137
+ ['real_estate_agent','sales',['real estate agent','realtor','риелтор','риэлтор','агент по недвижимости']],
138
+ ['insurance_agent','sales',['insurance agent','страховой агент','страховий агент']],
139
+ ['loan_officer','sales',['loan officer','credit specialist','кредитный специалист','кредитный менеджер']],
140
+ ['telesales_specialist','sales',['telesales specialist','телемаркетолог продажи','оператор продаж']],
141
+ ['pre_sales_engineer','sales',['pre-sales engineer','presales engineer','пресейл инженер']],
142
+ ['sales_operations_manager','sales',['sales operations manager','sales ops manager','sales ops']],
143
+
144
+ // Marketing
145
+ ['marketing_manager','marketing',['marketing manager','менеджер по маркетингу','маркетолог менеджер']],
146
+ ['digital_marketer','marketing',['digital marketer','digital marketing specialist','интернет маркетолог','диджитал маркетолог']],
147
+ ['performance_marketer','marketing',['performance marketer','performance marketing manager','перформанс маркетолог']],
148
+ ['seo_specialist','marketing',['seo specialist','seo manager','seo специалист']],
149
+ ['ppc_specialist','marketing',['ppc specialist','paid search specialist','контекстолог','ppc специалист']],
150
+ ['smm_specialist','marketing',['smm specialist','social media manager','smm менеджер','смм специалист']],
151
+ ['content_marketer','marketing',['content marketer','content marketing manager','контент маркетолог']],
152
+ ['brand_manager','marketing',['brand manager','бренд менеджер']],
153
+ ['pr_manager','marketing',['pr manager','public relations manager','пиар менеджер','pr специалист']],
154
+ ['crm_marketer','marketing',['crm marketer','crm marketing manager','crm маркетолог']],
155
+ ['email_marketer','marketing',['email marketer','email marketing specialist','емейл маркетолог']],
156
+ ['marketing_analyst','marketing',['marketing analyst','маркетинговый аналитик','аналитик маркетинга']],
157
+
158
+ // Finance
159
+ ['accountant','finance',['accountant','бухгалтер','бухгалтером','buxgalter','есепші']],
160
+ ['chief_accountant','finance',['chief accountant','head accountant','главный бухгалтер','головний бухгалтер','bosh buxgalter']],
161
+ ['payroll_accountant','finance',['payroll accountant','бухгалтер по заработной плате','бухгалтер по зарплате']],
162
+ ['financial_analyst','finance',['financial analyst','финансовый аналитик','финансовым аналитиком','фінансовий аналітик']],
163
+ ['financial_controller','finance',['financial controller','финансовый контролер','финансовый контроллер']],
164
+ ['finance_manager','finance',['finance manager','financial manager','финансовый менеджер']],
165
+ ['treasurer','finance',['treasurer','казначей','скарбник']],
166
+ ['auditor','finance',['auditor','аудитор']],
167
+ ['tax_specialist','finance',['tax specialist','tax accountant','налоговый специалист','налоговый бухгалтер']],
168
+ ['economist','finance',['economist','экономист','економіст']],
169
+ ['bank_teller','finance',['bank teller','операционист банка','кассир банка']],
170
+ ['investment_analyst','finance',['investment analyst','инвестиционный аналитик']],
171
+
172
+ // HR
173
+ ['recruiter','human_resources',['recruiter','рекрутер','рекрутер','talent recruiter']],
174
+ ['technical_recruiter','human_resources',['technical recruiter','it recruiter','tech recruiter','it рекрутер']],
175
+ ['talent_acquisition_specialist','human_resources',['talent acquisition specialist','talent acquisition manager','ta specialist']],
176
+ ['hr_manager','human_resources',['hr manager','human resources manager','hr менеджер','менеджер по персоналу']],
177
+ ['hr_business_partner','human_resources',['hr business partner','hrbp','hr бизнес партнер']],
178
+ ['hr_generalist','human_resources',['hr generalist','hr generalist specialist','hr дженералист']],
179
+ ['people_partner','human_resources',['people partner','people operations partner','пипл партнер']],
180
+ ['sourcer','human_resources',['talent sourcer','sourcer','сорсер']],
181
+ ['learning_development_specialist','human_resources',['learning and development specialist','l&d specialist','специалист по обучению и развитию']],
182
+
183
+ // Support/admin
184
+ ['customer_support_specialist','customer_support',['customer support specialist','support specialist','специалист поддержки','специалист служби підтримки']],
185
+ ['technical_support_specialist','customer_support',['technical support specialist','technical support engineer','специалист технической поддержки']],
186
+ ['helpdesk_specialist','customer_support',['helpdesk specialist','help desk specialist','helpdesk engineer','специалист helpdesk']],
187
+ ['call_center_operator','customer_support',['call center operator','call-center operator','оператор колл центра','оператор колл-центра','call markaz operatori']],
188
+ ['chat_operator','customer_support',['chat operator','оператор чата','чат оператор']],
189
+ ['customer_success_manager','customer_support',['customer success manager','csm','менеджер по успеху клиентов']],
190
+ ['office_manager','administration',['office manager','офис менеджер','офіс менеджер']],
191
+ ['administrator','administration',['administrator','администратор','адміністратор','administrator']],
192
+ ['receptionist','administration',['receptionist','ресепшионист','ресепшн','рецепционист']],
193
+ ['executive_assistant','administration',['executive assistant','personal assistant','ассистент руководителя','личный помощник']],
194
+ ['secretary','administration',['secretary','секретарь','секретар']],
195
+ ['data_entry_operator','administration',['data entry operator','data entry specialist','оператор ввода данных']],
196
+
197
+ // Logistics / retail
198
+ ['logistics_manager','logistics',['logistics manager','менеджер по логистике','логист']],
199
+ ['logistics_coordinator','logistics',['logistics coordinator','координатор логистики']],
200
+ ['dispatcher','logistics',['dispatcher','диспетчер','диспетчер']],
201
+ ['warehouse_manager','logistics',['warehouse manager','заведующий складом','начальник склада']],
202
+ ['warehouse_worker','logistics',['warehouse worker','складской работник','работник склада','склад працівник']],
203
+ ['picker','logistics',['order picker','picker','комплектовщик','сборщик заказов']],
204
+ ['packer','logistics',['packer','упаковщик','упаковщица','пакувальник']],
205
+ ['loader','logistics',['loader','грузчик','вантажник']],
206
+ ['supply_chain_manager','logistics',['supply chain manager','менеджер цепи поставок','supply chain specialist']],
207
+ ['procurement_specialist','logistics',['procurement specialist','purchasing specialist','специалист по закупкам','закупщик']],
208
+ ['customs_specialist','logistics',['customs specialist','customs broker','таможенный брокер','специалист вэд']],
209
+ ['inventory_specialist','logistics',['inventory specialist','inventory controller','специалист по запасам']],
210
+ ['cashier','retail',['cashier','кассир','касир','kassir']],
211
+ ['sales_assistant','retail',['sales assistant','shop assistant','продавец консультант','продавец-консультант','сатушы кеңесші']],
212
+ ['seller','retail',['seller','продавец','продавець','sotuvchi','сатушы']],
213
+ ['merchandiser','retail',['merchandiser','мерчендайзер','мерчандайзер']],
214
+ ['store_manager','retail',['store manager','управляющий магазином','заведующий магазином']],
215
+ ['store_supervisor','retail',['store supervisor','супервайзер магазина','старший смены магазина']],
216
+ ['promoter','retail',['promoter','промоутер']],
217
+ ['visual_merchandiser','retail',['visual merchandiser','визуальный мерчендайзер']],
218
+
219
+ // Hospitality
220
+ ['waiter','hospitality',['waiter','waitress','официант','офіціант']],
221
+ ['barista','hospitality',['barista','бариста']],
222
+ ['bartender','hospitality',['bartender','barman','бармен']],
223
+ ['cook','hospitality',['cook','повар','кухар','oshpaz','аспаз']],
224
+ ['chef','hospitality',['chef','head chef','шеф повар','шеф-повар','шеф кухар']],
225
+ ['sous_chef','hospitality',['sous chef','су шеф','су-шеф']],
226
+ ['hostess','hospitality',['hostess','хостес']],
227
+ ['restaurant_manager','hospitality',['restaurant manager','управляющий рестораном','менеджер ресторана']],
228
+ ['hotel_receptionist','hospitality',['hotel receptionist','hotel front desk','администратор гостиницы','администратор отеля']],
229
+ ['housekeeper','hospitality',['housekeeper','горничная','покоївка']],
230
+ ['dishwasher_worker','hospitality',['dishwasher worker','kitchen porter','посудомойщик','посудомойщица']],
231
+ ['baker','hospitality',['baker','пекарь','пекар']],
232
+ ['confectioner','hospitality',['confectioner','pastry chef','кондитер']],
233
+
234
+ // Medicine
235
+ ['doctor','medicine',['doctor','physician','врач','лікар','shifokor','дәрігер']],
236
+ ['nurse','medicine',['nurse','медсестра','медбрат','медична сестра','hamshira','медбике']],
237
+ ['dentist','medicine',['dentist','стоматолог','tish shifokor']],
238
+ ['pharmacist','medicine',['pharmacist','фармацевт','провизор']],
239
+ ['medical_assistant','medicine',['medical assistant','фельдшер','медицинский ассистент']],
240
+ ['surgeon','medicine',['surgeon','хирург','хірург']],
241
+ ['therapist_doctor','medicine',['general practitioner','family doctor','терапевт врач','семейный врач']],
242
+ ['pediatrician','medicine',['pediatrician','педиатр']],
243
+ ['gynecologist','medicine',['gynecologist','gynaecologist','гинеколог']],
244
+ ['laboratory_technician','medicine',['laboratory technician','lab technician','лаборант','медицинский лаборант']],
245
+ ['radiologist','medicine',['radiologist','рентгенолог','врач радиолог']],
246
+ ['psychologist','medicine',['psychologist','психолог','психолог']],
247
+ ['veterinarian','medicine',['veterinarian','vet','ветеринар']],
248
+
249
+ // Education
250
+ ['teacher','education',['teacher','учитель','вчитель','o‘qituvchi','мұғалім']],
251
+ ['english_teacher','education',['english teacher','english tutor','учитель английского','преподаватель английского','ingliz tili o‘qituvchi']],
252
+ ['tutor','education',['tutor','репетитор']],
253
+ ['kindergarten_teacher','education',['kindergarten teacher','воспитатель','вихователь','tarbiyachi']],
254
+ ['nanny','education',['nanny','няня','enaga']],
255
+ ['university_lecturer','education',['university lecturer','lecturer','преподаватель вуза','викладач університету']],
256
+ ['school_principal','education',['school principal','директор школы','директор школи']],
257
+ ['education_methodologist','education',['education methodologist','методист','методист образования']],
258
+ ['speech_therapist','education',['speech therapist','логопед']],
259
+ ['special_education_teacher','education',['special education teacher','дефектолог','коррекционный педагог']],
260
+
261
+ // Construction / trades / manufacturing
262
+ ['civil_engineer','construction',['civil engineer','инженер строитель','инженер-строитель']],
263
+ ['architect','construction',['architect','архитектор','архітектор']],
264
+ ['construction_manager','construction',['construction manager','руководитель строительства','прораб руководитель']],
265
+ ['site_manager','construction',['site manager','прораб','начальник участка']],
266
+ ['quantity_surveyor','construction',['quantity surveyor','сметчик','инженер сметчик']],
267
+ ['electrician','construction',['electrician','электрик','електрик']],
268
+ ['plumber','construction',['plumber','сантехник','сантехнік']],
269
+ ['welder','construction',['welder','сварщик','зварювальник','payvandchi','дәнекерлеуші']],
270
+ ['carpenter','construction',['carpenter','плотник','столяр','тесляр']],
271
+ ['painter','construction',['construction painter','маляр','маляр штукатур']],
272
+ ['tiler','construction',['tiler','плиточник','облицовщик']],
273
+ ['crane_operator','construction',['crane operator','крановщик','машинист крана']],
274
+ ['surveyor','construction',['surveyor','геодезист']],
275
+ ['hvac_technician','construction',['hvac technician','hvac engineer','инженер овик','техник по вентиляции']],
276
+ ['production_worker','manufacturing',['production worker','factory worker','рабочий производства','работник производства']],
277
+ ['machine_operator','manufacturing',['machine operator','станочник','оператор станка']],
278
+ ['cnc_operator','manufacturing',['cnc operator','cnc machinist','оператор чпу','оператор станка чпу']],
279
+ ['mechanical_engineer','manufacturing',['mechanical engineer','инженер механик','инженер-механик']],
280
+ ['electrical_engineer','manufacturing',['electrical engineer','инженер электрик','инженер-электрик']],
281
+ ['maintenance_technician','manufacturing',['maintenance technician','техник по обслуживанию','ремонтный техник']],
282
+ ['quality_control_inspector','manufacturing',['quality control inspector','qc inspector','контролер отк','инспектор качества']],
283
+ ['process_engineer','manufacturing',['process engineer','инженер технолог','инженер-технолог']],
284
+ ['industrial_engineer','manufacturing',['industrial engineer','инженер по производству']],
285
+ ['seamstress','manufacturing',['seamstress','tailor','швея','портной','тігінші']],
286
+
287
+ // Transport/security
288
+ ['driver','transport',['driver','водитель','водій','haydovchi','жүргізуші']],
289
+ ['truck_driver','transport',['truck driver','lorry driver','водитель грузовика','дальнобойщик','водитель категории ce']],
290
+ ['taxi_driver','transport',['taxi driver','таксист','водитель такси']],
291
+ ['bus_driver','transport',['bus driver','водитель автобуса']],
292
+ ['courier','transport',['courier','delivery courier','курьер','кур’єр','kuryer']],
293
+ ['forklift_operator','transport',['forklift operator','forklift driver','водитель погрузчика','карщик']],
294
+ ['auto_mechanic','transport',['auto mechanic','car mechanic','автомеханик','автослесарь']],
295
+ ['fleet_manager','transport',['fleet manager','менеджер автопарка','начальник автопарка']],
296
+ ['security_guard','security',['security guard','guard','охранник','охоронець','qorovul','күзетші']],
297
+ ['bodyguard','security',['bodyguard','телохранитель','охоронець особистий']],
298
+ ['security_supervisor','security',['security supervisor','начальник охраны','руководитель службы безопасности']],
299
+ ['loss_prevention_specialist','security',['loss prevention specialist','специалист по предотвращению потерь']],
300
+
301
+ // Legal/media/beauty/agriculture
302
+ ['lawyer','legal',['lawyer','attorney','юрист','юрист','адвокат']],
303
+ ['legal_counsel','legal',['legal counsel','in-house counsel','юрисконсульт']],
304
+ ['paralegal','legal',['paralegal','помощник юриста','асистент юриста']],
305
+ ['compliance_specialist','legal',['compliance specialist','compliance officer','комплаенс специалист']],
306
+ ['contract_specialist','legal',['contract specialist','contract manager','договорной юрист','специалист по договорам']],
307
+ ['notary_assistant','legal',['notary assistant','помощник нотариуса']],
308
+ ['copywriter','media_content',['copywriter','копирайтер','копірайтер']],
309
+ ['content_manager','media_content',['content manager','контент менеджер']],
310
+ ['content_creator','media_content',['content creator','creator','контент креатор','создатель контента']],
311
+ ['editor','media_content',['editor','редактор','редактор']],
312
+ ['journalist','media_content',['journalist','журналист','журналіст']],
313
+ ['translator','media_content',['translator','interpreter','переводчик','перекладач','tarjimon']],
314
+ ['video_editor','media_content',['video editor','видеомонтажер','монтажер видео']],
315
+ ['photographer','media_content',['photographer','фотограф']],
316
+ ['hairdresser','beauty_wellness',['hairdresser','hair stylist','парикмахер','стилист по волосам']],
317
+ ['barber','beauty_wellness',['barber','барбер']],
318
+ ['manicurist','beauty_wellness',['manicurist','nail technician','мастер маникюра','нейл мастер']],
319
+ ['cosmetologist','beauty_wellness',['cosmetologist','косметолог']],
320
+ ['massage_therapist','beauty_wellness',['massage therapist','masseur','массажист','массажистка']],
321
+ ['fitness_trainer','beauty_wellness',['fitness trainer','personal trainer','фитнес тренер','персональный тренер']],
322
+ ['farmer','agriculture',['farmer','фермер','фермер']],
323
+ ['agronomist','agriculture',['agronomist','агроном']],
324
+ ['tractor_driver','agriculture',['tractor driver','tractor operator','тракторист']],
325
+ ['livestock_specialist','agriculture',['livestock specialist','зоотехник']],
326
+ ['greenhouse_worker','agriculture',['greenhouse worker','работник теплицы']],
327
+ ['farm_worker','agriculture',['farm worker','agricultural worker','сельхоз рабочий','работник фермы']],
328
+ ];
329
+
330
+ function profession(canonical, group, strongAliases, weakAliases = []) {
331
+ const meta = GROUP_META.get(group) || { family: 'other', aliases: [] };
332
+ const strong = [...new Set([...strongAliases, ...(ROMANIAN_PROFESSION_ALIASES[canonical] || [])].filter(Boolean))];
333
+ const weak = [...new Set(weakAliases.filter(Boolean))];
334
+ return Object.freeze({
335
+ id: canonical,
336
+ taxonomyId: `profession.${group}.${canonical}`,
337
+ canonical,
338
+ group,
339
+ family: meta.family,
340
+ aliases: Object.freeze(strong),
341
+ strongAliases: Object.freeze(strong),
342
+ weakAliases: Object.freeze(weak),
343
+ strongRe: aliasesToRegex(strong),
344
+ weakRe: weak.length ? aliasesToRegex(weak) : null,
345
+ });
346
+ }
347
+
348
+ export const PROFESSION_CATALOG = Object.freeze(rows.map((row) => profession(...row)));
349
+
350
+ export const PROFESSION_GROUPS = Object.freeze(GROUP_DEFINITIONS.map(([canonical, family, aliases]) => Object.freeze({
351
+ id: `profession-group.${canonical}`,
352
+ canonical,
353
+ family,
354
+ aliases: Object.freeze(groupAliases(canonical, aliases)),
355
+ professions: Object.freeze(PROFESSION_CATALOG.filter((item) => item.group === canonical).map((item) => item.canonical)),
356
+ })));
357
+
358
+ export const SENIORITY_LEVELS = Object.freeze([
359
+ { canonical: 'intern', aliases: ['intern','trainee','стажер','стажёр','інтерн','стажерка','stajyor','тағылымгер'], score: 1 },
360
+ { canonical: 'junior', aliases: ['junior','jr','джуниор','джун','младший','молодший','junior level'], score: 1 },
361
+ { canonical: 'middle', aliases: ['middle','mid-level','mid level','мидл','миддл','средний уровень','середній рівень'], score: 1 },
362
+ { canonical: 'senior', aliases: ['senior','sr','сеньор','синьор','старший специалист','ведущий специалист','провідний спеціаліст'], score: 1 },
363
+ { canonical: 'staff', aliases: ['staff','staff engineer','staff developer','staff-level','стафф','стафф инженер'], score: 1 },
364
+ { canonical: 'principal', aliases: ['principal','principal engineer','principal developer','principal architect','principal-level','принципал инженер'], score: 1 },
365
+ { canonical: 'lead', aliases: ['lead','team lead','teamlead','tech lead','lead developer','lead engineer','тимлид','техлид','лид разработчик','ведущий разработчик'], score: 1 },
366
+ { canonical: 'head', aliases: ['head of','department head','руководитель отдела','начальник отдела','керівник відділу'], score: 0.95 },
367
+ { canonical: 'director', aliases: ['director','директор','директор департамента','директор напряму'], score: 0.9 },
368
+ { canonical: 'vp', aliases: ['vice president','vp of','вице-президент','віце-президент'], score: 1 },
369
+ { canonical: 'chief', aliases: ['chief officer','chief executive','chief technology','chief product','chief financial','chief marketing','chief operating'], score: 1 },
370
+ ].map((entry) => {
371
+ const aliases = [...new Set([...entry.aliases, ...(ROMANIAN_SENIORITY_ALIASES[entry.canonical] || [])])];
372
+ return Object.freeze({ ...entry, aliases: Object.freeze(aliases), re: aliasesToRegex(aliases) });
373
+ }));
374
+
375
+ export function matchProfessions(value, { limit = 5, allowWeak = true } = {}) {
376
+ const text = String(value || '');
377
+ if (!text) return [];
378
+ const matches = [];
379
+ for (const entry of PROFESSION_CATALOG) {
380
+ const strong = text.match(entry.strongRe);
381
+ if (strong) {
382
+ matches.push({ entry, score: 1, matched: strong[0].trim(), index: strong.index ?? 0, strength: 'strong' });
383
+ continue;
384
+ }
385
+ if (allowWeak && entry.weakRe) {
386
+ const weak = text.match(entry.weakRe);
387
+ if (weak) matches.push({ entry, score: 0.55, matched: weak[0].trim(), index: weak.index ?? 0, strength: 'weak' });
388
+ }
389
+ }
390
+ matches.sort((a, b) => b.score - a.score || b.matched.length - a.matched.length || a.index - b.index);
391
+ const seen = new Set();
392
+ return matches.filter((match) => {
393
+ if (seen.has(match.entry.canonical)) return false;
394
+ seen.add(match.entry.canonical);
395
+ return true;
396
+ }).slice(0, limit).map((match) => Object.freeze({
397
+ id: match.entry.id,
398
+ canonical: match.entry.canonical,
399
+ group: match.entry.group,
400
+ family: match.entry.family,
401
+ score: match.score,
402
+ strength: match.strength,
403
+ matched: match.matched,
404
+ }));
405
+ }
406
+
407
+ export function matchProfession(value, options = {}) {
408
+ return matchProfessions(value, { ...options, limit: 1 })[0] || null;
409
+ }
410
+
411
+ export function matchProfessionGroup(value) {
412
+ const text = String(value || '');
413
+ let best = null;
414
+ for (const entry of PROFESSION_GROUPS) {
415
+ const re = aliasesToRegex(entry.aliases);
416
+ const match = text.match(re);
417
+ if (!match) continue;
418
+ const score = Math.min(0.9, 0.55 + normalizeForMatch(match[0]).length / 100);
419
+ if (!best || score > best.score) best = { ...entry, score, matched: match[0].trim() };
420
+ }
421
+ return best ? Object.freeze(best) : null;
422
+ }
423
+
424
+ export function matchSeniority(value) {
425
+ const text = String(value || '');
426
+ const matches = [];
427
+ for (const entry of SENIORITY_LEVELS) {
428
+ const match = text.match(entry.re);
429
+ if (match) matches.push({ canonical: entry.canonical, score: entry.score, matched: match[0].trim(), index: match.index ?? 0 });
430
+ }
431
+ matches.sort((a, b) => b.score - a.score || b.matched.length - a.matched.length || a.index - b.index);
432
+ return matches[0] ? Object.freeze(matches[0]) : null;
433
+ }
434
+
435
+ export function professionByCanonical(canonical) {
436
+ return PROFESSION_CATALOG.find((item) => item.canonical === canonical) || null;
437
+ }
@@ -0,0 +1,16 @@
1
+ export type HiringSeniority = 'intern' | 'junior' | 'middle' | 'senior' | 'staff' | 'lead' | 'principal' | 'manager' | 'director';
2
+ export type DegreeLevel = 'secondary' | 'bachelor' | 'master' | 'doctorate';
3
+ export type DegreeField = 'computer_science' | 'engineering' | 'law' | 'forensics' | 'business';
4
+ export type CvSection = 'experience' | 'projects' | 'profile' | 'skills' | 'education' | 'other';
5
+ export const SENIORITY_RANK: Readonly<Record<HiringSeniority, number>>;
6
+ export function detectHiringSeniority(value: unknown): HiringSeniority | null;
7
+ export function detectDegreeLevel(value: unknown): DegreeLevel | null;
8
+ export function detectDegreeFields(value: unknown): readonly DegreeField[];
9
+ export function extractRequiredExperienceYears(value: unknown): number | null;
10
+ export function hasUsWorkAuthorization(value: unknown): boolean;
11
+ export function requiresUsSponsorship(value: unknown): boolean | null;
12
+ export function isNoSponsorshipRequirement(value: unknown): boolean;
13
+ export function bucketVacancyText(value: unknown): Readonly<{ required: string; optional: string; context: string; noise: string }>;
14
+ export function classifyCvSectionHeading(value: unknown): CvSection | null;
15
+ export function extractCvSection(value: unknown, wanted: CvSection): string;
16
+ export function extractCvExperienceYears(value: unknown, referenceDate?: Date): number | null;