@sealcode/sealgen 0.8.43 → 0.8.47
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/.eslintrc.js +1 -1
- package/.mocharc.js +10 -0
- package/.nycrc +6 -0
- package/.prettierrc +20 -13
- package/@types/add-route.d.ts +3 -1
- package/@types/build.d.ts +3 -1
- package/@types/forms/fields/boolean.test.d.ts +1 -0
- package/@types/forms/fields/email.test.d.ts +1 -0
- package/@types/forms/fields/enum-multiple.test.d.ts +1 -0
- package/@types/forms/fields/enum.test.d.ts +1 -0
- package/@types/forms/fields/number.test.d.ts +1 -0
- package/@types/forms/fields/pick-from-list.test.d.ts +1 -0
- package/@types/forms/fields/regexp.test.d.ts +1 -0
- package/@types/forms/form.test.d.ts +6 -0
- package/@types/forms/multiform.test.d.ts +1 -0
- package/@types/mount.d.ts +1 -1
- package/@types/page/mountable-with-fields.d.ts +1 -1
- package/@types/test_utils/locator_is_visible.d.ts +2 -0
- package/@types/utils/assert-throws.d.ts +1 -0
- package/@types/utils/browser-creator.d.ts +1 -0
- package/@types/utils/utils.d.ts +1 -0
- package/lib/add-route.js +3 -3
- package/lib/add-route.js.map +1 -1
- package/lib/add-route.test.js +55 -0
- package/lib/add-route.test.js.map +1 -0
- package/lib/build.js +3 -2
- package/lib/build.js.map +1 -1
- package/lib/cli.js +1 -1
- package/lib/cli.js.map +1 -1
- package/lib/example.test.js +4 -0
- package/lib/example.test.js.map +1 -0
- package/lib/forms/fields/boolean.test.js +37 -0
- package/lib/forms/fields/boolean.test.js.map +1 -0
- package/lib/forms/fields/email.test.js +25 -0
- package/lib/forms/fields/email.test.js.map +1 -0
- package/lib/forms/fields/enum-multiple.test.js +32 -0
- package/lib/forms/fields/enum-multiple.test.js.map +1 -0
- package/lib/forms/fields/enum.test.js +26 -0
- package/lib/forms/fields/enum.test.js.map +1 -0
- package/lib/forms/fields/number.js +0 -1
- package/lib/forms/fields/number.js.map +1 -1
- package/lib/forms/fields/number.test.js +35 -0
- package/lib/forms/fields/number.test.js.map +1 -0
- package/lib/forms/fields/pick-from-list.test.js +22 -0
- package/lib/forms/fields/pick-from-list.test.js.map +1 -0
- package/lib/forms/fields/regexp.test.js +26 -0
- package/lib/forms/fields/regexp.test.js.map +1 -0
- package/lib/forms/form.test.js +275 -0
- package/lib/forms/form.test.js.map +1 -0
- package/lib/forms/multiform.js +11 -2
- package/lib/forms/multiform.js.map +1 -1
- package/lib/forms/multiform.test.js +431 -0
- package/lib/forms/multiform.test.js.map +1 -0
- package/lib/make-env.js +1 -1
- package/lib/mount.js +38 -3
- package/lib/mount.js.map +1 -1
- package/lib/test_utils/locator_is_visible.js +15 -0
- package/lib/test_utils/locator_is_visible.js.map +1 -0
- package/lib/utils/assert-throws.js +24 -0
- package/lib/utils/assert-throws.js.map +1 -0
- package/lib/utils/browser-creator.js +14 -0
- package/lib/utils/browser-creator.js.map +1 -0
- package/lib/utils/exec.js.map +1 -1
- package/lib/utils/question.js.map +1 -1
- package/lib/utils/utils.js +3 -1
- package/lib/utils/utils.js.map +1 -1
- package/mocha_root_hooks.js +6 -0
- package/package.json +16 -8
- package/src/add-route.test.ts +58 -0
- package/src/add-route.ts +6 -5
- package/src/build.ts +6 -3
- package/src/cli.ts +2 -2
- package/src/forms/fields/boolean.test.ts +36 -0
- package/src/forms/fields/email.test.ts +24 -0
- package/src/forms/fields/enum-multiple.test.ts +31 -0
- package/src/forms/fields/enum.test.ts +25 -0
- package/src/forms/fields/number.test.ts +34 -0
- package/src/forms/fields/number.ts +0 -1
- package/src/forms/fields/pick-from-list.test.ts +19 -0
- package/src/forms/fields/regexp.test.ts +25 -0
- package/src/forms/form.test.ts +351 -0
- package/src/forms/multiform.test.ts +540 -0
- package/src/forms/multiform.ts +12 -2
- package/src/make-env.ts +1 -1
- package/src/mount.ts +43 -9
- package/src/page/mountable-with-fields.ts +1 -1
- package/src/test_utils/locator_is_visible.ts +17 -0
- package/src/utils/assert-throws.ts +18 -0
- package/src/utils/browser-creator.js +10 -0
- package/src/utils/exec.ts +8 -2
- package/src/utils/question.ts +4 -1
- package/src/utils/utils.ts +1 -0
- package/tsconfig.json +2 -3
- package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
- package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
- package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
- package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/.xunit +0 -3
- package/@types/forms/fields/files-multiple.d.ts +0 -12
- package/coverage/clover.xml +0 -79
- package/lib/forms/fields/files-multiple.js +0 -18
- package/lib/forms/fields/files-multiple.js.map +0 -1
- package/lib/sealgen-url.js +0 -1
- package/lib/sealgen-url.js.map +0 -1
- package/lib/tests/manual/multiform.js +0 -95
- package/lib/tests/manual/multiform.js.map +0 -1
- package/src/tests/manual/multiform.ts +0 -112
- package/test.js +0 -68
- /package/@types/{tests/manual/multiform.d.ts → add-route.test.d.ts} +0 -0
- /package/@types/{sealgen-url.d.ts → example.test.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sealcode/sealgen",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.47",
|
|
4
4
|
"description": "Module to automate adding routes and collections to a sealious application",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "
|
|
7
|
+
"test": "mocha",
|
|
8
8
|
"build": "tsc",
|
|
9
9
|
"prepare": "npm run build",
|
|
10
10
|
"watch": "npm run build -- --watch",
|
|
11
|
-
"
|
|
11
|
+
"clean-coverage": "rm -rf coverage .nyc_output .xunit",
|
|
12
|
+
"coverage": "npm run clean-coverage && nyc mocha",
|
|
13
|
+
"test-reports": "npm run clean-coverage && nyc --reporter clover mocha --reporter xunit --reporter-option output=.xunit",
|
|
14
|
+
"coverage-html": "npm run test-reports && nyc report --reporter lcov && xdg-open coverage/lcov-report/index.html"
|
|
12
15
|
},
|
|
13
16
|
"bin": {
|
|
14
17
|
"sealgen": "./lib/cli.js"
|
|
@@ -16,6 +19,8 @@
|
|
|
16
19
|
"author": "",
|
|
17
20
|
"license": "ISC",
|
|
18
21
|
"devDependencies": {
|
|
22
|
+
"@istanbuljs/nyc-config-typescript": "^1.0.2",
|
|
23
|
+
"@playwright/test": "^1.30.0",
|
|
19
24
|
"@types/koa__router": "^12.0.0",
|
|
20
25
|
"@types/mocha": "^9.0.0",
|
|
21
26
|
"@types/node": "^18.11.4",
|
|
@@ -27,13 +32,16 @@
|
|
|
27
32
|
"eslint-config-prettier": "^8.3.0",
|
|
28
33
|
"eslint-plugin-prettier": "^3.4.1",
|
|
29
34
|
"eslint-plugin-with-tsc-error": "^0.0.7",
|
|
35
|
+
"get-port": "^5.0.0",
|
|
30
36
|
"koa-body": "^5.0.0",
|
|
31
|
-
"mocha": "^9.
|
|
32
|
-
"mri": "^1.
|
|
37
|
+
"mocha": "^9.2.2",
|
|
38
|
+
"mri": "^1.2.0",
|
|
33
39
|
"nyc": "^15.1.0",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
40
|
+
"playwright": "^1.29.2",
|
|
41
|
+
"source-map-support": "^0.5.21",
|
|
42
|
+
"ts-node": "^10.9.1",
|
|
43
|
+
"typescript": "^4.3.5",
|
|
44
|
+
"wait-port": "^1.0.4"
|
|
37
45
|
},
|
|
38
46
|
"types": "./@types/index.d.ts",
|
|
39
47
|
"dependencies": {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
|
+
import { exec, spawn } from "child_process";
|
|
3
|
+
import { promisify } from "util";
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
import waitPort from "wait-port";
|
|
6
|
+
import getPort from "get-port";
|
|
7
|
+
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
|
|
10
|
+
describe("add route test", () => {
|
|
11
|
+
let node_pid = 0;
|
|
12
|
+
const app_path = "/tmp/sealious-minimal";
|
|
13
|
+
const container_name = "sealgen-test-mongo";
|
|
14
|
+
afterEach(async function () {
|
|
15
|
+
if (node_pid != 0) await execAsync(`kill -9 ${node_pid}`);
|
|
16
|
+
await Promise.all([
|
|
17
|
+
fs.rm(app_path, { recursive: true, force: true }),
|
|
18
|
+
execAsync(`docker rm -f ${container_name}`),
|
|
19
|
+
]);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("creates minimal sealious app", async function () {
|
|
23
|
+
this.timeout(250000);
|
|
24
|
+
console.log("\tcloning sealious-minimal...");
|
|
25
|
+
await execAsync(
|
|
26
|
+
`git clone https://hub.sealcode.org/source/sealious-minimal.git ${app_path} && cd ${app_path} && git checkout f48991a0a8b426e0d2f4a4b448fdd41d643b0dae`
|
|
27
|
+
);
|
|
28
|
+
console.log("\tinstalling dependencies and sealgen...");
|
|
29
|
+
await execAsync(
|
|
30
|
+
`cd ${app_path} && npm ci && rm -rf node_modules/@sealcode/sealgen && ln -s $OLDPWD node_modules/@sealcode/sealgen`
|
|
31
|
+
);
|
|
32
|
+
console.log("\trunning add-route and building app...");
|
|
33
|
+
await execAsync(
|
|
34
|
+
`cd ${app_path} && npx sealgen add-route --url=/sample --action=Sample --mode=page && npm run build`
|
|
35
|
+
);
|
|
36
|
+
console.log(
|
|
37
|
+
"\tstarting the database...(if timeouts here, run 'docker pull mongo:4.4-bionic' to solve)"
|
|
38
|
+
);
|
|
39
|
+
const port = await getPort();
|
|
40
|
+
await execAsync(`docker run -p ${port}:27017 --name ${container_name} -d mongo:4.4-bionic`);
|
|
41
|
+
console.log("\trunning app and making request to the generated url...");
|
|
42
|
+
const env = { ...process.env, SEALIOUS_MONGO_PORT: port.toString() };
|
|
43
|
+
let app_start = spawn(`node`, [`${app_path}/dist/back/index.js`], {
|
|
44
|
+
env,
|
|
45
|
+
});
|
|
46
|
+
if (app_start.pid == undefined) throw new Error("node failed to start");
|
|
47
|
+
node_pid = app_start.pid;
|
|
48
|
+
await waitPort({
|
|
49
|
+
host: "localhost",
|
|
50
|
+
port: 8080,
|
|
51
|
+
output: "silent",
|
|
52
|
+
timeout: 6000,
|
|
53
|
+
});
|
|
54
|
+
const res = await axios.get("http://localhost:8080/sample");
|
|
55
|
+
if (res.status != 200)
|
|
56
|
+
throw new Error("url generated by add-route exists but doesnt return 200");
|
|
57
|
+
});
|
|
58
|
+
});
|
package/src/add-route.ts
CHANGED
|
@@ -9,14 +9,15 @@ import { pageTemplate } from "./templates/page";
|
|
|
9
9
|
import { redirectTemplate } from "./templates/redirect";
|
|
10
10
|
import { testTemplate } from "./templates/route-test";
|
|
11
11
|
import { escape_url_params } from "./utils/escape-url-params";
|
|
12
|
-
import { question } from "./utils/question";
|
|
13
12
|
import prompts = require("prompts");
|
|
14
13
|
import { postTemplate } from "./templates/post";
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
export async function addRoute(
|
|
16
|
+
params: Partial<{ [key in "action" | "url" | "mode"]: string }>,
|
|
17
|
+
app_directory: string = process.cwd()
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
const target_locreq = _locreq(app_directory);
|
|
20
|
+
prompts.override(params);
|
|
20
21
|
const response = await prompts([
|
|
21
22
|
{
|
|
22
23
|
type: "text",
|
package/src/build.ts
CHANGED
|
@@ -31,6 +31,7 @@ async function complex_build(watch: boolean): Promise<void> {
|
|
|
31
31
|
const watcher = chokidar.watch("src", { ignoreInitial: true });
|
|
32
32
|
watcher.on("all", async (_, path) => {
|
|
33
33
|
if (!scss_build) return;
|
|
34
|
+
if (path.includes(".#")) return;
|
|
34
35
|
if (path.endsWith(".scss") && !path.endsWith("/includes.scss")) {
|
|
35
36
|
// refresh the list of all scss files in includes.scss
|
|
36
37
|
await generateScssIncludes();
|
|
@@ -70,9 +71,11 @@ async function complex_build(watch: boolean): Promise<void> {
|
|
|
70
71
|
watch && scss_build?.rebuild?.();
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
export async function buildProject(
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
export async function buildProject({
|
|
75
|
+
watch,
|
|
76
|
+
}: {
|
|
77
|
+
watch: boolean;
|
|
78
|
+
}): Promise<void> {
|
|
76
79
|
try {
|
|
77
80
|
await build({
|
|
78
81
|
entryPoints: ["./src/front/index.ts"],
|
package/src/cli.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { makeEnv } from "./make-env";
|
|
|
9
9
|
|
|
10
10
|
const actions: Record<
|
|
11
11
|
string,
|
|
12
|
-
(
|
|
12
|
+
(args: Record<string, string | boolean>) => Promise<void> | undefined
|
|
13
13
|
> = {
|
|
14
14
|
"add-collection": addCollection,
|
|
15
15
|
"add-route": addRoute,
|
|
@@ -32,5 +32,5 @@ void (async function () {
|
|
|
32
32
|
const action = process.argv.at(2);
|
|
33
33
|
actions;
|
|
34
34
|
const fn = actions[action || "default"] || actions.default;
|
|
35
|
-
await fn(
|
|
35
|
+
await fn(require("yargs").argv);
|
|
36
36
|
})();
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("boolean field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const required = new Fields.Boolean(true);
|
|
9
|
+
const not_required = new Fields.Boolean(false);
|
|
10
|
+
|
|
11
|
+
assert.strictEqual((await required.isValueValid(ctx, true)).valid, true);
|
|
12
|
+
assert.strictEqual((await required.isValueValid(ctx, false)).valid, false);
|
|
13
|
+
assert.strictEqual((await not_required.isValueValid(ctx, true)).valid, true);
|
|
14
|
+
assert.strictEqual((await not_required.isValueValid(ctx, false)).valid, true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("parse function", async () => {
|
|
18
|
+
const field = new Fields.Boolean(true);
|
|
19
|
+
const true_response = await field.parse(ctx, true as any);
|
|
20
|
+
const null_response = await field.parse(ctx, null as any);
|
|
21
|
+
const true_as_string_response = await field.parse(ctx, "true");
|
|
22
|
+
const undefined_response = await field.parse(ctx, undefined);
|
|
23
|
+
const number_response = await field.parse(ctx, 42);
|
|
24
|
+
|
|
25
|
+
assert.strictEqual(true_response.parsable, true);
|
|
26
|
+
assert.strictEqual(true_response.parsed_value, true);
|
|
27
|
+
assert.strictEqual(null_response.parsable, true);
|
|
28
|
+
assert.strictEqual(null_response.parsed_value, false);
|
|
29
|
+
assert.strictEqual(true_as_string_response.parsable, true);
|
|
30
|
+
assert.strictEqual(true_as_string_response.parsed_value, true);
|
|
31
|
+
assert.strictEqual(undefined_response.parsable, true);
|
|
32
|
+
assert.strictEqual(undefined_response.parsed_value, false);
|
|
33
|
+
assert.strictEqual(number_response.parsable, false);
|
|
34
|
+
assert.strictEqual(number_response.error, "Please enter a boolean");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("email field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const field = new Fields.EmailField(true);
|
|
9
|
+
|
|
10
|
+
assert.strictEqual((await field.isValueValid(ctx, "yes@an.email")).valid, true);
|
|
11
|
+
assert.strictEqual((await field.isValueValid(ctx, "notanemail")).valid, false);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it("parse function", async () => {
|
|
15
|
+
const field = new Fields.EmailField(true);
|
|
16
|
+
const string_response = await field.parse(ctx, "42");
|
|
17
|
+
const number_response = await field.parse(ctx, 42);
|
|
18
|
+
|
|
19
|
+
assert.strictEqual(string_response.parsable, true);
|
|
20
|
+
assert.strictEqual(string_response.parsed_value, "42");
|
|
21
|
+
assert.strictEqual(number_response.parsable, false);
|
|
22
|
+
assert.strictEqual(number_response.error, "Please enter a string");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("enum-multiple field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const field = new Fields.EnumMultipleField(true, ["sa", "mp", "le"]);
|
|
9
|
+
|
|
10
|
+
assert.strictEqual((await field.isValueValid(ctx, ["sa", "le"])).valid, true);
|
|
11
|
+
assert.strictEqual((await field.isValueValid(ctx, ["notvalid"])).valid, false);
|
|
12
|
+
assert.strictEqual((await field.isValueValid(ctx, [42] as any)).valid, false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("parse function", async () => {
|
|
16
|
+
const field = new Fields.EnumMultipleField(true, []);
|
|
17
|
+
const string_array_response = await field.parse(ctx, ["42"]);
|
|
18
|
+
const number_response = await field.parse(ctx, 42);
|
|
19
|
+
const string_response = await field.parse(ctx, "sample");
|
|
20
|
+
const null_response = await field.parse(ctx, null as any);
|
|
21
|
+
|
|
22
|
+
assert.strictEqual(string_array_response.parsable, true);
|
|
23
|
+
assert.deepEqual(string_array_response.parsed_value, ["42"]);
|
|
24
|
+
assert.strictEqual(number_response.parsable, false);
|
|
25
|
+
assert.strictEqual(number_response.error, "Please enter a list of strings");
|
|
26
|
+
assert.strictEqual(string_response.parsable, true);
|
|
27
|
+
assert.deepEqual(string_response.parsed_value, ["sample"]);
|
|
28
|
+
assert.strictEqual(null_response.parsable, true);
|
|
29
|
+
assert.deepEqual(null_response.parsed_value, []);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("enum field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const field = new Fields.EnumField(true, ["sa", "mp", "le"]);
|
|
9
|
+
|
|
10
|
+
assert.strictEqual((await field.isValueValid(ctx, 42)).valid, false);
|
|
11
|
+
assert.strictEqual((await field.isValueValid(ctx, "mp")).valid, true);
|
|
12
|
+
assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("parse function", async () => {
|
|
16
|
+
const field = new Fields.EnumField(true, []);
|
|
17
|
+
const string_response = await field.parse(ctx, "42");
|
|
18
|
+
const number_response = await field.parse(ctx, 42);
|
|
19
|
+
|
|
20
|
+
assert.strictEqual(string_response.parsable, true);
|
|
21
|
+
assert.strictEqual(string_response.parsed_value, "42");
|
|
22
|
+
assert.strictEqual(number_response.parsable, false);
|
|
23
|
+
assert.strictEqual(number_response.error, "Please enter a string");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("number field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const required = new Fields.NumberField(true, 0);
|
|
9
|
+
const not_required = new Fields.NumberField(false, 0);
|
|
10
|
+
|
|
11
|
+
assert.strictEqual((await required.isValueValid(ctx, 42)).valid, true);
|
|
12
|
+
assert.strictEqual((await required.isValueValid(ctx, "42")).valid, true);
|
|
13
|
+
assert.strictEqual((await required.isValueValid(ctx, "notvalid")).valid, false);
|
|
14
|
+
assert.strictEqual((await not_required.isValueValid(ctx, "")).valid, true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("parse function", async () => {
|
|
18
|
+
const required = new Fields.NumberField(true, 0);
|
|
19
|
+
const decimal_digits = new Fields.NumberField(true, 0, { decimalDigits: 1 });
|
|
20
|
+
const number_as_string_response = await required.parse(ctx, "42");
|
|
21
|
+
const number_response = await required.parse(ctx, 42);
|
|
22
|
+
const not_a_number_response = await required.parse(ctx, "notanumber");
|
|
23
|
+
const decimal_number_response = await decimal_digits.parse(ctx, 42.42);
|
|
24
|
+
|
|
25
|
+
assert.strictEqual(number_as_string_response.parsable, true);
|
|
26
|
+
assert.strictEqual(number_as_string_response.parsed_value, 42);
|
|
27
|
+
assert.strictEqual(number_response.parsable, true);
|
|
28
|
+
assert.strictEqual(number_response.parsed_value, 42);
|
|
29
|
+
assert.strictEqual(not_a_number_response.parsable, false);
|
|
30
|
+
assert.strictEqual(not_a_number_response.error, "Please enter a number");
|
|
31
|
+
assert.strictEqual(decimal_number_response.parsable, true);
|
|
32
|
+
assert.strictEqual(decimal_number_response.parsed_value, 42.4);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("pick-from-list field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const field = new Fields.PickFromListField(true, async () => {
|
|
9
|
+
return [
|
|
10
|
+
{ value: "samplev", label: "samplel" },
|
|
11
|
+
{ value: "samplevv", label: "samplell" },
|
|
12
|
+
];
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
assert.strictEqual((await field.isValueValid(ctx, 42 as any)).valid, false);
|
|
16
|
+
assert.strictEqual((await field.isValueValid(ctx, "samplevv")).valid, true);
|
|
17
|
+
assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { Fields } from "../../index";
|
|
3
|
+
|
|
4
|
+
describe("regexp field", () => {
|
|
5
|
+
const ctx = {} as any;
|
|
6
|
+
|
|
7
|
+
it("validation logic", async () => {
|
|
8
|
+
const field = new Fields.RegExpField(true, /^4/, "error");
|
|
9
|
+
|
|
10
|
+
assert.strictEqual((await field.isValueValid(ctx, "42")).valid, true);
|
|
11
|
+
assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
|
|
12
|
+
assert.strictEqual((await field.isValueValid(ctx, 42)).valid, false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("parse function", async () => {
|
|
16
|
+
const field = new Fields.RegExpField(true, /^4/, "error");
|
|
17
|
+
const string_response = await field.parse(ctx, "42");
|
|
18
|
+
const number_response = await field.parse(ctx, 42);
|
|
19
|
+
|
|
20
|
+
assert.strictEqual(string_response.parsable, true);
|
|
21
|
+
assert.strictEqual(string_response.parsed_value, "42");
|
|
22
|
+
assert.strictEqual(number_response.parsable, false);
|
|
23
|
+
assert.strictEqual(number_response.error, "Please enter a string");
|
|
24
|
+
});
|
|
25
|
+
});
|