add textarea type

This commit is contained in:
Matt Hill
2023-03-29 08:52:51 -06:00
parent f9c558ec25
commit 3e708ab796
7 changed files with 61 additions and 7 deletions

View File

@@ -24,7 +24,6 @@ describe("builder tests", () => {
placeholder: null,
pattern: null,
patternDescription: null,
textarea: null,
}),
}).build();
expect(JSON.stringify(bitcoinPropertiesBuilt)).toEqual(
@@ -39,8 +38,7 @@ describe("builder tests", () => {
"masked": true,
"placeholder": null,
"pattern": null,
"patternDescription": null,
"textarea": null
"patternDescription": null
}}`
.replaceAll("\n", " ")
.replaceAll(/\s{2,}/g, "")

View File

@@ -38,7 +38,6 @@ export class List<A extends ValueSpecList> extends IBuilder<A> {
placeholder: string | null;
pattern: string | null;
patternDescription: string | null;
textarea: boolean | null;
};
}
>(a: A) {

View File

@@ -8,6 +8,7 @@ import {
ValueSpecList,
ValueSpecNumber,
ValueSpecString,
ValueSpecTextarea,
} from "../config-types";
import { guardAll } from "../../util";
@@ -66,7 +67,6 @@ export class Value<A extends ValueSpec> extends IBuilder<A> {
placeholder: string | null;
pattern: string | null;
patternDescription: string | null;
textarea: boolean | null;
}
>(a: A) {
return new Value({
@@ -74,6 +74,20 @@ export class Value<A extends ValueSpec> extends IBuilder<A> {
...a,
} as ValueSpecString);
}
static textarea<
A extends {
name: string;
description: string | null;
warning: string | null;
nullable: boolean;
placeholder: string | null;
}
>(a: A) {
return new Value({
type: "textarea" as const,
...a,
} as ValueSpecTextarea);
}
static number<
A extends {
name: string;

View File

@@ -2,6 +2,7 @@ export type InputSpec = Record<string, ValueSpec>;
export type ValueType =
| "string"
| "textarea"
| "number"
| "boolean"
| "select"
@@ -16,6 +17,8 @@ export type ValueSpec = ValueSpecOf<ValueType>;
export type ValueSpecOf<T extends ValueType> = T extends "string"
? ValueSpecString
: T extends "number"
? ValueSpecTextarea
: T extends "textarea"
? ValueSpecNumber
: T extends "boolean"
? ValueSpecBoolean
@@ -37,7 +40,12 @@ export interface ValueSpecString extends ListValueSpecString, WithStandalone {
type: "string";
default: null | DefaultString;
nullable: boolean;
textarea: null | boolean;
}
export interface ValueSpecTextarea extends WithStandalone {
type: "textarea";
placeholder: null | string;
nullable: boolean;
}
export interface ValueSpecNumber extends ListValueSpecNumber, WithStandalone {

View File

@@ -76,6 +76,18 @@ writeConvertedFile(
copyable: true,
masked: true,
},
bio: {
type: "string",
nullable: false,
name: "Username",
description: "The username for connecting to Bitcoin over RPC.",
default: "bitcoin",
masked: true,
pattern: "^[a-zA-Z0-9_]+$",
"pattern-description":
"Must be alphanumeric (can contain underscore).",
textarea: true,
},
advanced: {
type: "object",
name: "Advanced",

View File

@@ -11,6 +11,7 @@ const { string, some, object, dictionary, unknown, number, literals, boolean } =
type TypeBoolean = "boolean";
type TypeString = "string";
type TypeTextarea = "textarea";
type TypeNumber = "number";
type TypeObject = "object";
type TypeList = "list";
@@ -33,6 +34,10 @@ type GuardNumber<A> =
type GuardString<A> =
A extends { type: TypeString } ? GuardDefaultNullable<A, string> :
unknown
// prettier-ignore
type GuardTextarea<A> =
A extends { type: TypeTextarea } ? GuardDefaultNullable<A, string> :
unknown
// prettier-ignore
type GuardBoolean<A> =
@@ -76,6 +81,7 @@ type GuardUnion<A> =
type _<T> = T;
export type GuardAll<A> = GuardNumber<A> &
GuardString<A> &
GuardTextarea<A> &
GuardBoolean<A> &
GuardObject<A> &
GuardList<A> &
@@ -232,6 +238,9 @@ export function guardAll<A extends ValueSpecAny>(
case "string":
return defaultNullable(string, value) as any;
case "textarea":
return defaultNullable(string, value) as any;
case "number":
return defaultNullable(
withIntegral(withRange(value), value),
@@ -267,6 +276,7 @@ export function guardAll<A extends ValueSpecAny>(
) as any;
}
return unknown as any;
case "multiselect":
if (matchValues.test(value)) {
const rangeValidate =
@@ -282,6 +292,7 @@ export function guardAll<A extends ValueSpecAny>(
) as any;
}
return unknown as any;
case "union":
if (matchUnion.test(value)) {
return some(

View File

@@ -52,6 +52,19 @@ export default async function makeFileContent(
function convertValueSpec(value: any): string {
switch (value.type) {
case "string": {
if (value.textarea) {
return `Value.textarea(${JSON.stringify(
{
name: value.name || null,
description: value.description || null,
warning: value.warning || null,
nullable: value.nullable || false,
placeholder: value.placeholder || null,
},
null,
2
)})`;
}
return `Value.string(${JSON.stringify(
{
name: value.name || null,
@@ -63,7 +76,6 @@ export default async function makeFileContent(
placeholder: value.placeholder || null,
pattern: value.pattern || null,
patternDescription: value["pattern-description"] || null,
textarea: value.textarea || null,
},
null,
2