@tslite/forms 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ 'use strict';function y(r,e={}){return r.t!=="object"?{fields:[i("value",r,true,void 0,e)]}:{fields:Object.keys(r.props).map(t=>{let o=r.props[t];return i(t,o.type,!o.optional,e.fields?.[t],e)})}}function m(r){return r.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,e=>e.toUpperCase())}function i(r,e,n,t,o){let f=t?.label??m(r),p=e.t==="apply"?o.widgets?.[e.name]:void 0,a=t?.control??p??F(e),l={key:r,label:f,control:a,type:e,required:n},d=t?.widget;if(e.t==="object"&&a==="group")return {...l,widget:d,fields:Object.keys(e.props).map(c=>{let u=e.props[c];return i(c,u.type,!u.optional,t?.fields?.[c],o)})};if(e.t==="array"&&a==="list")return {...l,widget:d,item:i("item",e.items,true,void 0,o)};if(e.t==="fn"&&a==="action")return {...l,widget:d,payload:g(e.params,o)};let s=b(e);return {...l,widget:d,...s?{options:s}:{}}}function g(r,e){return r.filter(n=>!n.variadic).map(n=>i(n.name,n.type,!n.optional,void 0,e))}function F(r){switch(r.t){case "string":return "text";case "number":return "number";case "boolean":return "switch";case "literal":return typeof r.value=="number"?"number":typeof r.value=="boolean"?"switch":"text";case "object":return "group";case "array":return "list";case "fn":return "action";case "union":return r.of.every(e=>e.t==="literal")?"select":"unknown";case "apply":return r.name==="Element"?"slot":"unknown";default:return "unknown"}}function b(r){if(r.t==="union"&&r.of.every(e=>e.t==="literal"))return r.of.map(e=>{let n=e.value;return {value:n,label:String(n)}})}exports.humanize=m;exports.toFormSchema=y;
@@ -0,0 +1,54 @@
1
+ import { Schema } from '@tslite/checker';
2
+
3
+ /** Controles conhecidos. Widgets custom podem usar o campo `widget`. */
4
+ type Control = "text" | "textarea" | "number" | "switch" | "select" | "color" | "icon" | "date" | "action" | "slot" | "group" | "list" | "unknown";
5
+ /** Uma opção de `select` (derivada de uma união de literais). */
6
+ interface Option {
7
+ readonly value: string | number | boolean;
8
+ readonly label: string;
9
+ }
10
+ /** Um campo do formulário (ou uma seção, se `control: "group"`). */
11
+ interface UiField {
12
+ readonly key: string;
13
+ readonly label: string;
14
+ readonly control: Control;
15
+ /** O tipo de origem — rastreável de volta ao `Schema`. */
16
+ readonly type: Schema;
17
+ readonly required: boolean;
18
+ /** Widget custom (override), quando `control` não basta. */
19
+ readonly widget?: string;
20
+ /** Opções de um `select` (união de literais). */
21
+ readonly options?: readonly Option[];
22
+ /** Subcampos de um `group` (`object`) — a seção. */
23
+ readonly fields?: readonly UiField[];
24
+ /** O campo-item de uma `list` (`array`). */
25
+ readonly item?: UiField;
26
+ /** O payload de uma `action` (`fn`) — os params da função. */
27
+ readonly payload?: readonly UiField[];
28
+ }
29
+ interface FormSchema {
30
+ readonly fields: readonly UiField[];
31
+ }
32
+ /** Override de um campo específico (estilo uiSchema do RJSF). */
33
+ interface FieldHint {
34
+ readonly label?: string;
35
+ readonly control?: Control;
36
+ readonly widget?: string;
37
+ /** Overrides aninhados, por chave, para um campo `object`. */
38
+ readonly fields?: Readonly<Record<string, FieldHint>>;
39
+ }
40
+ interface FormHints {
41
+ /** Widget por **tipo nomeado**: `{ Color: "color", Icon: "icon" }`. */
42
+ readonly widgets?: Readonly<Record<string, Control>>;
43
+ /** Overrides por chave de campo (no nível atual). */
44
+ readonly fields?: Readonly<Record<string, FieldHint>>;
45
+ }
46
+ /**
47
+ * Projeta um `Schema` de `object` (as props de um componente) num `FormSchema`.
48
+ * Se `schema` não for `object`, devolve um único campo com a key `"value"`.
49
+ */
50
+ declare function toFormSchema(schema: Schema, hints?: FormHints): FormSchema;
51
+ /** Capitaliza e quebra camelCase/snake/kebab: `submitAction` → "Submit Action". */
52
+ declare function humanize(key: string): string;
53
+
54
+ export { type Control, type FieldHint, type FormHints, type FormSchema, type Option, type UiField, humanize, toFormSchema };
@@ -0,0 +1,54 @@
1
+ import { Schema } from '@tslite/checker';
2
+
3
+ /** Controles conhecidos. Widgets custom podem usar o campo `widget`. */
4
+ type Control = "text" | "textarea" | "number" | "switch" | "select" | "color" | "icon" | "date" | "action" | "slot" | "group" | "list" | "unknown";
5
+ /** Uma opção de `select` (derivada de uma união de literais). */
6
+ interface Option {
7
+ readonly value: string | number | boolean;
8
+ readonly label: string;
9
+ }
10
+ /** Um campo do formulário (ou uma seção, se `control: "group"`). */
11
+ interface UiField {
12
+ readonly key: string;
13
+ readonly label: string;
14
+ readonly control: Control;
15
+ /** O tipo de origem — rastreável de volta ao `Schema`. */
16
+ readonly type: Schema;
17
+ readonly required: boolean;
18
+ /** Widget custom (override), quando `control` não basta. */
19
+ readonly widget?: string;
20
+ /** Opções de um `select` (união de literais). */
21
+ readonly options?: readonly Option[];
22
+ /** Subcampos de um `group` (`object`) — a seção. */
23
+ readonly fields?: readonly UiField[];
24
+ /** O campo-item de uma `list` (`array`). */
25
+ readonly item?: UiField;
26
+ /** O payload de uma `action` (`fn`) — os params da função. */
27
+ readonly payload?: readonly UiField[];
28
+ }
29
+ interface FormSchema {
30
+ readonly fields: readonly UiField[];
31
+ }
32
+ /** Override de um campo específico (estilo uiSchema do RJSF). */
33
+ interface FieldHint {
34
+ readonly label?: string;
35
+ readonly control?: Control;
36
+ readonly widget?: string;
37
+ /** Overrides aninhados, por chave, para um campo `object`. */
38
+ readonly fields?: Readonly<Record<string, FieldHint>>;
39
+ }
40
+ interface FormHints {
41
+ /** Widget por **tipo nomeado**: `{ Color: "color", Icon: "icon" }`. */
42
+ readonly widgets?: Readonly<Record<string, Control>>;
43
+ /** Overrides por chave de campo (no nível atual). */
44
+ readonly fields?: Readonly<Record<string, FieldHint>>;
45
+ }
46
+ /**
47
+ * Projeta um `Schema` de `object` (as props de um componente) num `FormSchema`.
48
+ * Se `schema` não for `object`, devolve um único campo com a key `"value"`.
49
+ */
50
+ declare function toFormSchema(schema: Schema, hints?: FormHints): FormSchema;
51
+ /** Capitaliza e quebra camelCase/snake/kebab: `submitAction` → "Submit Action". */
52
+ declare function humanize(key: string): string;
53
+
54
+ export { type Control, type FieldHint, type FormHints, type FormSchema, type Option, type UiField, humanize, toFormSchema };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ function y(r,e={}){return r.t!=="object"?{fields:[i("value",r,true,void 0,e)]}:{fields:Object.keys(r.props).map(t=>{let o=r.props[t];return i(t,o.type,!o.optional,e.fields?.[t],e)})}}function m(r){return r.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,e=>e.toUpperCase())}function i(r,e,n,t,o){let f=t?.label??m(r),p=e.t==="apply"?o.widgets?.[e.name]:void 0,a=t?.control??p??F(e),l={key:r,label:f,control:a,type:e,required:n},d=t?.widget;if(e.t==="object"&&a==="group")return {...l,widget:d,fields:Object.keys(e.props).map(c=>{let u=e.props[c];return i(c,u.type,!u.optional,t?.fields?.[c],o)})};if(e.t==="array"&&a==="list")return {...l,widget:d,item:i("item",e.items,true,void 0,o)};if(e.t==="fn"&&a==="action")return {...l,widget:d,payload:g(e.params,o)};let s=b(e);return {...l,widget:d,...s?{options:s}:{}}}function g(r,e){return r.filter(n=>!n.variadic).map(n=>i(n.name,n.type,!n.optional,void 0,e))}function F(r){switch(r.t){case "string":return "text";case "number":return "number";case "boolean":return "switch";case "literal":return typeof r.value=="number"?"number":typeof r.value=="boolean"?"switch":"text";case "object":return "group";case "array":return "list";case "fn":return "action";case "union":return r.of.every(e=>e.t==="literal")?"select":"unknown";case "apply":return r.name==="Element"?"slot":"unknown";default:return "unknown"}}function b(r){if(r.t==="union"&&r.of.every(e=>e.t==="literal"))return r.of.map(e=>{let n=e.value;return {value:n,label:String(n)}})}export{m as humanize,y as toFormSchema};
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@tslite/forms",
3
+ "version": "0.1.0",
4
+ "description": "TSLite forms — projects a Schema into a headless form descriptor (auto-forms / property panels)",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "sideEffects": false,
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/andersondrosa/tslite.git",
26
+ "directory": "packages/forms"
27
+ },
28
+ "keywords": [
29
+ "ast",
30
+ "schema",
31
+ "json-schema",
32
+ "auto-form",
33
+ "form-generation",
34
+ "property-panel",
35
+ "typescript"
36
+ ],
37
+ "author": "Anderson D. Rosa <andersondrosa@outlook.com>",
38
+ "license": "MIT",
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "dependencies": {
43
+ "@tslite/checker": "0.1.0"
44
+ },
45
+ "scripts": {
46
+ "build": "tsup",
47
+ "dev": "tsup --watch",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "test:coverage": "vitest run --coverage",
51
+ "typecheck": "tsc --noEmit",
52
+ "lint": "eslint src tests",
53
+ "lint:fix": "eslint src tests --fix",
54
+ "clean": "rm -rf dist",
55
+ "format": "prettier --write \"src/**/*.ts\"",
56
+ "format:check": "prettier --check \"src/**/*.ts\""
57
+ }
58
+ }