@unbound-app/cli 1.1.2 → 2.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.mjs +5922 -5631
- package/dist/rollup/index.d.mts +1 -1
- package/dist/rollup/index.mjs +3 -4
- package/dist/settings/schema.d.mts +0 -2
- package/dist/settings/schema.mjs +0 -2
- package/dist/{settings-typings-BRlzDlLI.mjs → settings-typings-BSBbM6c9.mjs} +58 -28
- package/package.json +3 -3
- package/templates/plugin/src/unbound-settings.d.ts +8 -11
- package/templates/repository/README.md +1 -1
package/dist/rollup/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { StaticDecode, Type } from "typebox";
|
|
2
|
-
import { ESTree } from "rolldown/utils";
|
|
3
2
|
import MagicString from "magic-string";
|
|
4
3
|
import { EmittedAsset, Plugin, PluginContext, RollupOptions } from "rollup";
|
|
4
|
+
import { ESTree } from "rolldown/utils";
|
|
5
5
|
/** One locale's messages, keyed by message key. */
|
|
6
6
|
type LocaleTable = Record<string, string>;
|
|
7
7
|
/** A translation as the build emits it: its minified JSON and that text's SHA-256. */
|
package/dist/rollup/index.mjs
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import { B as
|
|
2
|
-
import { transformAsync } from "@babel/core";
|
|
1
|
+
import { B as pluginDiagnostic, C as readLocaleFolder, D as reportLine, E as writeLocaleTypings, F as findFile, H as reportDiagnostics, I as sourceAlias, J as hermesBytecode, K as bytecodeFileName, L as diagnostic, M as Visitor, N as parseSync, P as transformSync$1, R as formatDiagnostic, S as locales, T as sourceLocalePath, U as reportProblem, V as reportDiagnostic, Y as hermescCount, a as SETTINGS_MODULE, at as getAssetPath, b as LOCALE_TYPINGS, c as settingsPath, ct as __commonJSMin, dt as __require$1, f as outputOnly, ft as __toCommonJS$1, g as shim_libraries_default, h as buildReport, i as SETTINGS_FILE, l as lineStarts, lt as __esmMin, m as DEFAULT_BUDGET, n as settingsTypings, ot as isAssetName, p as BUILD_REPORT_ENV, pt as __toESM$1, q as bytecodeSource, r as writeSettingsTypings, s as readPluginSettings, tt as ASSETS_DIRECTORY, u as toLocation, ut as __exportAll, v as parseByteSize, w as readTable, x as localeModule, y as LOCALE_MODULE } from "../settings-typings-BSBbM6c9.mjs";
|
|
3
2
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
4
3
|
import os from "node:os";
|
|
5
4
|
import { basename, dirname, extname, join, relative, resolve, sep } from "node:path";
|
|
6
5
|
import { createHash } from "node:crypto";
|
|
7
|
-
import {
|
|
6
|
+
import { transformAsync } from "@babel/core";
|
|
8
7
|
import MagicString from "magic-string";
|
|
9
8
|
import { fileURLToPath } from "node:url";
|
|
10
|
-
import { rollup } from "rollup";
|
|
11
9
|
import { nodeResolve } from "@rollup/plugin-node-resolve";
|
|
12
10
|
import { minify, swc } from "rollup-plugin-swc3";
|
|
13
11
|
import commonjs from "@rollup/plugin-commonjs";
|
|
14
12
|
import json from "@rollup/plugin-json";
|
|
15
13
|
import iife from "rollup-plugin-iife";
|
|
14
|
+
import { rollup } from "rollup";
|
|
16
15
|
import { parseAst } from "rolldown/parseAst";
|
|
17
16
|
import process$1 from "node:process";
|
|
18
17
|
import tty from "node:tty";
|
package/dist/settings/schema.mjs
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
import { Type } from "typebox";
|
|
3
|
-
import { Value } from "typebox/value";
|
|
4
|
-
import { execFile } from "node:child_process";
|
|
5
2
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
6
3
|
import { tmpdir } from "node:os";
|
|
7
4
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { Value } from "typebox/value";
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
8
|
import { fetchManifest, resolveHermesTargets } from "@unbound-app/rollup-plugin-hermes/manifest";
|
|
9
9
|
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
10
10
|
import { promisify } from "node:util";
|
|
11
11
|
import { createHash } from "node:crypto";
|
|
12
|
-
import { parseSync } from "rolldown/utils";
|
|
13
12
|
import { gzipSync } from "node:zlib";
|
|
14
13
|
import { fileURLToPath } from "node:url";
|
|
15
|
-
import { rolldown } from "rolldown";
|
|
16
14
|
// \0rolldown/runtime.js
|
|
17
15
|
var __create = Object.create;
|
|
18
16
|
var __defProp = Object.defineProperty;
|
|
@@ -435,6 +433,42 @@ function sourceAlias(sourceRoot) {
|
|
|
435
433
|
}
|
|
436
434
|
};
|
|
437
435
|
}
|
|
436
|
+
// src/rollup/rolldown-utils.ts
|
|
437
|
+
const require = createRequire(import.meta.url);
|
|
438
|
+
let loaded;
|
|
439
|
+
function load() {
|
|
440
|
+
loaded ??= require("rolldown/utils");
|
|
441
|
+
return loaded;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* @description Parses a module with rolldown's oxc parser, loading the parser on first use.
|
|
445
|
+
* @param args The file name, source and parser options, as `rolldown/utils` takes them.
|
|
446
|
+
* @returns The program, comments and errors.
|
|
447
|
+
*/
|
|
448
|
+
function parseSync(...args) {
|
|
449
|
+
return load().parseSync(...args);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* @description Transforms a module with rolldown's oxc transformer, loading it on first use.
|
|
453
|
+
* @param args The file name, source and transform options, as `rolldown/utils` takes them.
|
|
454
|
+
* @returns The transformed code.
|
|
455
|
+
*/
|
|
456
|
+
function transformSync(...args) {
|
|
457
|
+
return load().transformSync(...args);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Rolldown's ESTree visitor, created when it first visits like {@link parseSync}. No private
|
|
461
|
+
* fields: the CLI's bundled typings cannot declare them on an exported class.
|
|
462
|
+
*/
|
|
463
|
+
var Visitor = class {
|
|
464
|
+
visitor;
|
|
465
|
+
constructor(visitor) {
|
|
466
|
+
this.visitor = visitor;
|
|
467
|
+
}
|
|
468
|
+
visit(program) {
|
|
469
|
+
new (load()).Visitor(this.visitor).visit(program);
|
|
470
|
+
}
|
|
471
|
+
};
|
|
438
472
|
// ../api/testing/icu-parse.ts
|
|
439
473
|
/** A syntax error in an ICU message; `position` is the 1-based character it stopped at. */
|
|
440
474
|
var IcuSyntaxError = class extends Error {
|
|
@@ -913,7 +947,7 @@ function readTranslation(path, code, source, warnings) {
|
|
|
913
947
|
file: `${LOCALES_DIRECTORY}/${code}.json`,
|
|
914
948
|
path: key,
|
|
915
949
|
message: `is not in ${SOURCE_LOCALE}.json, so it is left out`,
|
|
916
|
-
fix: `add it to ${SOURCE_LOCALE}.json, or remove it (ubd i18n --prune)`
|
|
950
|
+
fix: `add it to ${SOURCE_LOCALE}.json, or remove it (ubd i18n fix --prune)`
|
|
917
951
|
});
|
|
918
952
|
continue;
|
|
919
953
|
}
|
|
@@ -1534,7 +1568,7 @@ function outputOnly(plugin) {
|
|
|
1534
1568
|
};
|
|
1535
1569
|
}
|
|
1536
1570
|
// ../contracts/src/settings-schema.ts
|
|
1537
|
-
const BUILDERS
|
|
1571
|
+
const BUILDERS = "setting.boolean/number/integer/string/choice/array/section/button/notice from '@unbound-app/settings/schema'";
|
|
1538
1572
|
const ENTITIES = [
|
|
1539
1573
|
"user",
|
|
1540
1574
|
"channel",
|
|
@@ -1612,8 +1646,6 @@ const SPEC = {
|
|
|
1612
1646
|
"maxLength",
|
|
1613
1647
|
"placeholder",
|
|
1614
1648
|
"alpha",
|
|
1615
|
-
"presets",
|
|
1616
|
-
"palette",
|
|
1617
1649
|
"maxSize"
|
|
1618
1650
|
]
|
|
1619
1651
|
},
|
|
@@ -1656,8 +1688,6 @@ const DISPLAY_KEYS = {
|
|
|
1656
1688
|
"url"
|
|
1657
1689
|
],
|
|
1658
1690
|
alpha: ["color"],
|
|
1659
|
-
presets: ["color"],
|
|
1660
|
-
palette: ["color"],
|
|
1661
1691
|
maxSize: ["image"],
|
|
1662
1692
|
units: ["duration"]
|
|
1663
1693
|
};
|
|
@@ -1799,7 +1829,6 @@ function readDisplay(node, path, reader) {
|
|
|
1799
1829
|
const display = textOf(node.displayAs);
|
|
1800
1830
|
for (const [key, displays] of Object.entries(DISPLAY_KEYS)) if (node[key] !== void 0 && !displays.includes(display)) issue(reader, path, `sets \`${key}\`, which only displayAs ${displays.map((name) => `'${name}'`).join("/")} takes`, `remove \`${key}\` or change displayAs`);
|
|
1801
1831
|
if (display === "slider" && (node.minimum === void 0 || node.maximum === void 0)) issue(reader, path, "shows as a slider without both `min` and `max`", "set both, or use displayAs: 'input'");
|
|
1802
|
-
if (node.palette === true && !Array.isArray(node.presets)) issue(reader, path, "sets `palette` without `presets`", "add `presets`");
|
|
1803
1832
|
if (node.kind === "choice") readChoices(node, path, reader);
|
|
1804
1833
|
if (node.kind === "array") {
|
|
1805
1834
|
const of = isObject(node.of) ? node.of : {};
|
|
@@ -1821,7 +1850,7 @@ function copy(node, keys) {
|
|
|
1821
1850
|
function readField(node, path, reader) {
|
|
1822
1851
|
const spec = isObject(node) && typeof node.kind === "string" ? SPEC[node.kind] : void 0;
|
|
1823
1852
|
if (!isObject(node) || !spec) {
|
|
1824
|
-
issue(reader, path, "is not built with a setting builder", `use ${BUILDERS
|
|
1853
|
+
issue(reader, path, "is not built with a setting builder", `use ${BUILDERS}`);
|
|
1825
1854
|
return;
|
|
1826
1855
|
}
|
|
1827
1856
|
for (const key of Object.keys(node)) if (!COMMON.includes(key) && !spec.keys.includes(key) && !TYPEBOX.has(key)) issue(reader, path, `has the unsupported \`${key}\` option`, "remove it");
|
|
@@ -2136,7 +2165,9 @@ const SETTINGS_FILE = "settings.ts";
|
|
|
2136
2165
|
const SETTINGS_MODULE = "@unbound-app/settings";
|
|
2137
2166
|
/** The build-time module `settings.ts` imports its builders from; it exists only while the build evaluates the file. */
|
|
2138
2167
|
const SETTINGS_SCHEMA_MODULE = "@unbound-app/settings/schema";
|
|
2139
|
-
|
|
2168
|
+
function buildersPath() {
|
|
2169
|
+
return fileURLToPath(import.meta.resolve("@unbound-app/cli/settings/schema"));
|
|
2170
|
+
}
|
|
2140
2171
|
/**
|
|
2141
2172
|
* @description Names a plugin's settings schema file.
|
|
2142
2173
|
* @param pluginRoot The plugin's directory.
|
|
@@ -2151,19 +2182,21 @@ function settingsPath(pluginRoot) {
|
|
|
2151
2182
|
* @returns Its default export as JSON, and the files it was bundled from.
|
|
2152
2183
|
*/
|
|
2153
2184
|
async function evaluateSettings(path) {
|
|
2185
|
+
const { rolldown } = await import("rolldown");
|
|
2186
|
+
const builders = buildersPath();
|
|
2154
2187
|
const bundle = await rolldown({
|
|
2155
2188
|
input: path,
|
|
2156
2189
|
platform: "node",
|
|
2157
2190
|
logLevel: "silent",
|
|
2158
2191
|
plugins: [{
|
|
2159
2192
|
name: "unbound-settings-schema",
|
|
2160
|
-
resolveId: (source) => source === "@unbound-app/settings/schema" ?
|
|
2193
|
+
resolveId: (source) => source === "@unbound-app/settings/schema" ? builders : null
|
|
2161
2194
|
}]
|
|
2162
2195
|
});
|
|
2163
2196
|
try {
|
|
2164
2197
|
const { output } = await bundle.generate({ format: "esm" });
|
|
2165
2198
|
const module = await import(`data:text/javascript;base64,${Buffer.from(output[0].code).toString("base64")}`);
|
|
2166
|
-
const watchFiles = (await bundle.watchFiles).filter((file) => file !==
|
|
2199
|
+
const watchFiles = (await bundle.watchFiles).filter((file) => file !== builders);
|
|
2167
2200
|
return {
|
|
2168
2201
|
value: JSON.parse(JSON.stringify(module.default ?? null)),
|
|
2169
2202
|
watchFiles
|
|
@@ -2396,19 +2429,16 @@ const SCHEMA_TYPINGS = `declare module '${SETTINGS_SCHEMA_MODULE}' {
|
|
|
2396
2429
|
| ({ displayAs: 'duration'; /** The units offered, smallest first. */ units?: ('ms' | 's' | 'm' | 'h' | 'd')[] } & Range & Never<'step'>);
|
|
2397
2430
|
|
|
2398
2431
|
type TextOptions = { minLength?: number; maxLength?: number; placeholder?: MessageKey };
|
|
2399
|
-
type ColorOptions = { alpha?: boolean; default: HexColor }
|
|
2400
|
-
| { palette?: false; presets?: HexColor[] }
|
|
2401
|
-
| { /** Draws \`presets\` inline. */ palette: true; presets: [HexColor, ...HexColor[]] }
|
|
2402
|
-
);
|
|
2432
|
+
type ColorOptions = { alpha?: boolean; default: HexColor };
|
|
2403
2433
|
type StringDisplay =
|
|
2404
|
-
| ({ displayAs?: 'input' | 'multiline'; default: string } & TextOptions & Never<'alpha' | '
|
|
2405
|
-
| ({ displayAs: 'secret'; default: string; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | '
|
|
2406
|
-
| ({ displayAs: 'url'; default: HttpUrl | ''; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | '
|
|
2434
|
+
| ({ displayAs?: 'input' | 'multiline'; default: string } & TextOptions & Never<'alpha' | 'maxSize'>)
|
|
2435
|
+
| ({ displayAs: 'secret'; default: string; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | 'maxSize'>)
|
|
2436
|
+
| ({ displayAs: 'url'; default: HttpUrl | ''; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | 'maxSize'>)
|
|
2407
2437
|
| ({ displayAs: 'color' } & ColorOptions & Never<'minLength' | 'maxLength' | 'placeholder' | 'maxSize'>)
|
|
2408
|
-
| ({ displayAs: 'image'; default?: string; /** The largest file, in bytes. */ maxSize?: number } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha'
|
|
2409
|
-
| ({ displayAs: 'font'; default?: string } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
2410
|
-
| ({ /** \`name\`, or \`name:id\` for a custom emoji. */ displayAs: 'emoji'; default?: EmojiString } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
2411
|
-
| ({ displayAs: 'user' | 'channel' | 'guild' | 'role'; default?: Snowflake | '' } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
2438
|
+
| ({ displayAs: 'image'; default?: string; /** The largest file, in bytes. */ maxSize?: number } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha'>)
|
|
2439
|
+
| ({ displayAs: 'font'; default?: string } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>)
|
|
2440
|
+
| ({ /** \`name\`, or \`name:id\` for a custom emoji. */ displayAs: 'emoji'; default?: EmojiString } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>)
|
|
2441
|
+
| ({ displayAs: 'user' | 'channel' | 'guild' | 'role'; default?: Snowflake | '' } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>);
|
|
2412
2442
|
|
|
2413
2443
|
/** An option's label: a message key, or a title and a subtitle a radio group shows under it. */
|
|
2414
2444
|
export type OptionLabel = MessageKey | { title: MessageKey; subtitle?: MessageKey };
|
|
@@ -2582,4 +2612,4 @@ function writeSettingsTypings(pluginRoot, typings) {
|
|
|
2582
2612
|
writeFileSync(path, typings);
|
|
2583
2613
|
return true;
|
|
2584
2614
|
}
|
|
2585
|
-
export {
|
|
2615
|
+
export { SOURCE_LOCALE as $, readIcuMessage as A, pluginDiagnostic as B, readLocaleFolder as C, reportLine as D, writeLocaleTypings as E, findFile as F, withoutFullStop as G, reportDiagnostics as H, sourceAlias as I, hermesBytecode as J, bytecodeFileName as K, diagnostic as L, Visitor as M, parseSync as N, buildReportSchema as O, transformSync as P, LOCALE_CODE_PATTERN as Q, formatDiagnostic as R, locales as S, sourceLocalePath as T, reportProblem as U, reportDiagnostic as V, sortDiagnostics as W, listAddonFiles as X, hermescCount as Y, LOCALES_DIRECTORY as Z, formatBytes as _, SETTINGS_MODULE as a, getAssetPath as at, LOCALE_TYPINGS as b, settingsPath as c, __commonJSMin as ct, OUTPUT_ONLY as d, __require as dt, isLocaleCode as et, outputOnly as f, __toCommonJS as ft, shim_libraries_default as g, buildReport as h, SETTINGS_FILE as i, ASSET_TYPES as it, IcuSyntaxError as j, readIcuArguments as k, lineStarts as l, __esmMin as lt, DEFAULT_BUDGET as m, settingsTypings as n, ASSET_NAME_PATTERN as nt, SETTINGS_SCHEMA_MODULE as o, isAssetName as ot, BUILD_REPORT_ENV as p, __toESM as pt, bytecodeSource as q, writeSettingsTypings as r, ASSET_SCALES as rt, readPluginSettings as s, ADDON_KINDS as st, SETTINGS_TYPINGS as t, ASSETS_DIRECTORY as tt, toLocation as u, __exportAll as ut, parseByteSize as v, readTable as w, localeModule as x, LOCALE_MODULE as y, isDiagnostic as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbound-app/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "The `ubd` command line for the Unbound client: evaluate on-device code and serve the debugger as an MCP.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mario P.",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"@rollup/plugin-commonjs": "^29.0.3",
|
|
62
62
|
"@rollup/plugin-json": "^6.1.0",
|
|
63
63
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
64
|
-
"@unbound-app/debugger": "0.10.
|
|
65
|
-
"@unbound-app/debugger-protocol": "0.
|
|
64
|
+
"@unbound-app/debugger": "0.10.4",
|
|
65
|
+
"@unbound-app/debugger-protocol": "1.0.1",
|
|
66
66
|
"@unbound-app/rollup-plugin-hermes": "2.0.0",
|
|
67
67
|
"better-auth": "1.7.16",
|
|
68
68
|
"cleye": "^2.7.0",
|
|
@@ -55,19 +55,16 @@ declare module '@unbound-app/settings/schema' {
|
|
|
55
55
|
| ({ displayAs: 'duration'; /** The units offered, smallest first. */ units?: ('ms' | 's' | 'm' | 'h' | 'd')[] } & Range & Never<'step'>);
|
|
56
56
|
|
|
57
57
|
type TextOptions = { minLength?: number; maxLength?: number; placeholder?: MessageKey };
|
|
58
|
-
type ColorOptions = { alpha?: boolean; default: HexColor }
|
|
59
|
-
| { palette?: false; presets?: HexColor[] }
|
|
60
|
-
| { /** Draws `presets` inline. */ palette: true; presets: [HexColor, ...HexColor[]] }
|
|
61
|
-
);
|
|
58
|
+
type ColorOptions = { alpha?: boolean; default: HexColor };
|
|
62
59
|
type StringDisplay =
|
|
63
|
-
| ({ displayAs?: 'input' | 'multiline'; default: string } & TextOptions & Never<'alpha' | '
|
|
64
|
-
| ({ displayAs: 'secret'; default: string; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | '
|
|
65
|
-
| ({ displayAs: 'url'; default: HttpUrl | ''; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | '
|
|
60
|
+
| ({ displayAs?: 'input' | 'multiline'; default: string } & TextOptions & Never<'alpha' | 'maxSize'>)
|
|
61
|
+
| ({ displayAs: 'secret'; default: string; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | 'maxSize'>)
|
|
62
|
+
| ({ displayAs: 'url'; default: HttpUrl | ''; placeholder?: MessageKey } & Never<'minLength' | 'maxLength' | 'alpha' | 'maxSize'>)
|
|
66
63
|
| ({ displayAs: 'color' } & ColorOptions & Never<'minLength' | 'maxLength' | 'placeholder' | 'maxSize'>)
|
|
67
|
-
| ({ displayAs: 'image'; default?: string; /** The largest file, in bytes. */ maxSize?: number } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha'
|
|
68
|
-
| ({ displayAs: 'font'; default?: string } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
69
|
-
| ({ /** `name`, or `name:id` for a custom emoji. */ displayAs: 'emoji'; default?: EmojiString } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
70
|
-
| ({ displayAs: 'user' | 'channel' | 'guild' | 'role'; default?: Snowflake | '' } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | '
|
|
64
|
+
| ({ displayAs: 'image'; default?: string; /** The largest file, in bytes. */ maxSize?: number } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha'>)
|
|
65
|
+
| ({ displayAs: 'font'; default?: string } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>)
|
|
66
|
+
| ({ /** `name`, or `name:id` for a custom emoji. */ displayAs: 'emoji'; default?: EmojiString } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>)
|
|
67
|
+
| ({ displayAs: 'user' | 'channel' | 'guild' | 'role'; default?: Snowflake | '' } & Never<'minLength' | 'maxLength' | 'placeholder' | 'alpha' | 'maxSize'>);
|
|
71
68
|
|
|
72
69
|
/** An option's label: a message key, or a title and a subtitle a radio group shows under it. */
|
|
73
70
|
export type OptionLabel = MessageKey | { title: MessageKey; subtitle?: MessageKey };
|
|
@@ -25,4 +25,4 @@ Builds every addon once into its `dist/` directory.
|
|
|
25
25
|
|
|
26
26
|
- Plugins: https://docs.unbound.rip/plugins/introduction
|
|
27
27
|
- Themes: https://docs.unbound.rip/themes/introduction
|
|
28
|
-
- Manifest reference: https://
|
|
28
|
+
- Manifest reference: https://unbound.rip/docs/developer/publishing/manifest
|