mojulo 0.0.0 → 0.1.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 +53 -4
- package/lib/audit-logger-new.js +11 -0
- package/lib/auth/gate.js +25 -0
- package/lib/auth/service.js +17 -0
- package/lib/auth/session.js +63 -0
- package/lib/builder/chat-processor.js +607 -0
- package/lib/builder/composer-bridge.js +82 -0
- package/lib/builder/evaluator.js +159 -0
- package/lib/builder/executor.js +252 -0
- package/lib/builder/index.js +48 -0
- package/lib/builder/session.js +248 -0
- package/lib/builder/system-prompt.js +422 -0
- package/lib/builder/tone-presets.js +75 -0
- package/lib/builder/tool-executors.js +1418 -0
- package/lib/builder/tools.js +338 -0
- package/lib/builder/validators.js +239 -0
- package/lib/composer/composer.js +225 -0
- package/lib/composer/index.js +40 -0
- package/lib/composer/protocols/00_base.txt +19 -0
- package/lib/composer/protocols/01_knowledge.txt +9 -0
- package/lib/composer/protocols/02_form-gathering.txt +32 -0
- package/lib/composer/protocols/03_appointments.txt +16 -0
- package/lib/composer/protocols/04_triage.txt +15 -0
- package/lib/composer/protocols/05_optical-read.txt +22 -0
- package/lib/composer/response-builder.js +98 -0
- package/lib/config-builder.js +650 -0
- package/lib/db/ids.js +10 -0
- package/lib/db/index.js +179 -0
- package/lib/db/repositories/apiKeys.js +72 -0
- package/lib/db/repositories/auditLogs.js +12 -0
- package/lib/db/repositories/botSpaces.js +12 -0
- package/lib/db/repositories/builderSessions.js +312 -0
- package/lib/db/repositories/deploymentEvents.js +12 -0
- package/lib/db/repositories/deployments.js +385 -0
- package/lib/db/repositories/documents.js +68 -0
- package/lib/db/repositories/mcpJobs.js +84 -0
- package/lib/deployers/bot-fleet.js +110 -0
- package/lib/deployers/bot-proxy.js +72 -0
- package/lib/deployers/build.js +89 -0
- package/lib/deployers/cloud-deploy.js +310 -0
- package/lib/deployers/docker.js +439 -0
- package/lib/deployers/fly.js +432 -0
- package/lib/deployers/index.js +38 -0
- package/lib/deployment-auth.js +36 -0
- package/lib/document-parser.js +171 -0
- package/lib/embedder/chunker.js +93 -0
- package/lib/embedder/local.js +101 -0
- package/lib/embedder/preview-rag.js +93 -0
- package/lib/envelope-schema.js +54 -0
- package/lib/fleet/scoped-sql.js +342 -0
- package/lib/form-schema-config/base.js +135 -0
- package/lib/form-schema-config/index.js +286 -0
- package/lib/form-schema-config/locales/af-ZA.js +153 -0
- package/lib/form-schema-config/locales/ar-AE.js +142 -0
- package/lib/form-schema-config/locales/ar-SA.js +164 -0
- package/lib/form-schema-config/locales/de-DE.js +152 -0
- package/lib/form-schema-config/locales/en-AU.js +161 -0
- package/lib/form-schema-config/locales/en-CA.js +115 -0
- package/lib/form-schema-config/locales/en-GB.js +132 -0
- package/lib/form-schema-config/locales/en-IN.js +219 -0
- package/lib/form-schema-config/locales/en-MY.js +171 -0
- package/lib/form-schema-config/locales/en-NG.js +198 -0
- package/lib/form-schema-config/locales/en-PH.js +186 -0
- package/lib/form-schema-config/locales/en-SG.js +153 -0
- package/lib/form-schema-config/locales/en-US.js +138 -0
- package/lib/form-schema-config/locales/es-ES.js +171 -0
- package/lib/form-schema-config/locales/es-MX.js +193 -0
- package/lib/form-schema-config/locales/fr-CA.js +138 -0
- package/lib/form-schema-config/locales/fr-FR.js +155 -0
- package/lib/form-schema-config/locales/hi-IN.js +219 -0
- package/lib/form-schema-config/locales/it-IT.js +157 -0
- package/lib/form-schema-config/locales/ja-JP.js +169 -0
- package/lib/form-schema-config/locales/ko-KR.js +140 -0
- package/lib/form-schema-config/locales/nl-NL.js +149 -0
- package/lib/form-schema-config/locales/pt-BR.js +168 -0
- package/lib/form-schema-config/locales/zh-CN.js +172 -0
- package/lib/form-schema-config/locales/zh-HK.js +142 -0
- package/lib/form-structure-schema.js +191 -0
- package/lib/llm-providers.js +828 -0
- package/lib/markdown.js +197 -0
- package/lib/mcp/catalysts/appointment-to-calendar.md +84 -0
- package/lib/mcp/catalysts/conversations-to-channel-digest.md +104 -0
- package/lib/mcp/catalysts/document-extract-to-store.md +92 -0
- package/lib/mcp/catalysts/knowledge-gap-miner.md +96 -0
- package/lib/mcp/catalysts/loader.js +144 -0
- package/lib/mcp/catalysts/qualify-lead-to-crm.md +83 -0
- package/lib/mcp/catalysts/scan-conversations-for-signal.md +92 -0
- package/lib/mcp/catalysts/submission-to-ticket.md +83 -0
- package/lib/mcp/catalysts/submissions-to-warehouse.md +103 -0
- package/lib/mcp/catalysts/weekly-submissions-digest.md +82 -0
- package/lib/mcp/jobs.js +64 -0
- package/lib/mcp/server.js +184 -0
- package/lib/mcp/session-binding.js +130 -0
- package/lib/mcp/tools/build.js +123 -0
- package/lib/mcp/tools/catalysts.js +477 -0
- package/lib/mcp/tools/context.js +325 -0
- package/lib/mcp/tools/fleet.js +391 -0
- package/lib/mcp/tools/jobs-tools.js +240 -0
- package/lib/mcp/tools/operate.js +314 -0
- package/lib/preview/build-preview-config.js +136 -0
- package/lib/rate-limiter.js +11 -0
- package/lib/resolve-api-key.js +142 -0
- package/lib/storage/index.js +40 -0
- package/messages/de.json +2136 -0
- package/messages/en.json +2136 -0
- package/messages/es.json +2136 -0
- package/messages/fr.json +2136 -0
- package/messages/it.json +2136 -0
- package/messages/ja.json +2136 -0
- package/messages/ko.json +2136 -0
- package/messages/nl.json +2136 -0
- package/messages/pl.json +2136 -0
- package/messages/pt.json +2136 -0
- package/messages/ru.json +2136 -0
- package/messages/uk.json +2136 -0
- package/messages/zh.json +2136 -0
- package/package.json +61 -5
- package/scripts/mcp-config.mjs +162 -0
- package/scripts/mcp-stdio-loader.mjs +42 -0
- package/scripts/mcp-stdio.mjs +108 -0
- package/scripts/mojulo-paths.mjs +48 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arabic - UAE (ar-AE) Locale Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const LOCALE_INFO = {
|
|
6
|
+
code: 'ar-AE',
|
|
7
|
+
name: 'United Arab Emirates',
|
|
8
|
+
region: 'Middle East',
|
|
9
|
+
currency: 'AED',
|
|
10
|
+
dateFormat: 'DD/MM/YYYY'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const PATTERNS = {
|
|
14
|
+
phone: {
|
|
15
|
+
pattern: '^(\\+971|0)\\s?5[0-9]\\s?\\d{3}\\s?\\d{4}$',
|
|
16
|
+
error: 'يرجى إدخال رقم هاتف صحيح',
|
|
17
|
+
description: 'UAE mobile number'
|
|
18
|
+
},
|
|
19
|
+
landline: {
|
|
20
|
+
pattern: '^(\\+971|0)\\s?[2-9]\\s?\\d{3}\\s?\\d{4}$',
|
|
21
|
+
error: 'يرجى إدخال رقم هاتف أرضي صحيح',
|
|
22
|
+
description: 'UAE landline number'
|
|
23
|
+
},
|
|
24
|
+
emiratesId: {
|
|
25
|
+
pattern: '^784-?\\d{4}-?\\d{7}-?\\d{1}$',
|
|
26
|
+
error: 'يرجى إدخال رقم الهوية الإماراتية الصحيح',
|
|
27
|
+
description: 'Emirates ID number'
|
|
28
|
+
},
|
|
29
|
+
trn: {
|
|
30
|
+
pattern: '^\\d{15}$',
|
|
31
|
+
error: 'يرجى إدخال الرقم الضريبي الصحيح (15 رقم)',
|
|
32
|
+
description: 'Tax Registration Number'
|
|
33
|
+
},
|
|
34
|
+
tradeLicense: {
|
|
35
|
+
pattern: '^\\d{6,10}$',
|
|
36
|
+
error: 'يرجى إدخال رقم الرخصة التجارية الصحيح',
|
|
37
|
+
description: 'Trade License Number'
|
|
38
|
+
},
|
|
39
|
+
poBox: {
|
|
40
|
+
pattern: '^\\d{3,6}$',
|
|
41
|
+
error: 'يرجى إدخال رقم صندوق البريد الصحيح',
|
|
42
|
+
description: 'PO Box number'
|
|
43
|
+
},
|
|
44
|
+
iban: {
|
|
45
|
+
pattern: '^AE\\d{2}\\s?\\d{3}\\s?\\d{16}$',
|
|
46
|
+
error: 'يرجى إدخال رقم IBAN صحيح',
|
|
47
|
+
description: 'UAE IBAN'
|
|
48
|
+
},
|
|
49
|
+
currency: {
|
|
50
|
+
pattern: '^(AED|د\\.إ\\.?)\\s?[\\d,]+(\\.\\d{2})?$',
|
|
51
|
+
error: 'يرجى إدخال مبلغ صحيح',
|
|
52
|
+
description: 'UAE Dirham amount'
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const ARCHETYPES = {
|
|
57
|
+
phone: {
|
|
58
|
+
type: 'tel',
|
|
59
|
+
autocomplete: 'tel',
|
|
60
|
+
inputMode: 'tel',
|
|
61
|
+
placeholder: '050 123 4567',
|
|
62
|
+
pattern: PATTERNS.phone.pattern,
|
|
63
|
+
patternError: PATTERNS.phone.error,
|
|
64
|
+
pii: true
|
|
65
|
+
},
|
|
66
|
+
postalCode: {
|
|
67
|
+
type: 'text',
|
|
68
|
+
autocomplete: 'postal-code',
|
|
69
|
+
inputMode: 'numeric',
|
|
70
|
+
placeholder: '12345',
|
|
71
|
+
pattern: PATTERNS.poBox.pattern,
|
|
72
|
+
patternError: PATTERNS.poBox.error,
|
|
73
|
+
helpText: 'رقم صندوق البريد'
|
|
74
|
+
},
|
|
75
|
+
nationalId: {
|
|
76
|
+
type: 'text',
|
|
77
|
+
inputMode: 'numeric',
|
|
78
|
+
placeholder: '784-1234-1234567-1',
|
|
79
|
+
pattern: PATTERNS.emiratesId.pattern,
|
|
80
|
+
patternError: PATTERNS.emiratesId.error,
|
|
81
|
+
pii: true,
|
|
82
|
+
sensitive: true,
|
|
83
|
+
helpText: 'سيتم حفظ رقم الهوية الإماراتية بشكل آمن'
|
|
84
|
+
},
|
|
85
|
+
iban: {
|
|
86
|
+
type: 'text',
|
|
87
|
+
inputMode: 'text',
|
|
88
|
+
placeholder: 'AE07 033 1234567890123456',
|
|
89
|
+
pattern: PATTERNS.iban.pattern,
|
|
90
|
+
patternError: PATTERNS.iban.error,
|
|
91
|
+
pii: true
|
|
92
|
+
},
|
|
93
|
+
emirate: {
|
|
94
|
+
type: 'dropdown',
|
|
95
|
+
autocomplete: 'address-level1',
|
|
96
|
+
options: [
|
|
97
|
+
{ value: 'AUH', label: 'أبوظبي (Abu Dhabi)' },
|
|
98
|
+
{ value: 'DXB', label: 'دبي (Dubai)' },
|
|
99
|
+
{ value: 'SHJ', label: 'الشارقة (Sharjah)' },
|
|
100
|
+
{ value: 'AJM', label: 'عجمان (Ajman)' },
|
|
101
|
+
{ value: 'UAQ', label: 'أم القيوين (Umm Al Quwain)' },
|
|
102
|
+
{ value: 'RAK', label: 'رأس الخيمة (Ras Al Khaimah)' },
|
|
103
|
+
{ value: 'FUJ', label: 'الفجيرة (Fujairah)' }
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
currency: {
|
|
107
|
+
type: 'text',
|
|
108
|
+
inputMode: 'decimal',
|
|
109
|
+
placeholder: 'AED 1,000.00',
|
|
110
|
+
pattern: PATTERNS.currency.pattern,
|
|
111
|
+
patternError: PATTERNS.currency.error
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Arabic (UAE) field name mappings - bilingual for business use
|
|
117
|
+
*/
|
|
118
|
+
export const FIELD_LABELS = {
|
|
119
|
+
postalCode: 'صندوق البريد / PO Box',
|
|
120
|
+
state: 'الإمارة / Emirate',
|
|
121
|
+
nationalId: 'رقم الهوية الإماراتية / Emirates ID',
|
|
122
|
+
phone: 'رقم الهاتف / Phone',
|
|
123
|
+
mobile: 'رقم الجوال / Mobile',
|
|
124
|
+
firstName: 'الاسم الأول / First Name',
|
|
125
|
+
lastName: 'اسم العائلة / Last Name',
|
|
126
|
+
fullName: 'الاسم الكامل / Full Name',
|
|
127
|
+
streetAddress: 'العنوان / Address',
|
|
128
|
+
city: 'المدينة / City',
|
|
129
|
+
email: 'البريد الإلكتروني / Email',
|
|
130
|
+
dateOfBirth: 'تاريخ الميلاد / Date of Birth',
|
|
131
|
+
company: 'اسم الشركة / Company Name'
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* UAE data protection compliance hints
|
|
136
|
+
*/
|
|
137
|
+
export const GDPR_HINTS = {
|
|
138
|
+
consentRequired: true,
|
|
139
|
+
dataRetentionNotice: true,
|
|
140
|
+
rightToErasure: true,
|
|
141
|
+
explicitConsentLanguage: 'أوافق على معالجة بياناتي الشخصية وفقاً لسياسة الخصوصية. / I consent to the processing of my personal data in accordance with the Privacy Policy.'
|
|
142
|
+
};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arabic - Saudi Arabia (ar-SA) Locale Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const LOCALE_INFO = {
|
|
6
|
+
code: 'ar-SA',
|
|
7
|
+
name: 'Saudi Arabia',
|
|
8
|
+
region: 'Middle East',
|
|
9
|
+
currency: 'SAR',
|
|
10
|
+
dateFormat: 'DD/MM/YYYY'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const PATTERNS = {
|
|
14
|
+
phone: {
|
|
15
|
+
pattern: '^(\\+966|0)\\s?5[0-9]\\s?\\d{3}\\s?\\d{4}$',
|
|
16
|
+
error: 'يرجى إدخال رقم جوال صحيح',
|
|
17
|
+
description: 'Saudi mobile number'
|
|
18
|
+
},
|
|
19
|
+
landline: {
|
|
20
|
+
pattern: '^(\\+966|0)\\s?1[1-9]\\s?\\d{3}\\s?\\d{4}$',
|
|
21
|
+
error: 'يرجى إدخال رقم هاتف أرضي صحيح',
|
|
22
|
+
description: 'Saudi landline number'
|
|
23
|
+
},
|
|
24
|
+
nationalId: {
|
|
25
|
+
pattern: '^[12]\\d{9}$',
|
|
26
|
+
error: 'يرجى إدخال رقم الهوية الوطنية أو الإقامة الصحيح (10 أرقام)',
|
|
27
|
+
description: 'Saudi National ID (starts with 1) or Iqama (starts with 2)'
|
|
28
|
+
},
|
|
29
|
+
vatNumber: {
|
|
30
|
+
pattern: '^3\\d{14}$',
|
|
31
|
+
error: 'يرجى إدخال الرقم الضريبي الصحيح (15 رقم يبدأ بـ 3)',
|
|
32
|
+
description: 'Saudi VAT number'
|
|
33
|
+
},
|
|
34
|
+
commercialRegistration: {
|
|
35
|
+
pattern: '^\\d{10}$',
|
|
36
|
+
error: 'يرجى إدخال رقم السجل التجاري الصحيح (10 أرقام)',
|
|
37
|
+
description: 'Commercial Registration (CR) number'
|
|
38
|
+
},
|
|
39
|
+
postalCode: {
|
|
40
|
+
pattern: '^\\d{5}$',
|
|
41
|
+
error: 'يرجى إدخال الرمز البريدي الصحيح (5 أرقام)',
|
|
42
|
+
description: 'Saudi postal code'
|
|
43
|
+
},
|
|
44
|
+
poBox: {
|
|
45
|
+
pattern: '^\\d{3,6}$',
|
|
46
|
+
error: 'يرجى إدخال رقم صندوق البريد الصحيح',
|
|
47
|
+
description: 'PO Box number'
|
|
48
|
+
},
|
|
49
|
+
iban: {
|
|
50
|
+
pattern: '^SA\\d{2}\\s?\\d{2}\\s?[A-Z0-9]{18}$',
|
|
51
|
+
error: 'يرجى إدخال رقم الآيبان الصحيح',
|
|
52
|
+
description: 'Saudi IBAN'
|
|
53
|
+
},
|
|
54
|
+
currency: {
|
|
55
|
+
pattern: '^(SAR|ر\\.س\\.?)\\s?[\\d,]+(\\.\\d{2})?$',
|
|
56
|
+
error: 'يرجى إدخال مبلغ صحيح',
|
|
57
|
+
description: 'Saudi Riyal amount'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const ARCHETYPES = {
|
|
62
|
+
phone: {
|
|
63
|
+
type: 'tel',
|
|
64
|
+
autocomplete: 'tel',
|
|
65
|
+
inputMode: 'tel',
|
|
66
|
+
placeholder: '050 123 4567',
|
|
67
|
+
pattern: PATTERNS.phone.pattern,
|
|
68
|
+
patternError: PATTERNS.phone.error,
|
|
69
|
+
pii: true
|
|
70
|
+
},
|
|
71
|
+
postalCode: {
|
|
72
|
+
type: 'text',
|
|
73
|
+
autocomplete: 'postal-code',
|
|
74
|
+
inputMode: 'numeric',
|
|
75
|
+
placeholder: '12345',
|
|
76
|
+
pattern: PATTERNS.postalCode.pattern,
|
|
77
|
+
patternError: PATTERNS.postalCode.error,
|
|
78
|
+
maxLength: 5
|
|
79
|
+
},
|
|
80
|
+
poBox: {
|
|
81
|
+
type: 'text',
|
|
82
|
+
inputMode: 'numeric',
|
|
83
|
+
placeholder: '12345',
|
|
84
|
+
pattern: PATTERNS.poBox.pattern,
|
|
85
|
+
patternError: PATTERNS.poBox.error,
|
|
86
|
+
helpText: 'رقم صندوق البريد'
|
|
87
|
+
},
|
|
88
|
+
nationalId: {
|
|
89
|
+
type: 'text',
|
|
90
|
+
inputMode: 'numeric',
|
|
91
|
+
placeholder: '1234567890',
|
|
92
|
+
pattern: PATTERNS.nationalId.pattern,
|
|
93
|
+
patternError: PATTERNS.nationalId.error,
|
|
94
|
+
pii: true,
|
|
95
|
+
sensitive: true,
|
|
96
|
+
helpText: 'سيتم حفظ رقم الهوية بشكل آمن'
|
|
97
|
+
},
|
|
98
|
+
iban: {
|
|
99
|
+
type: 'text',
|
|
100
|
+
inputMode: 'text',
|
|
101
|
+
placeholder: 'SA03 80 000000608010167519',
|
|
102
|
+
pattern: PATTERNS.iban.pattern,
|
|
103
|
+
patternError: PATTERNS.iban.error,
|
|
104
|
+
pii: true
|
|
105
|
+
},
|
|
106
|
+
region: {
|
|
107
|
+
type: 'dropdown',
|
|
108
|
+
autocomplete: 'address-level1',
|
|
109
|
+
options: [
|
|
110
|
+
{ value: 'RUH', label: 'الرياض (Riyadh)' },
|
|
111
|
+
{ value: 'MKH', label: 'مكة المكرمة (Makkah)' },
|
|
112
|
+
{ value: 'MDN', label: 'المدينة المنورة (Madinah)' },
|
|
113
|
+
{ value: 'QSM', label: 'القصيم (Qassim)' },
|
|
114
|
+
{ value: 'SHR', label: 'الشرقية (Eastern Province)' },
|
|
115
|
+
{ value: 'ASR', label: 'عسير (Asir)' },
|
|
116
|
+
{ value: 'TBK', label: 'تبوك (Tabuk)' },
|
|
117
|
+
{ value: 'HAL', label: 'حائل (Hail)' },
|
|
118
|
+
{ value: 'SHM', label: 'الحدود الشمالية (Northern Borders)' },
|
|
119
|
+
{ value: 'JZN', label: 'جازان (Jazan)' },
|
|
120
|
+
{ value: 'NJR', label: 'نجران (Najran)' },
|
|
121
|
+
{ value: 'BAH', label: 'الباحة (Al Bahah)' },
|
|
122
|
+
{ value: 'JWF', label: 'الجوف (Al Jawf)' }
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
currency: {
|
|
126
|
+
type: 'text',
|
|
127
|
+
inputMode: 'decimal',
|
|
128
|
+
placeholder: 'SAR 1,000.00',
|
|
129
|
+
pattern: PATTERNS.currency.pattern,
|
|
130
|
+
patternError: PATTERNS.currency.error
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Arabic (Saudi) field name mappings - bilingual for business use
|
|
136
|
+
*/
|
|
137
|
+
export const FIELD_LABELS = {
|
|
138
|
+
postalCode: 'الرمز البريدي / Postal Code',
|
|
139
|
+
poBox: 'صندوق البريد / PO Box',
|
|
140
|
+
state: 'المنطقة / Region',
|
|
141
|
+
nationalId: 'رقم الهوية الوطنية / National ID',
|
|
142
|
+
iqama: 'رقم الإقامة / Iqama',
|
|
143
|
+
phone: 'رقم الهاتف / Phone',
|
|
144
|
+
mobile: 'رقم الجوال / Mobile',
|
|
145
|
+
firstName: 'الاسم الأول / First Name',
|
|
146
|
+
lastName: 'اسم العائلة / Last Name',
|
|
147
|
+
fullName: 'الاسم الكامل / Full Name',
|
|
148
|
+
streetAddress: 'العنوان / Address',
|
|
149
|
+
city: 'المدينة / City',
|
|
150
|
+
email: 'البريد الإلكتروني / Email',
|
|
151
|
+
dateOfBirth: 'تاريخ الميلاد / Date of Birth',
|
|
152
|
+
company: 'اسم الشركة / Company Name',
|
|
153
|
+
commercialRegistration: 'السجل التجاري / Commercial Registration'
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Saudi PDPL (Personal Data Protection Law) compliance hints
|
|
158
|
+
*/
|
|
159
|
+
export const PDPL_HINTS = {
|
|
160
|
+
consentRequired: true,
|
|
161
|
+
dataRetentionNotice: true,
|
|
162
|
+
rightToErasure: true,
|
|
163
|
+
explicitConsentLanguage: 'أوافق على معالجة بياناتي الشخصية وفقاً لسياسة الخصوصية. / I consent to the processing of my personal data in accordance with the Privacy Policy.'
|
|
164
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* German (de-DE) Locale Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const LOCALE_INFO = {
|
|
6
|
+
code: 'de-DE',
|
|
7
|
+
name: 'Germany',
|
|
8
|
+
region: 'EU',
|
|
9
|
+
currency: 'EUR',
|
|
10
|
+
dateFormat: 'DD.MM.YYYY'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const PATTERNS = {
|
|
14
|
+
phone: {
|
|
15
|
+
pattern: '^(\\+49|0)[1-9]\\d{1,14}$',
|
|
16
|
+
error: 'Geben Sie eine gültige Telefonnummer ein',
|
|
17
|
+
description: 'German phone number'
|
|
18
|
+
},
|
|
19
|
+
postalCode: {
|
|
20
|
+
pattern: '^\\d{5}$',
|
|
21
|
+
error: 'Geben Sie eine gültige PLZ ein (5 Ziffern)',
|
|
22
|
+
description: 'German postal code (PLZ)'
|
|
23
|
+
},
|
|
24
|
+
steuerIdentifikationsnummer: {
|
|
25
|
+
pattern: '^\\d{11}$',
|
|
26
|
+
error: 'Geben Sie eine gültige Steuer-ID ein (11 Ziffern)',
|
|
27
|
+
description: 'Tax identification number'
|
|
28
|
+
},
|
|
29
|
+
sozialversicherungsnummer: {
|
|
30
|
+
pattern: '^\\d{2}[0-3]\\d[0-1]\\d{3}[A-Z]\\d{3}$',
|
|
31
|
+
error: 'Geben Sie eine gültige Sozialversicherungsnummer ein',
|
|
32
|
+
description: 'Social security number'
|
|
33
|
+
},
|
|
34
|
+
iban: {
|
|
35
|
+
pattern: '^DE\\d{2}\\s?\\d{4}\\s?\\d{4}\\s?\\d{4}\\s?\\d{4}\\s?\\d{2}$',
|
|
36
|
+
error: 'Geben Sie eine gültige deutsche IBAN ein',
|
|
37
|
+
description: 'German IBAN'
|
|
38
|
+
},
|
|
39
|
+
bic: {
|
|
40
|
+
pattern: '^[A-Z]{4}DE[A-Z0-9]{2}([A-Z0-9]{3})?$',
|
|
41
|
+
error: 'Geben Sie eine gültige BIC ein',
|
|
42
|
+
description: 'BIC/SWIFT code'
|
|
43
|
+
},
|
|
44
|
+
vatNumber: {
|
|
45
|
+
pattern: '^DE\\d{9}$',
|
|
46
|
+
error: 'Geben Sie eine gültige USt-IdNr. ein (DE + 9 Ziffern)',
|
|
47
|
+
description: 'German VAT number (USt-IdNr.)'
|
|
48
|
+
},
|
|
49
|
+
personalausweis: {
|
|
50
|
+
pattern: '^[CFGHJKLMNPRTVWXYZ0-9]{9}$',
|
|
51
|
+
error: 'Geben Sie eine gültige Ausweisnummer ein',
|
|
52
|
+
description: 'German ID card number'
|
|
53
|
+
},
|
|
54
|
+
currency: {
|
|
55
|
+
pattern: '^\\d{1,3}(\\.\\d{3})*(,\\d{2})?\\s?€?$',
|
|
56
|
+
error: 'Geben Sie einen gültigen Betrag ein',
|
|
57
|
+
description: 'Euro amount (German format)'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const ARCHETYPES = {
|
|
62
|
+
phone: {
|
|
63
|
+
type: 'tel',
|
|
64
|
+
autocomplete: 'tel',
|
|
65
|
+
inputMode: 'tel',
|
|
66
|
+
placeholder: '0151 12345678',
|
|
67
|
+
pattern: PATTERNS.phone.pattern,
|
|
68
|
+
patternError: PATTERNS.phone.error,
|
|
69
|
+
pii: true
|
|
70
|
+
},
|
|
71
|
+
postalCode: {
|
|
72
|
+
type: 'text',
|
|
73
|
+
autocomplete: 'postal-code',
|
|
74
|
+
inputMode: 'numeric',
|
|
75
|
+
placeholder: '10115',
|
|
76
|
+
pattern: PATTERNS.postalCode.pattern,
|
|
77
|
+
patternError: PATTERNS.postalCode.error,
|
|
78
|
+
maxLength: 5
|
|
79
|
+
},
|
|
80
|
+
nationalId: {
|
|
81
|
+
type: 'text',
|
|
82
|
+
inputMode: 'numeric',
|
|
83
|
+
placeholder: '12345678901',
|
|
84
|
+
pattern: PATTERNS.steuerIdentifikationsnummer.pattern,
|
|
85
|
+
patternError: PATTERNS.steuerIdentifikationsnummer.error,
|
|
86
|
+
pii: true,
|
|
87
|
+
sensitive: true,
|
|
88
|
+
helpText: 'Ihre Steuer-ID wird sicher aufbewahrt'
|
|
89
|
+
},
|
|
90
|
+
iban: {
|
|
91
|
+
type: 'text',
|
|
92
|
+
inputMode: 'text',
|
|
93
|
+
placeholder: 'DE89 3704 0044 0532 0130 00',
|
|
94
|
+
pattern: PATTERNS.iban.pattern,
|
|
95
|
+
patternError: PATTERNS.iban.error,
|
|
96
|
+
pii: true
|
|
97
|
+
},
|
|
98
|
+
bundesland: {
|
|
99
|
+
type: 'dropdown',
|
|
100
|
+
autocomplete: 'address-level1',
|
|
101
|
+
options: [
|
|
102
|
+
{ value: 'BW', label: 'Baden-Württemberg' },
|
|
103
|
+
{ value: 'BY', label: 'Bayern' },
|
|
104
|
+
{ value: 'BE', label: 'Berlin' },
|
|
105
|
+
{ value: 'BB', label: 'Brandenburg' },
|
|
106
|
+
{ value: 'HB', label: 'Bremen' },
|
|
107
|
+
{ value: 'HH', label: 'Hamburg' },
|
|
108
|
+
{ value: 'HE', label: 'Hessen' },
|
|
109
|
+
{ value: 'MV', label: 'Mecklenburg-Vorpommern' },
|
|
110
|
+
{ value: 'NI', label: 'Niedersachsen' },
|
|
111
|
+
{ value: 'NW', label: 'Nordrhein-Westfalen' },
|
|
112
|
+
{ value: 'RP', label: 'Rheinland-Pfalz' },
|
|
113
|
+
{ value: 'SL', label: 'Saarland' },
|
|
114
|
+
{ value: 'SN', label: 'Sachsen' },
|
|
115
|
+
{ value: 'ST', label: 'Sachsen-Anhalt' },
|
|
116
|
+
{ value: 'SH', label: 'Schleswig-Holstein' },
|
|
117
|
+
{ value: 'TH', label: 'Thüringen' }
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
currency: {
|
|
121
|
+
type: 'text',
|
|
122
|
+
inputMode: 'decimal',
|
|
123
|
+
placeholder: '0,00 €',
|
|
124
|
+
pattern: PATTERNS.currency.pattern,
|
|
125
|
+
patternError: PATTERNS.currency.error
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* German-specific field name mappings
|
|
131
|
+
*/
|
|
132
|
+
export const FIELD_LABELS = {
|
|
133
|
+
postalCode: 'PLZ',
|
|
134
|
+
state: 'Bundesland',
|
|
135
|
+
nationalId: 'Steuer-Identifikationsnummer',
|
|
136
|
+
phone: 'Telefonnummer',
|
|
137
|
+
firstName: 'Vorname',
|
|
138
|
+
lastName: 'Nachname',
|
|
139
|
+
streetAddress: 'Straße und Hausnummer',
|
|
140
|
+
city: 'Stadt/Ort',
|
|
141
|
+
email: 'E-Mail-Adresse'
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* GDPR compliance hints (strict for Germany)
|
|
146
|
+
*/
|
|
147
|
+
export const GDPR_HINTS = {
|
|
148
|
+
consentRequired: true,
|
|
149
|
+
dataRetentionNotice: true,
|
|
150
|
+
rightToErasure: true,
|
|
151
|
+
explicitConsentLanguage: 'Ich stimme der Verarbeitung meiner personenbezogenen Daten gemäß der Datenschutzerklärung zu.'
|
|
152
|
+
};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Australian English (en-AU) Locale Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const LOCALE_INFO = {
|
|
6
|
+
code: 'en-AU',
|
|
7
|
+
name: 'Australia',
|
|
8
|
+
region: 'Oceania',
|
|
9
|
+
currency: 'AUD',
|
|
10
|
+
dateFormat: 'DD/MM/YYYY'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const PATTERNS = {
|
|
14
|
+
phone: {
|
|
15
|
+
pattern: '^(\\+61|0)[2-478]\\d{8}$',
|
|
16
|
+
error: 'Enter a valid Australian phone number',
|
|
17
|
+
description: 'Australian phone number'
|
|
18
|
+
},
|
|
19
|
+
mobile: {
|
|
20
|
+
pattern: '^(\\+61|0)4\\d{8}$',
|
|
21
|
+
error: 'Enter a valid Australian mobile number',
|
|
22
|
+
description: 'Australian mobile number'
|
|
23
|
+
},
|
|
24
|
+
postalCode: {
|
|
25
|
+
pattern: '^\\d{4}$',
|
|
26
|
+
error: 'Enter a valid postcode (4 digits)',
|
|
27
|
+
description: 'Australian postcode'
|
|
28
|
+
},
|
|
29
|
+
tfn: {
|
|
30
|
+
pattern: '^\\d{3}\\s?\\d{3}\\s?\\d{3}$',
|
|
31
|
+
error: 'Enter a valid TFN (9 digits)',
|
|
32
|
+
description: 'Tax File Number'
|
|
33
|
+
},
|
|
34
|
+
abn: {
|
|
35
|
+
pattern: '^\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}$',
|
|
36
|
+
error: 'Enter a valid ABN (11 digits)',
|
|
37
|
+
description: 'Australian Business Number'
|
|
38
|
+
},
|
|
39
|
+
acn: {
|
|
40
|
+
pattern: '^\\d{3}\\s?\\d{3}\\s?\\d{3}$',
|
|
41
|
+
error: 'Enter a valid ACN (9 digits)',
|
|
42
|
+
description: 'Australian Company Number'
|
|
43
|
+
},
|
|
44
|
+
medicareNumber: {
|
|
45
|
+
pattern: '^\\d{4}\\s?\\d{5}\\s?\\d{1}(\\s?\\d{1})?$',
|
|
46
|
+
error: 'Enter a valid Medicare number',
|
|
47
|
+
description: 'Medicare card number'
|
|
48
|
+
},
|
|
49
|
+
bsb: {
|
|
50
|
+
pattern: '^\\d{3}-?\\d{3}$',
|
|
51
|
+
error: 'Enter a valid BSB (6 digits)',
|
|
52
|
+
description: 'Bank State Branch number'
|
|
53
|
+
},
|
|
54
|
+
bankAccount: {
|
|
55
|
+
pattern: '^\\d{6,10}$',
|
|
56
|
+
error: 'Enter a valid account number',
|
|
57
|
+
description: 'Australian bank account number'
|
|
58
|
+
},
|
|
59
|
+
currency: {
|
|
60
|
+
pattern: '^\\$?[\\d,]+(\\.\\d{2})?$',
|
|
61
|
+
error: 'Enter a valid amount',
|
|
62
|
+
description: 'Australian Dollar amount'
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const ARCHETYPES = {
|
|
67
|
+
phone: {
|
|
68
|
+
type: 'tel',
|
|
69
|
+
autocomplete: 'tel',
|
|
70
|
+
inputMode: 'tel',
|
|
71
|
+
placeholder: '0412 345 678',
|
|
72
|
+
pattern: PATTERNS.mobile.pattern,
|
|
73
|
+
patternError: PATTERNS.mobile.error,
|
|
74
|
+
pii: true
|
|
75
|
+
},
|
|
76
|
+
postalCode: {
|
|
77
|
+
type: 'text',
|
|
78
|
+
autocomplete: 'postal-code',
|
|
79
|
+
inputMode: 'numeric',
|
|
80
|
+
placeholder: '2000',
|
|
81
|
+
pattern: PATTERNS.postalCode.pattern,
|
|
82
|
+
patternError: PATTERNS.postalCode.error,
|
|
83
|
+
maxLength: 4
|
|
84
|
+
},
|
|
85
|
+
nationalId: {
|
|
86
|
+
type: 'text',
|
|
87
|
+
inputMode: 'numeric',
|
|
88
|
+
placeholder: '123 456 789',
|
|
89
|
+
pattern: PATTERNS.tfn.pattern,
|
|
90
|
+
patternError: PATTERNS.tfn.error,
|
|
91
|
+
pii: true,
|
|
92
|
+
sensitive: true,
|
|
93
|
+
helpText: 'Your TFN is stored securely'
|
|
94
|
+
},
|
|
95
|
+
abn: {
|
|
96
|
+
type: 'text',
|
|
97
|
+
inputMode: 'numeric',
|
|
98
|
+
placeholder: '51 824 753 556',
|
|
99
|
+
pattern: PATTERNS.abn.pattern,
|
|
100
|
+
patternError: PATTERNS.abn.error,
|
|
101
|
+
pii: true
|
|
102
|
+
},
|
|
103
|
+
bsb: {
|
|
104
|
+
type: 'text',
|
|
105
|
+
inputMode: 'numeric',
|
|
106
|
+
placeholder: '062-000',
|
|
107
|
+
pattern: PATTERNS.bsb.pattern,
|
|
108
|
+
patternError: PATTERNS.bsb.error,
|
|
109
|
+
pii: true
|
|
110
|
+
},
|
|
111
|
+
state: {
|
|
112
|
+
type: 'dropdown',
|
|
113
|
+
autocomplete: 'address-level1',
|
|
114
|
+
options: [
|
|
115
|
+
{ value: 'NSW', label: 'New South Wales' },
|
|
116
|
+
{ value: 'VIC', label: 'Victoria' },
|
|
117
|
+
{ value: 'QLD', label: 'Queensland' },
|
|
118
|
+
{ value: 'WA', label: 'Western Australia' },
|
|
119
|
+
{ value: 'SA', label: 'South Australia' },
|
|
120
|
+
{ value: 'TAS', label: 'Tasmania' },
|
|
121
|
+
{ value: 'ACT', label: 'Australian Capital Territory' },
|
|
122
|
+
{ value: 'NT', label: 'Northern Territory' }
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
currency: {
|
|
126
|
+
type: 'text',
|
|
127
|
+
inputMode: 'decimal',
|
|
128
|
+
placeholder: '$100.00',
|
|
129
|
+
pattern: PATTERNS.currency.pattern,
|
|
130
|
+
patternError: PATTERNS.currency.error
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Australian English field name mappings
|
|
136
|
+
*/
|
|
137
|
+
export const FIELD_LABELS = {
|
|
138
|
+
postalCode: 'Postcode',
|
|
139
|
+
state: 'State/Territory',
|
|
140
|
+
nationalId: 'Tax File Number (TFN)',
|
|
141
|
+
phone: 'Phone number',
|
|
142
|
+
mobile: 'Mobile number',
|
|
143
|
+
firstName: 'Given name',
|
|
144
|
+
lastName: 'Surname',
|
|
145
|
+
fullName: 'Full name',
|
|
146
|
+
streetAddress: 'Street address',
|
|
147
|
+
city: 'Suburb',
|
|
148
|
+
email: 'Email address',
|
|
149
|
+
dateOfBirth: 'Date of birth',
|
|
150
|
+
company: 'Company name'
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Australian Privacy Act compliance hints
|
|
155
|
+
*/
|
|
156
|
+
export const GDPR_HINTS = {
|
|
157
|
+
consentRequired: true,
|
|
158
|
+
dataRetentionNotice: true,
|
|
159
|
+
rightToErasure: true,
|
|
160
|
+
explicitConsentLanguage: 'I consent to the collection and use of my personal information in accordance with the Privacy Policy.'
|
|
161
|
+
};
|