mirror of
https://github.com/apache/superset.git
synced 2024-09-17 11:09:47 -04:00
feat: add validator package (#322)
* feat: add validator package * test: add unit tests * feat: add legacy function * fix: rename
This commit is contained in:
parent
aa9d262fba
commit
dbc98609a5
@ -0,0 +1,23 @@
|
||||
## @superset-ui/validator
|
||||
|
||||
[![Version](https://img.shields.io/npm/v/@superset-ui/validator.svg?style=flat)](https://img.shields.io/npm/v/@superset-ui/validator.svg?style=flat)
|
||||
[![David (path)](https://img.shields.io/david/apache-superset/superset-ui.svg?path=packages%2Fsuperset-ui-validator&style=flat-square)](https://david-dm.org/apache-superset/superset-ui?path=packages/superset-ui-validator)
|
||||
|
||||
Description
|
||||
|
||||
#### Example usage
|
||||
|
||||
```js
|
||||
import { xxx } from '@superset-ui/validator';
|
||||
```
|
||||
|
||||
#### API
|
||||
|
||||
`fn(args)`
|
||||
|
||||
- Do something
|
||||
|
||||
### Development
|
||||
|
||||
`@data-ui/build-config` is used to manage the build configuration for this package including babel
|
||||
builds, jest testing, eslint, and prettier.
|
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@superset-ui/validator",
|
||||
"version": "0.0.0",
|
||||
"description": "Superset UI validator",
|
||||
"sideEffects": false,
|
||||
"main": "lib/index.js",
|
||||
"module": "esm/index.js",
|
||||
"files": [
|
||||
"esm",
|
||||
"lib"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/apache-superset/superset-ui.git"
|
||||
},
|
||||
"keywords": ["superset"],
|
||||
"author": "Superset",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/apache-superset/superset-ui/issues"
|
||||
},
|
||||
"homepage": "https://github.com/apache-superset/superset-ui#readme",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@superset-ui/translation": "^0.12.0"
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
export { default as legacyValidateInteger } from './legacyValidateInteger';
|
||||
export { default as legacyValidateNumber } from './legacyValidateNumber';
|
||||
export { default as validateInteger } from './validateInteger';
|
||||
export { default as validateNumber } from './validateNumber';
|
||||
export { default as validateNonEmpty } from './validateNonEmpty';
|
@ -0,0 +1,12 @@
|
||||
import { t } from '@superset-ui/translation';
|
||||
|
||||
/**
|
||||
* formerly called integer()
|
||||
* @param v
|
||||
*/
|
||||
export default function legacyValidateInteger(v: unknown) {
|
||||
if (v && (isNaN(v as number) || parseInt(v as string, 10) !== Number(v))) {
|
||||
return t('is expected to be an integer');
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
import { t } from '@superset-ui/translation';
|
||||
|
||||
/**
|
||||
* formerly called numeric()
|
||||
* @param v
|
||||
*/
|
||||
export default function numeric(v: unknown) {
|
||||
if (v && isNaN(v as number)) {
|
||||
return t('is expected to be a number');
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
import { t } from '@superset-ui/translation';
|
||||
|
||||
export default function validateInteger(v: unknown) {
|
||||
if (
|
||||
(typeof v === 'string' && v.trim().length > 0 && Number.isInteger(Number(v.trim()))) ||
|
||||
(typeof v === 'number' && Number.isInteger(v))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return t('is expected to be an integer');
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
import { t } from '@superset-ui/translation';
|
||||
|
||||
export default function validateNonEmpty(v: unknown) {
|
||||
if (v === null || typeof v === 'undefined' || v === '' || (Array.isArray(v) && v.length === 0)) {
|
||||
return t('cannot be empty');
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
import { t } from '@superset-ui/translation';
|
||||
|
||||
export default function validateInteger(v: unknown) {
|
||||
if (
|
||||
(typeof v === 'string' && v.trim().length > 0 && Number.isFinite(Number(v.trim()))) ||
|
||||
(typeof v === 'number' && Number.isFinite(v))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return t('is expected to be a number');
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
import { legacyValidateInteger } from '../src';
|
||||
|
||||
describe('legacyValidateInteger()', () => {
|
||||
it('returns the warning message if invalid', () => {
|
||||
expect(legacyValidateInteger(10.1)).toBeTruthy();
|
||||
expect(legacyValidateInteger('abc')).toBeTruthy();
|
||||
expect(legacyValidateInteger(Infinity)).toBeTruthy();
|
||||
});
|
||||
it('returns false if the input is valid', () => {
|
||||
// superset seems to operate on this incorrect behavior at the moment
|
||||
expect(legacyValidateInteger(NaN)).toBeFalsy();
|
||||
expect(legacyValidateInteger(undefined)).toBeFalsy();
|
||||
expect(legacyValidateInteger(null)).toBeFalsy();
|
||||
expect(legacyValidateInteger('')).toBeFalsy();
|
||||
|
||||
expect(legacyValidateInteger(0)).toBeFalsy();
|
||||
expect(legacyValidateInteger(10)).toBeFalsy();
|
||||
expect(legacyValidateInteger('10')).toBeFalsy();
|
||||
});
|
||||
});
|
@ -0,0 +1,20 @@
|
||||
import { legacyValidateNumber } from '../src';
|
||||
|
||||
describe('legacyValidateNumber()', () => {
|
||||
it('returns the warning message if invalid', () => {
|
||||
expect(legacyValidateNumber('abc')).toBeTruthy();
|
||||
});
|
||||
it('returns false if the input is valid', () => {
|
||||
// superset seems to operate on this incorrect behavior at the moment
|
||||
expect(legacyValidateNumber(NaN)).toBeFalsy();
|
||||
expect(legacyValidateNumber(Infinity)).toBeFalsy();
|
||||
expect(legacyValidateNumber(undefined)).toBeFalsy();
|
||||
expect(legacyValidateNumber(null)).toBeFalsy();
|
||||
expect(legacyValidateNumber('')).toBeFalsy();
|
||||
|
||||
expect(legacyValidateNumber(0)).toBeFalsy();
|
||||
expect(legacyValidateNumber(10.1)).toBeFalsy();
|
||||
expect(legacyValidateNumber(10)).toBeFalsy();
|
||||
expect(legacyValidateNumber('10')).toBeFalsy();
|
||||
});
|
||||
});
|
@ -0,0 +1,18 @@
|
||||
import { validateInteger } from '../src';
|
||||
|
||||
describe('validateInteger()', () => {
|
||||
it('returns the warning message if invalid', () => {
|
||||
expect(validateInteger(10.1)).toBeTruthy();
|
||||
expect(validateInteger(NaN)).toBeTruthy();
|
||||
expect(validateInteger(Infinity)).toBeTruthy();
|
||||
expect(validateInteger(undefined)).toBeTruthy();
|
||||
expect(validateInteger(null)).toBeTruthy();
|
||||
expect(validateInteger('abc')).toBeTruthy();
|
||||
expect(validateInteger('')).toBeTruthy();
|
||||
});
|
||||
it('returns false if the input is valid', () => {
|
||||
expect(validateInteger(0)).toBeFalsy();
|
||||
expect(validateInteger(10)).toBeFalsy();
|
||||
expect(validateInteger('10')).toBeFalsy();
|
||||
});
|
||||
});
|
@ -0,0 +1,15 @@
|
||||
import { validateNonEmpty } from '../src';
|
||||
|
||||
describe('validateNonEmpty()', () => {
|
||||
it('returns the warning message if invalid', () => {
|
||||
expect(validateNonEmpty([])).toBeTruthy();
|
||||
expect(validateNonEmpty(undefined)).toBeTruthy();
|
||||
expect(validateNonEmpty(null)).toBeTruthy();
|
||||
expect(validateNonEmpty('')).toBeTruthy();
|
||||
});
|
||||
it('returns false if the input is valid', () => {
|
||||
expect(validateNonEmpty(0)).toBeFalsy();
|
||||
expect(validateNonEmpty(10)).toBeFalsy();
|
||||
expect(validateNonEmpty('abc')).toBeFalsy();
|
||||
});
|
||||
});
|
@ -0,0 +1,18 @@
|
||||
import { validateNumber } from '../src';
|
||||
|
||||
describe('validateNumber()', () => {
|
||||
it('returns the warning message if invalid', () => {
|
||||
expect(validateNumber(NaN)).toBeTruthy();
|
||||
expect(validateNumber(Infinity)).toBeTruthy();
|
||||
expect(validateNumber(undefined)).toBeTruthy();
|
||||
expect(validateNumber(null)).toBeTruthy();
|
||||
expect(validateNumber('abc')).toBeTruthy();
|
||||
expect(validateNumber('')).toBeTruthy();
|
||||
});
|
||||
it('returns false if the input is valid', () => {
|
||||
expect(validateNumber(0)).toBeFalsy();
|
||||
expect(validateNumber(10.1)).toBeFalsy();
|
||||
expect(validateNumber(10)).toBeFalsy();
|
||||
expect(validateNumber('10')).toBeFalsy();
|
||||
});
|
||||
});
|
@ -1,3 +1,7 @@
|
||||
import { configure } from '@superset-ui/translation';
|
||||
|
||||
configure();
|
||||
|
||||
const caches = {};
|
||||
|
||||
class Cache {
|
||||
|
Loading…
Reference in New Issue
Block a user