@sealcode/sealgen 0.12.0 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/notifier.js +1 -1
- package/package.json +2 -2
- package/src/notifier.ts +1 -1
- package/.madgerc +0 -7
- package/coverage/.tmp/coverage-15.json +0 -1
- package/coverage/.tmp/coverage-16.json +0 -1
- package/coverage/.tmp/coverage-17.json +0 -1
- package/coverage/.tmp/coverage-18.json +0 -1
- package/coverage/.tmp/coverage-19.json +0 -1
- package/coverage/.tmp/coverage-20.json +0 -1
- package/coverage/.tmp/coverage-21.json +0 -1
- package/coverage/.tmp/coverage-22.json +0 -1
- package/coverage/.tmp/coverage-23.json +0 -1
- package/coverage/.tmp/coverage-24.json +0 -1
- package/coverage/.tmp/coverage-25.json +0 -1
- package/coverage/.tmp/coverage-26.json +0 -1
- package/lib/add-collection.js +0 -24
- package/lib/add-jdd-component.js +0 -27
- package/lib/add-route.js +0 -65
- package/lib/add-route.test.js +0 -60
- package/lib/build.js +0 -187
- package/lib/cli.js +0 -35
- package/lib/components/components.js +0 -3
- package/lib/components/tabs.js +0 -88
- package/lib/components/toggle-modal.js +0 -46
- package/lib/example.test.js +0 -5
- package/lib/find-css-includes.js +0 -23
- package/lib/forms/controls/array.js +0 -140
- package/lib/forms/controls/autocomplete.js +0 -23
- package/lib/forms/controls/big-radio-group.js +0 -34
- package/lib/forms/controls/checkbox-group.js +0 -29
- package/lib/forms/controls/checkbox.js +0 -24
- package/lib/forms/controls/checkboxed-list-input.js +0 -35
- package/lib/forms/controls/collapsible-checkbox-group.js +0 -13
- package/lib/forms/controls/collapsible-field-group.js +0 -78
- package/lib/forms/controls/controls.js +0 -31
- package/lib/forms/controls/derived-frame.js +0 -52
- package/lib/forms/controls/derived.js +0 -77
- package/lib/forms/controls/dropdown.js +0 -55
- package/lib/forms/controls/editable-collection-subset.js +0 -68
- package/lib/forms/controls/field-group.js +0 -53
- package/lib/forms/controls/file.js +0 -35
- package/lib/forms/controls/form-control.js +0 -14
- package/lib/forms/controls/form-field-control.js +0 -9
- package/lib/forms/controls/form-header.js +0 -14
- package/lib/forms/controls/form-paragraph.js +0 -12
- package/lib/forms/controls/frame.js +0 -25
- package/lib/forms/controls/hidden-input.js +0 -14
- package/lib/forms/controls/html.js +0 -23
- package/lib/forms/controls/multiple-files.js +0 -160
- package/lib/forms/controls/multiple-photos.js +0 -33
- package/lib/forms/controls/number.js +0 -25
- package/lib/forms/controls/photo.js +0 -57
- package/lib/forms/controls/radio.js +0 -25
- package/lib/forms/controls/reverse-single-reference.js +0 -47
- package/lib/forms/controls/simple-input.js +0 -78
- package/lib/forms/controls/textarea.js +0 -33
- package/lib/forms/controls/tickable.js +0 -75
- package/lib/forms/fields/boolean.js +0 -51
- package/lib/forms/fields/boolean.test.js +0 -32
- package/lib/forms/fields/checkboxed-list.js +0 -40
- package/lib/forms/fields/collection-field.js +0 -29
- package/lib/forms/fields/email.js +0 -11
- package/lib/forms/fields/email.test.js +0 -20
- package/lib/forms/fields/enum-multiple.js +0 -47
- package/lib/forms/fields/enum-multiple.test.js +0 -27
- package/lib/forms/fields/enum.js +0 -39
- package/lib/forms/fields/enum.test.js +0 -21
- package/lib/forms/fields/existing-sealious-value.js +0 -16
- package/lib/forms/fields/field.js +0 -81
- package/lib/forms/fields/file.js +0 -53
- package/lib/forms/fields/multiple-files.js +0 -15
- package/lib/forms/fields/number.js +0 -45
- package/lib/forms/fields/number.test.js +0 -30
- package/lib/forms/fields/pick-from-list.js +0 -31
- package/lib/forms/fields/pick-from-list.test.js +0 -17
- package/lib/forms/fields/proxy-field.js +0 -20
- package/lib/forms/fields/regexp.js +0 -40
- package/lib/forms/fields/regexp.test.js +0 -21
- package/lib/forms/fields/reverse-single-reference.js +0 -14
- package/lib/forms/fields/simple-form-field.js +0 -20
- package/lib/forms/fields/structured-array.js +0 -18
- package/lib/forms/form.js +0 -176
- package/lib/forms/form.test.js +0 -1
- package/lib/forms/multiform.js +0 -174
- package/lib/forms/multiform.test.js +0 -426
- package/lib/generate-collections.js +0 -52
- package/lib/generate-components.js +0 -33
- package/lib/generate-routes.js +0 -75
- package/lib/index.js +0 -17
- package/lib/make-env.js +0 -14
- package/lib/make-hidden-inputs.js +0 -14
- package/lib/mount.js +0 -70
- package/lib/notifier.js +0 -19
- package/lib/page/access-control.js +0 -16
- package/lib/page/default-list-filters.js +0 -40
- package/lib/page/list.js +0 -183
- package/lib/page/mountable-with-fields.js +0 -85
- package/lib/page/mountable.js +0 -5
- package/lib/page/page.js +0 -26
- package/lib/page/props-parser.js +0 -23
- package/lib/page/sealious-list.js +0 -59
- package/lib/page/stateful-page.js +0 -97
- package/lib/remove-named-imports.js +0 -47
- package/lib/run.js +0 -2
- package/lib/sanitize.js +0 -10
- package/lib/src/add-collection.js +0 -24
- package/lib/src/add-jdd-component.js +0 -27
- package/lib/src/add-route.js +0 -65
- package/lib/src/add-route.test.js +0 -72
- package/lib/src/build.js +0 -142
- package/lib/src/cli.js +0 -37
- package/lib/src/components/components.js +0 -3
- package/lib/src/components/tabs.js +0 -88
- package/lib/src/components/toggle-modal.js +0 -46
- package/lib/src/example.test.js +0 -5
- package/lib/src/find-css-includes.js +0 -23
- package/lib/src/forms/controls/array.js +0 -141
- package/lib/src/forms/controls/autocomplete.js +0 -23
- package/lib/src/forms/controls/big-radio-group.js +0 -34
- package/lib/src/forms/controls/checkbox-group.js +0 -30
- package/lib/src/forms/controls/checkbox.js +0 -24
- package/lib/src/forms/controls/checkboxed-list-input.js +0 -35
- package/lib/src/forms/controls/collapsible-checkbox-group.js +0 -13
- package/lib/src/forms/controls/collapsible-field-group.js +0 -78
- package/lib/src/forms/controls/controls.js +0 -31
- package/lib/src/forms/controls/derived-frame.js +0 -52
- package/lib/src/forms/controls/derived.js +0 -77
- package/lib/src/forms/controls/dropdown.js +0 -55
- package/lib/src/forms/controls/editable-collection-subset.js +0 -68
- package/lib/src/forms/controls/field-group.js +0 -53
- package/lib/src/forms/controls/file.js +0 -35
- package/lib/src/forms/controls/form-control.js +0 -14
- package/lib/src/forms/controls/form-field-control.js +0 -9
- package/lib/src/forms/controls/form-header.js +0 -14
- package/lib/src/forms/controls/form-paragraph.js +0 -12
- package/lib/src/forms/controls/frame.js +0 -25
- package/lib/src/forms/controls/hidden-input.js +0 -14
- package/lib/src/forms/controls/html.js +0 -23
- package/lib/src/forms/controls/multiple-files.js +0 -160
- package/lib/src/forms/controls/multiple-photos.js +0 -33
- package/lib/src/forms/controls/number.js +0 -25
- package/lib/src/forms/controls/photo.js +0 -57
- package/lib/src/forms/controls/radio.js +0 -25
- package/lib/src/forms/controls/reverse-single-reference.js +0 -47
- package/lib/src/forms/controls/simple-input.js +0 -78
- package/lib/src/forms/controls/textarea.js +0 -33
- package/lib/src/forms/controls/tickable.js +0 -75
- package/lib/src/forms/fields/boolean.js +0 -51
- package/lib/src/forms/fields/boolean.test.js +0 -33
- package/lib/src/forms/fields/checkboxed-list.js +0 -40
- package/lib/src/forms/fields/collection-field.js +0 -29
- package/lib/src/forms/fields/email.js +0 -11
- package/lib/src/forms/fields/email.test.js +0 -20
- package/lib/src/forms/fields/enum-multiple.js +0 -47
- package/lib/src/forms/fields/enum-multiple.test.js +0 -27
- package/lib/src/forms/fields/enum.js +0 -39
- package/lib/src/forms/fields/enum.test.js +0 -21
- package/lib/src/forms/fields/existing-sealious-value.js +0 -16
- package/lib/src/forms/fields/field.js +0 -66
- package/lib/src/forms/fields/fields.js +0 -16
- package/lib/src/forms/fields/file.js +0 -53
- package/lib/src/forms/fields/multiple-files.js +0 -15
- package/lib/src/forms/fields/number.js +0 -45
- package/lib/src/forms/fields/number.test.js +0 -31
- package/lib/src/forms/fields/pick-from-list.js +0 -31
- package/lib/src/forms/fields/pick-from-list.test.js +0 -17
- package/lib/src/forms/fields/proxy-field.js +0 -20
- package/lib/src/forms/fields/regexp.js +0 -40
- package/lib/src/forms/fields/regexp.test.js +0 -21
- package/lib/src/forms/fields/reverse-single-reference.js +0 -14
- package/lib/src/forms/fields/simple-form-field.js +0 -19
- package/lib/src/forms/fields/structured-array.js +0 -18
- package/lib/src/forms/form-types.js +0 -2
- package/lib/src/forms/form.js +0 -176
- package/lib/src/forms/form.test.js +0 -271
- package/lib/src/forms/multiform.js +0 -174
- package/lib/src/forms/multiform.test.js +0 -430
- package/lib/src/generate-collections.js +0 -52
- package/lib/src/generate-components.js +0 -33
- package/lib/src/generate-routes.js +0 -75
- package/lib/src/hehe.test.js +0 -7
- package/lib/src/index.js +0 -19
- package/lib/src/make-env.js +0 -14
- package/lib/src/make-hidden-inputs.js +0 -14
- package/lib/src/mount.js +0 -70
- package/lib/src/notifier.js +0 -19
- package/lib/src/page/access-control.js +0 -16
- package/lib/src/page/default-list-filters.js +0 -40
- package/lib/src/page/list.js +0 -184
- package/lib/src/page/mountable-with-fields.js +0 -85
- package/lib/src/page/mountable.js +0 -5
- package/lib/src/page/page.js +0 -26
- package/lib/src/page/props-parser.js +0 -23
- package/lib/src/page/sealious-list.js +0 -59
- package/lib/src/page/stateful-page.js +0 -97
- package/lib/src/run.js +0 -2
- package/lib/src/sample-index.js +0 -3
- package/lib/src/sample-lib.js +0 -6
- package/lib/src/sanitize.js +0 -10
- package/lib/src/templates/collection.js +0 -12
- package/lib/src/templates/form.js +0 -57
- package/lib/src/templates/jdd-component.js +0 -39
- package/lib/src/templates/list.js +0 -139
- package/lib/src/templates/long-running-process.js +0 -60
- package/lib/src/templates/multiform.js +0 -55
- package/lib/src/templates/page.js +0 -23
- package/lib/src/templates/post.js +0 -22
- package/lib/src/templates/redirect.js +0 -23
- package/lib/src/templates/route-test.js +0 -54
- package/lib/src/templates/stateful-page.js +0 -66
- package/lib/src/templates/templates.js +0 -21
- package/lib/src/test_utils/locator_is_visible.js +0 -11
- package/lib/src/utils/assert-throws.js +0 -17
- package/lib/src/utils/base64.js +0 -7
- package/lib/src/utils/browser-creator.js +0 -10
- package/lib/src/utils/escape-url-params.js +0 -14
- package/lib/src/utils/exec.js +0 -22
- package/lib/src/utils/extract-fields-from-collection.js +0 -26
- package/lib/src/utils/format-external-url.js +0 -11
- package/lib/src/utils/import-path.js +0 -16
- package/lib/src/utils/input-wrapper.js +0 -15
- package/lib/src/utils/list-collections.js +0 -13
- package/lib/src/utils/make-slug.js +0 -6
- package/lib/src/utils/natural-numbers.js +0 -6
- package/lib/src/utils/prettier.js +0 -10
- package/lib/src/utils/question.js +0 -19
- package/lib/src/utils/render-attributes.js +0 -19
- package/lib/src/utils/sleep.js +0 -4
- package/lib/src/utils/translate.js +0 -6
- package/lib/src/utils/url-with-new-params.js +0 -5
- package/lib/src/utils/utils.js +0 -16
- package/lib/src/utils/walk.js +0 -23
- package/lib/src/vitest.config.js +0 -20
- package/lib/templates/collection.js +0 -12
- package/lib/templates/form.js +0 -57
- package/lib/templates/jdd-component.js +0 -39
- package/lib/templates/list.js +0 -139
- package/lib/templates/long-running-process.js +0 -60
- package/lib/templates/multiform.js +0 -55
- package/lib/templates/page.js +0 -23
- package/lib/templates/post.js +0 -22
- package/lib/templates/redirect.js +0 -23
- package/lib/templates/route-test.js +0 -54
- package/lib/templates/stateful-page.js +0 -66
- package/lib/templates/templates.js +0 -21
- package/lib/test_utils/locator_is_visible.js +0 -11
- package/lib/utils/assert-throws.js +0 -17
- package/lib/utils/base64.js +0 -7
- package/lib/utils/browser-creator.js +0 -10
- package/lib/utils/escape-url-params.js +0 -14
- package/lib/utils/exec.js +0 -22
- package/lib/utils/extract-fields-from-collection.js +0 -26
- package/lib/utils/format-external-url.js +0 -11
- package/lib/utils/import-path.js +0 -16
- package/lib/utils/input-wrapper.js +0 -15
- package/lib/utils/list-collections.js +0 -13
- package/lib/utils/make-slug.js +0 -6
- package/lib/utils/natural-numbers.js +0 -6
- package/lib/utils/prettier.js +0 -10
- package/lib/utils/question.js +0 -19
- package/lib/utils/render-attributes.js +0 -19
- package/lib/utils/sleep.js +0 -4
- package/lib/utils/translate.js +0 -6
- package/lib/utils/url-with-new-params.js +0 -5
- package/lib/utils/utils.js +0 -16
- package/lib/utils/walk.js +0 -23
- package/lib/vitest.config.js +0 -22
package/lib/sanitize.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { resolve } from "path";
|
|
2
|
-
import _locreq from "locreq";
|
|
3
|
-
import { promises as fs, existsSync } from "fs";
|
|
4
|
-
import { question } from "./utils/question.js";
|
|
5
|
-
import { collectionTemplate } from "./templates/collection.js";
|
|
6
|
-
import { generateCollections } from "./generate-collections.js";
|
|
7
|
-
const target_locreq = _locreq(process.cwd());
|
|
8
|
-
export async function addCollection() {
|
|
9
|
-
const regex_pattern = /^([A-Z_$][a-zA-Z0-9_$]*)$/;
|
|
10
|
-
const collection_name = await question('What\'s the name of the collection class (e.g. "SecretDocuments", must start with a capital letter): ', (s) => s.length > 3 && regex_pattern.test(s));
|
|
11
|
-
const url = await question("Enter the url-friendly name for the collection (e.g. secret-documents): ", (s) => !s.includes("/") && !s.includes(" "));
|
|
12
|
-
const file_path = target_locreq.resolve(`src/back/collections/${url}.ts`);
|
|
13
|
-
if (existsSync(file_path)) {
|
|
14
|
-
// eslint-disable-next-line no-console
|
|
15
|
-
console.error(`ERROR: File ${file_path} already exists.`);
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
await fs.mkdir(resolve(file_path, "../"), { recursive: true });
|
|
19
|
-
await fs.writeFile(file_path, collectionTemplate(collection_name));
|
|
20
|
-
// eslint-disable-next-line no-console
|
|
21
|
-
console.log(`${file_path} created`);
|
|
22
|
-
await generateCollections();
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=add-collection.js.map
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { resolve } from "path";
|
|
2
|
-
import _locreq from "locreq";
|
|
3
|
-
import { promises as fs, existsSync } from "fs";
|
|
4
|
-
import { question } from "./utils/question.js";
|
|
5
|
-
const target_locreq = _locreq(process.cwd());
|
|
6
|
-
import { jddComponentTemplate } from "./templates/jdd-component.js";
|
|
7
|
-
import { generateComponents } from "./generate-components.js";
|
|
8
|
-
import { toKebabCase } from "js-convert-case";
|
|
9
|
-
export async function addJDDComponent() {
|
|
10
|
-
const component_name = await question("What's the name of the component? > ", (s) => s.length > 3);
|
|
11
|
-
const file_path = target_locreq.resolve(`src/back/jdd-components/${toKebabCase(component_name)}/${toKebabCase(component_name)}.jdd.tsx`);
|
|
12
|
-
if (existsSync(file_path)) {
|
|
13
|
-
// eslint-disable-next-line no-console
|
|
14
|
-
console.error(`ERROR: File ${file_path} already exists.`);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
await fs.mkdir(resolve(file_path, "../"), { recursive: true });
|
|
18
|
-
await fs.writeFile(file_path, jddComponentTemplate(component_name));
|
|
19
|
-
const css_file_path = target_locreq.resolve(`src/back/jdd-components/${toKebabCase(component_name)}/${toKebabCase(component_name)}.css`);
|
|
20
|
-
await fs.writeFile(css_file_path, `.${toKebabCase(component_name)} {
|
|
21
|
-
}`);
|
|
22
|
-
// eslint-disable-next-line no-console
|
|
23
|
-
console.log(`Created ${file_path}`);
|
|
24
|
-
console.log(`Created ${css_file_path}`);
|
|
25
|
-
await generateComponents();
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=add-jdd-component.js.map
|
package/lib/src/add-route.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { existsSync, promises as fs } from "fs";
|
|
2
|
-
import _locreq from "locreq";
|
|
3
|
-
import { resolve } from "path";
|
|
4
|
-
import { generateRoutes } from "./generate-routes.js";
|
|
5
|
-
import { testTemplate } from "./templates/route-test.js";
|
|
6
|
-
import { escape_url_params } from "./utils/escape-url-params.js";
|
|
7
|
-
import prompts from "prompts";
|
|
8
|
-
import { Templates } from "./templates/templates.js";
|
|
9
|
-
export async function addRoute(params, app_directory = process.cwd()) {
|
|
10
|
-
const target_locreq = _locreq(app_directory);
|
|
11
|
-
prompts.override(params);
|
|
12
|
-
const response = await prompts([
|
|
13
|
-
{
|
|
14
|
-
type: "text",
|
|
15
|
-
name: "action",
|
|
16
|
-
message: 'What\'s the name of the action (e.g. "AddUser"): ',
|
|
17
|
-
validate: (s) => s.length > 3 ? true : "Should be at least 3 characters long",
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
type: "text",
|
|
21
|
-
name: "url",
|
|
22
|
-
message: "Enter a full absolute path for the new route (for example: /admin/users/:id/edit): ",
|
|
23
|
-
validate: (s) => s.trim()[0] == "/" ? true : "Should start with a '/'",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
type: "select",
|
|
27
|
-
name: "mode",
|
|
28
|
-
message: "What kind of route is it?",
|
|
29
|
-
choices: [
|
|
30
|
-
{ title: "page", value: "page" },
|
|
31
|
-
{ title: "stateful page", value: "sreact" },
|
|
32
|
-
{ title: "form", value: "form" },
|
|
33
|
-
{ title: "list", value: "list" },
|
|
34
|
-
{ title: "multiform", value: "multiform" },
|
|
35
|
-
{ title: "redirect", value: "redirect" },
|
|
36
|
-
{ title: "raw POST", value: "post" },
|
|
37
|
-
{ title: "Long Running Process status page", value: "lpr" },
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
]);
|
|
41
|
-
const { action, url, mode } = response;
|
|
42
|
-
const extension = ["list", "lpr", "page", "sreact"].includes(mode)
|
|
43
|
-
? "tsx"
|
|
44
|
-
: "ts";
|
|
45
|
-
const file_path = target_locreq.resolve(`src/back/routes/${escape_url_params(url)}.${mode}.${extension}`);
|
|
46
|
-
const test_file_path = target_locreq.resolve(`src/back/routes/${escape_url_params(url)}.test.ts`);
|
|
47
|
-
const template = Templates[mode];
|
|
48
|
-
if (!template) {
|
|
49
|
-
throw new Error(`Could not get template ${mode}`);
|
|
50
|
-
}
|
|
51
|
-
if (existsSync(file_path)) {
|
|
52
|
-
// eslint-disable-next-line no-console
|
|
53
|
-
console.error(`ERROR: File ${file_path} already exists.`);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
await fs.mkdir(resolve(file_path, "../"), { recursive: true });
|
|
57
|
-
await fs.writeFile(file_path, await template(action, file_path));
|
|
58
|
-
await fs.writeFile(test_file_path, testTemplate(action, file_path));
|
|
59
|
-
// eslint-disable-next-line no-console
|
|
60
|
-
console.log(`${file_path} created`);
|
|
61
|
-
// eslint-disable-next-line no-console
|
|
62
|
-
console.log(`${test_file_path} created`);
|
|
63
|
-
await generateRoutes();
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=add-route.js.map
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from "fs";
|
|
2
|
-
import { exec, spawn } from "child_process";
|
|
3
|
-
import axios from "axios";
|
|
4
|
-
import waitPort from "wait-port";
|
|
5
|
-
import getPort from "get-port";
|
|
6
|
-
import _locreq from "locreq";
|
|
7
|
-
const target_locreq = _locreq(__dirname);
|
|
8
|
-
const execAsync = (cmd) => {
|
|
9
|
-
return new Promise((resolve) => {
|
|
10
|
-
const process = exec(cmd);
|
|
11
|
-
process?.stdout?.on("data", (data) => {
|
|
12
|
-
console.log(`stdout: ${data}`);
|
|
13
|
-
});
|
|
14
|
-
process?.stderr?.on("data", (data) => {
|
|
15
|
-
console.error(`stdout: ${data}`);
|
|
16
|
-
});
|
|
17
|
-
process.on("exit", (code) => {
|
|
18
|
-
resolve();
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
const callSealgenBin = () => `node ${target_locreq.resolve("lib/cli.js")}`;
|
|
23
|
-
describe("add route test", () => {
|
|
24
|
-
let node_pid = 0;
|
|
25
|
-
const app_path = "/tmp/sealious-minimal";
|
|
26
|
-
const container_name = "sealgen-test-mongo";
|
|
27
|
-
afterEach(async function () {
|
|
28
|
-
try {
|
|
29
|
-
if (node_pid != 0)
|
|
30
|
-
await execAsync(`kill -9 ${node_pid}`);
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
throw new Error("node process exited unexpectedly, please inspect the output");
|
|
34
|
-
}
|
|
35
|
-
await Promise.all([
|
|
36
|
-
fs.rm(app_path, { recursive: true, force: true }),
|
|
37
|
-
execAsync(`docker rm -f ${container_name}`),
|
|
38
|
-
]);
|
|
39
|
-
});
|
|
40
|
-
it("creates minimal sealious app", async function () {
|
|
41
|
-
console.log("\tcloning sealious-minimal...");
|
|
42
|
-
await execAsync(`git clone https://hub.sealcode.org/source/sealious-minimal.git ${app_path} && cd ${app_path} && git checkout d5abeb9514359dde4`);
|
|
43
|
-
console.log("\tinstalling dependencies and sealgen...");
|
|
44
|
-
await execAsync(`cd ${app_path} && npm ci && rm -rf node_modules/@sealcode/sealgen && ln -s $OLDPWD node_modules/@sealcode/sealgen`);
|
|
45
|
-
console.log("\trunning add-route and building app...");
|
|
46
|
-
await execAsync(`cd ${app_path} && ${callSealgenBin()} add-route --url=/sample --action=Sample --mode=page && ${callSealgenBin()} build`);
|
|
47
|
-
console.log("\tstarting the database...(if timeouts here, run 'docker pull mongo:4.4-bionic' to solve)");
|
|
48
|
-
const port = await getPort();
|
|
49
|
-
await execAsync(`docker run -p ${port}:27017 --name ${container_name} -d mongo:4.4-bionic`);
|
|
50
|
-
console.log("\trunning app and making request to the generated url...");
|
|
51
|
-
const env = { ...process.env, SEALIOUS_MONGO_PORT: port.toString() };
|
|
52
|
-
let app_start = spawn(`node`, [`${app_path}/dist/back/index.js`], {
|
|
53
|
-
env,
|
|
54
|
-
});
|
|
55
|
-
app_start.stdout.on("data", (data) => console.log(data.toString()));
|
|
56
|
-
app_start.stderr.on("data", (data) => console.log(data.toString()));
|
|
57
|
-
if (app_start.pid == undefined)
|
|
58
|
-
throw new Error("node failed to start");
|
|
59
|
-
node_pid = app_start.pid;
|
|
60
|
-
await waitPort({
|
|
61
|
-
host: "localhost",
|
|
62
|
-
port: 8080,
|
|
63
|
-
output: "silent",
|
|
64
|
-
timeout: 6000,
|
|
65
|
-
});
|
|
66
|
-
const res = await axios.get("http://localhost:8080/sample");
|
|
67
|
-
if (res.status != 200) {
|
|
68
|
-
throw new Error("url generated by add-route exists but doesnt return 200");
|
|
69
|
-
}
|
|
70
|
-
}, 250000);
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=add-route.test.js.map
|
package/lib/src/build.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { build, context } from "esbuild";
|
|
2
|
-
import { promises as fs } from "fs";
|
|
3
|
-
import * as chokidar from "chokidar";
|
|
4
|
-
import { default as glob } from "tiny-glob";
|
|
5
|
-
import { generate_css_includes } from "./find-css-includes.js";
|
|
6
|
-
import { sleep } from "./utils/sleep.js";
|
|
7
|
-
import { generateCollections } from "./generate-collections.js";
|
|
8
|
-
import { generateRoutes } from "./generate-routes.js";
|
|
9
|
-
import { generateComponents } from "./generate-components.js";
|
|
10
|
-
import { make_notifier } from "./notifier.js";
|
|
11
|
-
import getPort from "get-port";
|
|
12
|
-
import { remove_named_imports } from "../remove-named-imports.js";
|
|
13
|
-
import _locreq from "locreq";
|
|
14
|
-
const target_locreq = _locreq(process.cwd());
|
|
15
|
-
async function get_notifier_port() {
|
|
16
|
-
return getPort({ port: 4000 });
|
|
17
|
-
}
|
|
18
|
-
async function write_notifier_config(watch, port) {
|
|
19
|
-
const config = { watch };
|
|
20
|
-
if (port) {
|
|
21
|
-
config.port = port;
|
|
22
|
-
}
|
|
23
|
-
await fs.writeFile(target_locreq.resolve("public/dist/notifier.json"), JSON.stringify(config));
|
|
24
|
-
}
|
|
25
|
-
async function build_ts() {
|
|
26
|
-
await Promise.all([
|
|
27
|
-
generateCollections(),
|
|
28
|
-
generateRoutes(),
|
|
29
|
-
generateComponents(),
|
|
30
|
-
]);
|
|
31
|
-
const entryPoints = (await glob("./src/back/**/*.{ts,tsx}")).filter((path) => !path.includes(".#"));
|
|
32
|
-
try {
|
|
33
|
-
await build({
|
|
34
|
-
entryPoints,
|
|
35
|
-
sourcemap: true,
|
|
36
|
-
bundle: false,
|
|
37
|
-
jsxFactory: "TempstreamJSX.createElement",
|
|
38
|
-
outdir: "./dist/back",
|
|
39
|
-
logLevel: "info",
|
|
40
|
-
platform: "node",
|
|
41
|
-
target: "es2022",
|
|
42
|
-
format: "esm",
|
|
43
|
-
plugins: [remove_named_imports],
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
48
|
-
console.error(e.message);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async function complex_build(watch) {
|
|
52
|
-
const loader = Object.fromEntries(["png", "svg", "jpg", "gif", "jpeg", "otf", "ttf"].map((ext) => ["." + ext, "file"]));
|
|
53
|
-
let css_build = await context({
|
|
54
|
-
entryPoints: ["./src/main.css"],
|
|
55
|
-
sourcemap: true,
|
|
56
|
-
bundle: true,
|
|
57
|
-
outdir: "./public/dist",
|
|
58
|
-
logLevel: "info",
|
|
59
|
-
// plugins: [sassPlugin()],
|
|
60
|
-
loader,
|
|
61
|
-
});
|
|
62
|
-
let ongoing_ts = false;
|
|
63
|
-
let ongoing_css = false;
|
|
64
|
-
let ongoing_ts_promise = null;
|
|
65
|
-
if (watch) {
|
|
66
|
-
const watcher = chokidar.watch("src", { ignoreInitial: true });
|
|
67
|
-
const port = await get_notifier_port();
|
|
68
|
-
const notifier = make_notifier(port);
|
|
69
|
-
await write_notifier_config(watch, port);
|
|
70
|
-
watcher.on("all", async (_, path) => {
|
|
71
|
-
if (!css_build)
|
|
72
|
-
return;
|
|
73
|
-
if (path.includes(".#"))
|
|
74
|
-
return;
|
|
75
|
-
if (path.endsWith(".css") && !path.endsWith("/includes.css")) {
|
|
76
|
-
if (ongoing_css) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
ongoing_css = true;
|
|
80
|
-
// refresh the list of all css files in includes.css
|
|
81
|
-
await generate_css_includes();
|
|
82
|
-
try {
|
|
83
|
-
await css_build?.rebuild?.();
|
|
84
|
-
console.log(`Built main.css [on ${path}]`);
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
88
|
-
console.error(e.message);
|
|
89
|
-
await sleep(200);
|
|
90
|
-
css_build
|
|
91
|
-
?.rebuild?.()
|
|
92
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
93
|
-
.catch((e) => console.error(e?.message));
|
|
94
|
-
}
|
|
95
|
-
if (ongoing_ts_promise) {
|
|
96
|
-
await ongoing_ts_promise;
|
|
97
|
-
}
|
|
98
|
-
notifier("css");
|
|
99
|
-
ongoing_css = false;
|
|
100
|
-
}
|
|
101
|
-
if ((path.endsWith(".ts") || path.endsWith(".tsx")) &&
|
|
102
|
-
!path.endsWith("src/back/collections/collections.ts") &&
|
|
103
|
-
!path.endsWith("src/back/routes/routes.ts") &&
|
|
104
|
-
!path.endsWith("src/back/routes/urls.ts")) {
|
|
105
|
-
if (ongoing_ts) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
ongoing_ts = true;
|
|
109
|
-
ongoing_ts_promise = build_ts();
|
|
110
|
-
await ongoing_ts_promise;
|
|
111
|
-
notifier("ts");
|
|
112
|
-
ongoing_ts_promise = null;
|
|
113
|
-
console.log(`Finished TS build [on ${path}]`);
|
|
114
|
-
ongoing_ts = false;
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
await write_notifier_config(watch);
|
|
120
|
-
}
|
|
121
|
-
await generate_css_includes();
|
|
122
|
-
await Promise.all([css_build.rebuild(), build_ts()]);
|
|
123
|
-
watch && css_build?.rebuild?.();
|
|
124
|
-
}
|
|
125
|
-
export async function buildProject({ watch, }) {
|
|
126
|
-
try {
|
|
127
|
-
await build({
|
|
128
|
-
entryPoints: ["./src/front/index.ts"],
|
|
129
|
-
sourcemap: true,
|
|
130
|
-
outfile: "./public/dist/bundle.js",
|
|
131
|
-
logLevel: "info",
|
|
132
|
-
bundle: true,
|
|
133
|
-
});
|
|
134
|
-
await complex_build(watch);
|
|
135
|
-
}
|
|
136
|
-
catch (e) {
|
|
137
|
-
console.log("CAUGHT!");
|
|
138
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
139
|
-
console.error(e.message);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=build.js.map
|
package/lib/src/cli.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { addCollection } from "./add-collection.js";
|
|
3
|
-
import { addJDDComponent } from "./add-jdd-component.js";
|
|
4
|
-
import { addRoute } from "./add-route.js";
|
|
5
|
-
import { buildProject } from "./build.js";
|
|
6
|
-
import { generate_css_includes } from "./find-css-includes.js";
|
|
7
|
-
import { generateCollections } from "./generate-collections.js";
|
|
8
|
-
import { generateComponents } from "./generate-components.js";
|
|
9
|
-
import { generateRoutes } from "./generate-routes.js";
|
|
10
|
-
import { makeEnv } from "./make-env.js";
|
|
11
|
-
import yargs from "yargs/yargs";
|
|
12
|
-
const actions = {
|
|
13
|
-
"add-collection": addCollection,
|
|
14
|
-
"add-route": addRoute,
|
|
15
|
-
"generate-collections": generateCollections,
|
|
16
|
-
"generate-components": generateComponents,
|
|
17
|
-
"generate-routes": generateRoutes,
|
|
18
|
-
"generate-css-includes": generate_css_includes,
|
|
19
|
-
build: buildProject,
|
|
20
|
-
default: async function () {
|
|
21
|
-
console.log("Usage: `npx sealgen <action>`");
|
|
22
|
-
console.log(`Available actions: ${Object.keys(actions)
|
|
23
|
-
.filter((e) => e != "default")
|
|
24
|
-
.join(", ")}`);
|
|
25
|
-
},
|
|
26
|
-
"make-env": makeEnv,
|
|
27
|
-
"add-component": addJDDComponent,
|
|
28
|
-
};
|
|
29
|
-
void (async function () {
|
|
30
|
-
const action = process.argv.at(2);
|
|
31
|
-
actions;
|
|
32
|
-
const fn = actions[action || "default"] || actions.default;
|
|
33
|
-
const args = yargs().argv;
|
|
34
|
-
console.log({ args });
|
|
35
|
-
await fn(args);
|
|
36
|
-
})();
|
|
37
|
-
//# sourceMappingURL=cli.js.map
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { tempstream } from "tempstream";
|
|
2
|
-
function name_to_id(str) {
|
|
3
|
-
return str.replace(/\W/g, "-");
|
|
4
|
-
}
|
|
5
|
-
const style = (hide_tabs_width) => /* HTML */ `<style>
|
|
6
|
-
.tab-label {
|
|
7
|
-
height: 45px;
|
|
8
|
-
line-height: 45px;
|
|
9
|
-
padding: 0 45px;
|
|
10
|
-
display: block;
|
|
11
|
-
float: left;
|
|
12
|
-
box-sizing: border-box;
|
|
13
|
-
border-bottom: 3px solid transparent;
|
|
14
|
-
cursor: pointer;
|
|
15
|
-
font-size: 18px;
|
|
16
|
-
-webkit-user-select: none;
|
|
17
|
-
user-select: none;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@media screen and (max-width: ${hide_tabs_width}px) {
|
|
21
|
-
.tab-label {
|
|
22
|
-
display: none;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.tab-label--mobile {
|
|
27
|
-
line-height: unset;
|
|
28
|
-
padding-top: 30px;
|
|
29
|
-
padding-left: 0;
|
|
30
|
-
pointer-events: none;
|
|
31
|
-
padding-bottom: 30px;
|
|
32
|
-
color: $font-graphite;
|
|
33
|
-
border-bottom: 2px solid $font-primary;
|
|
34
|
-
display: none;
|
|
35
|
-
@media screen and (max-width: ${hide_tabs_width}px) {
|
|
36
|
-
display: block;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.tab-content {
|
|
41
|
-
padding-top: 30px;
|
|
42
|
-
clear: both;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@media screen and (max-width: ${hide_tabs_width}px) {
|
|
46
|
-
.tab-content {
|
|
47
|
-
display: block !important;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
</style>`;
|
|
51
|
-
export function tabs(tabs, selected_tab_style = "font-weight: bold;", selected_index = 0, hide_tabs_width = 0) {
|
|
52
|
-
return /* HTML */ tempstream `${style(hide_tabs_width)}
|
|
53
|
-
${Object.keys(tabs)
|
|
54
|
-
.map((tab_title, index) => {
|
|
55
|
-
const id = name_to_id(tab_title);
|
|
56
|
-
return /* HTML */ `<input
|
|
57
|
-
type="radio"
|
|
58
|
-
name="tabs"
|
|
59
|
-
id="${id}"
|
|
60
|
-
class="tab-radio--${id}"
|
|
61
|
-
style="display: none"
|
|
62
|
-
${selected_index == index ? "checked" : ""}
|
|
63
|
-
/>
|
|
64
|
-
<label class="tab-label tab-label--${id}" for="${id}">
|
|
65
|
-
${tab_title}
|
|
66
|
-
</label>`;
|
|
67
|
-
})
|
|
68
|
-
.join("\n")}
|
|
69
|
-
${Object.entries(tabs).map(([title, content]) => {
|
|
70
|
-
const id = name_to_id(title);
|
|
71
|
-
return /* HTML */ tempstream `<div class="tab-label tab-label--mobile">
|
|
72
|
-
${title}
|
|
73
|
-
</div>
|
|
74
|
-
<div class="tab-content tab-content--${id}">${content}</div>
|
|
75
|
-
<style>
|
|
76
|
-
.tab-radio--${id} ~ .tab-content--${id} {
|
|
77
|
-
display:none;
|
|
78
|
-
}
|
|
79
|
-
.tab-radio--${id}:checked ~ .tab-content--${id} {
|
|
80
|
-
display:block;
|
|
81
|
-
}
|
|
82
|
-
.tab-radio--${id}:checked ~ label.tab-label--${id} {
|
|
83
|
-
${selected_tab_style}
|
|
84
|
-
}
|
|
85
|
-
</style>`;
|
|
86
|
-
})}`;
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=tabs.js.map
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { tempstream } from "tempstream";
|
|
2
|
-
import { makeSlug } from "../utils/utils.js";
|
|
3
|
-
export function toggleModal(options) {
|
|
4
|
-
const { contentWrapped, contentUnwrapped, name } = options;
|
|
5
|
-
const id = makeSlug(name);
|
|
6
|
-
return tempstream /* HTML */ `<style>
|
|
7
|
-
.toggle-modal__wrapped {
|
|
8
|
-
display: none;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
@media (max-width: 960px) {
|
|
12
|
-
.toggle-modal__wrapped {
|
|
13
|
-
display: block;
|
|
14
|
-
}
|
|
15
|
-
.toggle-modal__unwrapped {
|
|
16
|
-
display: none;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
#${id} {
|
|
20
|
-
display: none;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
#${id}:checked ~ .toggle-modal__wrapped {
|
|
24
|
-
display: none;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
#${id}:checked ~ .toggle-modal__unwrapped {
|
|
28
|
-
display: block;
|
|
29
|
-
position: fixed;
|
|
30
|
-
height: 100vh;
|
|
31
|
-
width: 100vw;
|
|
32
|
-
top: 0;
|
|
33
|
-
left: 0;
|
|
34
|
-
background-color: white;
|
|
35
|
-
z-index: 99;
|
|
36
|
-
overflow-y: scroll;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
</style>
|
|
40
|
-
<div class="toggle-modal toggle-modal--${id}">
|
|
41
|
-
<input id="${id}" name="${id}" type="checkbox" autocomplete="off" />
|
|
42
|
-
<div class="toggle-modal__wrapped">${contentWrapped(id)}</div>
|
|
43
|
-
<div class="toggle-modal__unwrapped">${contentUnwrapped(id)}</div>
|
|
44
|
-
</div>`;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=toggle-modal.js.map
|
package/lib/src/example.test.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from "fs";
|
|
2
|
-
import _locreq from "locreq";
|
|
3
|
-
import { relative } from "path";
|
|
4
|
-
import { walkDir } from "./utils/walk.js";
|
|
5
|
-
const target_locreq = _locreq(process.cwd());
|
|
6
|
-
export async function generate_css_includes() {
|
|
7
|
-
const files = await Promise.all((await walkDir(target_locreq.resolve("src/")))
|
|
8
|
-
.filter((f) => f.endsWith(".css") &&
|
|
9
|
-
!f.endsWith("/main.css") &&
|
|
10
|
-
!f.endsWith("\\main.css") &&
|
|
11
|
-
!f.endsWith("/includes.css") &&
|
|
12
|
-
!f.endsWith("\\includes.css") &&
|
|
13
|
-
!f.includes(".#"))
|
|
14
|
-
.map((fullpath) => relative(target_locreq.resolve("src/"), fullpath)));
|
|
15
|
-
await fs.writeFile(target_locreq.resolve("src/includes.css"), `/* DO NOT EDIT! This file is generated automaticaly with npx sealgen generate-css-includes */
|
|
16
|
-
|
|
17
|
-
@import "../node_modules/@sealcode/sealgen/src/forms/forms.css";
|
|
18
|
-
${files.map((path) => `@import "${path.replaceAll("\\", "/")}";`).join("\n")}
|
|
19
|
-
`);
|
|
20
|
-
// eslint-disable-next-line no-console
|
|
21
|
-
console.log("Successfuly generated new src/includes.css file");
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=find-css-includes.js.map
|