Dependencies: Updates all npm dependencies for Client, Login, and UmbracoExtension (#20386)

* build(deps): bump backoffice dependencies

* revert types

* build(deps): updates @hey-api/openapi-ts to 0.85.0 and regenerates files on client and template

* build(deps): updates all icons + regenerate

* build(deps): bumps all login dependencies + regenerate api

* chore: runs eslint --fix

* chore: runs prettier fix on files

* chore: fixes imports
This commit is contained in:
Jacob Overgaard
2025-10-07 09:14:23 +02:00
committed by GitHub
parent d400ba5899
commit b4e97ea49f
78 changed files with 2296 additions and 1685 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -217,10 +217,10 @@
"element-internals-polyfill": "^3.0.2"
},
"devDependencies": {
"@babel/core": "^7.28.0",
"@eslint/js": "^9.33.0",
"@babel/core": "^7.28.4",
"@eslint/js": "^9.37.0",
"@open-wc/testing": "^4.0.0",
"@playwright/test": "^1.54.2",
"@playwright/test": "^1.55.1",
"@storybook/addon-a11y": "9.0.14",
"@storybook/addon-docs": "9.0.14",
"@storybook/addon-links": "9.0.14",
@@ -233,18 +233,18 @@
"@web/test-runner": "^0.20.2",
"@web/test-runner-playwright": "^0.11.1",
"babel-loader": "^10.0.0",
"cross-env": "7.0.3",
"cssnano": "^7.1.0",
"eslint": "^9.33.0",
"cross-env": "10.1.0",
"cssnano": "^7.1.1",
"eslint": "^9.37.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsdoc": "^50.8.0",
"eslint-plugin-jsdoc": "^60.8.2",
"eslint-plugin-lit": "^2.1.1",
"eslint-plugin-local-rules": "^3.0.2",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-storybook": "9.0.14",
"eslint-plugin-wc": "^2.2.1",
"globals": "^16.3.0",
"eslint-plugin-wc": "^3.0.2",
"globals": "^16.4.0",
"madge": "^8.0.0",
"msw": "^1.3.5",
"playwright-msw": "^3.0.1",
@@ -255,12 +255,12 @@
"storybook": "9.0.14",
"tiny-glob": "^0.2.9",
"tsc-alias": "^1.8.16",
"typedoc": "^0.28.10",
"typescript": "5.9.2",
"typescript-eslint": "^8.39.1",
"typedoc": "^0.28.13",
"typescript": "5.9.3",
"typescript-eslint": "^8.45.0",
"typescript-json-schema": "^0.65.1",
"vite": "^7.1.5",
"vite-plugin-static-copy": "^3.1.2",
"vite": "^7.1.9",
"vite-plugin-static-copy": "^3.1.3",
"vite-tsconfig-paths": "^5.1.4",
"web-component-analyzer": "^2.0.0"
},

View File

@@ -2472,8 +2472,7 @@ export default {
confirmDeleteBlockTypeNotice:
'Indholdet vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ',
confirmDeleteBlockGroupTitle: 'Slet gruppe?',
confirmDeleteBlockGroupMessage:
'Er du sikker på at du vil slette gruppen <strong>%0%</strong>?',
confirmDeleteBlockGroupMessage: 'Er du sikker på at du vil slette gruppen <strong>%0%</strong>?',
confirmDeleteBlockGroupNotice:
'Indholdet af gruppens blokke vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ',
blockConfigurationOverlayTitle: "Konfiguration af '%0%'",

View File

@@ -2605,8 +2605,7 @@ export default {
confirmDeleteBlockTypeNotice:
'The content of this block will still be present, editing of this content will no longer be available and will be shown as unsupported content.',
confirmDeleteBlockGroupTitle: 'Delete group?',
confirmDeleteBlockGroupMessage:
'Are you sure you want to delete group <strong>%0%</strong>?',
confirmDeleteBlockGroupMessage: 'Are you sure you want to delete group <strong>%0%</strong>?',
confirmDeleteBlockGroupNotice:
'The content of these Blocks will still be present, editing of this content will no longer be available and will be shown as unsupported content.',
blockConfigurationOverlayTitle: "Configuration of '%0%'",

View File

@@ -6,6 +6,6 @@
"build": "vite build"
},
"dependencies": {
"dompurify": "^3.2.5"
"dompurify": "^3.2.7"
}
}

View File

@@ -6,6 +6,6 @@
"build": "vite build"
},
"dependencies": {
"lit": "^3.3.0"
"lit": "^3.3.1"
}
}

View File

@@ -6,6 +6,6 @@
"build": "vite build"
},
"dependencies": {
"marked": "^15.0.9"
"marked": "^16.3.0"
}
}

View File

@@ -6,6 +6,6 @@
"build": "vite build"
},
"dependencies": {
"monaco-editor": "^0.52.2"
"monaco-editor": "^0.54.0"
}
}

View File

@@ -9,7 +9,7 @@ const distAssets = '../../../dist-cms';
rmSync(dist, { recursive: true, force: true });
// copy fonts
cpSync('../../../node_modules/monaco-editor/min/vs/base/browser/ui/codicons', `${distAssets}/assets/fonts`, {
cpSync('../../../node_modules/monaco-editor/esm/vs/base/browser/ui/codicons', `${distAssets}/assets/fonts`, {
recursive: true,
});

View File

@@ -33,7 +33,11 @@ export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement
private _blockTypes?: Array<UmbBlockTypeWithGroupKey>;
@state()
private _blockTypesWithElementName: Array<{ type: UmbBlockTypeWithGroupKey; name: string; icon: string | null | undefined }> = [];
private _blockTypesWithElementName: Array<{
type: UmbBlockTypeWithGroupKey;
name: string;
icon: string | null | undefined;
}> = [];
@state()
private _blockGroups: Array<UmbBlockGridTypeGroupType> = [];
@@ -55,7 +59,11 @@ export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement
}
return undefined;
})
.filter((x) => x !== undefined) as Array<{ type: UmbBlockTypeWithGroupKey; name: string; icon: string | null | undefined }>;
.filter((x) => x !== undefined) as Array<{
type: UmbBlockTypeWithGroupKey;
name: string;
icon: string | null | undefined;
}>;
});
this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, async (context) => {
@@ -193,9 +201,7 @@ export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement
this._blockGroups,
(group) => group.key,
(group) =>
html`<uui-combobox-list-option
.value=${group.key}
?selected=${area.groupKey === group.key}>
html`<uui-combobox-list-option .value=${group.key} ?selected=${area.groupKey === group.key}>
<umb-icon name="icon-folder"></umb-icon>
${group.name}
</uui-combobox-list-option>`,

View File

@@ -14,7 +14,7 @@ export interface UmbElementValueModel<ValueType = unknown> extends UmbPropertyVa
/**
* @deprecated, we do not use entityType on values anymore. To be removed in Umbraco v.18.
* Just remove the property.
**/
*/
entityType?: string;
segment: string | null;
}

View File

@@ -392,11 +392,11 @@ export abstract class UmbContentDetailWorkspaceContextBase<
this.#segments.setValue(data?.items ?? []);
}
/**
* @deprecated Call `_processIncomingData` instead. `_scaffoldProcessData` will be removed in v.18.
*/
/**
* @deprecated Call `_processIncomingData` instead. `_scaffoldProcessData` will be removed in v.18.
*/
protected override _scaffoldProcessData(data: DetailModelType): Promise<DetailModelType> {
return this._processIncomingData(data);
return this._processIncomingData(data);
}
protected override async _processIncomingData(data: DetailModelType): Promise<DetailModelType> {

View File

@@ -1,7 +1,7 @@
// This file is auto-generated by @hey-api/openapi-ts
import type { ClientOptions } from './types.gen';
import { type Config, type ClientOptions as DefaultClientOptions, createClient, createConfig } from './client';
import { type ClientOptions, type Config, createClient, createConfig } from './client';
import type { ClientOptions as ClientOptions2 } from './types.gen';
/**
* The `createClientConfig()` function will be called on client initialization
@@ -11,8 +11,8 @@ import { type Config, type ClientOptions as DefaultClientOptions, createClient,
* `setConfig()`. This is useful for example if you're using Next.js
* to ensure your client always has the correct values.
*/
export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> = (override?: Config<DefaultClientOptions & T>) => Config<Required<DefaultClientOptions> & T>;
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;
export const client = createClient(createConfig<ClientOptions>({
export const client = createClient(createConfig<ClientOptions2>({
throwOnError: true
}));
}));

View File

@@ -2,6 +2,7 @@
import { createSseClient } from '../core/serverSentEvents.gen';
import type { HttpMethod } from '../core/types.gen';
import { getValidRequestBody } from '../core/utils.gen';
import type {
Client,
Config,
@@ -60,12 +61,12 @@ export const createClient = (config: Config = {}): Client => {
await opts.requestValidator(opts);
}
if (opts.body && opts.bodySerializer) {
if (opts.body !== undefined && opts.bodySerializer) {
opts.serializedBody = opts.bodySerializer(opts.body);
}
// remove Content-Type header if body is empty to avoid sending invalid requests
if (opts.serializedBody === undefined || opts.serializedBody === '') {
if (opts.body === undefined || opts.serializedBody === '') {
opts.headers.delete('Content-Type');
}
@@ -80,12 +81,12 @@ export const createClient = (config: Config = {}): Client => {
const requestInit: ReqInit = {
redirect: 'follow',
...opts,
body: opts.serializedBody,
body: getValidRequestBody(opts),
};
let request = new Request(url, requestInit);
for (const fn of interceptors.request._fns) {
for (const fn of interceptors.request.fns) {
if (fn) {
request = await fn(request, opts);
}
@@ -96,7 +97,7 @@ export const createClient = (config: Config = {}): Client => {
const _fetch = opts.fetch!;
let response = await _fetch(request);
for (const fn of interceptors.response._fns) {
for (const fn of interceptors.response.fns) {
if (fn) {
response = await fn(response, request, opts);
}
@@ -108,23 +109,41 @@ export const createClient = (config: Config = {}): Client => {
};
if (response.ok) {
if (
response.status === 204 ||
response.headers.get('Content-Length') === '0'
) {
return opts.responseStyle === 'data'
? {}
: {
data: {},
...result,
};
}
const parseAs =
(opts.parseAs === 'auto'
? getParseAs(response.headers.get('Content-Type'))
: opts.parseAs) ?? 'json';
if (
response.status === 204 ||
response.headers.get('Content-Length') === '0'
) {
let emptyData: any;
switch (parseAs) {
case 'arrayBuffer':
case 'blob':
case 'text':
emptyData = await response[parseAs]();
break;
case 'formData':
emptyData = new FormData();
break;
case 'stream':
emptyData = response.body;
break;
case 'json':
default:
emptyData = {};
break;
}
return opts.responseStyle === 'data'
? emptyData
: {
data: emptyData,
...result,
};
}
let data: any;
switch (parseAs) {
case 'arrayBuffer':
@@ -173,7 +192,7 @@ export const createClient = (config: Config = {}): Client => {
const error = jsonError ?? textError;
let finalError = error;
for (const fn of interceptors.error._fns) {
for (const fn of interceptors.error.fns) {
if (fn) {
finalError = (await fn(error, response, request, opts)) as string;
}
@@ -206,6 +225,15 @@ export const createClient = (config: Config = {}): Client => {
body: opts.body as BodyInit | null | undefined,
headers: opts.headers as unknown as Record<string, string>,
method,
onRequest: async (url, init) => {
let request = new Request(url, init);
for (const fn of interceptors.request.fns) {
if (fn) {
request = await fn(request, opts);
}
}
return request;
},
url,
});
};

View File

@@ -8,6 +8,7 @@ export {
urlSearchParamsBodySerializer,
} from '../core/bodySerializer.gen';
export { buildClientParams } from '../core/params.gen';
export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen';
export { createClient } from './client.gen';
export type {
Client,

View File

@@ -26,7 +26,7 @@ export interface Config<T extends ClientOptions = ClientOptions>
*
* @default globalThis.fetch
*/
fetch?: (request: Request) => ReturnType<typeof fetch>;
fetch?: typeof fetch;
/**
* Please don't use the Fetch client for Next.js applications. The `next`
* options won't have any effect.

View File

@@ -183,17 +183,27 @@ export const mergeConfigs = (a: Config, b: Config): Config => {
return config;
};
const headersEntries = (headers: Headers): Array<[string, string]> => {
const entries: Array<[string, string]> = [];
headers.forEach((value, key) => {
entries.push([key, value]);
});
return entries;
};
export const mergeHeaders = (
...headers: Array<Required<Config>['headers'] | undefined>
): Headers => {
const mergedHeaders = new Headers();
for (const header of headers) {
if (!header || typeof header !== 'object') {
if (!header) {
continue;
}
const iterator =
header instanceof Headers ? header.entries() : Object.entries(header);
header instanceof Headers
? headersEntries(header)
: Object.entries(header);
for (const [key, value] of iterator) {
if (value === null) {
@@ -234,67 +244,61 @@ type ResInterceptor<Res, Req, Options> = (
) => Res | Promise<Res>;
class Interceptors<Interceptor> {
_fns: (Interceptor | null)[];
fns: Array<Interceptor | null> = [];
constructor() {
this._fns = [];
clear(): void {
this.fns = [];
}
clear() {
this._fns = [];
eject(id: number | Interceptor): void {
const index = this.getInterceptorIndex(id);
if (this.fns[index]) {
this.fns[index] = null;
}
}
exists(id: number | Interceptor): boolean {
const index = this.getInterceptorIndex(id);
return Boolean(this.fns[index]);
}
getInterceptorIndex(id: number | Interceptor): number {
if (typeof id === 'number') {
return this._fns[id] ? id : -1;
} else {
return this._fns.indexOf(id);
return this.fns[id] ? id : -1;
}
}
exists(id: number | Interceptor) {
const index = this.getInterceptorIndex(id);
return !!this._fns[index];
return this.fns.indexOf(id);
}
eject(id: number | Interceptor) {
update(
id: number | Interceptor,
fn: Interceptor,
): number | Interceptor | false {
const index = this.getInterceptorIndex(id);
if (this._fns[index]) {
this._fns[index] = null;
}
}
update(id: number | Interceptor, fn: Interceptor) {
const index = this.getInterceptorIndex(id);
if (this._fns[index]) {
this._fns[index] = fn;
if (this.fns[index]) {
this.fns[index] = fn;
return id;
} else {
return false;
}
return false;
}
use(fn: Interceptor) {
this._fns = [...this._fns, fn];
return this._fns.length - 1;
use(fn: Interceptor): number {
this.fns.push(fn);
return this.fns.length - 1;
}
}
// `createInterceptors()` response, meant for external use as it does not
// expose internals
export interface Middleware<Req, Res, Err, Options> {
error: Pick<
Interceptors<ErrInterceptor<Err, Res, Req, Options>>,
'eject' | 'use'
>;
request: Pick<Interceptors<ReqInterceptor<Req, Options>>, 'eject' | 'use'>;
response: Pick<
Interceptors<ResInterceptor<Res, Req, Options>>,
'eject' | 'use'
>;
error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;
request: Interceptors<ReqInterceptor<Req, Options>>;
response: Interceptors<ResInterceptor<Res, Req, Options>>;
}
// do not add `Middleware` as return type so we can use _fns internally
export const createInterceptors = <Req, Res, Err, Options>() => ({
export const createInterceptors = <Req, Res, Err, Options>(): Middleware<
Req,
Res,
Err,
Options
> => ({
error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),
request: new Interceptors<ReqInterceptor<Req, Options>>(),
response: new Interceptors<ResInterceptor<Res, Req, Options>>(),

View File

@@ -0,0 +1,136 @@
// This file is auto-generated by @hey-api/openapi-ts
/**
* JSON-friendly union that mirrors what Pinia Colada can hash.
*/
export type JsonValue =
| null
| string
| number
| boolean
| JsonValue[]
| { [key: string]: JsonValue };
/**
* Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes.
*/
export const queryKeyJsonReplacer = (_key: string, value: unknown) => {
if (
value === undefined ||
typeof value === 'function' ||
typeof value === 'symbol'
) {
return undefined;
}
if (typeof value === 'bigint') {
return value.toString();
}
if (value instanceof Date) {
return value.toISOString();
}
return value;
};
/**
* Safely stringifies a value and parses it back into a JsonValue.
*/
export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => {
try {
const json = JSON.stringify(input, queryKeyJsonReplacer);
if (json === undefined) {
return undefined;
}
return JSON.parse(json) as JsonValue;
} catch {
return undefined;
}
};
/**
* Detects plain objects (including objects with a null prototype).
*/
const isPlainObject = (value: unknown): value is Record<string, unknown> => {
if (value === null || typeof value !== 'object') {
return false;
}
const prototype = Object.getPrototypeOf(value as object);
return prototype === Object.prototype || prototype === null;
};
/**
* Turns URLSearchParams into a sorted JSON object for deterministic keys.
*/
const serializeSearchParams = (params: URLSearchParams): JsonValue => {
const entries = Array.from(params.entries()).sort(([a], [b]) =>
a.localeCompare(b),
);
const result: Record<string, JsonValue> = {};
for (const [key, value] of entries) {
const existing = result[key];
if (existing === undefined) {
result[key] = value;
continue;
}
if (Array.isArray(existing)) {
(existing as string[]).push(value);
} else {
result[key] = [existing, value];
}
}
return result;
};
/**
* Normalizes any accepted value into a JSON-friendly shape for query keys.
*/
export const serializeQueryKeyValue = (
value: unknown,
): JsonValue | undefined => {
if (value === null) {
return null;
}
if (
typeof value === 'string' ||
typeof value === 'number' ||
typeof value === 'boolean'
) {
return value;
}
if (
value === undefined ||
typeof value === 'function' ||
typeof value === 'symbol'
) {
return undefined;
}
if (typeof value === 'bigint') {
return value.toString();
}
if (value instanceof Date) {
return value.toISOString();
}
if (Array.isArray(value)) {
return stringifyToJsonValue(value);
}
if (
typeof URLSearchParams !== 'undefined' &&
value instanceof URLSearchParams
) {
return serializeSearchParams(value);
}
if (isPlainObject(value)) {
return stringifyToJsonValue(value);
}
return undefined;
};

View File

@@ -7,6 +7,17 @@ export type ServerSentEventsOptions<TData = unknown> = Omit<
'method'
> &
Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {
/**
* Fetch API implementation. You can use this option to provide a custom
* fetch instance.
*
* @default globalThis.fetch
*/
fetch?: typeof fetch;
/**
* Implementing clients can call request interceptors inside this hook.
*/
onRequest?: (url: string, init: RequestInit) => Promise<Request>;
/**
* Callback invoked when a network or parsing error occurs during streaming.
*
@@ -24,6 +35,7 @@ export type ServerSentEventsOptions<TData = unknown> = Omit<
* @returns Nothing (void).
*/
onSseEvent?: (event: StreamEvent<TData>) => void;
serializedBody?: RequestInit['body'];
/**
* Default retry delay in milliseconds.
*
@@ -75,6 +87,7 @@ export type ServerSentEventsResult<
};
export const createSseClient = <TData = unknown>({
onRequest,
onSseError,
onSseEvent,
responseTransformer,
@@ -112,7 +125,21 @@ export const createSseClient = <TData = unknown>({
}
try {
const response = await fetch(url, { ...options, headers, signal });
const requestInit: RequestInit = {
redirect: 'follow',
...options,
body: options.serializedBody,
headers,
signal,
};
let request = new Request(url, requestInit);
if (onRequest) {
request = await onRequest(url, requestInit);
}
// fetch must be assigned here, otherwise it would throw the error:
// TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
const _fetch = options.fetch ?? globalThis.fetch;
const response = await _fetch(request);
if (!response.ok)
throw new Error(

View File

@@ -1,6 +1,6 @@
// This file is auto-generated by @hey-api/openapi-ts
import type { QuerySerializer } from './bodySerializer.gen';
import type { BodySerializer, QuerySerializer } from './bodySerializer.gen';
import {
type ArraySeparatorStyle,
serializeArrayParam,
@@ -112,3 +112,32 @@ export const getUrl = ({
}
return url;
};
export function getValidRequestBody(options: {
body?: unknown;
bodySerializer?: BodySerializer | null;
serializedBody?: unknown;
}) {
const hasBody = options.body !== undefined;
const isSerializedBody = hasBody && options.bodySerializer;
if (isSerializedBody) {
if ('serializedBody' in options) {
const hasSerializedBody =
options.serializedBody !== undefined && options.serializedBody !== '';
return hasSerializedBody ? options.serializedBody : null;
}
// not all clients implement a serializedBody property (i.e. client-axios)
return options.body !== '' ? options.body : null;
}
// plain/text body
if (hasBody) {
return options.body;
}
// no body was provided
return undefined;
}

View File

@@ -1,4 +1,5 @@
// This file is auto-generated by @hey-api/openapi-ts
export * from './types.gen';
export * from './client.gen';
export * from './sdk.gen';
export * from './sdk.gen';

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,9 @@
// This file is auto-generated by @hey-api/openapi-ts
export type ClientOptions = {
baseUrl: `${string}://${string}` | (string & {});
};
export type AllowedDocumentTypeModel = {
id: string;
name: string;
@@ -2079,7 +2083,7 @@ export type ProblemDetails = {
status?: number | null;
detail?: string | null;
instance?: string | null;
[key: string]: unknown | (string | null) | (string | null) | (number | null) | (string | null) | (string | null) | undefined;
[key: string]: unknown | string | null | string | null | number | null | string | null | string | null | undefined;
};
export type ProblemDetailsBuilderModel = {
@@ -3073,6 +3077,85 @@ export type WebhookResponseModel = {
events: Array<WebhookEventResponseModel>;
};
export type DocumentVariantItemResponseModelWritable = {
name: string;
culture?: string | null;
flags: Array<FlagModel>;
state: DocumentVariantStateModel;
};
export type DocumentVariantResponseModelWritable = {
culture?: string | null;
segment?: string | null;
name: string;
createDate: string;
updateDate: string;
state: DocumentVariantStateModel;
publishDate?: string | null;
scheduledPublishDate?: string | null;
scheduledUnpublishDate?: string | null;
flags: Array<FlagModel>;
};
export type PackageDefinitionResponseModelWritable = {
name: string;
contentNodeId?: string | null;
contentLoadChildNodes: boolean;
mediaIds: Array<string>;
mediaLoadChildNodes: boolean;
documentTypes: Array<string>;
mediaTypes: Array<string>;
dataTypes: Array<string>;
templates: Array<string>;
partialViews: Array<string>;
stylesheets: Array<string>;
scripts: Array<string>;
languages: Array<string>;
dictionaryItems: Array<string>;
id: string;
};
export type RelationResponseModelWritable = {
id: string;
relationType: ReferenceByIdModel;
};
export type SearchResultResponseModelWritable = {
id: string;
score: number;
fields: Array<FieldPresentationModel>;
};
export type UpdatePackageRequestModelWritable = {
name: string;
contentNodeId?: string | null;
contentLoadChildNodes: boolean;
mediaIds: Array<string>;
mediaLoadChildNodes: boolean;
documentTypes: Array<string>;
mediaTypes: Array<string>;
dataTypes: Array<string>;
templates: Array<string>;
partialViews: Array<string>;
stylesheets: Array<string>;
scripts: Array<string>;
languages: Array<string>;
dictionaryItems: Array<string>;
};
export type UpgradeSettingsResponseModelWritable = {
currentState: string;
newState: string;
newVersion: string;
oldVersion: string;
};
export type UserInstallRequestModelWritable = {
name: string;
email: string;
password: string;
};
export type GetCultureData = {
body?: never;
path?: never;
@@ -11449,7 +11532,7 @@ export type GetPackageCreatedByIdResponses = {
export type GetPackageCreatedByIdResponse = GetPackageCreatedByIdResponses[keyof GetPackageCreatedByIdResponses];
export type PutPackageCreatedByIdData = {
body?: UpdatePackageRequestModel;
body?: UpdatePackageRequestModelWritable;
path: {
id: string;
};
@@ -16428,7 +16511,3 @@ export type GetWebhookLogsResponses = {
};
export type GetWebhookLogsResponse = GetWebhookLogsResponses[keyof GetWebhookLogsResponses];
export type ClientOptions = {
baseUrl: `${string}://${string}` | (string & {});
};

View File

@@ -1,8 +1,8 @@
import { UmbFormControlMixin } from '../../validation/mixins/index.js';
import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type { UUISliderEvent } from '@umbraco-cms/backoffice/external/uui';
import { UmbFormControlMixin } from '../../validation/mixins/index.js';
function splitString(value: string | undefined): Partial<[number | undefined, number | undefined]> {
const [from, to] = (value ?? ',').split(',');

View File

@@ -72,7 +72,10 @@ export class UmbMultipleColorPickerItemInputElement extends UUIFormControlMixin(
// If it's 3-digit, expand it
if (hex.length === 3) {
hex = hex.split('').map(ch => ch + ch).join('');
hex = hex
.split('')
.map((ch) => ch + ch)
.join('');
}
return `#${hex}`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-chart-no-axes-column" viewBox="0 0 24 24"><path d="M18 20V10M12 20V4M6 20v-6"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-chart-no-axes-column" viewBox="0 0 24 24"><path d="M5 21v-6M12 21V3M19 21V9"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-chart-no-axes-column-increasing" viewBox="0 0 24 24"><path d="M12 20V10M18 20V4M6 20v-4"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-chart-no-axes-column-increasing" viewBox="0 0 24 24"><path d="M5 21v-6M12 21V9M19 21V3"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-text-quote" viewBox="0 0 24 24"><path d="M17 6H3M21 12H8M21 18H8M3 12v6"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-text-quote" viewBox="0 0 24 24"><path d="M17 5H3M21 12H8M21 19H8M3 12v7"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-bug" viewBox="0 0 24 24"><path d="m8 2 1.88 1.88M14.12 3.88 16 2M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M3 21c0-2.1 1.7-3.9 3.8-4M20.97 5c0 2.1-1.6 3.8-3.5 4M22 13h-4M17.2 17c2.1.1 3.8 1.9 3.8 4"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-bug" viewBox="0 0 24 24"><path d="M12 20v-9M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4zM14.12 3.88 16 2"/><path d="M21 21a4 4 0 0 0-3.81-4M21 5a4 4 0 0 1-3.55 3.97M22 13h-4M3 21a4 4 0 0 1 3.81-4M3 5a4 4 0 0 0 3.55 3.97M6 13H2M8 2l1.88 1.88M9 7.13V6a3 3 0 1 1 6 0v1.13"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list" viewBox="0 0 24 24"><path d="M3 12h.01M3 18h.01M3 6h.01M8 12h13M8 18h13M8 6h13"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list" viewBox="0 0 24 24"><path d="M3 5h.01M3 12h.01M3 19h.01M8 5h13M8 12h13M8 19h13"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-sliders-horizontal" viewBox="0 0 24 24"><path d="M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-sliders-horizontal" viewBox="0 0 24 24"><path d="M10 5H3M12 19H3M14 3v4M16 17v4M21 12h-9M21 19h-5M21 5h-7M8 10v4M8 12H3"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-house" viewBox="0 0 24 24"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-house" viewBox="0 0 24 24"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/><path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-indent-increase" viewBox="0 0 24 24"><path d="M21 12H11M21 18H11M21 6H11M3 8l4 4-4 4"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-indent-increase" viewBox="0 0 24 24"><path d="M21 5H11M21 12H11M21 19H11M3 8l4 4-4 4"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-justify" viewBox="0 0 24 24"><path d="M3 12h18M3 18h18M3 6h18"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-justify" viewBox="0 0 24 24"><path d="M3 5h18M3 12h18M3 19h18"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list-ordered" viewBox="0 0 24 24"><path d="M10 12h11M10 18h11M10 6h11M4 10h2M4 6h1v4M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list-ordered" viewBox="0 0 24 24"><path d="M11 5h10M11 12h10M11 19h10M4 4h1v5M4 9h2M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-indent-decrease" viewBox="0 0 24 24"><path d="M21 12H11M21 18H11M21 6H11M7 8l-4 4 4 4"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-indent-decrease" viewBox="0 0 24 24"><path d="M21 5H11M21 12H11M21 19H11M7 8l-4 4 4 4"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list-music" viewBox="0 0 24 24"><path d="M21 15V6M18.5 18a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5M12 12H3M16 6H3M12 18H3"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-list-music" viewBox="0 0 24 24"><path d="M16 5H3M11 12H3M11 19H3M21 16V5"/><circle cx="18" cy="16" r="3"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-center" viewBox="0 0 24 24"><path d="M17 12H7M19 18H5M21 6H3"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-center" viewBox="0 0 24 24"><path d="M21 5H3M17 12H7M19 19H5"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-justify" viewBox="0 0 24 24"><path d="M3 12h18M3 18h18M3 6h18"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-justify" viewBox="0 0 24 24"><path d="M3 5h18M3 12h18M3 19h18"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-left" viewBox="0 0 24 24"><path d="M15 12H3M17 18H3M21 6H3"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-left" viewBox="0 0 24 24"><path d="M21 5H3M15 12H3M17 19H3"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-right" viewBox="0 0 24 24"><path d="M21 12H9M21 18H7M21 6H3"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" class="lucide lucide-align-right" viewBox="0 0 24 24"><path d="M21 5H3M21 12H9M21 19H7"/></svg>`;

View File

@@ -1 +1 @@
export default `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>X</title><path fill="currentColor" d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"/></svg>`;
export default `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>X</title><path fill="currentColor" d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z"/></svg>`;

View File

@@ -9,12 +9,12 @@
"dependencies": {
"@types/diff": "^7.0.2",
"diff": "^7.0.0",
"uuid": "^11.1.0",
"@hey-api/openapi-ts": "0.81.1"
"uuid": "^13.0.0",
"@hey-api/openapi-ts": "0.85.0"
},
"devDependencies": {
"lucide-static": "^0.542.0",
"simple-icons": "^15.13.0",
"lucide-static": "^0.544.0",
"simple-icons": "^15.16.1",
"svgo": "^4.0.0"
}
}

View File

@@ -136,7 +136,9 @@ export abstract class UmbTreeItemElementBase<
.loading=${this._isLoading}
.hasChildren=${this._hasChildren}
.showChildren=${this._isOpen}
.caretLabel=${this._isOpen ? this.localize.term('visuallyHiddenTexts_collapseChildItems') + ' ' + this._label: this.localize.term('visuallyHiddenTexts_expandChildItems') + ' ' + this._label}
.caretLabel=${this._isOpen
? this.localize.term('visuallyHiddenTexts_collapseChildItems') + ' ' + this._label
: this.localize.term('visuallyHiddenTexts_expandChildItems') + ' ' + this._label}
label=${this._label}
href="${ifDefined(this._isSelectableContext ? undefined : this._href)}">
${this.renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()}

View File

@@ -1,10 +1,10 @@
import { UMB_WORKSPACE_CONTEXT } from '../../workspace.context-token.js';
import type { UmbWorkspaceContext } from '../../workspace-context.interface.js';
import type { ManifestWorkspaceDefaultKind } from './types.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import { UmbEntityContext, type UmbEntityUnique } from '@umbraco-cms/backoffice/entity';
import { UmbViewContext } from '@umbraco-cms/backoffice/view';
import type { ManifestWorkspaceDefaultKind } from './types.js';
export class UmbDefaultWorkspaceContext extends UmbContextBase implements UmbWorkspaceContext {
public workspaceAlias!: string;

View File

@@ -11,7 +11,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation';
/**
* @internal should only be used in the data type workspace.
* @internal
*/
@customElement('umb-data-type-details-workspace-property-editor-picker')
export class UmbDataTypeDetailsWorkspacePropertyEditorPickerElement extends UmbFormControlMixin<

View File

@@ -1,14 +1,14 @@
import { UmbPropertyEditorUICheckboxListElement } from './property-editor-ui-checkbox-list.element.js';
import { expect, fixture, html } from '@open-wc/testing';
import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils';
import {
setupBasicStringConfig,
setupObjectConfig,
import {
setupBasicStringConfig,
setupObjectConfig,
setupEmptyConfig,
getCheckboxListElement,
getCheckboxSelection,
verifyMultiSelectValueAndDOM,
MULTI_SELECT_TEST_DATA
MULTI_SELECT_TEST_DATA,
} from '../utils/property-editor-test-utils.js';
describe('UmbPropertyEditorUICheckboxListElement', () => {
@@ -23,14 +23,14 @@ describe('UmbPropertyEditorUICheckboxListElement', () => {
const checkboxListInput = getCheckboxListElement(element);
const checkboxElements = checkboxListInput?.shadowRoot?.querySelectorAll('uui-checkbox') || [];
const checkedValues: string[] = [];
checkboxElements.forEach((checkbox: Element) => {
const uuiCheckbox = checkbox as any;
if (uuiCheckbox.checked) {
checkedValues.push(uuiCheckbox.value);
}
});
return checkedValues;
}
@@ -121,7 +121,7 @@ describe('UmbPropertyEditorUICheckboxListElement', () => {
describe('configuration handling', () => {
it('should handle string array configuration', async () => {
setupBasicStringConfig(element, ['Option1', 'Option2', 'Option3']);
element.value = ['Option1', 'Option3'];
await element.updateComplete;
@@ -130,7 +130,7 @@ describe('UmbPropertyEditorUICheckboxListElement', () => {
it('should handle object array configuration', async () => {
setupObjectConfig(element);
element.value = ['red', 'blue'];
await element.updateComplete;
@@ -139,7 +139,7 @@ describe('UmbPropertyEditorUICheckboxListElement', () => {
it('should handle empty configuration gracefully', async () => {
setupEmptyConfig(element);
element.value = ['test'];
await element.updateComplete;

View File

@@ -1,11 +1,11 @@
import { UmbPropertyEditorUIDropdownElement } from './property-editor-ui-dropdown.element.js';
import { expect, fixture, html } from '@open-wc/testing';
import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils';
import {
setupBasicStringConfig,
setupObjectConfig,
import {
setupBasicStringConfig,
setupObjectConfig,
setupEmptyConfig,
MULTI_SELECT_TEST_DATA
MULTI_SELECT_TEST_DATA,
} from '../utils/property-editor-test-utils.js';
describe('UmbPropertyEditorUIDropdownElement', () => {
@@ -27,19 +27,19 @@ describe('UmbPropertyEditorUIDropdownElement', () => {
function getLocalSelectedValues() {
const dropdownInput = getLocalDropdownInput();
const selectElement = getNativeSelectElement();
if (dropdownInput) {
// Single mode - the dropdown input value might be a string or comma-separated string
const value = dropdownInput.value;
if (!value) return [];
// Handle both single values and comma-separated values
return typeof value === 'string' ? value.split(', ').filter(v => v.length > 0) : [value];
return typeof value === 'string' ? value.split(', ').filter((v) => v.length > 0) : [value];
} else if (selectElement) {
// Multiple mode
const selectedOptions = selectElement.selectedOptions;
return selectedOptions ? Array.from(selectedOptions).map(option => option.value) : [];
return selectedOptions ? Array.from(selectedOptions).map((option) => option.value) : [];
}
return [];
}
@@ -58,7 +58,7 @@ describe('UmbPropertyEditorUIDropdownElement', () => {
return multiple;
}
return undefined;
}
},
} as any;
}
@@ -193,9 +193,9 @@ describe('UmbPropertyEditorUIDropdownElement', () => {
return false;
}
return undefined;
}
},
} as any;
element.value = ['Option1'];
await element.updateComplete;
@@ -209,16 +209,16 @@ describe('UmbPropertyEditorUIDropdownElement', () => {
return [
{ name: 'Red Color', value: 'red' },
{ name: 'Green Color', value: 'green' },
{ name: 'Blue Color', value: 'blue' }
{ name: 'Blue Color', value: 'blue' },
];
}
if (alias === 'multiple') {
return false;
}
return undefined;
}
},
} as any;
element.value = ['red'];
await element.updateComplete;
@@ -227,9 +227,9 @@ describe('UmbPropertyEditorUIDropdownElement', () => {
it('should handle empty configuration gracefully', async () => {
element.config = {
getValueByAlias: () => undefined
getValueByAlias: () => undefined,
} as any;
element.value = ['test'];
await element.updateComplete;

View File

@@ -9,7 +9,7 @@ import {
getSelectElement,
getSelectedValue,
verifySelectValueAndDOM,
SINGLE_SELECT_TEST_DATA
SINGLE_SELECT_TEST_DATA,
} from '../utils/property-editor-test-utils.js';
describe('UmbPropertyEditorUISelectElement', () => {
@@ -19,8 +19,6 @@ describe('UmbPropertyEditorUISelectElement', () => {
element = await fixture(html`<umb-property-editor-ui-select></umb-property-editor-ui-select>`);
});
it('is defined with its own instance', () => {
expect(element).to.be.instanceOf(UmbPropertyEditorUISelectElement);
});

View File

@@ -1,22 +1,22 @@
import type { ManifestMarkedExtension } from './marked-extension.extension.js';
export const manifests: Array<ManifestMarkedExtension> = [
{
type: 'markedExtension',
alias: 'Umb.MarkedExtension.Ufm',
name: 'UFM Marked Extension',
api: () => import('./ufm-marked-extension.api.js'),
meta: {
alias: 'ufm',
},
},
{
type: 'markedExtension',
alias: 'Umb.MarkedExtension.Ufmjs',
name: 'UFM JS Marked Extension',
api: () => import('./ufmjs-marked-extension.api.js'),
meta: {
alias: 'ufmjs',
},
},
];
import type { ManifestMarkedExtension } from './marked-extension.extension.js';
export const manifests: Array<ManifestMarkedExtension> = [
{
type: 'markedExtension',
alias: 'Umb.MarkedExtension.Ufm',
name: 'UFM Marked Extension',
api: () => import('./ufm-marked-extension.api.js'),
meta: {
alias: 'ufm',
},
},
{
type: 'markedExtension',
alias: 'Umb.MarkedExtension.Ufmjs',
name: 'UFM JS Marked Extension',
api: () => import('./ufmjs-marked-extension.api.js'),
meta: {
alias: 'ufmjs',
},
},
];