@sealcode/sealgen 0.2.1 → 0.2.2
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 -0
- package/.log/ti-292609.log +508 -0
- package/.log/ti-304933.log +524 -0
- package/.log/ti-312312.log +508 -0
- package/.log/ti-314240.log +1617 -0
- package/.log/ti-62627.log +508 -0
- package/.log/ti-64785.log +508 -0
- package/.log/ti-65911.log +533 -0
- package/.log/ti-69885.log +548 -0
- package/.log/ti-72106.log +551 -0
- package/.log/ti-74858.log +508 -0
- package/.log/tsserver.log +1610 -1625
- package/@types/build.d.ts +1 -0
- package/@types/cli.d.ts +2 -0
- package/@types/forms/controls/checkboxed-list-input.d.ts +16 -0
- package/@types/forms/controls/controls.d.ts +9 -0
- package/@types/forms/controls/dropdown.d.ts +20 -0
- package/@types/forms/controls/editable-collection-subset.d.ts +21 -0
- package/@types/forms/controls/form-control.d.ts +8 -0
- package/@types/forms/controls/form-field-control.d.ts +13 -0
- package/@types/forms/controls/form-header.d.ts +9 -0
- package/@types/forms/controls/form-paragraph.d.ts +7 -0
- package/@types/forms/controls/frame.d.ts +17 -0
- package/@types/forms/controls/simple-input.d.ts +28 -0
- package/@types/forms/controls.d.ts +0 -0
- package/@types/forms/field.d.ts +42 -0
- package/@types/forms/form-fields-list.d.ts +4 -0
- package/@types/forms/form.d.ts +42 -0
- package/@types/forms/validator.d.ts +3 -0
- package/@types/index.d.ts +14 -2
- package/@types/page/access-control.d.ts +6 -0
- package/@types/page/list.d.ts +59 -0
- package/@types/page/page.d.ts +26 -0
- package/@types/page/props-parser.d.ts +20 -0
- package/@types/run.d.ts +0 -0
- package/@types/utils/natural-numbers.d.ts +1 -0
- package/@types/utils/sleep.d.ts +1 -0
- package/@types/utils/url-with-new-params.d.ts +2 -0
- package/@types/utils/utils.d.ts +9 -0
- package/@types/utils/walk.d.ts +1 -1
- package/lib/build.js +108 -0
- package/lib/build.js.map +1 -0
- package/lib/cli.js +30 -0
- package/lib/cli.js.map +1 -0
- package/lib/find-scss-includes.js +2 -1
- package/lib/find-scss-includes.js.map +1 -1
- package/lib/forms/controls/checkboxed-list-input.js +43 -0
- package/lib/forms/controls/checkboxed-list-input.js.map +1 -0
- package/lib/forms/controls/controls.js +22 -0
- package/lib/forms/controls/controls.js.map +1 -0
- package/lib/forms/controls/dropdown.js +40 -0
- package/lib/forms/controls/dropdown.js.map +1 -0
- package/lib/forms/controls/editable-collection-subset.js +73 -0
- package/lib/forms/controls/editable-collection-subset.js.map +1 -0
- package/lib/forms/controls/form-control.js +7 -0
- package/lib/forms/controls/form-control.js.map +1 -0
- package/lib/forms/controls/form-field-control.js +22 -0
- package/lib/forms/controls/form-field-control.js.map +1 -0
- package/lib/forms/controls/form-header.js +18 -0
- package/lib/forms/controls/form-header.js.map +1 -0
- package/lib/forms/controls/form-paragraph.js +16 -0
- package/lib/forms/controls/form-paragraph.js.map +1 -0
- package/lib/forms/controls/frame.js +29 -0
- package/lib/forms/controls/frame.js.map +1 -0
- package/lib/forms/controls/simple-input.js +50 -0
- package/lib/forms/controls/simple-input.js.map +1 -0
- package/lib/forms/controls.js +1 -0
- package/lib/forms/controls.js.map +1 -0
- package/lib/forms/field.js +80 -0
- package/lib/forms/field.js.map +1 -0
- package/lib/forms/form-fields-list.js +10 -0
- package/lib/forms/form-fields-list.js.map +1 -0
- package/lib/forms/form.js +162 -0
- package/lib/forms/form.js.map +1 -0
- package/lib/forms/validator.js +11 -0
- package/lib/forms/validator.js.map +1 -0
- package/lib/generate-routes.js +1 -1
- package/lib/generate-routes.js.map +1 -1
- package/lib/index.js +17 -25
- package/lib/index.js.map +1 -1
- package/lib/page/access-control.js +20 -0
- package/lib/page/access-control.js.map +1 -0
- package/lib/page/list.js +148 -0
- package/lib/page/list.js.map +1 -0
- package/lib/page/page.js +20 -0
- package/lib/page/page.js.map +1 -0
- package/lib/page/props-parser.js +74 -0
- package/lib/page/props-parser.js.map +1 -0
- package/lib/run.js +1 -0
- package/lib/run.js.map +1 -0
- package/lib/templates/list.js +1 -1
- package/lib/utils/list-collections.js +1 -1
- package/lib/utils/list-collections.js.map +1 -1
- package/lib/utils/natural-numbers.js +10 -0
- package/lib/utils/natural-numbers.js.map +1 -0
- package/lib/utils/sleep.js +8 -0
- package/lib/utils/sleep.js.map +1 -0
- package/lib/utils/url-with-new-params.js +12 -0
- package/lib/utils/url-with-new-params.js.map +1 -0
- package/lib/utils/utils.js +19 -0
- package/lib/utils/utils.js.map +1 -0
- package/lib/utils/walk.js +4 -4
- package/lib/utils/walk.js.map +1 -1
- package/package.json +17 -4
- package/src/build.ts +82 -0
- package/src/cli.ts +34 -0
- package/src/find-scss-includes.ts +3 -2
- package/src/forms/controls/checkboxed-list-input.ts +50 -0
- package/src/forms/controls/controls.ts +9 -0
- package/src/forms/controls/dropdown.ts +57 -0
- package/src/forms/controls/editable-collection-subset.ts +91 -0
- package/src/forms/controls/form-control.ts +13 -0
- package/src/forms/controls/form-field-control.ts +39 -0
- package/src/forms/controls/form-header.ts +16 -0
- package/src/forms/controls/form-paragraph.ts +11 -0
- package/src/forms/controls/frame.ts +26 -0
- package/src/forms/controls/simple-input.ts +73 -0
- package/src/forms/controls.ts +0 -0
- package/src/forms/field.ts +119 -0
- package/src/forms/form-fields-list.ts +7 -0
- package/src/forms/form.ts +242 -0
- package/src/forms/forms.scss +18 -0
- package/src/forms/validator.ts +10 -0
- package/src/generate-routes.ts +2 -2
- package/src/index.ts +14 -28
- package/src/page/access-control.ts +18 -0
- package/src/page/list.ts +214 -0
- package/src/page/page.ts +31 -0
- package/src/page/props-parser.ts +99 -0
- package/src/run.ts +0 -0
- package/src/templates/list.ts +1 -1
- package/src/utils/list-collections.ts +2 -2
- package/src/utils/natural-numbers.ts +5 -0
- package/src/utils/sleep.ts +3 -0
- package/src/utils/url-with-new-params.ts +9 -0
- package/src/utils/utils.ts +10 -0
- package/src/utils/walk.ts +2 -2
- package/tsconfig.json +5 -2
- package/src/tsconfig.json +0 -18
package/src/page/page.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Router from "@koa/router";
|
|
2
|
+
import { BaseContext } from "koa";
|
|
3
|
+
|
|
4
|
+
import { Templatable, tempstream } from "tempstream";
|
|
5
|
+
|
|
6
|
+
export type PageErrorMessage = { type: "access" | "internal"; message: string };
|
|
7
|
+
|
|
8
|
+
export interface Mountable {
|
|
9
|
+
mount: (router: Router, path: string) => void;
|
|
10
|
+
canAccess: (ctx: BaseContext) => Promise<{ canAccess: boolean; message: string }>;
|
|
11
|
+
renderError(ctx: BaseContext, error: PageErrorMessage): Promise<Templatable>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export abstract class Page implements Mountable {
|
|
15
|
+
mount(router: Router, path: string) {
|
|
16
|
+
router.get(path, async (ctx) => {
|
|
17
|
+
ctx.body = await this.render(ctx);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
|
+
async canAccess(_: BaseContext) {
|
|
23
|
+
return { canAccess: true, message: "" };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async renderError(_: BaseContext, error: PageErrorMessage) {
|
|
27
|
+
return tempstream/* HTML */ `<div>${error.message}</div>`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public abstract render(ctx: BaseContext): Promise<Templatable>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import {
|
|
2
|
+
hasShape,
|
|
3
|
+
predicates,
|
|
4
|
+
Shape,
|
|
5
|
+
ShapeToType,
|
|
6
|
+
} from "@sealcode/ts-predicates";
|
|
7
|
+
|
|
8
|
+
import { BaseContext } from "koa";
|
|
9
|
+
import merge from "merge";
|
|
10
|
+
import { BasePageProps } from "./list";
|
|
11
|
+
|
|
12
|
+
export type EncodedProps = Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
// the intention here is to sometime in the future be able to store multiple frames on one document, so props for each frame will be in a different namespace, and parsers are going to help with that
|
|
15
|
+
|
|
16
|
+
function parseStringValues<TheShape extends Shape>(
|
|
17
|
+
shape: TheShape,
|
|
18
|
+
values: Record<string, string>
|
|
19
|
+
): ShapeToType<TheShape> {
|
|
20
|
+
const result: Record<string, unknown> = {};
|
|
21
|
+
for (const [key, value] of Object.entries(values)) {
|
|
22
|
+
if (!(key in shape)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const predicate = shape[key];
|
|
26
|
+
if (predicate == predicates.number) {
|
|
27
|
+
result[key] = parseFloat(value);
|
|
28
|
+
} else {
|
|
29
|
+
result[key] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
33
|
+
return result as ShapeToType<TheShape>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export abstract class PagePropsParser<PropsType extends BasePageProps> {
|
|
37
|
+
abstract decode(ctx: BaseContext): PropsType;
|
|
38
|
+
abstract encode(props: PropsType): EncodedProps;
|
|
39
|
+
abstract getHTMLInputName(prop_name: string): string;
|
|
40
|
+
|
|
41
|
+
constructor(
|
|
42
|
+
public propsShape: Shape,
|
|
43
|
+
public defaultValues: Partial<PropsType>
|
|
44
|
+
) {}
|
|
45
|
+
|
|
46
|
+
overwriteProp(
|
|
47
|
+
ctx: BaseContext,
|
|
48
|
+
new_props: Partial<PropsType>
|
|
49
|
+
): EncodedProps {
|
|
50
|
+
const result = {};
|
|
51
|
+
merge.recursive(result, this.decode(ctx), new_props);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
makeHiddenInputs(values: PropsType, fields_to_skip: string[]): string {
|
|
56
|
+
return Object.entries(values)
|
|
57
|
+
.filter(([key]) => !fields_to_skip.includes(key))
|
|
58
|
+
.map(
|
|
59
|
+
([key, value]: [string, string | number]) =>
|
|
60
|
+
/* HTML */ `<input
|
|
61
|
+
type="hidden"
|
|
62
|
+
name="${key}"
|
|
63
|
+
value="${value}"
|
|
64
|
+
/>`
|
|
65
|
+
)
|
|
66
|
+
.join(" ");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
getDefaultValue<Key extends keyof PropsType>(
|
|
70
|
+
key: Key
|
|
71
|
+
): PropsType[Key] | undefined {
|
|
72
|
+
return this.defaultValues[key];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class AllQueryParams<
|
|
77
|
+
PropsType extends BasePageProps
|
|
78
|
+
> extends PagePropsParser<PropsType> {
|
|
79
|
+
decode(ctx: BaseContext): PropsType {
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
81
|
+
const query = parseStringValues(this.propsShape, {
|
|
82
|
+
...this.defaultValues,
|
|
83
|
+
...ctx.query,
|
|
84
|
+
} as unknown as Record<string, string>);
|
|
85
|
+
if (!hasShape(this.propsShape, query)) {
|
|
86
|
+
throw new Error("Wrong props shape");
|
|
87
|
+
}
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
89
|
+
return query as PropsType;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
encode(props: PropsType): Record<string, unknown> {
|
|
93
|
+
return props;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
getHTMLInputName(prop_name: string): string {
|
|
97
|
+
return prop_name;
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/run.ts
ADDED
|
File without changes
|
package/src/templates/list.ts
CHANGED
|
@@ -22,7 +22,7 @@ export const listTemplate = async (
|
|
|
22
22
|
collection[0].toLocaleUpperCase() + collection.slice(1);
|
|
23
23
|
const rel = curryImportPath(newfilefullpath);
|
|
24
24
|
return `import { BaseContext } from "koa";
|
|
25
|
-
import { CollectionItem
|
|
25
|
+
import { CollectionItem } from "sealious";
|
|
26
26
|
import { tempstream } from "tempstream";
|
|
27
27
|
import { ${uppercase_collection} } from "${rel(
|
|
28
28
|
"src/back/collections/collections"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import _locreq from "locreq";
|
|
2
|
-
import {
|
|
2
|
+
import { walkDir } from "./walk";
|
|
3
3
|
const target_locreq = _locreq(process.cwd());
|
|
4
4
|
|
|
5
5
|
export async function listCollections(): Promise<string[]> {
|
|
6
|
-
const files = await
|
|
6
|
+
const files = await walkDir(target_locreq.resolve("src/back/collections"));
|
|
7
7
|
return files
|
|
8
8
|
.filter(
|
|
9
9
|
(f) =>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Awaited<T> = T extends Promise<infer U> ? U : T;
|
|
2
|
+
export type UnwrapArray<T> = T extends Array<infer U> ? U : T;
|
|
3
|
+
|
|
4
|
+
export { sleep } from "./sleep";
|
|
5
|
+
export { naturalNumbers } from "./natural-numbers";
|
|
6
|
+
export { UrlWithNewParams } from "./url-with-new-params";
|
|
7
|
+
export { exec } from "./exec";
|
|
8
|
+
export { importPath, curryImportPath } from "./import-path";
|
|
9
|
+
export { listCollections } from "./list-collections";
|
|
10
|
+
export { walkDir } from "./walk";
|
package/src/utils/walk.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "fs";
|
|
2
2
|
import { resolve } from "path";
|
|
3
3
|
|
|
4
|
-
export async function
|
|
4
|
+
export async function walkDir(dir: string): Promise<string[]> {
|
|
5
5
|
const entries = await fs.readdir(dir);
|
|
6
6
|
let ret: string[] = [];
|
|
7
7
|
for (const entry of entries) {
|
|
@@ -11,7 +11,7 @@ export async function walk(dir: string): Promise<string[]> {
|
|
|
11
11
|
|
|
12
12
|
if (info.isDirectory()) {
|
|
13
13
|
// eslint-disable-next-line no-await-in-loop
|
|
14
|
-
ret = [...ret, ...(await
|
|
14
|
+
ret = [...ret, ...(await walkDir(fullpath))];
|
|
15
15
|
} else {
|
|
16
16
|
ret = [...ret, fullpath];
|
|
17
17
|
}
|
package/tsconfig.json
CHANGED
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
"allowJs": true,
|
|
15
15
|
"declarationDir": "@types",
|
|
16
16
|
"resolveJsonModule": true,
|
|
17
|
-
"sourceMap": true
|
|
17
|
+
"sourceMap": true,
|
|
18
|
+
"allowSyntheticDefaultImports": true,
|
|
19
|
+
"keyofStringsOnly": true,
|
|
20
|
+
"skipLibCheck": true
|
|
18
21
|
},
|
|
19
22
|
"include": ["src/**/*"],
|
|
20
|
-
"exclude": ["src/**/*.test.ts"]
|
|
23
|
+
"exclude": ["src/**/*.test.ts", "node_modules/**"]
|
|
21
24
|
}
|
package/src/tsconfig.json
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"module": "ESNext",
|
|
4
|
-
"moduleResolution": "node",
|
|
5
|
-
"noImplicitAny": true,
|
|
6
|
-
"noImplicitThis": true,
|
|
7
|
-
"strictNullChecks": true,
|
|
8
|
-
"target": "ES2020",
|
|
9
|
-
"lib": ["es6", "esnext"],
|
|
10
|
-
"outDir": "../../dist/scripts",
|
|
11
|
-
"checkJs": true,
|
|
12
|
-
"allowJs": true,
|
|
13
|
-
"resolveJsonModule": true,
|
|
14
|
-
"sourceMap": true,
|
|
15
|
-
"skipLibCheck": true
|
|
16
|
-
},
|
|
17
|
-
"include": ["./**/*", "./*"]
|
|
18
|
-
}
|