@sealcode/sealgen 0.6.0 → 0.7.0

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 (82) hide show
  1. package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +1 -0
  2. package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +1 -0
  3. package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +1 -0
  4. package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.xunit +3 -0
  7. package/@types/forms/controls/field-group.d.ts +17 -0
  8. package/@types/forms/controls/form-control.d.ts +1 -1
  9. package/@types/forms/controls/form-field-control.d.ts +1 -1
  10. package/@types/forms/controls/simple-input.d.ts +2 -1
  11. package/@types/forms/form.d.ts +19 -6
  12. package/@types/forms/multiform.d.ts +23 -0
  13. package/@types/index.d.ts +1 -0
  14. package/@types/page/mountable-with-fields.d.ts +32 -0
  15. package/@types/page/mountable.d.ts +2 -27
  16. package/@types/page/page.d.ts +2 -2
  17. package/@types/templates/multiform.d.ts +1 -0
  18. package/@types/templates/redirect.d.ts +1 -0
  19. package/@types/tests/manual/multiform.d.ts +1 -0
  20. package/@types/utils/input-wrapper.d.ts +4 -0
  21. package/coverage/clover.xml +79 -0
  22. package/lib/add-route.js +27 -8
  23. package/lib/add-route.js.map +1 -1
  24. package/lib/forms/controls/checkboxed-list-input.js +12 -9
  25. package/lib/forms/controls/checkboxed-list-input.js.map +1 -1
  26. package/lib/forms/controls/dropdown.js +14 -12
  27. package/lib/forms/controls/dropdown.js.map +1 -1
  28. package/lib/forms/controls/field-group.js +26 -0
  29. package/lib/forms/controls/field-group.js.map +1 -0
  30. package/lib/forms/controls/form-control.js.map +1 -1
  31. package/lib/forms/controls/form-field-control.js.map +1 -1
  32. package/lib/forms/controls/simple-input.js +6 -8
  33. package/lib/forms/controls/simple-input.js.map +1 -1
  34. package/lib/forms/controls/textarea.js +13 -15
  35. package/lib/forms/controls/textarea.js.map +1 -1
  36. package/lib/forms/form.js +95 -57
  37. package/lib/forms/form.js.map +1 -1
  38. package/lib/forms/multiform.js +169 -0
  39. package/lib/forms/multiform.js.map +1 -0
  40. package/lib/generate-collections.js +5 -3
  41. package/lib/generate-collections.js.map +1 -1
  42. package/lib/generate-routes.js +7 -3
  43. package/lib/generate-routes.js.map +1 -1
  44. package/lib/index.js +1 -0
  45. package/lib/index.js.map +1 -1
  46. package/lib/page/list.js +1 -1
  47. package/lib/page/list.js.map +1 -1
  48. package/lib/page/mountable-with-fields.js +63 -0
  49. package/lib/page/mountable-with-fields.js.map +1 -0
  50. package/lib/page/mountable.js +2 -49
  51. package/lib/page/mountable.js.map +1 -1
  52. package/lib/page/page.js +2 -2
  53. package/lib/page/page.js.map +1 -1
  54. package/lib/templates/multiform.js +59 -0
  55. package/lib/templates/multiform.js.map +1 -0
  56. package/lib/templates/redirect.js +27 -0
  57. package/lib/templates/redirect.js.map +1 -0
  58. package/lib/tests/manual/multiform.js +95 -0
  59. package/lib/tests/manual/multiform.js.map +1 -0
  60. package/lib/utils/input-wrapper.js +20 -0
  61. package/lib/utils/input-wrapper.js.map +1 -0
  62. package/package.json +4 -3
  63. package/src/add-route.ts +30 -11
  64. package/src/forms/controls/checkboxed-list-input.ts +17 -10
  65. package/src/forms/controls/dropdown.ts +28 -23
  66. package/src/forms/controls/form-control.ts +3 -1
  67. package/src/forms/controls/form-field-control.ts +4 -1
  68. package/src/forms/controls/simple-input.ts +19 -12
  69. package/src/forms/controls/textarea.ts +15 -14
  70. package/src/forms/form.ts +122 -76
  71. package/src/forms/multiform.ts +211 -0
  72. package/src/generate-collections.ts +6 -3
  73. package/src/generate-routes.ts +7 -3
  74. package/src/index.ts +1 -0
  75. package/src/page/list.ts +1 -1
  76. package/src/page/mountable-with-fields.ts +112 -0
  77. package/src/page/mountable.ts +4 -96
  78. package/src/page/page.ts +7 -3
  79. package/src/templates/multiform.ts +58 -0
  80. package/src/templates/redirect.ts +22 -0
  81. package/src/tests/manual/multiform.ts +106 -0
  82. package/src/utils/input-wrapper.ts +18 -0
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/page/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/page/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MountableWithFields = void 0;
4
+ const tempstream_1 = require("tempstream");
5
+ const mountable_1 = require("./mountable");
6
+ class MountableWithFields extends mountable_1.Mountable {
7
+ constructor() {
8
+ super();
9
+ this.field_names_prefix = ""; // useful for multiform, where many forms are merged into one and field assignment is made using the prefix
10
+ this.form_id = ""; // all fields within this mountable will be tied to form of this id
11
+ if (!this.fields)
12
+ this.fields = {};
13
+ }
14
+ init() {
15
+ for (const [name, field] of Object.entries(this.fields)) {
16
+ field.init(name);
17
+ }
18
+ }
19
+ // this one is meant to be overwritten
20
+ async validateValues(ctx, data) {
21
+ return {
22
+ valid: true,
23
+ error: "",
24
+ };
25
+ }
26
+ async validate(ctx, values) {
27
+ const field_errors = {};
28
+ let valid = true;
29
+ const form_messages = [];
30
+ await Promise.all(Object.entries(values)
31
+ .filter(([fieldname]) => fieldname in this.fields)
32
+ .map(async ([key]) => {
33
+ const field = this.fields[key];
34
+ const { valid: fieldvalid, message: fieldmessage } = await field.getValue(ctx, values);
35
+ if (!fieldvalid) {
36
+ valid = false;
37
+ field_errors[field.name] = fieldmessage;
38
+ }
39
+ }));
40
+ const formValidationResult = await this.validateValues(ctx, values);
41
+ if (!formValidationResult.valid) {
42
+ form_messages.push({
43
+ type: "error",
44
+ text: formValidationResult.error,
45
+ });
46
+ valid = false;
47
+ }
48
+ return { valid, field_errors, form_messages };
49
+ }
50
+ renderControls(ctx, data) {
51
+ return tempstream_1.tempstream /* HTML */ `${this.controls.map((control) => control.render(ctx, data.raw_values, data.messages, this.field_names_prefix, this.form_id))}`;
52
+ }
53
+ async renderError(_, error) {
54
+ return error.message;
55
+ }
56
+ renderMessages(_, data) {
57
+ return tempstream_1.tempstream /* HTML */ `<div class="form-messages">
58
+ ${data.messages.map((message) => `<div class="form-message form-message--${message.type}">${message.text}</div>`)}
59
+ </div>`;
60
+ }
61
+ }
62
+ exports.MountableWithFields = MountableWithFields;
63
+ //# sourceMappingURL=mountable-with-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountable-with-fields.js","sourceRoot":"","sources":["../../src/page/mountable-with-fields.ts"],"names":[],"mappings":"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"}
@@ -1,56 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Mountable = void 0;
4
- const tempstream_1 = require("tempstream");
5
4
  class Mountable {
6
- constructor() {
7
- if (!this.fields)
8
- this.fields = {};
9
- }
10
- // this one is meant to be overwritten
11
- async validateValues(ctx, data) {
12
- return {
13
- valid: true,
14
- error: "",
15
- };
16
- }
17
- async validate(ctx, values) {
18
- const field_errors = {};
19
- let valid = true;
20
- const form_messages = [];
21
- await Promise.all(Object.entries(values)
22
- .filter(([fieldname]) => fieldname in this.fields)
23
- .map(async ([key]) => {
24
- const field = this.fields[key];
25
- const { valid: fieldvalid, message: fieldmessage } = await field.getValue(ctx, values);
26
- if (!fieldvalid) {
27
- valid = false;
28
- field_errors[field.name] = fieldmessage;
29
- }
30
- }));
31
- const formValidationResult = await this.validateValues(ctx, values);
32
- if (!formValidationResult.valid) {
33
- form_messages.push({
34
- type: "error",
35
- text: formValidationResult.error,
36
- });
37
- valid = false;
38
- }
39
- return { valid, field_errors, form_messages };
40
- }
41
- init() {
42
- for (const [name, field] of Object.entries(this.fields)) {
43
- field.init(name);
44
- }
45
- }
46
- renderControls(ctx, data) {
47
- return tempstream_1.tempstream /* HTML */ `${this.controls.map((control) => control.render(ctx, data.raw_values, data.messages))}`;
48
- }
49
- renderMessages(_, data) {
50
- return tempstream_1.tempstream /* HTML */ `<div class="form-messages">
51
- ${data.messages.map((message) => `<div class="form-message form-message--${message.type}">${message.text}</div>`)}
52
- </div>`;
53
- }
5
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
6
+ init() { }
54
7
  }
55
8
  exports.Mountable = Mountable;
56
9
  //# sourceMappingURL=mountable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mountable.js","sourceRoot":"","sources":["../../src/page/mountable.ts"],"names":[],"mappings":";;;AAGA,2CAAyD;AAQzD,MAAsB,SAAS;IAG9B;QACC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,EAAO,CAAC;IACzC,CAAC;IAgBD,sCAAsC;IACtC,KAAK,CAAC,cAAc,CACnB,GAAY,EACZ,IAAmC;QAEnC,OAAO;YACN,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,EAAE;SACT,CAAC;IACH,CAAC;IAES,KAAK,CAAC,QAAQ,CACvB,GAAY,EACZ,MAAqC;QAMrC,MAAM,YAAY,GAAG,EAAkC,CAAC;QACxD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,MAAM,aAAa,GAAG,EAAmB,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;aACjD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAA2B,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,GACjD,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,EAAE;gBAChB,KAAK,GAAG,KAAK,CAAC;gBACd,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;aACxC;QACF,CAAC,CAAC,CACH,CAAC;QACF,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;YAChC,aAAa,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,oBAAoB,CAAC,KAAK;aAChC,CAAC,CAAC;YACH,KAAK,GAAG,KAAK,CAAC;SACd;QACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI;QACH,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjB;IACF,CAAC;IAEM,cAAc,CACpB,GAAY,EACZ,IAA4B;QAE5B,OAAO,uBAAU,CAAA,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5D,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CACnD,EAAE,CAAC;IACL,CAAC;IAEM,cAAc,CACpB,CAAU,EACV,IAA4B;QAE5B,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAClB,CAAC,OAAO,EAAE,EAAE,CACX,0CAA0C,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,QAAQ,CAChF;SACK,CAAC;IACT,CAAC;CACD;AA7FD,8BA6FC"}
1
+ {"version":3,"file":"mountable.js","sourceRoot":"","sources":["../../src/page/mountable.ts"],"names":[],"mappings":";;;AAIA,MAAsB,SAAS;IAC9B,gEAAgE;IAChE,IAAI,KAAU,CAAC;CAMf;AARD,8BAQC"}
package/lib/page/page.js CHANGED
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Page = void 0;
4
4
  const tempstream_1 = require("tempstream");
5
5
  const __1 = require("..");
6
- const mountable_1 = require("./mountable");
7
- class Page extends mountable_1.Mountable {
6
+ const mountable_with_fields_1 = require("./mountable-with-fields");
7
+ class Page extends mountable_with_fields_1.MountableWithFields {
8
8
  constructor() {
9
9
  super(...arguments);
10
10
  this.propsParser = new __1.AllQueryParams();
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page/page.ts"],"names":[],"mappings":";;;AAGA,2CAAsE;AACtE,0BAAoC;AAEpC,2CAAkE;AAGlE,MAAsB,IAEpB,SAAQ,qBAAY;IAFtB;;QAGC,gBAAW,GACV,IAAI,kBAAc,EAAE,CAAC;QACtB,aAAQ,GAAG,EAAE,CAAC;IAyBf,CAAC;IAvBA,KAAK,CAAC,MAAc,EAAE,IAAY;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,SAAS,CAAC,CAAU;QACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,CAAU,EACV,KAAuB;QAEvB,OAAO,uBAAU,CAAA,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC;IAC3D,CAAC;IAID,gBAAgB,CAAC,GAAY;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACD;AA9BD,oBA8BC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page/page.ts"],"names":[],"mappings":";;;AAGA,2CAAyD;AACzD,0BAAoC;AAEpC,mEAIiC;AAGjC,MAAsB,IAEpB,SAAQ,2CAAsB;IAFhC;;QAGC,gBAAW,GACV,IAAI,kBAAc,EAAE,CAAC;QACtB,aAAQ,GAAG,EAAE,CAAC;IAyBf,CAAC;IAvBA,KAAK,CAAC,MAAc,EAAE,IAAY;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,SAAS,CAAC,CAAU;QACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,CAAU,EACV,KAAuB;QAEvB,OAAO,uBAAU,CAAA,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC;IAC3D,CAAC;IAID,gBAAgB,CAAC,GAAY;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACD;AA9BD,oBA8BC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.multiformTemplate = void 0;
4
+ const utils_1 = require("../utils/utils");
5
+ async function multiformTemplate(action_name, newfilefullpath) {
6
+ const rel = utils_1.curryImportPath(newfilefullpath);
7
+ return `import { Context } from "koa";
8
+ import html from "${rel("src/back/html")}";
9
+ import { Controls, Fields, Form, FormMessage, Multiform } from "@sealcode/sealgen";
10
+ import { FlatTemplatable } from "tempstream";
11
+
12
+ export const actionName = "${action_name}";
13
+
14
+ const fields1 = {
15
+ email: new Fields.SimpleFormField(true),
16
+ password: new Fields.SimpleFormField(true),
17
+ };
18
+
19
+ const form1 = new (class extends Form<typeof fields1> {
20
+ defaultSuccessMessage = "Form1 done!";
21
+ controls = [
22
+ new Controls.FormHeader("form1"),
23
+ new Controls.SimpleInput(fields1.email),
24
+ ];
25
+ fields = fields1;
26
+ onSubmit() {
27
+ console.log("form1 submit");
28
+ }
29
+ })();
30
+
31
+ const fields2 = {
32
+ name: new Fields.SimpleFormField(true),
33
+ surname: new Fields.SimpleFormField(true),
34
+ };
35
+
36
+ const form2 = new (class extends Form<Record<never, unknown>> {
37
+ defaultSuccessMessage = "Form2 done!";
38
+ controls = [new Controls.FormHeader("form2"), new Controls.SimpleInput(fields2.name)];
39
+ fields = fields2;
40
+ onSubmit() {
41
+ console.log("form2 submit");
42
+ }
43
+ })();
44
+
45
+ export default new (class extends Multiform {
46
+ name = "multiform_test";
47
+ forms = { form1, form2 };
48
+ async render(
49
+ ctx: Context,
50
+ messages: FormMessage[],
51
+ prerenderedForms?: Record<string, FlatTemplatable | undefined>
52
+ ): Promise<FlatTemplatable> {
53
+ return html(ctx, "${action_name}", await super.render(ctx, messages, prerenderedForms));
54
+ }
55
+ })();
56
+ `;
57
+ }
58
+ exports.multiformTemplate = multiformTemplate;
59
+ //# sourceMappingURL=multiform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiform.js","sourceRoot":"","sources":["../../src/templates/multiform.ts"],"names":[],"mappings":";;;AAAA,0CAAiD;AAE1C,KAAK,UAAU,iBAAiB,CACtC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,GAAG,GAAG,uBAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;oBACY,GAAG,CAAC,eAAe,CAAC;;;;6BAIX,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAyClB,WAAW;;;CAGhC,CAAC;AACF,CAAC;AAvDD,8CAuDC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redirectTemplate = void 0;
4
+ async function redirectTemplate(action_name) {
5
+ return `import { Context } from "koa";
6
+ import { Mountable } from "@sealcode/sealgen";
7
+ import Router from "@koa/router";
8
+
9
+ export const actionName = "${action_name}";
10
+
11
+ export default new (class ${action_name}Redirect extends Mountable {
12
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+ async canAccess(_: Context) {
14
+ return { canAccess: true, message: "" };
15
+ }
16
+
17
+ mount(router: Router, path: string) {
18
+ router.get(path, async (ctx) => {
19
+ ctx.status = 302;
20
+ ctx.redirect("/new_url");
21
+ });
22
+ }
23
+ })();
24
+ `;
25
+ }
26
+ exports.redirectTemplate = redirectTemplate;
27
+ //# sourceMappingURL=redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/templates/redirect.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACzD,OAAO;;;;6BAIqB,WAAW;;4BAEZ,WAAW;;;;;;;;;;;;;CAatC,CAAC;AACF,CAAC;AArBD,4CAqBC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const koa_1 = __importDefault(require("koa"));
7
+ const router_1 = __importDefault(require("@koa/router"));
8
+ const __1 = require("../..");
9
+ const multiform_1 = require("../../forms/multiform");
10
+ const koa_body_1 = __importDefault(require("koa-body"));
11
+ const tempstream_1 = require("tempstream");
12
+ const app = new koa_1.default({ proxy: true });
13
+ const router = new router_1.default();
14
+ const fields1 = {
15
+ email: new __1.Fields.SimpleFormField(true),
16
+ password: new __1.Fields.SimpleFormField(true),
17
+ };
18
+ const form1 = new (class extends __1.Form {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.defaultSuccessMessage = "Form1 done!";
22
+ this.controls = [
23
+ new __1.Controls.FormHeader("form1"),
24
+ new __1.Controls.SimpleInput(fields1.email),
25
+ ];
26
+ this.fields = fields1;
27
+ }
28
+ onSubmit() {
29
+ console.log("form1 submit");
30
+ }
31
+ })();
32
+ const fields2 = {
33
+ name: new __1.Fields.SimpleFormField(true),
34
+ surname: new __1.Fields.SimpleFormField(true),
35
+ };
36
+ const form2 = new (class extends __1.Form {
37
+ constructor() {
38
+ super(...arguments);
39
+ this.defaultSuccessMessage = "Form2 done!";
40
+ this.controls = [
41
+ new __1.Controls.FormHeader("form2"),
42
+ new __1.Controls.SimpleInput(fields2.name),
43
+ ];
44
+ this.fields = fields2;
45
+ }
46
+ onSubmit() {
47
+ console.log("form2 submit");
48
+ }
49
+ })();
50
+ const multiform = new (class extends multiform_1.Multiform {
51
+ constructor() {
52
+ super(...arguments);
53
+ this.name = "multiform_test";
54
+ this.forms = { form1, form2 };
55
+ }
56
+ async render(ctx, messages, prerenderedForms) {
57
+ return tempstream_1.tempstream `<!DOCTYPE html>
58
+ <html>
59
+ <head>
60
+ <title>Multiform Test - Sealgen</title>
61
+ <script type="module">
62
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
63
+ </script>
64
+ </head>
65
+ <body>
66
+ ${super.render(ctx, messages, prerenderedForms)}
67
+ </body>
68
+ </html>`;
69
+ }
70
+ })();
71
+ const URL = "/";
72
+ async function handleHtmlPromise(ctx, next) {
73
+ await next();
74
+ if (ctx.body instanceof Promise) {
75
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
76
+ ctx.body = await ctx.body;
77
+ }
78
+ ctx.set("content-type", "text/html;charset=utf-8");
79
+ }
80
+ router.use(URL, koa_body_1.default(), async (ctx, next) => {
81
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
82
+ ctx.$body = ctx.request.body;
83
+ ctx.$app = {
84
+ getString: (_, args, trans) => (typeof trans == "function" ? trans(args) : trans),
85
+ };
86
+ await next();
87
+ }, handleHtmlPromise);
88
+ multiform.init();
89
+ multiform.mount(router, URL);
90
+ // to automatically add trailing slashes:
91
+ router.use(URL, (ctx) => ctx.set("content-type", "text/html;charset=utf-8"));
92
+ app.use(router.routes()).use(router.allowedMethods());
93
+ app.listen(3000);
94
+ console.log("Multiform test app listening on localhost:3000");
95
+ //# sourceMappingURL=multiform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiform.js","sourceRoot":"","sources":["../../../src/tests/manual/multiform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inputWrapper = exports.getRequiredClass = void 0;
4
+ const tempstream_1 = require("tempstream");
5
+ function getRequiredClass(isRequired) {
6
+ return isRequired ? "required" : "";
7
+ }
8
+ exports.getRequiredClass = getRequiredClass;
9
+ function getModifierClasses(modifiers) {
10
+ return modifiers.map((m) => "form-input__wrapper--" + m).join(" ");
11
+ }
12
+ function inputWrapper(modifiers, input) {
13
+ return tempstream_1.tempstream /* HTML */ `<div
14
+ class="form-input form-input__wrapper ${getModifierClasses(modifiers)}"
15
+ >
16
+ ${input}
17
+ </div>`;
18
+ }
19
+ exports.inputWrapper = inputWrapper;
20
+ //# sourceMappingURL=input-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-wrapper.js","sourceRoot":"","sources":["../../src/utils/input-wrapper.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AAExC,SAAgB,gBAAgB,CAAC,UAAmB;IACnD,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAFD,4CAEC;AAED,SAAS,kBAAkB,CAAC,SAAmB;IAC9C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,YAAY,CAAC,SAAmB,EAAE,KAAa;IAC9D,OAAO,uBAAU,CAAA,UAAU,CAAC;0CACa,kBAAkB,CAAC,SAAS,CAAC;;IAEnE,KAAK;QACD,CAAC;AACT,CAAC;AAND,oCAMC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealcode/sealgen",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Module to automate adding routes and collections to a sealious application",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -26,6 +26,7 @@
26
26
  "eslint-config-prettier": "^8.3.0",
27
27
  "eslint-plugin-prettier": "^3.4.1",
28
28
  "eslint-plugin-with-tsc-error": "^0.0.7",
29
+ "koa-body": "^5.0.0",
29
30
  "mocha": "^9.1.1",
30
31
  "mri": "^1.1.6",
31
32
  "nyc": "^15.1.0",
@@ -42,10 +43,10 @@
42
43
  "koa": "^2.13.0",
43
44
  "locreq": "^2.0.2",
44
45
  "merge": "^2.1.1",
46
+ "prettier": "^2.7.1",
45
47
  "prompts": "^2.4.2",
46
48
  "tempstream": "^0.0.21",
47
- "tiny-glob": "^0.2.9",
48
- "prettier": "^2.7.1"
49
+ "tiny-glob": "^0.2.9"
49
50
  },
50
51
  "peerDependencies": {
51
52
  "@koa/router": "^10.1.1",
package/src/add-route.ts CHANGED
@@ -1,14 +1,17 @@
1
+ import { existsSync, promises as fs } from "fs";
2
+ import _locreq from "locreq";
1
3
  import { resolve } from "path";
2
- import { promises as fs, existsSync } from "fs";
3
- import { question } from "./utils/question";
4
- import { pageTemplate } from "./templates/page";
4
+ import { generateRoutes } from "./generate-routes";
5
5
  import { formTemplate } from "./templates/form";
6
+ import { listTemplate } from "./templates/list";
7
+ import { multiformTemplate } from "./templates/multiform";
8
+ import { pageTemplate } from "./templates/page";
9
+ import { redirectTemplate } from "./templates/redirect";
6
10
  import { testTemplate } from "./templates/route-test";
7
11
  import { escape_url_params } from "./utils/escape-url-params";
12
+ import { question } from "./utils/question";
13
+ import prompts = require("prompts");
8
14
 
9
- import _locreq from "locreq";
10
- import { generateRoutes } from "./generate-routes";
11
- import { listTemplate } from "./templates/list";
12
15
  const target_locreq = _locreq(process.cwd());
13
16
 
14
17
  export async function addRoute(): Promise<void> {
@@ -20,11 +23,21 @@ export async function addRoute(): Promise<void> {
20
23
  "Enter a full absolute path for the new route (e.g. /admin/users/add): ",
21
24
  (s: string) => s.trim()[0] == "/"
22
25
  );
23
- const mode_answer = (await question(
24
- "Is this a page (p), a form (f), or a list (l)? ",
25
- (a: string) => ["p", "f", "l"].includes(a.toLowerCase())
26
- )) as "p" | "f" | "l";
27
- const mode = (<const>{ p: "page", f: "form", l: "list" })[mode_answer];
26
+
27
+ const response = await prompts({
28
+ type: "select",
29
+ name: "mode",
30
+ message: "What kind of route is it?",
31
+ choices: [
32
+ { title: "page", value: "page" },
33
+ { title: "form", value: "form" },
34
+ { title: "list", value: "list" },
35
+ { title: "multiform", value: "multiform" },
36
+ { title: "redirect", value: "redirect" },
37
+ ],
38
+ });
39
+
40
+ const mode = response.mode as string;
28
41
 
29
42
  const file_path = target_locreq.resolve(
30
43
  `src/back/routes/${escape_url_params(url)}.${mode}.ts`
@@ -36,8 +49,14 @@ export async function addRoute(): Promise<void> {
36
49
  page: pageTemplate,
37
50
  form: formTemplate,
38
51
  list: listTemplate,
52
+ multiform: multiformTemplate,
53
+ redirect: redirectTemplate,
39
54
  }[mode];
40
55
 
56
+ if (!template) {
57
+ throw new Error(`Could not get template ${mode}`);
58
+ }
59
+
41
60
  if (existsSync(file_path)) {
42
61
  // eslint-disable-next-line no-console
43
62
  console.error(`ERROR: File ${file_path} already exists.`);
@@ -1,6 +1,7 @@
1
1
  import { is, predicates } from "@sealcode/ts-predicates";
2
2
  import { Context } from "koa";
3
3
  import { tempstream } from "tempstream";
4
+ import { getRequiredClass, inputWrapper } from "../../utils/input-wrapper";
4
5
  import { ChekboxedListField } from "../fields/field";
5
6
  import { FormDataValue } from "../form";
6
7
  import { FormFieldControl } from "./controls";
@@ -22,17 +23,23 @@ export class CheckboxedListInput extends FormFieldControl {
22
23
  this.field.generateOptions(ctx),
23
24
  this.field.isVisible(ctx),
24
25
  ]);
26
+
27
+ const { name, required } = this.field;
28
+
25
29
  return tempstream/* HTML */ `${isVisible
26
- ? Object.entries(options).map(
27
- ([value, text]) => /* HTML */ `<div>
28
- <input
29
- type="checkbox"
30
- id="${this.field.name}.${value}"
31
- name="${this.field.name}.${value}"
32
- ${pickedValues.includes(value) ? "checked" : ""}
33
- />
34
- <label for="${this.field.name}.${value}">${text}</label>
35
- </div>`
30
+ ? Object.entries(options).map(([value, text]) =>
31
+ inputWrapper(
32
+ [name, getRequiredClass(required)],
33
+ /* HTML */ `
34
+ <input
35
+ type="checkbox"
36
+ id="${name}.${value}"
37
+ name="${name}.${value}"
38
+ ${pickedValues.includes(value) ? "checked" : ""}
39
+ />
40
+ <label for="${name}.${value}">${text}</label>
41
+ `
42
+ )
36
43
  )
37
44
  : ""}`;
38
45
  }
@@ -1,6 +1,6 @@
1
1
  import { Context } from "koa";
2
- import { tempstream } from "tempstream";
3
2
  import { attribute } from "../../sanitize";
3
+ import { getRequiredClass, inputWrapper } from "../../utils/input-wrapper";
4
4
  import { FormField, PickFromListField } from "../fields/field";
5
5
  import { FormDataValue } from "../form";
6
6
  import { FormFieldControl } from "./controls";
@@ -26,28 +26,33 @@ export class Dropdown extends FormFieldControl {
26
26
  data: Record<string, FormDataValue>
27
27
  ) {
28
28
  const { parsed: picked_value } = await this.field.getValue(ctx, data);
29
- const id = this.field.name;
30
- return tempstream/* HTML */ `<label for="${id}"
31
- >${this.options.label}</label
32
- ><select
33
- name="${this.field.name}"
34
- id="${id}"
35
- ${this.options.autosubmit
36
- ? `onchange='this.form.submit()'`
37
- : ""}
38
- ${!this.options.autocomplete ? `autocomplete="off"` : ""}
39
- >
40
- ${Promise.resolve(this.field.generateOptions(ctx)).then(
41
- (options) =>
42
- Object.entries(options).map(
43
- ([value, text]) =>
44
- `<option value="${attribute(value)}" ${
45
- (value || "") == picked_value
46
- ? "selected"
47
- : ""
48
- }>${text}</option>`
29
+ const name = this.field.name;
30
+ return inputWrapper(
31
+ [name, getRequiredClass(this.field.required)],
32
+ /* HTML */ `<label for="${name}">${this.options.label}</label
33
+ ><select
34
+ name="${this.field.name}"
35
+ id="${name}"
36
+ ${this.options.autosubmit
37
+ ? `onchange='this.form.submit()'`
38
+ : ""}
39
+ ${!this.options.autocomplete ? `autocomplete="off"` : ""}
40
+ >
41
+ ${
42
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
43
+ Promise.resolve(this.field.generateOptions(ctx)).then(
44
+ (options) =>
45
+ Object.entries(options).map(
46
+ ([value, text]) =>
47
+ `<option value="${attribute(value)}" ${
48
+ (value || "") == picked_value
49
+ ? "selected"
50
+ : ""
51
+ }>${text}</option>`
52
+ )
49
53
  )
50
- )}
51
- </select>`;
54
+ }
55
+ </select>`
56
+ );
52
57
  }
53
58
  }
@@ -6,7 +6,9 @@ export abstract class FormControl {
6
6
  abstract render(
7
7
  ctx: Context,
8
8
  data: Record<string, FormDataValue>,
9
- messages: FormMessage[]
9
+ messages: FormMessage[],
10
+ field_name_prefix: string,
11
+ form_id: string
10
12
  ): FlatTemplatable | Promise<FlatTemplatable>;
11
13
  abstract role: "input" | "decoration" | "messages" | "submit";
12
14
  }
@@ -18,6 +18,9 @@ export abstract class FormFieldControl extends FormControl {
18
18
 
19
19
  abstract render(
20
20
  ctx: Context,
21
- data: Record<string, FormDataValue>
21
+ data: Record<string, FormDataValue>,
22
+ messages: [],
23
+ field_name_prefix: string,
24
+ form_id: string
22
25
  ): FlatTemplatable | Promise<FlatTemplatable>;
23
26
  }