@sealcode/sealgen 0.3.2 → 0.4.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 (108) hide show
  1. package/@types/forms/controls/checkboxed-list-input.d.ts +5 -6
  2. package/@types/forms/controls/dropdown.d.ts +5 -6
  3. package/@types/forms/controls/editable-collection-subset.d.ts +6 -6
  4. package/@types/forms/controls/form-control.d.ts +3 -4
  5. package/@types/forms/controls/form-field-control.d.ts +9 -8
  6. package/@types/forms/controls/frame.d.ts +2 -2
  7. package/@types/forms/controls/simple-input.d.ts +5 -5
  8. package/@types/forms/field.d.ts +47 -16
  9. package/@types/forms/fields/checkboxed-list.d.ts +16 -0
  10. package/@types/forms/fields/collection-field.d.ts +11 -0
  11. package/@types/forms/fields/field.d.ts +38 -0
  12. package/@types/forms/fields/number.d.ts +13 -0
  13. package/@types/forms/fields/pick-from-list.d.ts +16 -0
  14. package/@types/forms/fields/simple-form-field.d.ts +7 -0
  15. package/@types/forms/form-fields-list.d.ts +1 -1
  16. package/@types/forms/form.d.ts +24 -29
  17. package/@types/forms/simple-form-field.d.ts +6 -0
  18. package/@types/forms/validator.d.ts +0 -3
  19. package/@types/index.d.ts +8 -5
  20. package/@types/make-hidden-inputs.d.ts +4 -0
  21. package/@types/page/list.d.ts +23 -42
  22. package/@types/page/mountable.d.ts +36 -0
  23. package/@types/page/page.d.ts +10 -17
  24. package/@types/page/props-parser.d.ts +5 -10
  25. package/@types/utils/translate.d.ts +3 -0
  26. package/lib/build.js +2 -1
  27. package/lib/build.js.map +1 -1
  28. package/lib/forms/controls/checkboxed-list-input.js +10 -17
  29. package/lib/forms/controls/checkboxed-list-input.js.map +1 -1
  30. package/lib/forms/controls/dropdown.js +16 -20
  31. package/lib/forms/controls/dropdown.js.map +1 -1
  32. package/lib/forms/controls/editable-collection-subset.js +33 -35
  33. package/lib/forms/controls/editable-collection-subset.js.map +1 -1
  34. package/lib/forms/controls/form-control.js.map +1 -1
  35. package/lib/forms/controls/form-field-control.js +2 -11
  36. package/lib/forms/controls/form-field-control.js.map +1 -1
  37. package/lib/forms/controls/simple-input.js +17 -23
  38. package/lib/forms/controls/simple-input.js.map +1 -1
  39. package/lib/forms/field.js +96 -20
  40. package/lib/forms/field.js.map +1 -1
  41. package/lib/forms/fields/checkboxed-list.js +43 -0
  42. package/lib/forms/fields/checkboxed-list.js.map +1 -0
  43. package/lib/forms/fields/collection-field.js +28 -0
  44. package/lib/forms/fields/collection-field.js.map +1 -0
  45. package/lib/forms/fields/field.js +70 -0
  46. package/lib/forms/fields/field.js.map +1 -0
  47. package/lib/forms/fields/number.js +45 -0
  48. package/lib/forms/fields/number.js.map +1 -0
  49. package/lib/forms/fields/pick-from-list.js +34 -0
  50. package/lib/forms/fields/pick-from-list.js.map +1 -0
  51. package/lib/forms/fields/simple-form-field.js +18 -0
  52. package/lib/forms/fields/simple-form-field.js.map +1 -0
  53. package/lib/forms/form.js +50 -96
  54. package/lib/forms/form.js.map +1 -1
  55. package/lib/forms/simple-form-field.js +18 -0
  56. package/lib/forms/simple-form-field.js.map +1 -0
  57. package/lib/forms/validator.js +0 -10
  58. package/lib/forms/validator.js.map +1 -1
  59. package/lib/generate-routes.js +19 -2
  60. package/lib/generate-routes.js.map +1 -1
  61. package/lib/index.js +4 -3
  62. package/lib/index.js.map +1 -1
  63. package/lib/make-hidden-inputs.js +17 -0
  64. package/lib/make-hidden-inputs.js.map +1 -0
  65. package/lib/page/list.js +65 -79
  66. package/lib/page/list.js.map +1 -1
  67. package/lib/page/mountable.js +56 -0
  68. package/lib/page/mountable.js.map +1 -0
  69. package/lib/page/page.js +11 -1
  70. package/lib/page/page.js.map +1 -1
  71. package/lib/page/props-parser.js +4 -47
  72. package/lib/page/props-parser.js.map +1 -1
  73. package/lib/templates/form.js +32 -17
  74. package/lib/templates/form.js.map +1 -1
  75. package/lib/templates/list.js +30 -20
  76. package/lib/templates/list.js.map +1 -1
  77. package/lib/utils/translate.js +10 -0
  78. package/lib/utils/translate.js.map +1 -0
  79. package/package.json +4 -3
  80. package/src/build.ts +2 -1
  81. package/src/forms/controls/checkboxed-list-input.ts +12 -23
  82. package/src/forms/controls/dropdown.ts +27 -32
  83. package/src/forms/controls/editable-collection-subset.ts +57 -54
  84. package/src/forms/controls/form-control.ts +5 -6
  85. package/src/forms/controls/form-field-control.ts +13 -29
  86. package/src/forms/controls/frame.ts +2 -2
  87. package/src/forms/controls/simple-input.ts +27 -24
  88. package/src/forms/fields/checkboxed-list.ts +61 -0
  89. package/src/forms/fields/collection-field.ts +54 -0
  90. package/src/forms/fields/field.ts +116 -0
  91. package/src/forms/fields/number.ts +53 -0
  92. package/src/forms/fields/pick-from-list.ts +49 -0
  93. package/src/forms/fields/simple-form-field.ts +20 -0
  94. package/src/forms/form.ts +98 -163
  95. package/src/generate-routes.ts +19 -2
  96. package/src/index.ts +8 -5
  97. package/src/make-hidden-inputs.ts +22 -0
  98. package/src/page/list.ts +115 -126
  99. package/src/page/mountable.ts +105 -0
  100. package/src/page/page.ts +21 -12
  101. package/src/page/props-parser.ts +9 -67
  102. package/src/templates/form.ts +32 -17
  103. package/src/templates/list.ts +30 -20
  104. package/src/utils/translate.ts +13 -0
  105. package/src/forms/controls.ts +0 -0
  106. package/src/forms/field.ts +0 -119
  107. package/src/forms/form-fields-list.ts +0 -7
  108. package/src/forms/validator.ts +0 -10
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AASA,+CAA6B;AAC7B,4DAA0C;AAC1C,gDAA8B;AAC9B,8CAA4B;AAC5B,sDAAoC;AACpC,gDAA8B;AAC9B,oDAAkC;AAClC,8CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAWA,4DAA0C;AAC1C,uDAAqC;AACrC,mDAAiC;AACjC,8CAA4B;AAC5B,+CAA6B;AAC7B,sDAAoC;AACpC,gDAA8B;AAC9B,8CAA4B;AAC5B,oDAAkC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeHiddenInputs = void 0;
4
+ const tempstream_1 = require("tempstream");
5
+ function makeHiddenInputs(ctx, fields, values, fields_to_skip) {
6
+ return tempstream_1.tempstream `${Object.entries(fields)
7
+ .filter(([key]) => !fields_to_skip.includes(key))
8
+ .map(([key, field]) => tempstream_1.tempstream /* HTML */ `<input
9
+ type="hidden"
10
+ name="${key}"
11
+ value="${field
12
+ .getValue(ctx, values)
13
+ .then((r) => JSON.stringify(r.raw))}"
14
+ />`)}`;
15
+ }
16
+ exports.makeHiddenInputs = makeHiddenInputs;
17
+ //# sourceMappingURL=make-hidden-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-hidden-inputs.js","sourceRoot":"","sources":["../src/make-hidden-inputs.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AAGzD,SAAgB,gBAAgB,CAC/B,GAAgB,EAChB,MAAiC,EACjC,MAAqC,EACrC,cAAwB;IAExB,OAAO,uBAAU,CAAA,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAChD,GAAG,CACH,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,uBAAU,CAAA,UAAU,CAAC;;YAE9B,GAAG;aACF,KAAK;SACZ,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;SACrB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MAClC,CACH,EAAE,CAAC;AACN,CAAC;AAjBD,4CAiBC"}
package/lib/page/list.js CHANGED
@@ -1,94 +1,67 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SealiousItemListPage = exports.ListPage = exports.BaseListPageDefaultProps = exports.BaseListPagePropsShape = exports.BasePagePropsShape = void 0;
3
+ exports.SealiousItemListPage = exports.ListPage = exports.BaseListPageFields = exports.BasePagePropsShape = void 0;
4
4
  const tempstream_1 = require("tempstream");
5
5
  const access_control_1 = require("./access-control");
6
6
  const page_1 = require("./page");
7
- const ts_predicates_1 = require("@sealcode/ts-predicates");
8
- const form_fields_list_1 = require("../forms/form-fields-list");
7
+ const field_1 = require("../forms/fields/field");
9
8
  const utils_1 = require("../utils/utils");
9
+ const make_hidden_inputs_1 = require("../make-hidden-inputs");
10
10
  exports.BasePagePropsShape = {};
11
- exports.BaseListPagePropsShape = {
12
- page: ts_predicates_1.predicates.number,
13
- itemsPerPage: ts_predicates_1.predicates.number,
11
+ exports.BaseListPageFields = {
12
+ page: new field_1.NumberField(false, 1),
13
+ itemsPerPage: new field_1.NumberField(false, 12),
14
14
  };
15
- exports.BaseListPageDefaultProps = { page: 1, itemsPerPage: 25 };
16
15
  class ListPage extends page_1.Page {
17
16
  constructor() {
18
17
  super(...arguments);
19
- this.filterFields = [];
18
+ this.filterFields = {};
20
19
  this.filterControls = [];
21
20
  }
22
- renderListContainer(_, content) {
23
- return tempstream_1.tempstream `<div>${content}</div>`;
24
- }
25
- async validateProps(ctx, props) {
26
- const errors = {};
27
- let has_errors = false;
28
- const promises = [];
29
- for (const [key, value] of Object.entries(props)) {
30
- const field = form_fields_list_1.FormFieldsList.getField(this.filterFields, key);
31
- if (field) {
32
- promises.push(field._validate(ctx, value).then(({ valid, message }) => {
33
- if (!valid) {
34
- has_errors = true;
35
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
36
- errors[key] = message;
37
- }
38
- }));
39
- }
21
+ init() {
22
+ super.init();
23
+ for (const [fieldname, field] of Object.entries(this.filterFields)) {
24
+ field.init(fieldname);
40
25
  }
41
- await Promise.all(promises);
42
- return { valid: has_errors, errors };
43
26
  }
44
- async getProps(ctx) {
45
- const raw_props = this.propsParser.decode(ctx);
46
- const parsed_props = { ...raw_props };
47
- const { errors } = await this.validateProps(ctx, parsed_props);
48
- for (const prop_name in errors) {
49
- const default_value = this.propsParser.getDefaultValue(prop_name);
50
- if (default_value !== undefined) {
51
- parsed_props[prop_name] = default_value;
52
- }
53
- else {
54
- delete parsed_props[prop_name];
55
- }
56
- }
57
- return { parsed_props, errors, raw_props };
27
+ renderListContainer(_, content) {
28
+ return tempstream_1.tempstream `<div>${content}</div>`;
58
29
  }
59
30
  async render(ctx) {
60
- const { parsed_props, errors, raw_props } = await this.getProps(ctx);
61
- return tempstream_1.tempstream `${this.renderPagination(ctx, parsed_props)}
62
- ${this.renderFilters(ctx, parsed_props, raw_props, errors)}
63
- ${this.getItems(ctx, parsed_props).then(({ items }) => this.renderListContainer(ctx, items.map((item) => this.renderItem(ctx, item))))}`;
31
+ const values = this.extractRawValues(ctx);
32
+ const { parsed: page } = await this.fields.page.getValue(ctx, values);
33
+ const { parsed: itemsPerPage } = await this.fields.itemsPerPage.getValue(ctx, values);
34
+ const items_promise = this.getItems(ctx, page, itemsPerPage, values);
35
+ return tempstream_1.tempstream `${this.renderPagination(ctx, values)}
36
+ ${this.renderFilters(ctx)}
37
+ ${items_promise.then((items) => this.renderListContainer(ctx, items.map((item) => this.renderItem(ctx, item))))}`;
64
38
  }
65
- async renderPagination(ctx, props) {
66
- const totalIems = await this.getTotalPages(ctx, props);
67
- const currentPage = props.page;
39
+ async renderPagination(ctx, values) {
40
+ const { parsed: page } = await this.fields.page.getValue(ctx, values);
41
+ const { parsed: itemsPerPage } = await this.fields.itemsPerPage.getValue(ctx, values);
42
+ const totalIems = await this.getTotalPages(ctx, itemsPerPage, values);
68
43
  return tempstream_1.tempstream /* HTML */ `<center>
69
- ${currentPage > 1
70
- ? this.renderPageButton(ctx, 1, "Pierwsza strona")
71
- : ""}
72
- ${currentPage > 1
73
- ? this.renderPageButton(ctx, currentPage - 1, "Poprzednia strona")
44
+ ${page > 1 ? this.renderPageButton(ctx, 1, "Pierwsza strona") : ""}
45
+ ${page > 1
46
+ ? this.renderPageButton(ctx, page - 1, "Poprzednia strona")
74
47
  : ""}
75
48
 
76
49
  <select onchange="if (this.value) Turbo.visit(this.value)">
77
- ${Array.from(utils_1.naturalNumbers(1, await this.getTotalPages(ctx, props))).map((n) => /* HTML */ `<option
50
+ ${Array.from(utils_1.naturalNumbers(1, totalIems)).map((n) => /* HTML */ `<option
78
51
  value="${utils_1.UrlWithNewParams(ctx,
79
52
  //eslint-disable-next-line @typescript-eslint/consistent-type-assertions
80
53
  this.propsParser.overwriteProp(ctx, {
81
54
  page: n,
82
55
  }))}"
83
- ${currentPage === n ? "selected" : ""}
56
+ ${page === n ? "selected" : ""}
84
57
  >
85
58
  ${n}
86
59
  </option>`)}
87
60
  </select>
88
- ${currentPage < totalIems
89
- ? this.renderPageButton(ctx, currentPage + 1, "Następna strona")
61
+ ${page < totalIems
62
+ ? this.renderPageButton(ctx, page + 1, "Następna strona")
90
63
  : ""}
91
- ${currentPage < totalIems
64
+ ${page < totalIems
92
65
  ? this.renderPageButton(ctx, totalIems, "Ostatnia strona")
93
66
  : ""}
94
67
  </center>`;
@@ -103,21 +76,26 @@ ${this.getItems(ctx, parsed_props).then(({ items }) => this.renderListContainer(
103
76
  >${text}</a
104
77
  >`;
105
78
  }
106
- renderFilters(ctx, parsed_props, // parsed props don't include wrong values
107
- raw_props, errors) {
79
+ async getFilterValues(ctx) {
80
+ const filter = {};
81
+ const raw_values = this.extractRawValues(ctx);
82
+ for (const [fieldname, field] of Object.entries(this.filterFields)) {
83
+ // eslint-disable-next-line no-await-in-loop
84
+ const { parsed } = await field.getValue(ctx, raw_values);
85
+ filter[fieldname] = parsed;
86
+ }
87
+ return filter;
88
+ }
89
+ renderFilters(ctx) {
90
+ const values = this.extractRawValues(ctx);
108
91
  return tempstream_1.tempstream /* HTML */ `<form method="GET">
109
- ${this.propsParser.makeHiddenInputs(parsed_props, [
92
+ ${make_hidden_inputs_1.makeHiddenInputs(ctx, this.fields, values, [
110
93
  "page",
111
- ...this.filterFields.map((f) => f.name),
94
+ ...Object.values(this.filterFields).map((f) => f.name),
112
95
  ])}
113
96
  ${this.filterControls.map((control) =>
114
97
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
115
- control.render(ctx, this.filterFields, {
116
- values: parsed_props,
117
- raw_values: raw_props,
118
- errors,
119
- messages: [],
120
- }))}
98
+ control.render(ctx, values))}
121
99
  </form>`;
122
100
  }
123
101
  }
@@ -128,17 +106,25 @@ class SealiousItemListPage extends ListPage {
128
106
  this.collection = collection;
129
107
  this.canAccess = access_control_1.peopleWhoCan("list", this.collection);
130
108
  }
131
- async getTotalPages(ctx, props) {
132
- const { items } = await this.collection.list(ctx.$context).fetch();
133
- return Math.ceil(items.length / props.itemsPerPage);
109
+ async getTotalPages(ctx, itemsPerPage) {
110
+ const query = this.collection.list(ctx.$context);
111
+ await this.addFilter(ctx, query);
112
+ const { items } = await query.fetch();
113
+ return Math.ceil(items.length / itemsPerPage);
114
+ }
115
+ async addFilter(ctx, list) {
116
+ const filters = await this.getFilterValues(ctx);
117
+ if (Object.keys(filters).length) {
118
+ list.filter(filters);
119
+ }
134
120
  }
135
- async getItems(ctx, props) {
136
- return {
137
- items: (await this.collection
138
- .list(ctx.$context)
139
- .paginate({ items: props.itemsPerPage, page: props.page })
140
- .fetch()).items,
141
- };
121
+ async getItems(ctx, page, itemsPerPage) {
122
+ const query = this.collection.list(ctx.$context);
123
+ await this.addFilter(ctx, query);
124
+ const { items } = await query
125
+ .paginate({ items: itemsPerPage, page })
126
+ .fetch();
127
+ return items;
142
128
  }
143
129
  async renderItem(_, item) {
144
130
  return `<div>${item.id}</div>`;
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/page/list.ts"],"names":[],"mappings":";;;AAEA,2CAAqD;AACrD,qDAAgD;AAChD,iCAA8B;AAC9B,2DAAkE;AAKlE,gEAA2D;AAC3D,0CAAkE;AAErD,QAAA,kBAAkB,GAAU,EAAE,CAAC;AAG/B,QAAA,sBAAsB,GAAU;IAC5C,IAAI,EAAE,0BAAU,CAAC,MAAM;IACvB,YAAY,EAAE,0BAAU,CAAC,MAAM;CAC/B,CAAC;AAEW,QAAA,wBAAwB,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAItE,MAAsB,QAGpB,SAAQ,WAAI;IAHd;;QAYC,iBAAY,GAAiC,EAAE,CAAC;QAChD,mBAAc,GAAuB,EAAE,CAAC;IA6IzC,CAAC;IA3IA,mBAAmB,CAAC,CAAc,EAAE,OAAoB;QACvD,OAAO,uBAAU,CAAA,QAAQ,OAAO,QAAQ,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,aAAa,CAClB,GAAgB,EAChB,KAAgB;QAEhB,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACjD,MAAM,KAAK,GAAG,iCAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE;gBACV,QAAQ,CAAC,IAAI,CACZ,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;oBACvD,IAAI,CAAC,KAAK,EAAE;wBACX,UAAU,GAAG,IAAI,CAAC;wBAClB,yEAAyE;wBACzE,MAAM,CAAC,GAAsB,CAAC,GAAG,OAAO,CAAC;qBACzC;gBACF,CAAC,CAAC,CACF,CAAC;aACF;SACD;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAgB;QAK9B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC/D,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAClE,IAAI,aAAa,KAAK,SAAS,EAAE;gBAChC,YAAY,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;aACxC;iBAAM;gBACN,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;aAC/B;SACD;QACD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAgB;QAC5B,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAErE,OAAO,uBAAU,CAAA,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC;EAC5D,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC;EACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACrD,IAAI,CAAC,mBAAmB,CACvB,GAAG,EACH,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAC/C,CACD,EAAE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAgB,EAAE,KAAgB;QACxD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;QAE/B,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,WAAW,GAAG,CAAC;YAChB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,CAAC;YAClD,CAAC,CAAC,EAAE;KACH,WAAW,GAAG,CAAC;YAChB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CACrB,GAAG,EACH,WAAW,GAAG,CAAC,EACf,mBAAmB,CAClB;YACH,CAAC,CAAC,EAAE;;;MAGF,KAAK,CAAC,IAAI,CACX,sBAAc,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CACvD,CAAC,GAAG,CACJ,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;eACR,wBAAgB,CACxB,GAAG;QACH,wEAAwE;QACxE,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE;YACnC,IAAI,EAAE,CAAC;SACe,CAAC,CACxB;QACC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;QAEnC,CAAC;eACM,CACV;;KAEA,WAAW,GAAG,SAAS;YACxB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,EAAE,iBAAiB,CAAC;YAChE,CAAC,CAAC,EAAE;KACH,WAAW,GAAG,SAAS;YACxB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,iBAAiB,CAAC;YAC1D,CAAC,CAAC,EAAE;YACI,CAAC;IACZ,CAAC;IAEO,gBAAgB,CAAC,GAAgB,EAAE,IAAY,EAAE,IAAY;QACpE,OAAO,UAAU,CAAC;WACT,wBAAgB,CACvB,GAAG;QACH,wEAAwE;QACxE,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE;YACnC,IAAI;SACkB,CAAC,CACxB;MACE,IAAI;IACN,CAAC;IACJ,CAAC;IAED,aAAa,CACZ,GAAgB,EAChB,YAAuB,EAAE,0CAA0C;IACnE,SAAoB,EACpB,MAA8B;QAE9B,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACjD,MAAM;YACN,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACvC,CAAC;KACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACrC,yEAAyE;QACzE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE;YACtC,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,SAAS;YACrB,MAAM;YACN,QAAQ,EAAE,EAAE;SACA,CAAC,CACd;UACM,CAAC;IACV,CAAC;CACD;AA1JD,4BA0JC;AAED,MAAsB,oBAGpB,SAAQ,QAAsC;IAC/C,YAAmB,UAAa;QAC/B,KAAK,EAAE,CAAC;QADU,eAAU,GAAV,UAAU,CAAG;QA2BhC,cAAS,GAAG,6BAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAzBlD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAgB,EAAE,KAAgB;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAgB,EAAE,KAAgB;QAChD,OAAO;YACN,KAAK,EAAE,CACN,MAAM,IAAI,CAAC,UAAU;iBACnB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;iBAClB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;iBACzD,KAAK,EAAE,CACT,CAAC,KAAK;SACP,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CACf,CAAc,EACd,IAAuB;QAEvB,OAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChC,CAAC;CAGD;AAhCD,oDAgCC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/page/list.ts"],"names":[],"mappings":";;;AAGA,2CAAsE;AACtE,qDAAgD;AAChD,iCAA8B;AAG9B,iDAA+D;AAC/D,0CAAkE;AAElE,8DAAyD;AAE5C,QAAA,kBAAkB,GAAU,EAAE,CAAC;AAG/B,QAAA,kBAAkB,GAAU;IACxC,IAAI,EAAE,IAAI,mBAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,IAAI,mBAAW,CAAC,KAAK,EAAE,EAAE,CAAC;CACxC,CAAC;AAEF,MAAsB,QAGpB,SAAQ,WAAO;IAHjB;;QAsBC,iBAAY,GAA8B,EAAE,CAAC;QAC7C,mBAAc,GAAuB,EAAE,CAAC;IA2GzC,CAAC;IAzGA,IAAI;QACH,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACnE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACtB;IACF,CAAC;IAED,mBAAmB,CAAC,CAAc,EAAE,OAAoB;QACvD,OAAO,uBAAU,CAAA,QAAQ,OAAO,QAAQ,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,uBAAU,CAAA,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC;OACjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBACd,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,IAAI,CAAC,mBAAmB,CACvB,GAAG,EACH,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAC/C,CACD,EAAE,CAAC;IACP,CAAC;IAED,KAAK,CAAC,gBAAgB,CACrB,GAAgB,EAChB,MAAqC;QAErC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAEtE,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE;KAChE,IAAI,GAAG,CAAC;YACT,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,mBAAmB,CAAC;YAC3D,CAAC,CAAC,EAAE;;;MAGF,KAAK,CAAC,IAAI,CAAC,sBAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;eACR,wBAAgB,CACxB,GAAG;QACH,wEAAwE;QACxE,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE;YACnC,IAAI,EAAE,CAAC;SAC6B,CAAC,CACtC;QACC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;QAE5B,CAAC;eACM,CACV;;KAEA,IAAI,GAAG,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,iBAAiB,CAAC;YACzD,CAAC,CAAC,EAAE;KACH,IAAI,GAAG,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,iBAAiB,CAAC;YAC1D,CAAC,CAAC,EAAE;YACI,CAAC;IACZ,CAAC;IAEO,gBAAgB,CAAC,GAAgB,EAAE,IAAY,EAAE,IAAY;QACpE,OAAO,UAAU,CAAC;WACT,wBAAgB,CACvB,GAAG;QACH,wEAAwE;QACxE,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE;YACnC,IAAI;SACgC,CAAC,CACtC;MACE,IAAI;IACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAgB;QACrC,MAAM,MAAM,GAAG,EAA6B,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACnE,4CAA4C;YAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;SAC3B;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,aAAa,CAAC,GAAgB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,qCAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;YAC5C,MAAM;YACN,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtD,CAAC;KACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACrC,yEAAyE;QACzE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAC3B;UACM,CAAC;IACV,CAAC;CACD;AAlID,4BAkIC;AAED,MAAsB,oBAGpB,SAAQ,QAA8B;IACvC,YAAmB,UAAa;QAC/B,KAAK,EAAE,CAAC;QADU,eAAU,GAAV,UAAU,CAAG;QA4ChC,cAAS,GAAG,6BAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IA1ClD,CAAC;IAED,KAAK,CAAC,aAAa,CAClB,GAAgB,EAChB,YAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAC/C,CAAC;IAES,KAAK,CAAC,SAAS,CACxB,GAAgB,EAChB,IAAiB;QAEjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,OAAiC,CAAC,CAAC;SAC/C;IACF,CAAC;IAED,KAAK,CAAC,QAAQ,CACb,GAAgB,EAChB,IAAY,EACZ,YAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK;aAC3B,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;aACvC,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CACf,CAAc,EACd,IAAuB;QAEvB,OAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChC,CAAC;CAGD;AAjDD,oDAiDC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mountable = void 0;
4
+ const tempstream_1 = require("tempstream");
5
+ 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
+ }
54
+ }
55
+ exports.Mountable = Mountable;
56
+ //# sourceMappingURL=mountable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountable.js","sourceRoot":"","sources":["../../src/page/mountable.ts"],"names":[],"mappings":";;;AAGA,2CAAsE;AAQtE,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,GAAgB,EAChB,IAAmC;QAEnC,OAAO;YACN,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,EAAE;SACT,CAAC;IACH,CAAC;IAES,KAAK,CAAC,QAAQ,CACvB,GAAgB,EAChB,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,GAAgB,EAChB,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,CAAc,EACd,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"}
package/lib/page/page.js CHANGED
@@ -2,7 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Page = void 0;
4
4
  const tempstream_1 = require("tempstream");
5
- class Page {
5
+ const __1 = require("..");
6
+ const mountable_1 = require("./mountable");
7
+ class Page extends mountable_1.Mountable {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.propsParser = new __1.AllQueryParams();
11
+ this.controls = [];
12
+ }
6
13
  mount(router, path) {
7
14
  router.get(path, async (ctx) => {
8
15
  ctx.body = await this.render(ctx);
@@ -15,6 +22,9 @@ class Page {
15
22
  async renderError(_, error) {
16
23
  return tempstream_1.tempstream /* HTML */ `<div>${error.message}</div>`;
17
24
  }
25
+ extractRawValues(ctx) {
26
+ return this.propsParser.decode(ctx);
27
+ }
18
28
  }
19
29
  exports.Page = Page;
20
30
  //# sourceMappingURL=page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page/page.ts"],"names":[],"mappings":";;;AAGA,2CAAqD;AAUrD,MAAsB,IAAI;IACzB,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,CAAc;QAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,CAAc,EAAE,KAAuB;QACxD,OAAO,uBAAU,CAAA,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC;IAC3D,CAAC;CAGD;AAjBD,oBAiBC"}
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,CAAc;QAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,CAAc,EACd,KAAuB;QAEvB,OAAO,uBAAU,CAAA,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC;IAC3D,CAAC;IAID,gBAAgB,CAAC,GAAgB;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACD;AA9BD,oBA8BC"}
@@ -4,64 +4,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AllQueryParams = exports.PagePropsParser = void 0;
7
- const ts_predicates_1 = require("@sealcode/ts-predicates");
8
7
  const merge_1 = __importDefault(require("merge"));
9
- // 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
10
- function parseStringValues(shape, values) {
11
- const result = {};
12
- for (const [key, value] of Object.entries(values)) {
13
- if (!(key in shape)) {
14
- continue;
15
- }
16
- const predicate = shape[key];
17
- if (predicate == ts_predicates_1.predicates.number) {
18
- result[key] = parseFloat(value);
19
- }
20
- else {
21
- result[key] = value;
22
- }
23
- }
24
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
25
- return result;
26
- }
8
+ // page props parser is only tasked with getting the raw props from *somewhere*
9
+ // and being able to put new values back to that somewhere. Parsing to numbers
10
+ // or any other exotic types is done by fields logic.
27
11
  class PagePropsParser {
28
- constructor(propsShape, defaultValues) {
29
- this.propsShape = propsShape;
30
- this.defaultValues = defaultValues;
31
- }
32
12
  overwriteProp(ctx, new_props) {
33
13
  const result = {};
34
14
  merge_1.default.recursive(result, this.decode(ctx), new_props);
35
15
  return result;
36
16
  }
37
- makeHiddenInputs(values, fields_to_skip) {
38
- return Object.entries(values)
39
- .filter(([key]) => !fields_to_skip.includes(key))
40
- .map(([key, value]) =>
41
- /* HTML */ `<input
42
- type="hidden"
43
- name="${key}"
44
- value="${value}"
45
- />`)
46
- .join(" ");
47
- }
48
- getDefaultValue(key) {
49
- return this.defaultValues[key];
50
- }
51
17
  }
52
18
  exports.PagePropsParser = PagePropsParser;
53
19
  class AllQueryParams extends PagePropsParser {
54
20
  decode(ctx) {
55
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
56
- const query = parseStringValues(this.propsShape, {
57
- ...this.defaultValues,
58
- ...ctx.query,
59
- });
60
- if (!ts_predicates_1.hasShape(this.propsShape, query)) {
61
- throw new Error("Wrong props shape");
62
- }
63
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
64
- return query;
21
+ return ctx.query;
65
22
  }
66
23
  encode(props) {
67
24
  return props;
@@ -1 +1 @@
1
- {"version":3,"file":"props-parser.js","sourceRoot":"","sources":["../../src/page/props-parser.ts"],"names":[],"mappings":";;;;;;AAAA,2DAKiC;AAGjC,kDAA0B;AAK1B,sMAAsM;AAEtM,SAAS,iBAAiB,CACzB,KAAe,EACf,MAA8B;IAE9B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAClD,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE;YACpB,SAAS;SACT;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,SAAS,IAAI,0BAAU,CAAC,MAAM,EAAE;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;SAChC;aAAM;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACpB;KACD;IACD,yEAAyE;IACzE,OAAO,MAA+B,CAAC;AACxC,CAAC;AAED,MAAsB,eAAe;IAKpC,YACQ,UAAiB,EACjB,aAAiC;QADjC,eAAU,GAAV,UAAU,CAAO;QACjB,kBAAa,GAAb,aAAa,CAAoB;IACtC,CAAC;IAEJ,aAAa,CACZ,GAAgB,EAChB,SAA6B;QAE7B,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,eAAK,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,gBAAgB,CAAC,MAAiB,EAAE,cAAwB;QAC3D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAChD,GAAG,CACH,CAAC,CAAC,GAAG,EAAE,KAAK,CAA4B,EAAE,EAAE;QAC3C,UAAU,CAAC;;cAEF,GAAG;eACF,KAAK;QACZ,CACJ;aACA,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,eAAe,CACd,GAAQ;QAER,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACD;AAtCD,0CAsCC;AAED,MAAa,cAEX,SAAQ,eAA0B;IACnC,MAAM,CAAC,GAAgB;QACtB,yEAAyE;QACzE,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE;YAChD,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,GAAG,CAAC,KAAK;SACyB,CAAC,CAAC;QACxC,IAAI,CAAC,wBAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACrC;QACD,yEAAyE;QACzE,OAAO,KAAkB,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAgB;QACtB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAiB;QACjC,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAvBD,wCAuBC"}
1
+ {"version":3,"file":"props-parser.js","sourceRoot":"","sources":["../../src/page/props-parser.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAM1B,+EAA+E;AAC/E,8EAA8E;AAC9E,qDAAqD;AAErD,MAAsB,eAAe;IAKpC,aAAa,CACZ,GAAgB,EAChB,SAA6B;QAE7B,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,eAAK,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAbD,0CAaC;AAED,MAAa,cAEX,SAAQ,eAA0B;IACnC,MAAM,CAAC,GAAgB;QACtB,OAAO,GAAG,CAAC,KAAK,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAgB;QACtB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAiB;QACjC,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAdD,wCAcC"}
@@ -6,43 +6,58 @@ async function formTemplate(action_name, newfilefullpath) {
6
6
  const rel = import_path_1.curryImportPath(newfilefullpath);
7
7
  return `import { BaseContext } from "koa";
8
8
  import {
9
+ CollectionField,
9
10
  Form,
10
11
  FormData,
11
- FormHeader,
12
+ FormDataValue,
13
+ SimpleFormField,
12
14
  SimpleInput,
13
- FormField,
14
- collectionFieldValidator,
15
15
  } from "@sealcode/sealgen";
16
-
16
+ import html from "../html";
17
17
  import { Users } from "${rel("src/back/collections/collections")}";
18
- import html from "${rel("src/back/html")}";
19
18
 
20
19
  export const actionName = "${action_name}";
21
20
 
22
- export default new(class ${action_name}Form extends Form {
23
- defaultSuccessMessage = "Pomyślnie utworzono użytkownika";
21
+ const fields = {
22
+ email: new CollectionField(true, Users.fields.email),
23
+ password: new SimpleFormField(true),
24
+ };
24
25
 
25
- fields = [new FormField("email", true, collectionFieldValidator(Users.fields.email))];
26
+ export default new (class ${action_name}Form extends Form<typeof fields> {
27
+ defaultSuccessMessage = "Formularz wypełniony poprawnie";
28
+ fields = fields;
26
29
 
27
30
  controls = [
28
- new FormHeader("Enter your email address"),
29
- new SimpleInput("email", { label: "Your email", type: "email" }),
31
+ new SimpleInput(fields.email, { label: "Email:", type: "email" }),
32
+ new SimpleInput(fields.password, { label: "Password:", type: "password" }),
30
33
  ];
31
34
 
35
+ async validateValues(
36
+ ctx: BaseContext,
37
+ data: Record<string, FormDataValue>
38
+ ): Promise<{ valid: boolean; error: string }> {
39
+ // just an example
40
+ const { parsed: email } = await this.fields.email.getValue(ctx, data);
41
+ const { parsed: password } = await this.fields.password.getValue(ctx, data);
42
+ if ((password || "").length > (email || "").length) {
43
+ return { valid: false, error: "Password cannot be longer than email" };
44
+ } else {
45
+ return { valid: true, error: "" };
46
+ }
47
+ }
48
+
32
49
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
33
50
  async canAccess(_: BaseContext) {
34
51
  return { canAccess: true, message: "" };
35
52
  }
36
53
 
37
- async onSubmit(ctx: BaseContext, values: Record<"email", string>) {
38
- await ctx.$app.collections.users.create(ctx.$context, {
39
- username: values.email,
40
- ...values,
41
- });
54
+ async onSubmit() {
55
+ //noop
56
+ return;
42
57
  }
43
58
 
44
- async render(ctx: BaseContext, data: FormData, path: string) {
45
- return html(ctx, "${action_name}", await super.render(ctx, data, path));
59
+ async render(ctx: BaseContext, data: FormData) {
60
+ return html(ctx, "${action_name}", await super.render(ctx, data));
46
61
  }
47
62
  })();
48
63
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/templates/form.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;AAEhD,KAAK,UAAU,YAAY,CACjC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,GAAG,GAAG,6BAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;;;;;;;;;;yBAUiB,GAAG,CAAC,kCAAkC,CAAC;oBAC5C,GAAG,CAAC,eAAe,CAAC;;6BAEX,WAAW;;2BAEb,WAAW;;;;;;;;;;;;;;;;;;;;;;;sBAuBhB,WAAW;;;CAGhC,CAAC;AACF,CAAC;AA/CD,oCA+CC"}
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/templates/form.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;AAEhD,KAAK,UAAU,YAAY,CACjC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,GAAG,GAAG,6BAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;;;;;;;;;;yBAUiB,GAAG,CAAC,kCAAkC,CAAC;;6BAEnC,WAAW;;;;;;;4BAOZ,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAkCjB,WAAW;;;CAGhC,CAAC;AACF,CAAC;AA9DD,oCA8DC"}
@@ -21,38 +21,48 @@ const listTemplate = async (action_name, newfilefullpath) => {
21
21
  import { CollectionItem } from "sealious";
22
22
  import { tempstream } from "tempstream";
23
23
  import { ${uppercase_collection} } from "${rel("src/back/collections/collections")}";
24
- import html from "${rel("src/back/html.ts")}";
25
- import {
26
- BaseListPageDefaultProps,
27
- BaseListPageProps,
28
- BaseListPagePropsShape,
29
- SealiousItemListPage,
30
- AllQueryParams,
31
- } from "@sealcode/sealgen";
24
+ import html from "../../html";
25
+ import { SealiousItemListPage, BaseListPageFields } from "@sealcode/sealgen";
32
26
 
33
27
  export const actionName = "${action_name}";
34
28
 
35
- export default new (class ${action_name}Page extends SealiousItemListPage<typeof ${uppercase_collection}> {
36
- propsParser = new AllQueryParams<BaseListPageProps>(
37
- BaseListPagePropsShape,
38
- BaseListPageDefaultProps
39
- );
29
+ const filterFields = {};
30
+
31
+ export default new (class ${action_name}Page extends SealiousItemListPage<
32
+ typeof ${uppercase_collection},
33
+ typeof BaseListPageFields
34
+ > {
35
+ fields = BaseListPageFields;
36
+
37
+ filterFields = filterFields;
38
+ filterControls = [];
40
39
 
41
40
  async render(ctx: BaseContext) {
42
41
  return html(
43
42
  ctx,
44
- "${uppercase_collection}",
43
+ "${uppercase_collection}",
45
44
  tempstream/* HTML */ \`<div>
46
- <h2>${uppercase_collection} List</h2>
47
- <ul>
48
- \${super.render(ctx)}
49
- </ul>
45
+ <h2>${uppercase_collection} List</h2>
46
+ <table>
47
+ <thead>
48
+ <th>id</th>
49
+ \${Object.keys(${uppercase_collection}.fields).map(
50
+ (fieldname) => \`<th>\${fieldname}</th>\`
51
+ )}
52
+ </thead>
53
+ <tbody>
54
+ \${super.render(ctx)}
55
+ </tbody>
56
+ </table>
50
57
  </div>\`
51
58
  );
52
59
  }
53
60
 
54
- async renderItem(_: BaseContext, item: CollectionItem<typeof ${uppercase_collection}>) {
55
- return tempstream\`<li>\${item.id}</li>\`;
61
+ async renderItem(_: BaseContext, item: CollectionItem<typeof ${uppercase_collection}>) {
62
+ return tempstream\`<tr><td>\${item.id}</td>\${Object.keys(${uppercase_collection}.fields).map(
63
+ (fieldname: keyof typeof ${uppercase_collection}["fields"]) =>
64
+ tempstream\`<td>\${item.get(fieldname)}</td>\`
65
+ )}</tr>\`;
56
66
  }
57
67
  })(${uppercase_collection});
58
68
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/templates/list.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;AACvD,mCAAoC;AACpC,gEAA4D;AAErD,MAAM,YAAY,GAAG,KAAK,EAChC,WAAmB,EACnB,eAAuB,EACL,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC9B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,CACR,MAAM,kCAAe,EAAE,CACvB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU;SACjB,CAAC,CAAC;KACH,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAoB,CAAC;IACjD,MAAM,oBAAoB,GACzB,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,6BAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;;;WAGG,oBAAoB,YAAY,GAAG,CAC5C,kCAAkC,CAClC;oBACkB,GAAG,CAAC,kBAAkB,CAAC;;;;;;;;;6BASd,WAAW;;4BAEZ,WAAW,4CAA4C,oBAAoB;;;;;;;;;eASxF,oBAAoB;;sBAEb,oBAAoB;;;;;;;;mEAQyB,oBAAoB;;;KAGlF,oBAAoB;CACxB,CAAC;AACF,CAAC,CAAC;AA5DW,QAAA,YAAY,gBA4DvB"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/templates/list.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;AACvD,mCAAoC;AACpC,gEAA4D;AAErD,MAAM,YAAY,GAAG,KAAK,EAChC,WAAmB,EACnB,eAAuB,EACL,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC9B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,CACR,MAAM,kCAAe,EAAE,CACvB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU;SACjB,CAAC,CAAC;KACH,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAoB,CAAC;IACjD,MAAM,oBAAoB,GACzB,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,6BAAe,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;;;WAGG,oBAAoB,YAAY,GAAG,CAC5C,kCAAkC,CAClC;;;;6BAI2B,WAAW;;;;4BAIZ,WAAW;UAC7B,oBAAoB;;;;;;;;;;;MAWxB,oBAAoB;;UAEhB,oBAAoB;;;;uBAIP,oBAAoB;;;;;;;;;;;;gEAYqB,oBAAoB;8DACtB,oBAAoB;8BACpD,oBAAoB;;;;KAI7C,oBAAoB;CACxB,CAAC;AACF,CAAC,CAAC;AAtEW,QAAA,YAAY,gBAsEvB"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.t = void 0;
4
+ function t(ctx, key, props, default_translation) {
5
+ return /* HTML */ `<span translation-key="${key.replace('"', '\\"')}"
6
+ >${ctx.$app.getString(key, props, default_translation)}</span
7
+ >`;
8
+ }
9
+ exports.t = t;
10
+ //# sourceMappingURL=translate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/utils/translate.ts"],"names":[],"mappings":";;;AAGA,SAAgB,CAAC,CAChB,GAAgB,EAChB,GAAW,EACX,KAAY,EACZ,mBAAgC;IAEhC,OAAO,UAAU,CAAC,0BAA0B,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;KAC/D,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,mBAAmB,CAAC;GACrD,CAAC;AACJ,CAAC;AATD,cASC"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@sealcode/sealgen",
3
- "version": "0.3.2",
3
+ "version": "0.4.2",
4
4
  "description": "Module to automate adding routes and collections to a sealious application",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
7
7
  "test": "node test.js",
8
8
  "build": "tsc",
9
9
  "prepare": "npm run build",
10
+ "watch": "npm run build -- --watch",
10
11
  "test-reports": "npm run build && rm -fr .xunit coverage && npm run test -- --cover --test-report"
11
12
  },
12
13
  "bin": {
@@ -42,12 +43,12 @@
42
43
  "locreq": "^2.0.2",
43
44
  "merge": "^2.1.1",
44
45
  "prompts": "^2.4.2",
45
- "tempstream": "^0.0.19",
46
+ "tempstream": "^0.0.21",
46
47
  "tiny-glob": "^0.2.9"
47
48
  },
48
49
  "peerDependencies": {
49
50
  "@koa/router": "^10.1.1",
50
51
  "koa": "^2.13.0",
51
- "sealious": "0.14.x"
52
+ "sealious": "^0.15.8"
52
53
  }
53
54
  }