@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.
Files changed (139) hide show
  1. package/.eslintrc.js +1 -0
  2. package/.log/ti-292609.log +508 -0
  3. package/.log/ti-304933.log +524 -0
  4. package/.log/ti-312312.log +508 -0
  5. package/.log/ti-314240.log +1617 -0
  6. package/.log/ti-62627.log +508 -0
  7. package/.log/ti-64785.log +508 -0
  8. package/.log/ti-65911.log +533 -0
  9. package/.log/ti-69885.log +548 -0
  10. package/.log/ti-72106.log +551 -0
  11. package/.log/ti-74858.log +508 -0
  12. package/.log/tsserver.log +1610 -1625
  13. package/@types/build.d.ts +1 -0
  14. package/@types/cli.d.ts +2 -0
  15. package/@types/forms/controls/checkboxed-list-input.d.ts +16 -0
  16. package/@types/forms/controls/controls.d.ts +9 -0
  17. package/@types/forms/controls/dropdown.d.ts +20 -0
  18. package/@types/forms/controls/editable-collection-subset.d.ts +21 -0
  19. package/@types/forms/controls/form-control.d.ts +8 -0
  20. package/@types/forms/controls/form-field-control.d.ts +13 -0
  21. package/@types/forms/controls/form-header.d.ts +9 -0
  22. package/@types/forms/controls/form-paragraph.d.ts +7 -0
  23. package/@types/forms/controls/frame.d.ts +17 -0
  24. package/@types/forms/controls/simple-input.d.ts +28 -0
  25. package/@types/forms/controls.d.ts +0 -0
  26. package/@types/forms/field.d.ts +42 -0
  27. package/@types/forms/form-fields-list.d.ts +4 -0
  28. package/@types/forms/form.d.ts +42 -0
  29. package/@types/forms/validator.d.ts +3 -0
  30. package/@types/index.d.ts +14 -2
  31. package/@types/page/access-control.d.ts +6 -0
  32. package/@types/page/list.d.ts +59 -0
  33. package/@types/page/page.d.ts +26 -0
  34. package/@types/page/props-parser.d.ts +20 -0
  35. package/@types/run.d.ts +0 -0
  36. package/@types/utils/natural-numbers.d.ts +1 -0
  37. package/@types/utils/sleep.d.ts +1 -0
  38. package/@types/utils/url-with-new-params.d.ts +2 -0
  39. package/@types/utils/utils.d.ts +9 -0
  40. package/@types/utils/walk.d.ts +1 -1
  41. package/lib/build.js +108 -0
  42. package/lib/build.js.map +1 -0
  43. package/lib/cli.js +30 -0
  44. package/lib/cli.js.map +1 -0
  45. package/lib/find-scss-includes.js +2 -1
  46. package/lib/find-scss-includes.js.map +1 -1
  47. package/lib/forms/controls/checkboxed-list-input.js +43 -0
  48. package/lib/forms/controls/checkboxed-list-input.js.map +1 -0
  49. package/lib/forms/controls/controls.js +22 -0
  50. package/lib/forms/controls/controls.js.map +1 -0
  51. package/lib/forms/controls/dropdown.js +40 -0
  52. package/lib/forms/controls/dropdown.js.map +1 -0
  53. package/lib/forms/controls/editable-collection-subset.js +73 -0
  54. package/lib/forms/controls/editable-collection-subset.js.map +1 -0
  55. package/lib/forms/controls/form-control.js +7 -0
  56. package/lib/forms/controls/form-control.js.map +1 -0
  57. package/lib/forms/controls/form-field-control.js +22 -0
  58. package/lib/forms/controls/form-field-control.js.map +1 -0
  59. package/lib/forms/controls/form-header.js +18 -0
  60. package/lib/forms/controls/form-header.js.map +1 -0
  61. package/lib/forms/controls/form-paragraph.js +16 -0
  62. package/lib/forms/controls/form-paragraph.js.map +1 -0
  63. package/lib/forms/controls/frame.js +29 -0
  64. package/lib/forms/controls/frame.js.map +1 -0
  65. package/lib/forms/controls/simple-input.js +50 -0
  66. package/lib/forms/controls/simple-input.js.map +1 -0
  67. package/lib/forms/controls.js +1 -0
  68. package/lib/forms/controls.js.map +1 -0
  69. package/lib/forms/field.js +80 -0
  70. package/lib/forms/field.js.map +1 -0
  71. package/lib/forms/form-fields-list.js +10 -0
  72. package/lib/forms/form-fields-list.js.map +1 -0
  73. package/lib/forms/form.js +162 -0
  74. package/lib/forms/form.js.map +1 -0
  75. package/lib/forms/validator.js +11 -0
  76. package/lib/forms/validator.js.map +1 -0
  77. package/lib/generate-routes.js +1 -1
  78. package/lib/generate-routes.js.map +1 -1
  79. package/lib/index.js +17 -25
  80. package/lib/index.js.map +1 -1
  81. package/lib/page/access-control.js +20 -0
  82. package/lib/page/access-control.js.map +1 -0
  83. package/lib/page/list.js +148 -0
  84. package/lib/page/list.js.map +1 -0
  85. package/lib/page/page.js +20 -0
  86. package/lib/page/page.js.map +1 -0
  87. package/lib/page/props-parser.js +74 -0
  88. package/lib/page/props-parser.js.map +1 -0
  89. package/lib/run.js +1 -0
  90. package/lib/run.js.map +1 -0
  91. package/lib/templates/list.js +1 -1
  92. package/lib/utils/list-collections.js +1 -1
  93. package/lib/utils/list-collections.js.map +1 -1
  94. package/lib/utils/natural-numbers.js +10 -0
  95. package/lib/utils/natural-numbers.js.map +1 -0
  96. package/lib/utils/sleep.js +8 -0
  97. package/lib/utils/sleep.js.map +1 -0
  98. package/lib/utils/url-with-new-params.js +12 -0
  99. package/lib/utils/url-with-new-params.js.map +1 -0
  100. package/lib/utils/utils.js +19 -0
  101. package/lib/utils/utils.js.map +1 -0
  102. package/lib/utils/walk.js +4 -4
  103. package/lib/utils/walk.js.map +1 -1
  104. package/package.json +17 -4
  105. package/src/build.ts +82 -0
  106. package/src/cli.ts +34 -0
  107. package/src/find-scss-includes.ts +3 -2
  108. package/src/forms/controls/checkboxed-list-input.ts +50 -0
  109. package/src/forms/controls/controls.ts +9 -0
  110. package/src/forms/controls/dropdown.ts +57 -0
  111. package/src/forms/controls/editable-collection-subset.ts +91 -0
  112. package/src/forms/controls/form-control.ts +13 -0
  113. package/src/forms/controls/form-field-control.ts +39 -0
  114. package/src/forms/controls/form-header.ts +16 -0
  115. package/src/forms/controls/form-paragraph.ts +11 -0
  116. package/src/forms/controls/frame.ts +26 -0
  117. package/src/forms/controls/simple-input.ts +73 -0
  118. package/src/forms/controls.ts +0 -0
  119. package/src/forms/field.ts +119 -0
  120. package/src/forms/form-fields-list.ts +7 -0
  121. package/src/forms/form.ts +242 -0
  122. package/src/forms/forms.scss +18 -0
  123. package/src/forms/validator.ts +10 -0
  124. package/src/generate-routes.ts +2 -2
  125. package/src/index.ts +14 -28
  126. package/src/page/access-control.ts +18 -0
  127. package/src/page/list.ts +214 -0
  128. package/src/page/page.ts +31 -0
  129. package/src/page/props-parser.ts +99 -0
  130. package/src/run.ts +0 -0
  131. package/src/templates/list.ts +1 -1
  132. package/src/utils/list-collections.ts +2 -2
  133. package/src/utils/natural-numbers.ts +5 -0
  134. package/src/utils/sleep.ts +3 -0
  135. package/src/utils/url-with-new-params.ts +9 -0
  136. package/src/utils/utils.ts +10 -0
  137. package/src/utils/walk.ts +2 -2
  138. package/tsconfig.json +5 -2
  139. package/src/tsconfig.json +0 -18
@@ -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
@@ -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, Middlewares } from "sealious";
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 { walk } from "./walk";
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 walk(target_locreq.resolve("src/back/collections"));
6
+ const files = await walkDir(target_locreq.resolve("src/back/collections"));
7
7
  return files
8
8
  .filter(
9
9
  (f) =>
@@ -0,0 +1,5 @@
1
+ export function* naturalNumbers(min: number, max: number) {
2
+ for (let i = min; i <= max; i++) {
3
+ yield i;
4
+ }
5
+ }
@@ -0,0 +1,3 @@
1
+ export async function sleep(time: number) {
2
+ return new Promise((resolve) => setTimeout(resolve, time));
3
+ }
@@ -0,0 +1,9 @@
1
+ import { BaseContext } from "koa";
2
+ import qs from "qs";
3
+
4
+ export function UrlWithNewParams(
5
+ ctx: BaseContext,
6
+ query_params: Record<string, unknown>
7
+ ): string {
8
+ return `${ctx.path}?${qs.stringify(query_params)}`;
9
+ }
@@ -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 walk(dir: string): Promise<string[]> {
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 walk(fullpath))];
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
- }