UNPKG

@obliczeniowo/elementary

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