UNPKG

@obliczeniowo/elementary

Version:
1 lines 16 kB
{"version":3,"file":"obliczeniowo-elementary-utils.mjs","sources":["../../../../projects/components/utils/string.ts","../../../../projects/components/utils/validators.ts","../../../../projects/components/utils/data/chemical-elements.ts","../../../../projects/components/utils/obliczeniowo-elementary-utils.ts"],"sourcesContent":["export const firstToUpper = (text: string) => {\r\n if (!text.length) {\r\n return text;\r\n }\r\n return text.charAt(0).toUpperCase() + text.slice(1)\r\n}\r\n\r\nexport const allWordsFirstToUpper = (text: string) => {\r\n return text.split(' ').map(text => firstToUpper(text)).join(' ');\r\n}\r\n\r\nexport const toCamelCase = (text: string) => {\r\n return allWordsFirstToUpper(text.replace(/\\s/g, ' ').trim()).replace(/\\s/g, '');\r\n}","import { AbstractControl, UntypedFormGroup, ValidationErrors } from '@angular/forms';\r\n\r\nexport class OblValidators {\r\n /**\r\n * Expressions used to validate, you can override them on very start of your application to apply your own specific\r\n * validation for e-mail or what so ever\r\n */\r\n static regs: { [name: string]: RegExp } = {\r\n email: /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i,\r\n noWhiteSpaces: /^[^\\s]*$/,\r\n login: /^[a-zA-Z0-9]*$/,\r\n uLogin: /^[\\p{Alphabetic}0-9]*$/u\r\n }\r\n\r\n /**\r\n * Test if email is valid\r\n *\r\n * In case you want to override it you can just change OblValidators.regs.email to what you want\r\n *\r\n * @example\r\n *\r\n * \"test@test.pl\" => null\r\n * \"test@test\" => { 'invalid-email': true }\r\n * \"test\" => { 'invalid-email': true }\r\n * \"test@\" => { 'invalid-email': true }\r\n */\r\n static email(control: AbstractControl): ValidationErrors | null {\r\n const email = control.value;\r\n const ok = null;\r\n\r\n if (!email) {\r\n return ok;\r\n }\r\n\r\n if (email !== '' && !OblValidators.regs.email.test(email)) {\r\n return { 'invalid-email': true };\r\n }\r\n\r\n return ok;\r\n }\r\n\r\n /**\r\n * Test Polish NIP (number of task identify)\r\n */\r\n static nip(control: AbstractControl): ValidationErrors | null {\r\n let nip: string = control.value?.toString() || '';\r\n\r\n nip = nip.replace(/[\\ \\-]/gi, '');\r\n\r\n if (nip.length !== 10) {\r\n return { 'nip-length': true }\r\n }\r\n\r\n const weights = [6, 5, 7, 2, 3, 4, 5, 6, 7];\r\n let sum = 0;\r\n const controlNumber = parseInt(nip.substring(9, 10));\r\n const weightCount = weights.length;\r\n\r\n for (let i = 0; i < weightCount; i++) {\r\n sum += (parseInt(nip.substr(i, 1)) * weights[i]);\r\n }\r\n\r\n return sum % 11 === controlNumber ? null : { 'nip-sum': true };\r\n }\r\n\r\n /**\r\n * Test Polish PESEL number\r\n */\r\n static pesel(control: AbstractControl): ValidationErrors | null {\r\n let pesel = control.value?.toString() || '';\r\n\r\n pesel = pesel.replace(/[\\ \\-]/gi, '');\r\n\r\n if (pesel.length !== 10) {\r\n return { 'pesel-length': true }\r\n }\r\n\r\n const weight = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];\r\n let sum = 0;\r\n const controlNumber = parseInt(pesel.substring(10, 11));\r\n\r\n for (let i = 0; i < weight.length; i++) {\r\n sum += (parseInt(pesel.substring(i, i + 1)) * weight[i]);\r\n }\r\n\r\n sum = sum % 10;\r\n\r\n return (10 - sum) % 10 === controlNumber ? null : { 'pesel-sum': true };\r\n }\r\n\r\n /**\r\n * Validate Polish REGON number\r\n */\r\n static regon(control: AbstractControl): ValidationErrors | null {\r\n let rawRegon = control.value?.toString();\r\n\r\n rawRegon = rawRegon.replace(/[\\ \\-]/gi, '');\r\n\r\n const weights9 = [8, 9, 2, 3, 4, 5, 6, 7];\r\n const weights14 = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8];\r\n\r\n if (!rawRegon) {\r\n return null;\r\n }\r\n\r\n const regon = rawRegon.toString().replace(/[^a-z\\d]/gi, '');\r\n\r\n if (regon.length !== 9 && regon.length !== 14) {\r\n return { 'regon-length': true };\r\n }\r\n\r\n // calculate checksum\r\n let sum = 0;\r\n weights9.forEach((weight, position) => {\r\n const digit = Number(regon[position]);\r\n sum += weight * digit;\r\n });\r\n\r\n const checksum = (sum % 11) % 10;\r\n\r\n if (checksum !== Number(regon[8])) {\r\n return { 'regon-checksum': true };\r\n }\r\n\r\n if (regon.length === 14) {\r\n // calculate second checksum\r\n let sum2 = 0;\r\n weights14.forEach((weight, position) => {\r\n const digit = Number(regon[position]);\r\n sum2 += weight * digit;\r\n });\r\n\r\n const checksum2 = (sum2 % 11) % 10;\r\n\r\n if (checksum2 !== Number(regon[13])) {\r\n return { 'regon-checksum': true };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Test if contains white spaces (space, tabulator, new line)\r\n *\r\n * @example\r\n *\r\n * \"test@#$%_01234\" => null\r\n * \"test@#$% 01234\" => { 'white-spaces': true }\r\n */\r\n static noWhiteSpaces(control: AbstractControl): ValidationErrors | null {\r\n return OblValidators.regs.noWhiteSpaces.test(control.value) ? null : { 'white-spaces': true };\r\n }\r\n\r\n /**\r\n * Test if value from AbstractControl contain only any alphabetical unicode sign or number 0-9 excluding _\r\n * this unicode version can have some problem on different types of browsers\r\n *\r\n * In case you want to override it you can just change OblValidators.regs.login to what you want\r\n *\r\n * @example\r\n *\r\n * \"zazolcGesiaJazn\" => null\r\n * \"zażółćGęsiąJaźń\" => { 'non-digit-or-alphabetical': true }\r\n * \"zazolcGesiaJazn0123456789\" => null\r\n * \"zazolcGesiaJaznń0123456789_\" => { 'non-digit-or-alphabetical': true }\r\n * \"zazolcGesiaJazn0123456789$%^\" => { 'non-digit-or-alphabetical': true }\r\n * \"zazolc gesia jazn\" => { 'white-spaces': true }\r\n */\r\n static login(control: AbstractControl): ValidationErrors | null {\r\n const err = OblValidators.noWhiteSpaces(control);\r\n\r\n if (err) {\r\n return err;\r\n }\r\n\r\n return OblValidators.regs.login.test(control.value) ? null : { 'non-digit-or-alphabetical': true };\r\n }\r\n\r\n /**\r\n * Test if value from AbstractControl contain only any alphabetical unicode sign or number 0-9 excluding _\r\n * this unicode version can have some problem on different types of browsers, if it's ok for you to have\r\n * ASCII only version then please use login version\r\n *\r\n * In case you want to override it you can just change OblValidators.regs.uLogin to what you want\r\n *\r\n * @example\r\n *\r\n * \"zażółćGęsiąJaźń\" => null\r\n * \"zażółćGęsiąJaźń0123456789\" => null\r\n * \"zażółćGęsiąJaźń0123456789_\" => { 'non-digit-or-alphabetical': true }\r\n * \"zażółćGęsiąJaźń0123456789$%^\" => { 'non-digit-or-alphabetical': true }\r\n * \"zażółć gęsią jaźń\" => { 'white-spaces': true }\r\n */\r\n static uLogin(control: AbstractControl): ValidationErrors | null {\r\n const err = OblValidators.noWhiteSpaces(control);\r\n\r\n if (err) {\r\n return err;\r\n }\r\n\r\n return OblValidators.regs.uLogin.test(control.value) ? null : { 'non-digit-or-alphabetical': true };\r\n }\r\n\r\n /**\r\n * validate if values matching\r\n */\r\n static equalValidator(value: string) {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (control.value !== value) {\r\n return { 'not-equal': true };\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * validate if value from form group with name is equal to value to validated field\r\n */\r\n static equalFormFieldValidator(form: UntypedFormGroup, name: string) {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (control.value !== form.get(name)?.getRawValue()) {\r\n return { 'not-equal': true };\r\n }\r\n return null;\r\n }\r\n }\r\n}\r\n","export const symbols = [\r\n 'H',\r\n 'He',\r\n 'Li',\r\n 'Be',\r\n 'B',\r\n 'C',\r\n 'N',\r\n 'O',\r\n 'F',\r\n 'Ne',\r\n 'Na',\r\n 'Mg',\r\n 'Al',\r\n 'Si',\r\n 'P',\r\n 'S',\r\n 'Cl',\r\n 'Ar',\r\n 'K',\r\n 'Ca',\r\n 'Sc',\r\n 'Ti',\r\n 'V',\r\n 'Cr',\r\n 'Mn',\r\n 'Fe',\r\n 'Co',\r\n 'Ni',\r\n 'Cu',\r\n 'Zn',\r\n 'Ga',\r\n 'Ge',\r\n 'As',\r\n 'Se',\r\n 'Br',\r\n 'Kr',\r\n 'Rb',\r\n 'Sr',\r\n 'Y',\r\n 'Zr',\r\n 'Nb',\r\n 'Mo',\r\n 'Tc',\r\n 'Ru',\r\n 'Rh',\r\n 'Pd',\r\n 'Ag',\r\n 'Cd',\r\n 'In',\r\n 'Sn',\r\n 'Sb',\r\n 'Te',\r\n 'I',\r\n 'Xe',\r\n 'Cs',\r\n 'Ba',\r\n 'La',\r\n 'Ce',\r\n 'Pr',\r\n 'Nd',\r\n 'Pm',\r\n 'Sm',\r\n 'Eu',\r\n 'Gd',\r\n 'Tb',\r\n 'Dy',\r\n 'Ho',\r\n 'Er',\r\n 'Tm',\r\n 'Yb',\r\n 'Lu',\r\n 'Hf',\r\n 'Ta',\r\n 'W',\r\n 'Re',\r\n 'Os',\r\n 'Ir',\r\n 'Pt',\r\n 'Au',\r\n 'Hg',\r\n 'Tl',\r\n 'Pb',\r\n 'Bi',\r\n 'Po',\r\n 'At',\r\n 'Rn',\r\n 'Fr',\r\n 'Ra',\r\n 'Ac',\r\n 'Th',\r\n 'Pa',\r\n 'U',\r\n 'Np',\r\n 'Pu',\r\n 'Am',\r\n 'Cm',\r\n 'Bk',\r\n 'Cf',\r\n 'Es',\r\n 'Fm',\r\n 'Md',\r\n 'No',\r\n 'Lr',\r\n 'Rf',\r\n 'Db',\r\n 'Sg',\r\n 'Bh',\r\n 'Hs',\r\n 'Mt',\r\n 'Ds',\r\n 'Rg',\r\n 'Cn',\r\n 'Nh',\r\n 'Fl',\r\n 'Mc',\r\n 'Lv',\r\n 'Ts',\r\n 'Og',\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}