# Huz.Com > Component > Scalar

Handles primitive/scalar types as plain, array, map or map of

## Standards
- Language: `TS`
- Eslint: `Yes`
- Static Code Analysis: `Yes` *IntelliJ Code Inspections*
- DDD - Document Driven: `Yes`
- EDD - Exception Driven: `Yes`
- TDD - Test Driven: `Yes` [go to test folder](./test/)
- Standards Complied: [Huz Standards](https://gitlab.azerdev.com/huz.byorbit/be/documentation/standards)

## Commands
- ``npm run clear`` *// clears "dist" folder*
- ``npm run lint`` *// runs eslint for static code analysis*
- ``npm run test`` *// runs test files in "test" folder*
- ``npm run build`` *// builds JS files at "dist" folder*
- ``npm publish`` *or* ``npm run publix`` *// publishes "dist" folder to npm*

## Install
``npm i @huz-com/scalar``

## Shared Options
Name | Type | Default | cast | castArray | castMap | Info
--- | --- | --- | --- | --- | --- | ---
log | boolean | true | [x] | [x] | [x] | logs when a problem
error | boolean | false | [x] | [x] | [x] | throws when a problem
mandatory | boolean | false | [x] | [o] | [o] | problem if null
unique | boolean | false | [o] | [x] | [o] | removes duplicated items in array
keepNullItems | boolean | false | [o] | [x] | [o] | keeps null items in array (default: remove nulls)
minItems | integer | null | [o] | [x] | [o] | problem if array size is less than
maxItems | integer | null | [o] | [x] | [o] | problem if array size is greater than
keepNullValues | boolean | false | [o] | [o] | [x] | keeps null values in map (default: remove nulls)
minKeys | integer | null | [o] | [o] | [x] | problem if object key size is less than
maxKeys | integer | null | [o] | [o] | [x] | problem if object key size is greater than

## Types
### stringType/codeType/namerType/uuidType
- Returns a string in any event ==> string|null
- Trims texts (else noTrim:true)
- Converts empty string to null (else noTrim:true)

#### Specific Options
Name | Type | Default | cast | castArray | castMap | Info
--- | --- | --- | --- | --- | --- | ---
noTrim | boolean | false | [x] | [x] | [x] | ignore trim (except uuidType)
minLength | integer | null | [x] | [x] | [x] | problem if text length is less than (except uuidType)
maxLength | integer | null | [x] | [x] | [x] | problem if text length is greater than (except uuidType)
pattern | string | null | [x] | [x] | [x] | for only **codeType** and **namerType**

#### Most Used Function
- stringType.is(value: any): boolean
- stringType.cast(value: any, opt?: Options, req?: Request): **string**|null
- stringType.castArray(value: any, opt?: Options, req?: Request): Array<**string**> *// or Array<string|null> with keepNullItems:true*
- stringType.castMap(value: any, opt?: Options, req?: Request): Record<string, **string**> *// or Record<string, string|null> with keepNullValues:true*
- stringType.castMapOf(value: any, opt?: Options, req?: Request): Record<**string**, any>

#### Samples
Call | Result
--- | ---
stringType.cast(``undefined``) | ``null`` 
stringType.cast(``5``) | ``"5"``
stringType.cast(``true``) | ``"true"`` 
stringType.cast(``" "``) | ``null`` 
stringType.cast(``"   foo bar   "``) | ``"foo bar"`` 
stringType.cast(``["  foo"]``) | ``"foo"``
stringType.cast(``{id:5}``) | ``"5"`` *id property is special*
stringType.cast(``() => 5``) | ``"5"``
stringType.cast(``"   foo bar   "``, {noTrim:true}) | ``"   foo bar   "`` 
stringType.cast(``"foo bar"``, {error: true, minLength:10}) | **throws**
stringType.cast(``"foo bar"``, {minLength:10}) | **logs** 
stringType.cast(``"   "``, {error: true, mandatory:true}) | **throws**
stringType.cast(``{a:1}``) | **logs** 
stringType.castArray(``null``) | ``[]`` 
stringType.castArray(``"foo bar  "``) | ``["foo bar"]`` 
stringType.castArray(``[5,true,"   foo bar", () => 4.5, {id:5}, null]``) | ``["5", "true", "foo bar", "4.5", "5"]`` 
stringType.castMap(``null``) | ``{}`` 
stringType.castMap(``{k1: 5, k2: true, k3: "   foo bar", k4: () => 4.5, k5: {id:5}, k6: null}``) | ``{k1: "5", k2: "true", k3: "foo bar", k4: "4.5", k5: "5"}`` 

### intType/floatType
- Returns a number in any event ==> number|null
- Converts infinite numbers to null
- Converts nan numbers to null
- Floors if number is float **for only intType**

#### Specific Options
Name | Type | Default | cast | castArray | castMap | Info
--- | --- | --- | --- | --- | --- | ---
def | integer | null | [x] | [x] | [x] | if null use default value
min | integer | null | [x] | [x] | [x] | problem if value is less than
max | integer | null | [x] | [x] | [x] | problem if value is greater than

#### Most Used Function
- intType.is(value: any): boolean
- intType.cast(value: any, opt?: Options, req?: Request): **number**|null
- intType.castArray(value: any, opt?: Options, req?: Request): Array<**number**> *// or Array<number|null> with keepNullItems:true*
- intType.castMap(value: any, opt?: Options, req?: Request): Record<string, **number**> *// or Record<string, number|null> with keepNullValues:true*
- intType.castMapOf(value: any, opt?: Options, req?: Request): Record<**number**, any>

#### Samples
Call | Result
--- | ---
intType.cast(``undefined``) | ``null`` 
intType.cast(``"foo"``, {def:4}) | ``4`` 
intType.cast(``"5"``) | ``5``
intType.cast(``true``) | ``1`` 
intType.cast(``false``) | ``0`` 
intType.cast(``{id:5}``) | ``5`` *id property is special*
intType.cast(``() => 5``) | ``5``
intType.cast(``[5]``) | ``5``
intType.cast(``5.3``) | ``5``
intType.cast(``"   foo bar   "``, {def: 5}) | ``5`` 
intType.cast(``"foo"``, {def: 5}) | ``5`` 
intType.cast(``"foo"``, {mandatory:true}) | **logs** 
intType.cast(``"5.3"``, {min:6, error: true}) | **throws**
intType.castArray(``undefined``) | ``[]`` 
intType.castArray(``"5"``) | ``[5]``
intType.castArray(``[5,null]``) | ``[5]``
intType.castArray(``["5",null]``, {keepNullItems: true}) | ``[5, null]``
intType.castMap(``undefined``) | ``{}`` 
intType.castMap(``{k1:5, k2: null}``) | ``{k1: 5}``
intType.castMap(``{k1:{id:5}, k2: null}``, {keepNullValues: true}) | ``{k1: 5, k2: null}``

### boolType
- Returns a boolean in any event ==> boolean|null
- Converts most-used text to boolean [ true, t, yes, y, on, false, f, no, n, off ]
- Converts positive numbers to true
- Converts negative and zero numbers to false

#### Specific Options
Name | Type | Default | cast | castArray | castMap | Info
--- | --- | --- | --- | --- | --- | ---
def | boolean | null | [x] | [x] | [x] | if null use default value

#### Most Used Function
- boolType.is(value: any): boolean
- boolType.cast(value: any, opt?: Options, req?: Request): **boolean**|null
- boolType.castArray(value: any, opt?: Options, req?: Request): Array<**boolean**> *// or Array<boolean|null> with keepNullItems:true*
- boolType.castMap(value: any, opt?: Options, req?: Request): Record<string, **boolean**> *// or Record<string, boolean|null> with keepNullValues:true*

#### Samples
Call | Result
--- | ---
boolType.cast(``undefined``) | ``null`` 
boolType.cast(``5``) | ``true``
boolType.cast(``-1``) | ``false``
boolType.cast(``"on"``) | ``true`` 
boolType.cast(``"off"``) | ``false`` 
boolType.cast(``() => "t"``) | ``true``
boolType.cast(``["yes"]``) | ``true``
boolType.cast(``"   foo bar   "``, {def: false}) | ``false`` 
boolType.cast(``"foo"``, {mandatory:true}) | **logs** 
boolType.castArray(``undefined``) | ``[]`` 
boolType.castArray(``"5"``) | ``[true]``
boolType.castArray(``["on",null]``) | ``[true]``
boolType.castArray(``["off",null]``, {keepNullItems: true}) | ``[false, null]``
boolType.castMap(``undefined``) | ``{}`` 
boolType.castMap(``{k1:5, k2: null}``) | ``{k1: true}``
boolType.castMap(``{k1:false, k2: null}``, {keepNullValues: true}) | ``{k1: false, k2: null}``

### functionType
- Returns a function in any event ==> function|null
- Checks argument size if need
- Supports default function if null

#### Specific Options
Name | Type | Default | cast | castArray | castMap | Info
--- | --- | --- | --- | --- | --- | ---
def | Function | null | [x] | [x] | [x] | if null use default value
min | integer | null | [x] | [x] | [x] | problem if argument size is less than
max | integer | null | [x] | [x] | [x] | problem if argument size is greater than

#### Most Used Function
- functionType.is(value: any): boolean
- functionType.cast(value: any, opt?: Options, req?: Request): **Function**|null
- functionType.castArray(value: any, opt?: Options, req?: Request): Array<**Function**> *// or Array<Function|null> with keepNullItems:true*
- functionType.castMap(value: any, opt?: Options, req?: Request): Record<string, **Function**> *// or Record<string, Function|null> with keepNullValues:true*

#### Samples
Call | Result
--- | ---
functionType.cast(``undefined``) | ``null`` 
functionType.cast(``undefined``, {def: () => 'foo'}) | ``() => 'foo'`` 
functionType.cast(``(p1) => 2 * p1``, {min: 2}) | **logs** 
functionType.cast(``"foo"``, {mandatory:true, error: true}) | **throws** "foo" is not a function
functionType.castArray(``undefined``) | ``[]`` 
functionType.castArray(``[() => 'foo',null]``) | ``[() => 'foo']``
functionType.castArray(``[() => 'foo',null]``, {keepNullItems: true}) | ``[() => 'foo', null]``
functionType.castMap(``undefined``) | ``{}`` 
functionType.castMap(``{k1:() => 'foo', k2: null}``) | ``{k1: () => 'foo'}``
functionType.castMap(``{k1:() => 'foo', k2: null}``, {keepNullValues: true}) | ``{k1: () => 'foo', k2: null}``

## Other Types
- @todo
- **dateType**
    > Converts any date related (string, number, integer array, Date, Moment) value Date type
    >
    - ``Date``
    - ``Date[] | Array<Date>``
    - ``{[key: string]: Date} | Record<string, Date>``
- **isoDatetimeType** [format: ``yyyy-mm-ddTHH:ii:ss.eee.Z``]
    > Converts any date related (string, number, integer array, Date, Moment) value ISO Datetime format
    >
    - ``string``
    - ``string[] | Array<string>``
    - ``{[key: string]: string} | Record<string, string>``
- **isoDateType** [format: ``yyyy-mm-dd``]
    > Converts any date related (string, number, integer array, Date, Moment) value ISO Date format
    >
    - ``string``
    - ``string[] | Array<string>``
    - ``{[key: string]: string} | Record<string, string>``
- **isoTimeType** [format: ``HH:ii:ss.eee.Z``]
    > Converts any date related (string, number, integer array, Date, Moment) value ISO Time format
    >
    - ``string``
    - ``string[] | Array<string>``
    - ``{[key: string]: string} | Record<string, string>``
- **momentType**
    > Converts any date related (string, number, integer array, Date, Moment) value Moment class
    >
    - ``Moment``
    - ``Moment[] | Array<Moment>``
    - ``{[key: string]: Moment} | Record<string, Moment>``
- **regExpType**
    > Validates Regexp (also converts string to RegExp)
    >
    - ``RegExp``
    - ``RegExp[] | Array<RegExp>``
    - ``{[key: string]: RegExp} | Record<string, RegExp>``
- **anyType**
    > For anonymous scalar type usage
    >
    - ``any``
    - ``any[] | Array<any>``
    - ``{[key: string]: any} | Record<string, any>``
- **arrayType**
    > For anonymous array usage
    >
    - ``any[] | Array<any>``
    - ``any[][] | Array<Array<any>>``
    - ``{[key: string]: any[]} | Record<string, Array<any>>``
- **objectType**
    > For anonymous object (also be called as map or record) usage
    >
    - ``{[key: string]: any} | Record<string, any>``
    - ``{[key: string]: any}[] | Array<Record<string, any>>``
    - ``{[key: string]: {[sub: string]: any}} | Record<string, Record<string, any>>``
