@sealcode/sealgen 0.6.0 → 0.6.1

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.
@@ -0,0 +1,25 @@
1
+ /// <reference types="koa__router" />
2
+ import Router from "@koa/router";
3
+ import { Context } from "koa";
4
+ import { FlatTemplatable } from "tempstream";
5
+ import { Form, FormData, FormDataValue, FormMessage, Mountable } from "..";
6
+ import { Fields } from "../page/mountable";
7
+ export default class Multiform extends Mountable {
8
+ name: string;
9
+ forms: Record<string, Form<Fields>>;
10
+ wrapper: (content: FlatTemplatable) => FlatTemplatable;
11
+ controls: never[];
12
+ constructor(name: string, forms: Record<string, Form<Fields>>, wrapper?: (content: FlatTemplatable) => FlatTemplatable);
13
+ init(): void;
14
+ extractRawValues(ctx: Context): Record<string, FormDataValue>;
15
+ canAccess(_: Context): Promise<{
16
+ canAccess: boolean;
17
+ message: string;
18
+ }>;
19
+ getSubFormsToRender(ctx: Context): Array<readonly [string, Form<any>]>;
20
+ renderSubForm(ctx: Context, sub_form_name: string): Promise<FlatTemplatable>;
21
+ getSubformRawValues(ctx: Context, sub_form_name: string): Record<string, FormDataValue>;
22
+ renderSubForms(ctx: Context, messages: FormMessage[], prerenderedForms?: Record<string, FlatTemplatable | undefined>): Promise<FlatTemplatable>;
23
+ render(ctx: Context, data: FormData<any>): Promise<FlatTemplatable>;
24
+ mount(router: Router, path: string): void;
25
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ts_predicates_1 = require("@sealcode/ts-predicates");
4
+ const tempstream_1 = require("tempstream");
5
+ const __1 = require("..");
6
+ const sanitize_1 = require("../sanitize");
7
+ const FIELD_PREFIX_SEPARATOR = "___";
8
+ class Multiform extends __1.Mountable {
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ constructor(name, forms, wrapper = (content) => tempstream_1.tempstream `<!doctype html><html>${content}</html>`) {
11
+ super();
12
+ this.name = name;
13
+ this.forms = forms;
14
+ this.wrapper = wrapper;
15
+ this.controls = [];
16
+ for (const [key, form] of Object.entries(forms)) {
17
+ if (key !== sanitize_1.attribute(key)) {
18
+ throw new Error(`Form name "${key}" is not url-safe. Try: "${sanitize_1.attribute(key)}"`);
19
+ }
20
+ form.makeOpenFormTag = () => `<div>`;
21
+ form.makeCloseFormTag = () => `</div>`;
22
+ form.field_names_prefix = key + FIELD_PREFIX_SEPARATOR;
23
+ form.form_id = this.name;
24
+ form.action = "./" + key;
25
+ form.init();
26
+ form.extractRawValues = (context) => this.getSubformRawValues(context, key);
27
+ const submit_button_id = this.name + "_" + key + "_submit";
28
+ form.makeSubmitButton = () => /* HTML */ `<input
29
+ type="submit"
30
+ value="${form.submitButtonText}"
31
+ formaction="${form.action}"
32
+ id="${submit_button_id}"
33
+ ${form.form_id ? `form="${form.form_id}"` : ""}
34
+ /> `;
35
+ }
36
+ }
37
+ init() {
38
+ super.init();
39
+ for (const form of Object.values(this.forms)) {
40
+ for (const field of Object.values(form.fields)) {
41
+ if (field.name.includes(FIELD_PREFIX_SEPARATOR)) {
42
+ throw new Error(`A field name within multiform cannot contain '${FIELD_PREFIX_SEPARATOR}'`);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ extractRawValues(ctx) {
48
+ return ctx.$body || {};
49
+ }
50
+ async canAccess(_) {
51
+ return {
52
+ canAccess: true,
53
+ message: "this view includes multiple forms and each of them have their unique access rules",
54
+ };
55
+ }
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ getSubFormsToRender(ctx) {
58
+ const requested_frame = ctx.headers["turbo-frame"];
59
+ if (!ts_predicates_1.is(requested_frame, ts_predicates_1.predicates.or(ts_predicates_1.predicates.undefined, ts_predicates_1.predicates.string))) {
60
+ throw new Error("Wrong turbo-frame header value type");
61
+ }
62
+ const forms_to_render = requested_frame && this.forms[requested_frame]
63
+ ? [[requested_frame, this.forms[requested_frame]]]
64
+ : Object.entries(this.forms);
65
+ return forms_to_render;
66
+ }
67
+ async renderSubForm(ctx, sub_form_name) {
68
+ const form = this.forms[sub_form_name];
69
+ const result = await form.canAccess(ctx);
70
+ if (!result.canAccess) {
71
+ return result.message;
72
+ }
73
+ return form.render(ctx, {
74
+ raw_values: this.getSubformRawValues(ctx, sub_form_name),
75
+ messages: [],
76
+ });
77
+ }
78
+ getSubformRawValues(ctx, sub_form_name) {
79
+ const result = Object.fromEntries(Object.entries(this.extractRawValues(ctx))
80
+ .filter(([key]) => key.startsWith(sub_form_name + FIELD_PREFIX_SEPARATOR))
81
+ .map(([key, value]) => [
82
+ key.slice((sub_form_name + FIELD_PREFIX_SEPARATOR).length),
83
+ value,
84
+ ]));
85
+ return result;
86
+ }
87
+ async renderSubForms(ctx, messages, prerenderedForms = {}) {
88
+ return this.wrapper(tempstream_1.tempstream /* HTML */ `${this.renderMessages(ctx, {
89
+ raw_values: {},
90
+ messages,
91
+ })}
92
+ <div class="forms">
93
+ <form
94
+ id="${this.name}"
95
+ novalidate
96
+ ${
97
+ /* novalidate is here because all the subforms are actuallly one form and errors in one will prevent submitting all of the forms */ ""}
98
+ method="POST"
99
+ ></form>
100
+ ${this.getSubFormsToRender(ctx).map(([form_name]) => {
101
+ const frame_form_id = this.name + "_" + form_name + "_frame_form";
102
+ return tempstream_1.tempstream /* HTML */ `<turbo-frame
103
+ id="${form_name}"
104
+ contains-subform
105
+ subform-id="${frame_form_id}"
106
+ >
107
+ ${prerenderedForms[form_name] ||
108
+ this.renderSubForm(ctx, form_name)}
109
+ <form id="${frame_form_id}" method="POST"></form>
110
+ </turbo-frame>`;
111
+ })}
112
+ </div>
113
+ <script>
114
+ (function () {
115
+ if (!window.subform_handlers) {
116
+ window.subform_handlers = {};
117
+ }
118
+ if (window.subform_handlers["${this.name}"]) {
119
+ return;
120
+ }
121
+ const handler = () => {
122
+ document
123
+ .querySelectorAll("turbo-frame[contains-subform]")
124
+ .forEach((frame) => {
125
+ frame_form_id =
126
+ frame.getAttribute("subform-id");
127
+ frame
128
+ .querySelectorAll("input")
129
+ .forEach((input) => {
130
+ input.setAttribute(
131
+ "form",
132
+ frame_form_id
133
+ );
134
+ });
135
+ });
136
+ };
137
+ window.subform_handlers["${this.name}"] = handler;
138
+ document.documentElement.addEventListener(
139
+ "turbo:load",
140
+ handler
141
+ );
142
+ document.documentElement.addEventListener(
143
+ "turbo:frame-render",
144
+ handler
145
+ );
146
+ })();
147
+ </script>`);
148
+ }
149
+ async render(ctx, data) {
150
+ return this.renderSubForms(ctx, data.messages, {});
151
+ }
152
+ mount(router, path) {
153
+ router.get(path, async (ctx) => {
154
+ ctx.type = "html";
155
+ ctx.body = await this.render(ctx, {
156
+ raw_values: this.extractRawValues(ctx),
157
+ messages: [],
158
+ });
159
+ });
160
+ for (const [key, form] of Object.entries(this.forms)) {
161
+ router.post(path + (path.endsWith("/") ? "" : "/") + key, async (ctx) => {
162
+ const reaction = await form.handlePost(ctx);
163
+ if (reaction.action == "stay") {
164
+ ctx.status = 422;
165
+ const form_content = reaction.content;
166
+ ctx.body = this.renderSubForms(ctx, [], {
167
+ [key]: form_content,
168
+ });
169
+ }
170
+ else if (reaction.action == "redirect") {
171
+ ctx.status = 303;
172
+ ctx.redirect(reaction.url);
173
+ }
174
+ });
175
+ }
176
+ }
177
+ }
178
+ exports.default = Multiform;
179
+ //# sourceMappingURL=multiform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiform.js","sourceRoot":"","sources":["../../src/forms/multiform.ts"],"names":[],"mappings":"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"}
@@ -31,15 +31,17 @@ const prettier_1 = require("./utils/prettier");
31
31
  const target_locreq = locreq_1.default(process.cwd());
32
32
  async function extractCollectionClassname(full_file_path) {
33
33
  const file_content = await fs_1.promises.readFile(full_file_path, "utf-8");
34
- const result = file_content.match(/export default class (\w+)/);
34
+ const result = /export default class (\w+)/.exec(file_content);
35
35
  if (result === null) {
36
36
  throw new Error("Missing 'export default class' statement?");
37
37
  }
38
- return ts_predicates_1.assertType(result[1], ts_predicates_1.predicates.string, "Missing export default class?");
38
+ return ts_predicates_1.assertType(result[1], ts_predicates_1.predicates.string, `Missing export default class in '${full_file_path}'?`);
39
39
  }
40
40
  async function generateCollections() {
41
41
  const collections_dir = target_locreq.resolve("src/back/collections");
42
- const files = (await fs_1.promises.readdir(collections_dir)).filter((f) => !f.match(/\.(sub)?test\./) && f != "collections.ts");
42
+ const files = (await fs_1.promises.readdir(collections_dir)).filter((f) => !/\.(sub)?test\./.exec(f) &&
43
+ f != "collections.ts" &&
44
+ f.endsWith(".ts"));
43
45
  const file_data = await Promise.all(files.map(async (file) => {
44
46
  const full_path = target_locreq.resolve("src/back/collections/" + file);
45
47
  const class_name = await extractCollectionClassname(full_path);
@@ -1 +1 @@
1
- {"version":3,"file":"generate-collections.js","sourceRoot":"","sources":["../src/generate-collections.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA6B;AAC7B,mDAAqC;AACrC,2BAAoC;AACpC,2DAAiE;AACjE,+CAAqD;AAErD,MAAM,aAAa,GAAG,gBAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE7C,KAAK,UAAU,0BAA0B,CACxC,cAAsB;IAEtB,MAAM,YAAY,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;KAC7D;IACD,OAAO,0BAAU,CAChB,MAAM,CAAC,CAAC,CAAC,EACT,0BAAU,CAAC,MAAM,EACjB,+BAA+B,CAC/B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,mBAAmB;IACxC,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,CAAC,MAAM,aAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAC1D,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CACtC,uBAAuB,GAAG,IAAI,CAC9B,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC/D,OAAO;YACN,UAAU;YACV,IAAI;YACJ,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAChC,CAAC;IACH,CAAC,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GAAG;;;EAGf,SAAS;SACT,GAAG,CACH,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAC3B,WAAW,UAAU,YAAY,OAAO,IAAI,CAC7C;SACA,IAAI,CAAC,IAAI,CAAC;;EAEV,SAAS;SACT,GAAG,CACH,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,gBAAgB,UAAU,WAAW,UAAU,KAAK,CACxE;SACA,IAAI,CAAC,IAAI,CAAC;;;;EAIV,SAAS;SACT,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,OAAO,MAAM,UAAU,GAAG,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC;GACT,CAAC;IACH,MAAM,aAAE,CAAC,SAAS,CACjB,aAAa,CAAC,OAAO,CAAC,qCAAqC,CAAC,EAC5D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,4BAAiB,EAAE,CAAC,CACnD,CAAC;IACF,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACV,oEAAoE,CACpE,CAAC;AACH,CAAC;AAlDD,kDAkDC"}
1
+ {"version":3,"file":"generate-collections.js","sourceRoot":"","sources":["../src/generate-collections.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA6B;AAC7B,mDAAqC;AACrC,2BAAoC;AACpC,2DAAiE;AACjE,+CAAqD;AAErD,MAAM,aAAa,GAAG,gBAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE7C,KAAK,UAAU,0BAA0B,CACxC,cAAsB;IAEtB,MAAM,YAAY,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,IAAI,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;KAC7D;IACD,OAAO,0BAAU,CAChB,MAAM,CAAC,CAAC,CAAC,EACT,0BAAU,CAAC,MAAM,EACjB,oCAAoC,cAAc,IAAI,CACtD,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,mBAAmB;IACxC,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,CAAC,MAAM,aAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzB,CAAC,IAAI,gBAAgB;QACrB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClB,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CACtC,uBAAuB,GAAG,IAAI,CAC9B,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC/D,OAAO;YACN,UAAU;YACV,IAAI;YACJ,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAChC,CAAC;IACH,CAAC,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GAAG;;;EAGf,SAAS;SACT,GAAG,CACH,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAC3B,WAAW,UAAU,YAAY,OAAO,IAAI,CAC7C;SACA,IAAI,CAAC,IAAI,CAAC;;EAEV,SAAS;SACT,GAAG,CACH,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,gBAAgB,UAAU,WAAW,UAAU,KAAK,CACxE;SACA,IAAI,CAAC,IAAI,CAAC;;;;EAIV,SAAS;SACT,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,OAAO,MAAM,UAAU,GAAG,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC;GACT,CAAC;IACH,MAAM,aAAE,CAAC,SAAS,CACjB,aAAa,CAAC,OAAO,CAAC,qCAAqC,CAAC,EAC5D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,4BAAiB,EAAE,CAAC,CACnD,CAAC;IACF,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACV,oEAAoE,CACpE,CAAC;AACH,CAAC;AArDD,kDAqDC"}
@@ -0,0 +1,86 @@
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 = __importDefault(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 multiform_1.default("multiform_test", { form1, form2 }, (content) => tempstream_1.tempstream `<!DOCTYPE html>
51
+ <html>
52
+ <head>
53
+ <title>Multiform Test - Sealgen</title>
54
+ <script type="module">
55
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
56
+ </script>
57
+ </head>
58
+ <body>
59
+ ${content}
60
+ </body>
61
+ </html>`);
62
+ const URL = "/";
63
+ async function handleHtmlPromise(ctx, next) {
64
+ await next();
65
+ if (ctx.body instanceof Promise) {
66
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
67
+ ctx.body = await ctx.body;
68
+ }
69
+ ctx.set("content-type", "text/html;charset=utf-8");
70
+ }
71
+ router.use(URL, koa_body_1.default(), async (ctx, next) => {
72
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
73
+ ctx.$body = ctx.request.body;
74
+ ctx.$app = {
75
+ getString: (_, args, trans) => typeof trans == "function" ? trans(args) : trans,
76
+ };
77
+ await next();
78
+ }, handleHtmlPromise);
79
+ multiform.init();
80
+ multiform.mount(router, URL);
81
+ // to automatically add trailing slashes:
82
+ router.use(URL, (ctx) => ctx.set("content-type", "text/html;charset=utf-8"));
83
+ app.use(router.routes()).use(router.allowedMethods());
84
+ app.listen(3000);
85
+ console.log("Multiform test app listening on localhost:3000");
86
+ //# sourceMappingURL=multiform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiform.js","sourceRoot":"","sources":["../../../src/tests/manual/multiform.ts"],"names":[],"mappings":";;;;;AAAA,8CAAmC;AACnC,yDAAiC;AACjC,6BAA+C;AAC/C,sEAA8C;AAC9C,wDAA+B;AAC/B,2CAAwC;AACxC,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrC,MAAM,MAAM,GAAG,IAAI,gBAAM,EAAE,CAAC;AAE5B,MAAM,OAAO,GAAG;IACf,KAAK,EAAE,IAAI,UAAM,CAAC,eAAe,CAAC,IAAI,CAAC;IACvC,QAAQ,EAAE,IAAI,UAAM,CAAC,eAAe,CAAC,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,SAAQ,QAAoB;IAAlC;;QAClB,0BAAqB,GAAG,aAAa,CAAC;QACtC,aAAQ,GAAG;YACV,IAAI,YAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YAChC,IAAI,YAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACvC,CAAC;QACF,WAAM,GAAG,OAAO,CAAC;IAIlB,CAAC;IAHA,QAAQ;QACP,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;CACD,CAAC,EAAE,CAAC;AAEL,MAAM,OAAO,GAAG;IACf,IAAI,EAAE,IAAI,UAAM,CAAC,eAAe,CAAC,IAAI,CAAC;IACtC,OAAO,EAAE,IAAI,UAAM,CAAC,eAAe,CAAC,IAAI,CAAC;CACzC,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,SAAQ,QAA4B;IAA1C;;QAClB,0BAAqB,GAAG,aAAa,CAAC;QACtC,aAAQ,GAAG;YACV,IAAI,YAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YAChC,IAAI,YAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SACtC,CAAC;QACF,WAAM,GAAG,OAAO,CAAC;IAIlB,CAAC;IAHA,QAAQ;QACP,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;CACD,CAAC,EAAE,CAAC;AAEL,MAAM,SAAS,GAAG,IAAI,mBAAS,CAC9B,gBAAgB,EAChB,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAU,CAAA;;;;;;;;;MASlB,OAAO;;UAEH,CACT,CAAC;AAEF,MAAM,GAAG,GAAG,GAAG,CAAC;AAEhB,KAAK,UAAU,iBAAiB,CAAC,GAAY,EAAE,IAAc;IAC5D,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,GAAG,CAAC,IAAI,YAAY,OAAO,EAAE;QAChC,mEAAmE;QACnE,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;KAC1B;IACD,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,GAAG,CACT,GAAG,EACH,kBAAO,EAAE,EACT,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACnB,mEAAmE;IACnE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,GAAG,CAAC,IAAI,GAAG;QACV,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAC7B,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;KACjD,CAAC;IACF,MAAM,IAAI,EAAE,CAAC;AACd,CAAC,EACD,iBAAiB,CACjB,CAAC;AACF,SAAS,CAAC,IAAI,EAAE,CAAC;AACjB,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC7B,yCAAyC;AAEzC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAE7E,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;AACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAEjB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealcode/sealgen",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Module to automate adding routes and collections to a sealious application",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -10,21 +10,24 @@ async function extractCollectionClassname(
10
10
  full_file_path: string
11
11
  ): Promise<string> {
12
12
  const file_content = await fs.readFile(full_file_path, "utf-8");
13
- const result = file_content.match(/export default class (\w+)/);
13
+ const result = /export default class (\w+)/.exec(file_content);
14
14
  if (result === null) {
15
15
  throw new Error("Missing 'export default class' statement?");
16
16
  }
17
17
  return assertType(
18
18
  result[1],
19
19
  predicates.string,
20
- "Missing export default class?"
20
+ `Missing export default class in '${full_file_path}'?`
21
21
  );
22
22
  }
23
23
 
24
24
  export async function generateCollections(): Promise<void> {
25
25
  const collections_dir = target_locreq.resolve("src/back/collections");
26
26
  const files = (await fs.readdir(collections_dir)).filter(
27
- (f) => !f.match(/\.(sub)?test\./) && f != "collections.ts"
27
+ (f) =>
28
+ !/\.(sub)?test\./.exec(f) &&
29
+ f != "collections.ts" &&
30
+ f.endsWith(".ts")
28
31
  );
29
32
  const file_data = await Promise.all(
30
33
  files.map(async (file) => {